    Ext.ux.TabScrollerMenu =  Ext.extend(Object, {
    	pageSize       : 10,
    	maxText        : 15,
    	menuPrefixText : 'Items',
    	constructor    : function(config) {
    		config = config || {};
    		Ext.apply(this, config);
    	},
    	init : function(tabPanel) {
    		Ext.apply(tabPanel, this.tabPanelMethods);

    		tabPanel.tabScrollerMenu = this;
    		var thisRef = this;

    		tabPanel.on({
    			render : {
    				scope  : tabPanel,
    				single : true,
    				fn     : function() {
    					var newFn = tabPanel.createScrollers.createSequence(thisRef.createPanelsMenu, this);
    					tabPanel.createScrollers = newFn;
    				}
    			}
    		});
    	},
    	// private && sequeneced
    	createPanelsMenu : function() {
    		var h = this.stripWrap.dom.offsetHeight;

    		//move the right menu item to the left 18px
    		var rtScrBtn = this.header.dom.firstChild;
    		Ext.fly(rtScrBtn).applyStyles({
    			right : '18px'
    		});

    		var stripWrap = Ext.get(this.strip.dom.parentNode);
    		stripWrap.applyStyles({
    			 'margin-right' : '36px'
    		});

    		// Add the new righthand menu
    		var scrollMenu = this.header.insertFirst({
    			cls:'x-tab-tabmenu-right'
    		});
    		scrollMenu.setHeight(h);
    		scrollMenu.addClassOnOver('x-tab-tabmenu-over');
    		scrollMenu.on('click', this.showTabsMenu, this);

    		this.scrollLeft.show = this.scrollLeft.show.createSequence(function() {
    			scrollMenu.show();
    		});

    		this.scrollLeft.hide = this.scrollLeft.hide.createSequence(function() {
    			scrollMenu.hide();
    		});

    	},
    	// public
    	getPageSize : function() {
    		return this.pageSize;
    	},
    	// public
    	setPageSize : function(pageSize) {
    		this.pageSize = pageSize;
    	},
    	// public
    	getMaxText : function() {
    		return this.maxText;
    	},
    	// public
    	setMaxText : function(t) {
    		this.maxText = t;
    	},
    	getMenuPrefixText : function() {
    		return this.menuPrefixText;
    	},
    	setMenuPrefixText : function(t) {
    		this.menuPrefixText = t;
    	},
    	// private && applied to the tab panel itself.
    	tabPanelMethods : {
    		// all execute within the scope of the tab panel
    		// private
    		showTabsMenu : function(e) {
    			if (! this.tabsMenu) {
    				this.tabsMenu =  new Ext.menu.Menu();
    				this.on('beforedestroy', this.tabsMenu.destroy, this.tabsMenu);
    			}

    			this.tabsMenu.removeAll();

    			this.generateTabMenuItems();

    			var target = Ext.get(e.getTarget());
    			var xy     = target.getXY();

    			//Y param + 24 pixels
    			xy[1] += 24;

    			this.tabsMenu.showAt(xy);
    		},
    		// private
    		generateTabMenuItems : function() {
    			var curActive  = this.getActiveTab();
    			var totalItems = this.items.getCount();
    			var pageSize   = this.tabScrollerMenu.getPageSize();

    			if (totalItems > pageSize)  {
    				var numSubMenus = Math.floor(totalItems / pageSize);
    				var remainder   = totalItems % pageSize;

    				// Loop through all of the items and create submenus in chunks of 10
    				for (var i = 0 ; i < numSubMenus; i++) {
    					var curPage = (i + 1) * pageSize;
    					var menuItems = [];

    					for (var x = 0; x < pageSize; x++) {
    						index = x + curPage - pageSize;
    						var item = this.items.get(index);
    						menuItems.push(this.autoGenMenuItem(item));
    					}

    					this.tabsMenu.add({
    						text : this.tabScrollerMenu.getMenuPrefixText() + ' '  + (curPage - pageSize + 1) + ' - ' + curPage,
    						menu : menuItems
    					});

    				}
    				// remaining items
    				if (remainder > 0) {
    					var start = numSubMenus * pageSize;
    					menuItems = [];
    					for (var i = start ; i < totalItems; i ++ ) {
    						var item = this.items.get(i);
    						menuItems.push(this.autoGenMenuItem(item));
    					}

    					this.tabsMenu.add({
    						text : this.tabScrollerMenu.menuPrefixText  + ' ' + (start + 1) + ' - ' + (start + menuItems.length),
    						menu : menuItems
    					});

    				}
    			}
    			else {
    				this.items.each(function(item) {
    					if (item.id != curActive.id && ! item.hidden) {
    						menuItems.push(this.autoGenMenuItem(item));
    					}
    				}, this);
    			}
    		},
    		// private
    		autoGenMenuItem : function(item) {
    			var maxText = this.tabScrollerMenu.getMaxText();
    			var text    = Ext.util.Format.ellipsis(item.title, maxText);

    			return {
    				text      : text,
    				handler   : this.showTabFromMenu,
    				scope     : this,
    				disabled  : item.disabled,
    				tabToShow : item,
    				iconCls   : item.iconCls
    			}

    		},
    		// private
    		showTabFromMenu : function(menuItem) {
    			this.setActiveTab(menuItem.tabToShow);
    		}
    	}
    });