(function () {
	var Dom = YAHOO.util.Dom,
		Event = YAHOO.util.Event;
	YAHOO.widget.MenuManager = function () {
		var m_bInitializedEventHandlers = false,
		m_oMenus = {},
		m_oVisibleMenus = {},
		m_oItems = {},
		m_oEventTypes = {
			"click": "clickEvent",
			"mousedown": "mouseDownEvent",
			"mouseup": "mouseUpEvent",
			"mouseover": "mouseOverEvent",
			"mouseout": "mouseOutEvent",
			"keydown": "keyDownEvent",
			"keyup": "keyUpEvent",
			"keypress": "keyPressEvent"
		},
		m_oFocusedMenuItem = null;
		function getMenuRootElement(p_oElement) {
			var oParentNode;
			if (p_oElement && p_oElement.tagName) {
				switch (p_oElement.tagName.toUpperCase()) {
				case "DIV":
					oParentNode = p_oElement.parentNode;
					if (
						(
							Dom.hasClass(p_oElement, "hd") ||
							Dom.hasClass(p_oElement, "bd") ||
							Dom.hasClass(p_oElement, "ft")
						) && 
						oParentNode && 
						oParentNode.tagName && 
						oParentNode.tagName.toUpperCase() == "DIV") 
					{
						return oParentNode;
					}
					else {
						return p_oElement;
					}
					break;
				case "LI":
					return p_oElement;
				default:
					oParentNode = p_oElement.parentNode;
					if (oParentNode) {
						return getMenuRootElement(oParentNode);
					}
					break;
				}
			}
		}
		function onDOMEvent(p_oEvent) {
			var oTarget = Event.getTarget(p_oEvent),
			oElement = getMenuRootElement(oTarget),
			sCustomEventType,
			sTagName,
			sId,
			oMenuItem,
			oMenu; 
			if (oElement) {
				sTagName = oElement.tagName.toUpperCase();
				if (sTagName == "LI") {
					sId = oElement.id;
					if (sId && m_oItems[sId]) {
						oMenuItem = m_oItems[sId];
						oMenu = oMenuItem.parent;
					}
				}
				else if (sTagName == "DIV") {
					if (oElement.id) {
						oMenu = m_oMenus[oElement.id];
					}
				}
			}
			if (oMenu) {
				sCustomEventType = m_oEventTypes[p_oEvent.type];
				if (oMenuItem && !oMenuItem.cfg.getProperty("disabled")) {
					oMenuItem[sCustomEventType].fire(p_oEvent);				   
					if (
							p_oEvent.type == "keyup" || 
							p_oEvent.type == "mousedown") 
					{
						if (m_oFocusedMenuItem != oMenuItem) {
							if (m_oFocusedMenuItem) {
								m_oFocusedMenuItem.blurEvent.fire();
							}
							oMenuItem.focusEvent.fire();
						}
					}
				}
				oMenu[sCustomEventType].fire(p_oEvent, oMenuItem);
			}
			else if (p_oEvent.type == "mousedown") {
				if (m_oFocusedMenuItem) {
					m_oFocusedMenuItem.blurEvent.fire();
					m_oFocusedMenuItem = null;
				}
				for (var i in m_oVisibleMenus) {
					if (YAHOO.lang.hasOwnProperty(m_oVisibleMenus, i)) {
						oMenu = m_oVisibleMenus[i];
						if (oMenu.cfg.getProperty("clicktohide") && 
							!(oMenu instanceof YAHOO.widget.MenuBar) && 
							oMenu.cfg.getProperty("position") == "dynamic") {
							oMenu.hide();
						}
						else {
							oMenu.clearActiveItem(true);
						}
					}
				} 
			}
			else if (p_oEvent.type == "keyup") { 
				if (m_oFocusedMenuItem) {
					m_oFocusedMenuItem.blurEvent.fire();
					m_oFocusedMenuItem = null;
				}
			}
		}
		function onMenuDestroy(p_sType, p_aArgs, p_oMenu) {
			if (m_oMenus[p_oMenu.id]) {
				this.removeMenu(p_oMenu);
			}
		}
		function onMenuFocus(p_sType, p_aArgs) {
			var oItem = p_aArgs[0];
			if (oItem) {
				m_oFocusedMenuItem = oItem;
			}
		}
		function onMenuBlur(p_sType, p_aArgs) {
			m_oFocusedMenuItem = null;
		}
		function onMenuVisibleConfigChange(p_sType, p_aArgs) {
			var bVisible = p_aArgs[0],
				sId = this.id;
			if (bVisible) {
				m_oVisibleMenus[sId] = this;
			}
			else if (m_oVisibleMenus[sId]) {
				delete m_oVisibleMenus[sId];
			}
		}
		function onItemDestroy(p_sType, p_aArgs) {
			removeItem(this);
		}
		function removeItem(p_oMenuItem) {
			var sId = p_oMenuItem.id;
			if (sId && m_oItems[sId]) {
				if (m_oFocusedMenuItem == p_oMenuItem) {
					m_oFocusedMenuItem = null;
				}
				delete m_oItems[sId];
				p_oMenuItem.destroyEvent.unsubscribe(onItemDestroy);
			}
		}
		function onItemAdded(p_sType, p_aArgs) {
			var oItem = p_aArgs[0],
				sId;
			if (oItem instanceof YAHOO.widget.MenuItem) { 
				sId = oItem.id;
				if (!m_oItems[sId]) {
					m_oItems[sId] = oItem;
					oItem.destroyEvent.subscribe(onItemDestroy);
				}
			}
		}
		return {
			addMenu: function (p_oMenu) {
				var oDoc;
				if (p_oMenu instanceof YAHOO.widget.Menu && p_oMenu.id && 
					!m_oMenus[p_oMenu.id]) {
					m_oMenus[p_oMenu.id] = p_oMenu;
					if (!m_bInitializedEventHandlers) {
						oDoc = document;
						Event.on(oDoc, "mouseover", onDOMEvent, this, true);
						Event.on(oDoc, "mouseout", onDOMEvent, this, true);
						Event.on(oDoc, "mousedown", onDOMEvent, this, true);
						Event.on(oDoc, "mouseup", onDOMEvent, this, true);
						Event.on(oDoc, "click", onDOMEvent, this, true);
						Event.on(oDoc, "keydown", onDOMEvent, this, true);
						Event.on(oDoc, "keyup", onDOMEvent, this, true);
						Event.on(oDoc, "keypress", onDOMEvent, this, true);
						m_bInitializedEventHandlers = true;
					}
					p_oMenu.cfg.subscribeToConfigEvent("visible", 
						onMenuVisibleConfigChange);
					p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, 
											this);
					p_oMenu.itemAddedEvent.subscribe(onItemAdded);
					p_oMenu.focusEvent.subscribe(onMenuFocus);
					p_oMenu.blurEvent.subscribe(onMenuBlur);
				}
			},
			removeMenu: function (p_oMenu) {
				var sId,
					aItems,
					i;
				if (p_oMenu) {
					sId = p_oMenu.id;
					if (m_oMenus[sId] == p_oMenu) {
						aItems = p_oMenu.getItems();
						if (aItems && aItems.length > 0) {
							i = aItems.length - 1;
							do {
								removeItem(aItems[i]);
							}
							while (i--);
						}
						delete m_oMenus[sId];
						if (m_oVisibleMenus[sId] == p_oMenu) {
							delete m_oVisibleMenus[sId];
	   
						}
						if (p_oMenu.cfg) {
							p_oMenu.cfg.unsubscribeFromConfigEvent("visible", 
								onMenuVisibleConfigChange);
						}
						p_oMenu.destroyEvent.unsubscribe(onMenuDestroy, 
							p_oMenu);
						p_oMenu.itemAddedEvent.unsubscribe(onItemAdded);
						p_oMenu.focusEvent.unsubscribe(onMenuFocus);
						p_oMenu.blurEvent.unsubscribe(onMenuBlur);
					}
				}
			},
			hideVisible: function () {
				var oMenu;
				for (var i in m_oVisibleMenus) {
					if (YAHOO.lang.hasOwnProperty(m_oVisibleMenus, i)) {
						oMenu = m_oVisibleMenus[i];
						if (!(oMenu instanceof YAHOO.widget.MenuBar) && 
							oMenu.cfg.getProperty("position") == "dynamic") {
							oMenu.hide();
						}
					}
				}
			},
			getVisible: function () {
				return m_oVisibleMenus;
			},
			getMenus: function () {
				return m_oMenus;
			},
						getMenu: function (p_sId) {
				var oMenu = m_oMenus[p_sId];
				if (oMenu) {
					return oMenu;
				}
			},
						getMenuItem: function (p_sId) {
				var oItem = m_oItems[p_sId];
				if (oItem) {
					return oItem;
				}
			},
			getMenuItemGroup: function (p_sId) {
				var oUL = Dom.get(p_sId),
					aItems,
					oNode,
					oItem,
					sId;
				if (oUL && oUL.tagName && 
					oUL.tagName.toUpperCase() == "UL") {
					oNode = oUL.firstChild;
					if (oNode) {
						aItems = [];
						do {
							sId = oNode.id;
							if (sId) {
								oItem = this.getMenuItem(sId);
								if (oItem) {
									aItems[aItems.length] = oItem;
								}
							}
						}
						while ((oNode = oNode.nextSibling));
						if (aItems.length > 0) {
							return aItems;
						}
					}
				}
			},
			getFocusedMenuItem: function () {
				return m_oFocusedMenuItem;
			},
			getFocusedMenu: function () {
				if (m_oFocusedMenuItem) {
					return (m_oFocusedMenuItem.parent.getRoot());
				}
			},
			toString: function () {
				return "MenuManager";
			}
		};
	}();
})();
(function () {
YAHOO.widget.Menu = function (p_oElement, p_oConfig) {
	if (p_oConfig) {
		this.parent = p_oConfig.parent;
		this.lazyLoad = p_oConfig.lazyLoad || p_oConfig.lazyload;
		this.itemData = p_oConfig.itemData || p_oConfig.itemdata;
	}
	YAHOO.widget.Menu.superclass.constructor.call(this, p_oElement, p_oConfig);
};
function checkPosition(p_sPosition) {
	if (typeof p_sPosition == "string") {
		return ("dynamic,static".indexOf((p_sPosition.toLowerCase())) != -1);
	}
}
var Dom = YAHOO.util.Dom,
	Event = YAHOO.util.Event,
	Module = YAHOO.widget.Module,
	Overlay = YAHOO.widget.Overlay,
	Menu = YAHOO.widget.Menu,
	MenuManager = YAHOO.widget.MenuManager,
	CustomEvent = YAHOO.util.CustomEvent,
	Lang = YAHOO.lang,
	UA = YAHOO.env.ua,
	m_oShadowTemplate,
	EVENT_TYPES = {
		"MOUSE_OVER": "mouseover",
		"MOUSE_OUT": "mouseout",
		"MOUSE_DOWN": "mousedown",
		"MOUSE_UP": "mouseup",
		"CLICK": "click",
		"KEY_PRESS": "keypress",
		"KEY_DOWN": "keydown",
		"KEY_UP": "keyup",
		"FOCUS": "focus",
		"BLUR": "blur",
		"ITEM_ADDED": "itemAdded",
		"ITEM_REMOVED": "itemRemoved"
	},
	DEFAULT_CONFIG = {
		"VISIBLE": { 
			key: "visible", 
			value: false, 
			validator: Lang.isBoolean
		}, 
		"CONSTRAIN_TO_VIEWPORT": {
			key: "constraintoviewport", 
			value: true, 
			validator: Lang.isBoolean, 
			supercedes: ["iframe","x","y","xy"]
		}, 
		"POSITION": { 
			key: "position", 
			value: "dynamic", 
			validator: checkPosition, 
			supercedes: ["visible", "iframe"]
		}, 
		"SUBMENU_ALIGNMENT": { 
			key: "submenualignment", 
			value: ["tl","tr"],
			suppressEvent: true
		},
		"AUTO_SUBMENU_DISPLAY": { 
			key: "autosubmenudisplay", 
			value: true, 
			validator: Lang.isBoolean,
			suppressEvent: true
		}, 
		"SHOW_DELAY": { 
			key: "showdelay", 
			value: 250, 
			validator: Lang.isNumber, 
			suppressEvent: true
		}, 
		"HIDE_DELAY": { 
			key: "hidedelay", 
			value: 0, 
			validator: Lang.isNumber, 
			suppressEvent: true
		}, 
		"SUBMENU_HIDE_DELAY": { 
			key: "submenuhidedelay", 
			value: 250, 
			validator: Lang.isNumber,
			suppressEvent: true
		}, 
		"CLICK_TO_HIDE": { 
			key: "clicktohide", 
			value: true, 
			validator: Lang.isBoolean,
			suppressEvent: true
		},
		"CONTAINER": { 
			key: "container",
			suppressEvent: true
		}, 
		"SCROLL_INCREMENT": { 
			key: "scrollincrement", 
			value: 1, 
			validator: Lang.isNumber,
			supercedes: ["maxheight"],
			suppressEvent: true
		},
		"MIN_SCROLL_HEIGHT": { 
			key: "minscrollheight", 
			value: 90, 
			validator: Lang.isNumber,
			supercedes: ["maxheight"],
			suppressEvent: true
		},
		"MAX_HEIGHT": { 
			key: "maxheight", 
			value: 0, 
			validator: Lang.isNumber,
			supercedes: ["iframe"],
			suppressEvent: true
		}, 
		"CLASS_NAME": { 
			key: "classname", 
			value: null, 
			validator: Lang.isString,
			suppressEvent: true
		}, 
		"DISABLED": { 
			key: "disabled", 
			value: false, 
			validator: Lang.isBoolean,
			suppressEvent: true
		}
	};
YAHOO.lang.extend(Menu, Overlay, {
// Constants
CSS_CLASS_NAME: "yuimenu",
ITEM_TYPE: null,
GROUP_TITLE_TAG_NAME: "h6",
OFF_SCREEN_POSITION: [-10000, -10000],
// Private properties
_nHideDelayId: null,
_nShowDelayId: null,
_nSubmenuHideDelayId: null,
_nBodyScrollId: null,
_bHideDelayEventHandlersAssigned: false,
_bHandledMouseOverEvent: false,
_bHandledMouseOutEvent: false,
_aGroupTitleElements: null,
_aItemGroups: null,
_aListElements: null,
_nCurrentMouseX: 0,
_bStopMouseEventHandlers: false,
_sClassName: null,
// Public properties
lazyLoad: false,
itemData: null,
activeItem: null,
parent: null,
srcElement: null,
// Events
mouseOverEvent: null,
mouseOutEvent: null,
mouseDownEvent: null,
mouseUpEvent: null,
clickEvent: null,
keyPressEvent: null,
keyDownEvent: null,
keyUpEvent: null,
itemAddedEvent: null,
itemRemovedEvent: null,
init: function (p_oElement, p_oConfig) {
	this._aItemGroups = [];
	this._aListElements = [];
	this._aGroupTitleElements = [];
	if (!this.ITEM_TYPE) {
		this.ITEM_TYPE = YAHOO.widget.MenuItem;
	}
	var oElement;
	if (typeof p_oElement == "string") {
		oElement = document.getElementById(p_oElement);
	}
	else if (p_oElement.tagName) {
		oElement = p_oElement;
	}
	if (oElement && oElement.tagName) {
		switch(oElement.tagName.toUpperCase()) {
			case "DIV":
				this.srcElement = oElement;
				if (!oElement.id) {
					oElement.setAttribute("id", Dom.generateId());
				}
				Menu.superclass.init.call(this, oElement);
				this.beforeInitEvent.fire(Menu);
			break;
			case "SELECT":
				this.srcElement = oElement;
				Menu.superclass.init.call(this, Dom.generateId());
				this.beforeInitEvent.fire(Menu);
			break;
		}
	}
	else {
		Menu.superclass.init.call(this, p_oElement);
		this.beforeInitEvent.fire(Menu);
	}
	if (this.element) {
		Dom.addClass(this.element, this.CSS_CLASS_NAME);

		this.initEvent.subscribe(this._onInit);
		this.beforeRenderEvent.subscribe(this._onBeforeRender);
		this.renderEvent.subscribe(this._onRender);
		this.renderEvent.subscribe(this.onRender);
		this.beforeShowEvent.subscribe(this._onBeforeShow);
		this.hideEvent.subscribe(this.positionOffScreen);
		this.showEvent.subscribe(this._onShow);
		this.beforeHideEvent.subscribe(this._onBeforeHide);
		this.mouseOverEvent.subscribe(this._onMouseOver);
		this.mouseOutEvent.subscribe(this._onMouseOut);
		this.clickEvent.subscribe(this._onClick);
		this.keyDownEvent.subscribe(this._onKeyDown);
		this.keyPressEvent.subscribe(this._onKeyPress);
		if (UA.gecko || UA.webkit) {
			this.cfg.subscribeToConfigEvent("y", this._onYChange);
		}
		if (p_oConfig) {
			this.cfg.applyConfig(p_oConfig, true);
		}

		MenuManager.addMenu(this);
		this.initEvent.fire(Menu);
	}
},
// Private methods
_initSubTree: function () {
	var oSrcElement = this.srcElement,
		sSrcElementTagName,
		nGroup,
		sGroupTitleTagName,
		oNode,
		aListElements,
		nListElements,
		i;
	if (oSrcElement) {
		sSrcElementTagName = 
			(oSrcElement.tagName && oSrcElement.tagName.toUpperCase());
		if (sSrcElementTagName == "DIV") {
			oNode = this.body.firstChild;
			if (oNode) {
				nGroup = 0;
				sGroupTitleTagName = this.GROUP_TITLE_TAG_NAME.toUpperCase();
				do {
					if (oNode && oNode.tagName) {
						switch (oNode.tagName.toUpperCase()) {
							case sGroupTitleTagName:
								this._aGroupTitleElements[nGroup] = oNode;
							break;
							case "UL":
								this._aListElements[nGroup] = oNode;
								this._aItemGroups[nGroup] = [];
								nGroup++;
							break;
						}
					}
				}
				while ((oNode = oNode.nextSibling));
				if (this._aListElements[0]) {
					Dom.addClass(this._aListElements[0], "first-of-type");
				}
			}
		}
		oNode = null;
		if (sSrcElementTagName) {
			switch (sSrcElementTagName) {
				case "DIV":
					aListElements = this._aListElements;
					nListElements = aListElements.length;
					if (nListElements > 0) {
						i = nListElements - 1;
						do {
							oNode = aListElements[i].firstChild;
							if (oNode) {
								do {
									if (oNode && oNode.tagName && 
										oNode.tagName.toUpperCase() == "LI") {
										this.addItem(new this.ITEM_TYPE(oNode, 
													{ parent: this }), i);
									}
								}
								while ((oNode = oNode.nextSibling));
							}
						}
						while (i--);
					}
				break;
				case "SELECT":
					oNode = oSrcElement.firstChild;
					do {
						if (oNode && oNode.tagName) {
							switch (oNode.tagName.toUpperCase()) {
								case "OPTGROUP":
								case "OPTION":
									this.addItem(
											new this.ITEM_TYPE(
													oNode, 
													{ parent: this }
												)
											);
								break;
							}
						}
					}
					while ((oNode = oNode.nextSibling));
				break;
			}
		}
	}
},
_getFirstEnabledItem: function () {
	var aItems = this.getItems(),
		nItems = aItems.length,
		oItem;
	for(var i=0; i<nItems; i++) {
		oItem = aItems[i];
		if (oItem && !oItem.cfg.getProperty("disabled") && 
			oItem.element.style.display != "none") {
			return oItem;
		}
	}
},
_addItemToGroup: function (p_nGroupIndex, p_oItem, p_nItemIndex) {
	var oItem,
		nGroupIndex,
		aGroup,
		oGroupItem,
		bAppend,
		oNextItemSibling,
		nItemIndex;
	function getNextItemSibling(p_aArray, p_nStartIndex) {
		return (p_aArray[p_nStartIndex] || getNextItemSibling(p_aArray, 
				(p_nStartIndex+1)));
	}
	if (p_oItem instanceof this.ITEM_TYPE) {
		oItem = p_oItem;
		oItem.parent = this;
	}
	else if (typeof p_oItem == "string") {
		oItem = new this.ITEM_TYPE(p_oItem, { parent: this });
	}
	else if (typeof p_oItem == "object") {
		p_oItem.parent = this;
		oItem = new this.ITEM_TYPE(p_oItem.text, p_oItem);
	}
	if (oItem) {
		if (oItem.cfg.getProperty("selected")) {
			this.activeItem = oItem;
		}
		nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
		aGroup = this._getItemGroup(nGroupIndex);
		if (!aGroup) {
			aGroup = this._createItemGroup(nGroupIndex);
		}
		if (typeof p_nItemIndex == "number") {
			bAppend = (p_nItemIndex >= aGroup.length);
			if (aGroup[p_nItemIndex]) {
				aGroup.splice(p_nItemIndex, 0, oItem);
			}
			else {
				aGroup[p_nItemIndex] = oItem;
			}
			oGroupItem = aGroup[p_nItemIndex];
			if (oGroupItem) {
				if (bAppend && (!oGroupItem.element.parentNode || 
						oGroupItem.element.parentNode.nodeType == 11)) {
					this._aListElements[nGroupIndex].appendChild(
						oGroupItem.element);
				}
				else {
					oNextItemSibling = getNextItemSibling(aGroup, 
						(p_nItemIndex+1));
					if (oNextItemSibling && (!oGroupItem.element.parentNode || 
							oGroupItem.element.parentNode.nodeType == 11)) {
						this._aListElements[nGroupIndex].insertBefore(
								oGroupItem.element, 
								oNextItemSibling.element);
					}
				}
				oGroupItem.parent = this;
				this._subscribeToItemEvents(oGroupItem);
				this._configureSubmenu(oGroupItem);
				this._updateItemProperties(nGroupIndex);
				this.itemAddedEvent.fire(oGroupItem);
				this.changeContentEvent.fire();
				return oGroupItem;
			}
		}
		else {
			nItemIndex = aGroup.length;
			aGroup[nItemIndex] = oItem;
			oGroupItem = aGroup[nItemIndex];
			if (oGroupItem) {
				if (!Dom.isAncestor(this._aListElements[nGroupIndex], 
						oGroupItem.element)) {
					this._aListElements[nGroupIndex].appendChild(
						oGroupItem.element);
				}
				oGroupItem.element.setAttribute("groupindex", nGroupIndex);
				oGroupItem.element.setAttribute("index", nItemIndex);
				oGroupItem.parent = this;
				oGroupItem.index = nItemIndex;
				oGroupItem.groupIndex = nGroupIndex;
				this._subscribeToItemEvents(oGroupItem);
				this._configureSubmenu(oGroupItem);
				if (nItemIndex === 0) {
					Dom.addClass(oGroupItem.element, "first-of-type");
				}
				this.itemAddedEvent.fire(oGroupItem);
				this.changeContentEvent.fire();
				return oGroupItem;
			}
		}
	}
},
_removeItemFromGroupByIndex: function (p_nGroupIndex, p_nItemIndex) {
	var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0,
		aGroup = this._getItemGroup(nGroupIndex),
		aArray,
		oItem,
		oUL;
	if (aGroup) {
		aArray = aGroup.splice(p_nItemIndex, 1);
		oItem = aArray[0];
		if (oItem) {
			this._updateItemProperties(nGroupIndex);
			if (aGroup.length === 0) {
				oUL = this._aListElements[nGroupIndex];
				if (this.body && oUL) {
					this.body.removeChild(oUL);
				}
				this._aItemGroups.splice(nGroupIndex, 1);

				this._aListElements.splice(nGroupIndex, 1);
				oUL = this._aListElements[0];
				if (oUL) {
					Dom.addClass(oUL, "first-of-type");
				}
			}
			this.itemRemovedEvent.fire(oItem);
			this.changeContentEvent.fire();
			return oItem;
		}
	}
},
_removeItemFromGroupByValue: function (p_nGroupIndex, p_oItem) {
	var aGroup = this._getItemGroup(p_nGroupIndex),
		nItems,
		nItemIndex,
		i;
	if (aGroup) {
		nItems = aGroup.length;
		nItemIndex = -1;
		if (nItems > 0) {
			i = nItems-1;
			do {
				if (aGroup[i] == p_oItem) {
					nItemIndex = i;
					break;
				}
			}
			while(i--);
			if (nItemIndex > -1) {
				return (this._removeItemFromGroupByIndex(p_nGroupIndex, 
							nItemIndex));
			}
		}
	}
},
_updateItemProperties: function (p_nGroupIndex) {
	var aGroup = this._getItemGroup(p_nGroupIndex),
		nItems = aGroup.length,
		oItem,
		oLI,
		i;
	if (nItems > 0) {
		i = nItems - 1;
		do {
			oItem = aGroup[i];
			if (oItem) {
				oLI = oItem.element;
				oItem.index = i;
				oItem.groupIndex = p_nGroupIndex;
				oLI.setAttribute("groupindex", p_nGroupIndex);
				oLI.setAttribute("index", i);
				Dom.removeClass(oLI, "first-of-type");
			}
		}
		while(i--);
		if (oLI) {
			Dom.addClass(oLI, "first-of-type");
		}
	}
},
_createItemGroup: function (p_nIndex) {
	var oUL;
	if (!this._aItemGroups[p_nIndex]) {
		this._aItemGroups[p_nIndex] = [];
		oUL = document.createElement("ul");
		this._aListElements[p_nIndex] = oUL;
		return this._aItemGroups[p_nIndex];
	}
},
_getItemGroup: function (p_nIndex) {
	var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0);
	return this._aItemGroups[nIndex];
},
_configureSubmenu: function (p_oItem) {
	var oSubmenu = p_oItem.cfg.getProperty("submenu");
	if (oSubmenu) {
		this.cfg.configChangedEvent.subscribe(this._onParentMenuConfigChange, 
				oSubmenu, true);
		this.renderEvent.subscribe(this._onParentMenuRender, oSubmenu, true);
		oSubmenu.beforeShowEvent.subscribe(this._onSubmenuBeforeShow);
	}
},

_subscribeToItemEvents: function (p_oItem) {
	p_oItem.focusEvent.subscribe(this._onMenuItemFocus);
	p_oItem.blurEvent.subscribe(this._onMenuItemBlur);
	p_oItem.destroyEvent.subscribe(this._onMenuItemDestroy, p_oItem, this);
	p_oItem.cfg.configChangedEvent.subscribe(this._onMenuItemConfigChange,
		p_oItem, this);
},
_onVisibleChange: function (p_sType, p_aArgs) {
	var bVisible = p_aArgs[0];
	if (bVisible) {
		Dom.addClass(this.element, "visible");
	}
	else {
		Dom.removeClass(this.element, "visible");
	}
},
_cancelHideDelay: function () {
	var oRoot = this.getRoot();
	if (oRoot._nHideDelayId) {
		window.clearTimeout(oRoot._nHideDelayId);
	}
},
_execHideDelay: function () {
	this._cancelHideDelay();
	var oRoot = this.getRoot(),
		me = this;
	function hideMenu() {
		if (oRoot.activeItem) {
			oRoot.clearActiveItem();
		}
		if (oRoot == me && !(me instanceof YAHOO.widget.MenuBar) && 
			me.cfg.getProperty("position") == "dynamic") {
			me.hide();
		}
	}
	oRoot._nHideDelayId = 
		window.setTimeout(hideMenu, oRoot.cfg.getProperty("hidedelay"));
},
_cancelShowDelay: function () {
	var oRoot = this.getRoot();
	if (oRoot._nShowDelayId) {
		window.clearTimeout(oRoot._nShowDelayId);
	}
},
_execShowDelay: function (p_oMenu) {
	var oRoot = this.getRoot();
	function showMenu() {
		if (p_oMenu.parent.cfg.getProperty("selected")) {
			p_oMenu.show();
		}
	}
	oRoot._nShowDelayId = 
		window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay"));
},
_execSubmenuHideDelay: function (p_oSubmenu, p_nMouseX, p_nHideDelay) {
	var me = this;
	p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () {
		if (me._nCurrentMouseX > (p_nMouseX + 10)) {
			p_oSubmenu._nSubmenuHideDelayId = window.setTimeout(function () {
				p_oSubmenu.hide();
			}, p_nHideDelay);
		}
		else {
			p_oSubmenu.hide();
		}
	}, 50);
},
// Protected methods
_disableScrollHeader: function () {
	if (!this._bHeaderDisabled) {
		Dom.addClass(this.header, "topscrollbar_disabled");
		this._bHeaderDisabled = true;
	}
},
_disableScrollFooter: function () {
	if (!this._bFooterDisabled) {
		Dom.addClass(this.footer, "bottomscrollbar_disabled");
		this._bFooterDisabled = true;
	}
},
_enableScrollHeader: function () {
	if (this._bHeaderDisabled) {
		Dom.removeClass(this.header, "topscrollbar_disabled");
		this._bHeaderDisabled = false;
	}
},
_enableScrollFooter: function () {
	if (this._bFooterDisabled) {
		Dom.removeClass(this.footer, "bottomscrollbar_disabled");
		this._bFooterDisabled = false;
	}
},
_onMouseOver: function (p_sType, p_aArgs) {
	if (this._bStopMouseEventHandlers) {
		return false;
	}
	var oEvent = p_aArgs[0],
		oItem = p_aArgs[1],
		oTarget = Event.getTarget(oEvent),
		oParentMenu,
		nShowDelay,
		bShowDelay,
		oActiveItem,
		oItemCfg,
		oSubmenu;
	if (!this._bHandledMouseOverEvent && (oTarget == this.element || 
		Dom.isAncestor(this.element, oTarget))) {
		this._nCurrentMouseX = 0;
		Event.on(this.element, "mousemove", this._onMouseMove, this, true);
		if (!Dom.isAncestor(oItem.element, Event.getRelatedTarget(oEvent))) {
			this.clearActiveItem();
		}
		if (this.parent && this._nSubmenuHideDelayId) {
			window.clearTimeout(this._nSubmenuHideDelayId);
			this.parent.cfg.setProperty("selected", true);
			oParentMenu = this.parent.parent;
			oParentMenu._bHandledMouseOutEvent = true;
			oParentMenu._bHandledMouseOverEvent = false;
		}
		this._bHandledMouseOverEvent = true;
		this._bHandledMouseOutEvent = false;
	}
	if (oItem && !oItem.handledMouseOverEvent && 
		!oItem.cfg.getProperty("disabled") && 
		(oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget))) {
		nShowDelay = this.cfg.getProperty("showdelay");
		bShowDelay = (nShowDelay > 0);
		if (bShowDelay) {
			this._cancelShowDelay();
		}
		oActiveItem = this.activeItem;
		if (oActiveItem) {
			oActiveItem.cfg.setProperty("selected", false);
		}
		oItemCfg = oItem.cfg;
		oItemCfg.setProperty("selected", true);
		if (this.hasFocus()) {
			oItem.focus();
		}
		if (this.cfg.getProperty("autosubmenudisplay")) {
			oSubmenu = oItemCfg.getProperty("submenu");
			if (oSubmenu) {
				if (bShowDelay) {
					this._execShowDelay(oSubmenu);
				}
				else {
					oSubmenu.show();
				}
			}
		}
		oItem.handledMouseOverEvent = true;
		oItem.handledMouseOutEvent = false;
	}
},
_onMouseOut: function (p_sType, p_aArgs) {
	if (this._bStopMouseEventHandlers) {
		return false;
	}
	var oEvent = p_aArgs[0],
		oItem = p_aArgs[1],
		oRelatedTarget = Event.getRelatedTarget(oEvent),
		bMovingToSubmenu = false,
		oItemCfg,
		oSubmenu,
		nSubmenuHideDelay,
		nShowDelay;
	if (oItem && !oItem.cfg.getProperty("disabled")) {
		oItemCfg = oItem.cfg;
		oSubmenu = oItemCfg.getProperty("submenu");
		if (oSubmenu && (oRelatedTarget == oSubmenu.element ||
				Dom.isAncestor(oSubmenu.element, oRelatedTarget))) {
			bMovingToSubmenu = true;
		}
		if (!oItem.handledMouseOutEvent && ((oRelatedTarget != oItem.element &&  
			!Dom.isAncestor(oItem.element, oRelatedTarget)) || 
			bMovingToSubmenu)) {
			if (!bMovingToSubmenu) {
				oItem.cfg.setProperty("selected", false);
				if (oSubmenu) {
					nSubmenuHideDelay = 
						this.cfg.getProperty("submenuhidedelay");
					nShowDelay = this.cfg.getProperty("showdelay");
					if (!(this instanceof YAHOO.widget.MenuBar) && 
						nSubmenuHideDelay > 0 && 
						nShowDelay >= nSubmenuHideDelay) {
						this._execSubmenuHideDelay(oSubmenu, 
								Event.getPageX(oEvent),
								nSubmenuHideDelay);
					}
					else {
						oSubmenu.hide();
					}
				}
			}
			oItem.handledMouseOutEvent = true;
			oItem.handledMouseOverEvent = false;
		}
	}
	if (!this._bHandledMouseOutEvent && ((oRelatedTarget != this.element &&  
		!Dom.isAncestor(this.element, oRelatedTarget)) || bMovingToSubmenu)) {
		Event.removeListener(this.element, "mousemove", this._onMouseMove);
		this._nCurrentMouseX = Event.getPageX(oEvent);
		this._bHandledMouseOutEvent = true;
		this._bHandledMouseOverEvent = false;
	}
},
_onMouseMove: function (p_oEvent, p_oMenu) {
	if (this._bStopMouseEventHandlers) {
		return false;
	}
	this._nCurrentMouseX = Event.getPageX(p_oEvent);
},
_onClick: function (p_sType, p_aArgs) {
	var Event = YAHOO.util.Event,
		Dom = YAHOO.util.Dom,
		oEvent = p_aArgs[0],
		oItem = p_aArgs[1],
		oSubmenu,
		bInMenuAnchor = false,
		oRoot,
		sId,
		sURL,
		nHashPos,
		nLen;
	if (oItem) {
		if (oItem.cfg.getProperty("disabled")) {
			Event.preventDefault(oEvent);
		}
		else {
			oSubmenu = oItem.cfg.getProperty("submenu");
			sURL = oItem.cfg.getProperty("url");
			if (sURL) {
				nHashPos = sURL.indexOf("#");
				nLen = sURL.length;
				if (nHashPos != -1) {
					sURL = sURL.substr(nHashPos, nLen);
					nLen = sURL.length;
					if (nLen > 1) {
						sId = sURL.substr(1, nLen);
						bInMenuAnchor = Dom.isAncestor(this.element, sId);
					}
					else if (nLen === 1) {
						bInMenuAnchor = true;
					}
				}
			}
			if (bInMenuAnchor && !oItem.cfg.getProperty("target")) {
				Event.preventDefault(oEvent);
				oItem.focus();
			}
			if (!oSubmenu) {
				oRoot = this.getRoot();
				if (oRoot instanceof YAHOO.widget.MenuBar || 
					oRoot.cfg.getProperty("position") == "static") {
					oRoot.clearActiveItem();
				}
				else {
					oRoot.hide();
				}
			}
		}
	}
},
_onKeyDown: function (p_sType, p_aArgs) {
	var oEvent = p_aArgs[0],
		oItem = p_aArgs[1],
		me = this,
		oSubmenu,
		oItemCfg,
		oParentItem,
		oRoot,
		oNextItem,
		oBody,
		nBodyScrollTop,
		nBodyOffsetHeight,
		aItems,
		nItems,
		nNextItemOffsetTop,
		nScrollTarget,
		oParentMenu;
	function stopMouseEventHandlers() {
		me._bStopMouseEventHandlers = true;
		window.setTimeout(function () {
			me._bStopMouseEventHandlers = false;
		}, 10);
	}
	if (oItem && !oItem.cfg.getProperty("disabled")) {
		oItemCfg = oItem.cfg;
		oParentItem = this.parent;
		switch(oEvent.keyCode) {
			case 38:
			case 40:
				oNextItem = (oEvent.keyCode == 38) ? 
					oItem.getPreviousEnabledSibling() : 
					oItem.getNextEnabledSibling();
				if (oNextItem) {
					this.clearActiveItem();
					oNextItem.cfg.setProperty("selected", true);
					oNextItem.focus();
					if (this.cfg.getProperty("maxheight") > 0) {
						oBody = this.body;
						nBodyScrollTop = oBody.scrollTop;
						nBodyOffsetHeight = oBody.offsetHeight;
						aItems = this.getItems();
						nItems = aItems.length - 1;
						nNextItemOffsetTop = oNextItem.element.offsetTop;
						if (oEvent.keyCode == 40 ) {
					   
							if (nNextItemOffsetTop >= (nBodyOffsetHeight + nBodyScrollTop)) {
								oBody.scrollTop = nNextItemOffsetTop - nBodyOffsetHeight;
							}
							else if (nNextItemOffsetTop <= nBodyScrollTop) {
								oBody.scrollTop = 0;
							}
							if (oNextItem == aItems[nItems]) {
								oBody.scrollTop = oNextItem.element.offsetTop;
							}
						}
						else {  // Up
							if (nNextItemOffsetTop <= nBodyScrollTop) {
								oBody.scrollTop = nNextItemOffsetTop - oNextItem.element.offsetHeight;
							}
							else if (nNextItemOffsetTop >= (nBodyScrollTop + nBodyOffsetHeight)) {
								oBody.scrollTop = nNextItemOffsetTop;
							}
							if (oNextItem == aItems[0]) {
								oBody.scrollTop = 0;
							}
						}
						nBodyScrollTop = oBody.scrollTop;
						nScrollTarget = oBody.scrollHeight - oBody.offsetHeight;
						if (nBodyScrollTop === 0) {
							this._disableScrollHeader();
							this._enableScrollFooter();
						}
						else if (nBodyScrollTop == nScrollTarget) {
							 this._enableScrollHeader();
							 this._disableScrollFooter();
						}
						else {
							this._enableScrollHeader();
							this._enableScrollFooter();
						}
					}
				}
				Event.preventDefault(oEvent);
				stopMouseEventHandlers();
			break;
			case 39:
				oSubmenu = oItemCfg.getProperty("submenu");
				if (oSubmenu) {
					if (!oItemCfg.getProperty("selected")) {
						oItemCfg.setProperty("selected", true);
					}
					oSubmenu.show();
					oSubmenu.setInitialFocus();
					oSubmenu.setInitialSelection();
				}
				else {
					oRoot = this.getRoot();
					if (oRoot instanceof YAHOO.widget.MenuBar) {
						oNextItem = oRoot.activeItem.getNextEnabledSibling();
						if (oNextItem) {
							oRoot.clearActiveItem();
							oNextItem.cfg.setProperty("selected", true);
							oSubmenu = oNextItem.cfg.getProperty("submenu");
							if (oSubmenu) {
								oSubmenu.show();
							}
							oNextItem.focus();
						}
					}
				}
				Event.preventDefault(oEvent);
				stopMouseEventHandlers();
			break;
			case 37:
				if (oParentItem) {
					oParentMenu = oParentItem.parent;
					if (oParentMenu instanceof YAHOO.widget.MenuBar) {
						oNextItem = 
							oParentMenu.activeItem.getPreviousEnabledSibling();
						if (oNextItem) {
							oParentMenu.clearActiveItem();
							oNextItem.cfg.setProperty("selected", true);
							oSubmenu = oNextItem.cfg.getProperty("submenu");
							if (oSubmenu) {
								oSubmenu.show();
							}
							oNextItem.focus();
						} 
					}
					else {
						this.hide();
						oParentItem.focus();
					}
				}
				Event.preventDefault(oEvent);
				stopMouseEventHandlers();
			break;
		}
	}
	if (oEvent.keyCode == 27) { // Esc key
		if (this.cfg.getProperty("position") == "dynamic") {
			this.hide();
			if (this.parent) {
				this.parent.focus();
			}
		}
		else if (this.activeItem) {
			oSubmenu = this.activeItem.cfg.getProperty("submenu");
			if (oSubmenu && oSubmenu.cfg.getProperty("visible")) {
				oSubmenu.hide();
				this.activeItem.focus();
			}
			else {
				this.activeItem.blur();
				this.activeItem.cfg.setProperty("selected", false);
			}
		}
		Event.preventDefault(oEvent);
	}
},
_onKeyPress: function (p_sType, p_aArgs) {
	var oEvent = p_aArgs[0];
	if (oEvent.keyCode == 40 || oEvent.keyCode == 38) {
		Event.preventDefault(oEvent);
	}
},
_onYChange: function (p_sType, p_aArgs) {
	var oParent = this.parent,
		nScrollTop,
		oIFrame,
		nY;
	if (oParent) {
		nScrollTop = oParent.parent.body.scrollTop;
		if (nScrollTop > 0) {
			nY = (this.cfg.getProperty("y") - nScrollTop);
			Dom.setY(this.element, nY);
			oIFrame = this.iframe;
			if (oIFrame) {
				Dom.setY(oIFrame, nY);
			}
			this.cfg.setProperty("y", nY, true);
		}
	}
},
_onScrollTargetMouseOver: function (p_oEvent, p_oMenu) {
	this._cancelHideDelay();
	var oTarget = Event.getTarget(p_oEvent),
		oBody = this.body,
		me = this,
		nScrollIncrement = this.cfg.getProperty("scrollincrement"),
		nScrollTarget,
		fnScrollFunction;
	function scrollBodyDown() {
		var nScrollTop = oBody.scrollTop;
		if (nScrollTop < nScrollTarget) {
			oBody.scrollTop = (nScrollTop + nScrollIncrement);
			me._enableScrollHeader();
		}
		else {
			oBody.scrollTop = nScrollTarget;
			window.clearInterval(me._nBodyScrollId);
			me._disableScrollFooter();
		}
	}
	function scrollBodyUp() {
		var nScrollTop = oBody.scrollTop;
		if (nScrollTop > 0) {
			oBody.scrollTop = (nScrollTop - nScrollIncrement);
			me._enableScrollFooter();
		}
		else {
			oBody.scrollTop = 0;
			window.clearInterval(me._nBodyScrollId);
			me._disableScrollHeader();
		}
	}
	if (Dom.hasClass(oTarget, "hd")) {
		fnScrollFunction = scrollBodyUp;
	}
	else {
		nScrollTarget = oBody.scrollHeight - oBody.offsetHeight;
		fnScrollFunction = scrollBodyDown;
	}
	this._nBodyScrollId = window.setInterval(fnScrollFunction, 10);
},
_onScrollTargetMouseOut: function (p_oEvent, p_oMenu) {
	window.clearInterval(this._nBodyScrollId);
	this._cancelHideDelay();
},
// Private methods
_onInit: function (p_sType, p_aArgs) {
	this.cfg.subscribeToConfigEvent("visible", this._onVisibleChange);
	var bRootMenu = !this.parent,
		bLazyLoad = this.lazyLoad;

	if (((bRootMenu && !bLazyLoad) || 
		(bRootMenu && (this.cfg.getProperty("visible") || 
		this.cfg.getProperty("position") == "static")) || 
		(!bRootMenu && !bLazyLoad)) && this.getItemGroups().length === 0) {
		if (this.srcElement) {
			this._initSubTree();
		}
		if (this.itemData) {
			this.addItems(this.itemData);
		}
	}
	else if (bLazyLoad) {
		this.cfg.fireQueue();
	}
},
_onBeforeRender: function (p_sType, p_aArgs) {
	var oEl = this.element,
		nListElements = this._aListElements.length,
		bFirstList = true,
		i = 0,
		oUL,
		oGroupTitle;
	if (nListElements > 0) {
		do {
			oUL = this._aListElements[i];
			if (oUL) {
				if (bFirstList) {
					Dom.addClass(oUL, "first-of-type");
					bFirstList = false;
				}
				if (!Dom.isAncestor(oEl, oUL)) {
					this.appendToBody(oUL);
				}
				oGroupTitle = this._aGroupTitleElements[i];
				if (oGroupTitle) {
					if (!Dom.isAncestor(oEl, oGroupTitle)) {
						oUL.parentNode.insertBefore(oGroupTitle, oUL);
					}
					Dom.addClass(oUL, "hastitle");
				}
			}
			i++;
		}
		while(i < nListElements);
	}
},
_onRender: function (p_sType, p_aArgs) {
	if (this.cfg.getProperty("position") == "dynamic") { 
		if (!this.cfg.getProperty("visible")) {
			this.positionOffScreen();
		}
	}
},

_onBeforeShow: function (p_sType, p_aArgs) {
	var nOptions,
		n,
		nViewportHeight,
		oRegion,
		oSrcElement;
	if (this.lazyLoad && this.getItemGroups().length === 0) {
		if (this.srcElement) {
			this._initSubTree();
		}
		if (this.itemData) {
			if (this.parent && this.parent.parent && 
				this.parent.parent.srcElement && 
				this.parent.parent.srcElement.tagName.toUpperCase() == 
				"SELECT") {
				nOptions = this.itemData.length;
				for(n=0; n<nOptions; n++) {
					if (this.itemData[n].tagName) {
						this.addItem((new this.ITEM_TYPE(this.itemData[n])));
					}
				}
			}
			else {
				this.addItems(this.itemData);
			}
		}
		oSrcElement = this.srcElement;
		if (oSrcElement) {
			if (oSrcElement.tagName.toUpperCase() == "SELECT") {
				if (Dom.inDocument(oSrcElement)) {
					this.render(oSrcElement.parentNode);
				}
				else {
					this.render(this.cfg.getProperty("container"));
				}
			}
			else {
				this.render();
			}
		}
		else {
			if (this.parent) {
				this.render(this.parent.element);
			}
			else {
				this.render(this.cfg.getProperty("container"));
			}
		}
	}
	var nMaxHeight = this.cfg.getProperty("maxheight"),
		nMinScrollHeight = this.cfg.getProperty("minscrollheight"),
		bDynamicPos = this.cfg.getProperty("position") == "dynamic";
	if (!this.parent && bDynamicPos) {
		this.cfg.refireEvent("xy");
   
	}
	function clearMaxHeight() {
		this.cfg.setProperty("maxheight", 0);
		this.hideEvent.unsubscribe(clearMaxHeight);
	}
	if (!(this instanceof YAHOO.widget.MenuBar) && bDynamicPos) {
		if (nMaxHeight === 0) {
			nViewportHeight = Dom.getViewportHeight();
			if (this.parent && 
				this.parent.parent instanceof YAHOO.widget.MenuBar) {
			   
				oRegion = YAHOO.util.Region.getRegion(this.parent.element);
				nViewportHeight = (nViewportHeight - oRegion.bottom);
			}
			if (this.element.offsetHeight >= nViewportHeight) {
				nMaxHeight = (nViewportHeight - (Overlay.VIEWPORT_OFFSET * 2));
				if (nMaxHeight < nMinScrollHeight) {
					nMaxHeight = nMinScrollHeight;
				}
				this.cfg.setProperty("maxheight", nMaxHeight);
				this.hideEvent.subscribe(clearMaxHeight);
			}
		}
	}
},
_onShow: function (p_sType, p_aArgs) {
	var oParent = this.parent,
		oParentMenu,
		aParentAlignment,
		aAlignment;
	function disableAutoSubmenuDisplay(p_oEvent) {
		var oTarget;
		if (p_oEvent.type == "mousedown" || (p_oEvent.type == "keydown" && 
			p_oEvent.keyCode == 27)) {
			oTarget = Event.getTarget(p_oEvent);
			if (oTarget != oParentMenu.element || 
				!Dom.isAncestor(oParentMenu.element, oTarget)) {
				oParentMenu.cfg.setProperty("autosubmenudisplay", false);
				Event.removeListener(document, "mousedown", 
						disableAutoSubmenuDisplay);
				Event.removeListener(document, "keydown", 
						disableAutoSubmenuDisplay);
			}
		}
	}
	if (oParent) {
		oParentMenu = oParent.parent;
		aParentAlignment = oParentMenu.cfg.getProperty("submenualignment");
		aAlignment = this.cfg.getProperty("submenualignment");
		if ((aParentAlignment[0] != aAlignment[0]) &&
			(aParentAlignment[1] != aAlignment[1])) {
			this.cfg.setProperty("submenualignment", 
				[aParentAlignment[0], aParentAlignment[1]]);
		}
		if (!oParentMenu.cfg.getProperty("autosubmenudisplay") && 
			(oParentMenu instanceof YAHOO.widget.MenuBar || 
			oParentMenu.cfg.getProperty("position") == "static")) {
			oParentMenu.cfg.setProperty("autosubmenudisplay", true);
			Event.on(document, "mousedown", disableAutoSubmenuDisplay);							 
			Event.on(document, "keydown", disableAutoSubmenuDisplay);
		}
	}
},
_onBeforeHide: function (p_sType, p_aArgs) {
	var oActiveItem = this.activeItem,
		oConfig,
		oSubmenu;
	if (oActiveItem) {
		oConfig = oActiveItem.cfg;
		oConfig.setProperty("selected", false);
		oSubmenu = oConfig.getProperty("submenu");
		if (oSubmenu) {
			oSubmenu.hide();
		}
	}
	if (this.getRoot() == this) {
		this.blur();
	}
},
_onParentMenuConfigChange: function (p_sType, p_aArgs, p_oSubmenu) {
	var sPropertyName = p_aArgs[0][0],
		oPropertyValue = p_aArgs[0][1];
	switch(sPropertyName) {
		case "iframe":
		case "constraintoviewport":
		case "hidedelay":
		case "showdelay":
		case "submenuhidedelay":
		case "clicktohide":
		case "effect":
		case "classname":
		case "scrollincrement":
		case "minscrollheight":
			p_oSubmenu.cfg.setProperty(sPropertyName, oPropertyValue);
		break;
	}
},
_onParentMenuRender: function (p_sType, p_aArgs, p_oSubmenu) {
	var oParentCfg = p_oSubmenu.parent.parent.cfg,
		oConfig = {
			constraintoviewport: oParentCfg.getProperty("constraintoviewport"),
			xy: [0,0],
			clicktohide: oParentCfg.getProperty("clicktohide"),
			effect: oParentCfg.getProperty("effect"),
			showdelay: oParentCfg.getProperty("showdelay"),
			hidedelay: oParentCfg.getProperty("hidedelay"),
			submenuhidedelay: oParentCfg.getProperty("submenuhidedelay"),
			classname: oParentCfg.getProperty("classname"),
			scrollincrement: oParentCfg.getProperty("scrollincrement"),
			minscrollheight: oParentCfg.getProperty("minscrollheight"),
			iframe: oParentCfg.getProperty("iframe")
		},
		oLI;
	p_oSubmenu.cfg.applyConfig(oConfig);
	if (!this.lazyLoad) {
		oLI = this.parent.element;
		if (this.element.parentNode == oLI) {
			this.render();
		}
		else {
			this.render(oLI);
		}
	}
},
_onSubmenuBeforeShow: function (p_sType, p_aArgs) {
	var oParent = this.parent,
		aAlignment = oParent.parent.cfg.getProperty("submenualignment");
	if (!this.cfg.getProperty("context")) {
		this.cfg.setProperty("context", 
			[oParent.element, aAlignment[0], aAlignment[1]]);
	}
	else {
		this.align();
	}
},
_onMenuItemFocus: function (p_sType, p_aArgs) {
	this.parent.focusEvent.fire(this);
},
_onMenuItemBlur: function (p_sType, p_aArgs) {
	this.parent.blurEvent.fire(this);
},
_onMenuItemDestroy: function (p_sType, p_aArgs, p_oItem) {
	this._removeItemFromGroupByValue(p_oItem.groupIndex, p_oItem);
},
_onMenuItemConfigChange: function (p_sType, p_aArgs, p_oItem) {
	var sPropertyName = p_aArgs[0][0],
		oPropertyValue = p_aArgs[0][1],
		oSubmenu;
	switch(sPropertyName) {
		case "selected":
			if (oPropertyValue === true) {
				this.activeItem = p_oItem;
			}
		break;
		case "submenu":
			oSubmenu = p_aArgs[0][1];
			if (oSubmenu) {
				this._configureSubmenu(p_oItem);
			}
		break;
	}
},
// Public event handlers for configuration properties
enforceConstraints: function (type, args, obj) {
	var oParentMenuItem = this.parent,
		nViewportOffset = Overlay.VIEWPORT_OFFSET,
		oElement = this.element,
		oConfig = this.cfg,
		pos = args[0],
		offsetHeight = oElement.offsetHeight,
		offsetWidth = oElement.offsetWidth,
		viewPortWidth = Dom.getViewportWidth(),
		viewPortHeight = Dom.getViewportHeight(),
		nPadding = (oParentMenuItem && 
			oParentMenuItem.parent instanceof YAHOO.widget.MenuBar) ? 
			0 : nViewportOffset,
		aContext = oConfig.getProperty("context"),
		oContextElement = aContext ? aContext[0] : null,
		topConstraint,
		leftConstraint,
		bottomConstraint,
		rightConstraint,
		scrollX,
		scrollY,
		x,
		y;
	if (offsetWidth < viewPortWidth) {
		x = pos[0];
		scrollX = Dom.getDocumentScrollLeft();
		leftConstraint = scrollX + nPadding;
		rightConstraint = scrollX + viewPortWidth - offsetWidth - nPadding;
		if (x < nViewportOffset) {
			x = leftConstraint;
		} else if ((x + offsetWidth) > viewPortWidth) {
			if(oContextElement &&
				((x - oContextElement.offsetWidth) > offsetWidth)) {
				if (oParentMenuItem && 
					oParentMenuItem.parent instanceof YAHOO.widget.MenuBar) {
					x = (x - (offsetWidth - oContextElement.offsetWidth));
				}
				else {
					x = (x - (oContextElement.offsetWidth + offsetWidth));
				}
			}
			else {
				x = rightConstraint;
			}
		}
	}
	if (offsetHeight < viewPortHeight) {
		y = pos[1];
		scrollY = Dom.getDocumentScrollTop();
		topConstraint = scrollY + nPadding;
		bottomConstraint = scrollY + viewPortHeight - offsetHeight - nPadding;
		if (y < nViewportOffset) {
			y = topConstraint;
		} else if (y > bottomConstraint) {
			if (oContextElement && (y > offsetHeight)) {
				y = ((y + oContextElement.offsetHeight) - offsetHeight);
			}
			else {
				y = bottomConstraint;
			}
		}
	}
	oConfig.setProperty("x", x, true);
	oConfig.setProperty("y", y, true);
	oConfig.setProperty("xy", [x,y], true);
},
configVisible: function (p_sType, p_aArgs, p_oMenu) {
	var bVisible,
		sDisplay;
	if (this.cfg.getProperty("position") == "dynamic") {
		Menu.superclass.configVisible.call(this, p_sType, p_aArgs, p_oMenu);
	}
	else {
		bVisible = p_aArgs[0];
		sDisplay = Dom.getStyle(this.element, "display");
		Dom.setStyle(this.element, "visibility", "visible");
		if (bVisible) {
			if (sDisplay != "block") {
				this.beforeShowEvent.fire();
				Dom.setStyle(this.element, "display", "block");
				this.showEvent.fire();
			}
		}
		else {
			if (sDisplay == "block") {
				this.beforeHideEvent.fire();
				Dom.setStyle(this.element, "display", "none");
				this.hideEvent.fire();
			}
		}
	}
},
configPosition: function (p_sType, p_aArgs, p_oMenu) {
	var oElement = this.element,
		sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute",
		oCfg = this.cfg,
		nZIndex;
	Dom.setStyle(oElement, "position", sCSSPosition);
	if (sCSSPosition == "static") {
		Dom.setStyle(oElement, "display", "block");
		oCfg.setProperty("visible", true);
	}
	else {
		Dom.setStyle(oElement, "visibility", "hidden");
	}
	if (sCSSPosition == "absolute") {
		nZIndex = oCfg.getProperty("zindex");
		if (!nZIndex || nZIndex === 0) {
			nZIndex = this.parent ? 
				(this.parent.parent.cfg.getProperty("zindex") + 1) : 1;
			oCfg.setProperty("zindex", nZIndex);
		}
	}
},
configIframe: function (p_sType, p_aArgs, p_oMenu) {
	if (this.cfg.getProperty("position") == "dynamic") {
		Menu.superclass.configIframe.call(this, p_sType, p_aArgs, p_oMenu);
	}
},
configHideDelay: function (p_sType, p_aArgs, p_oMenu) {
	var nHideDelay = p_aArgs[0],
		oMouseOutEvent = this.mouseOutEvent,
		oMouseOverEvent = this.mouseOverEvent,
		oKeyDownEvent = this.keyDownEvent;
	if (nHideDelay > 0) {
		if (!this._bHideDelayEventHandlersAssigned) {
			oMouseOutEvent.subscribe(this._execHideDelay);
			oMouseOverEvent.subscribe(this._cancelHideDelay);
			oKeyDownEvent.subscribe(this._cancelHideDelay);
			this._bHideDelayEventHandlersAssigned = true;
		}
	}
	else {
		oMouseOutEvent.unsubscribe(this._execHideDelay);
		oMouseOverEvent.unsubscribe(this._cancelHideDelay);
		oKeyDownEvent.unsubscribe(this._cancelHideDelay);
		this._bHideDelayEventHandlersAssigned = false;
	}
},
configContainer: function (p_sType, p_aArgs, p_oMenu) {
	var oElement = p_aArgs[0];
	if (typeof oElement == 'string') {
		this.cfg.setProperty("container", document.getElementById(oElement), 
				true);
	}
},
_setMaxHeight: function (p_sType, p_aArgs, p_nMaxHeight) {
	this.cfg.setProperty("maxheight", p_nMaxHeight);
	this.renderEvent.unsubscribe(this._setMaxHeight);
},
configMaxHeight: function (p_sType, p_aArgs, p_oMenu) {
	var nMaxHeight = p_aArgs[0],
		oElement = this.element,
		oBody = this.body,
		oHeader = this.header,
		oFooter = this.footer,
		fnMouseOver = this._onScrollTargetMouseOver,
		fnMouseOut = this._onScrollTargetMouseOut,
		nMinScrollHeight = this.cfg.getProperty("minscrollheight"),
		nHeight,
		nOffsetWidth,
		sWidth;
	if (nMaxHeight !== 0 && nMaxHeight < nMinScrollHeight) {
		nMaxHeight = nMinScrollHeight;
	}
	if (this.lazyLoad && !oBody) {
		this.renderEvent.unsubscribe(this._setMaxHeight);
		if (nMaxHeight > 0) {
			this.renderEvent.subscribe(this._setMaxHeight, nMaxHeight, this);
		}
		return;
	}
	Dom.setStyle(oBody, "height", "");
	Dom.removeClass(oBody, "yui-menu-body-scrolled");
	var bSetWidth = ((UA.gecko && this.parent && this.parent.parent && 
		this.parent.parent.cfg.getProperty("position") == "dynamic") || UA.ie);
	if (bSetWidth) {
		if (!this.cfg.getProperty("width")) {
			nOffsetWidth = oElement.offsetWidth;
			oElement.style.width = nOffsetWidth + "px";
			sWidth = (nOffsetWidth - (oElement.offsetWidth - nOffsetWidth)) + "px";
			this.cfg.setProperty("width", sWidth);
		}
	}
	if (!oHeader && !oFooter) {
		this.setHeader("&#32;");
		this.setFooter("&#32;");
		oHeader = this.header;
		oFooter = this.footer;
		Dom.addClass(oHeader, "topscrollbar");
		Dom.addClass(oFooter, "bottomscrollbar");
		oElement.insertBefore(oHeader, oBody);
		oElement.appendChild(oFooter);
	}
	nHeight = (nMaxHeight - (oHeader.offsetHeight + oHeader.offsetHeight));
	if (nHeight > 0 && (oBody.offsetHeight > nMaxHeight)) {
		Dom.addClass(oBody, "yui-menu-body-scrolled");
		Dom.setStyle(oBody, "height", (nHeight + "px"));
		Event.on(oHeader, "mouseover", fnMouseOver, this, true);
		Event.on(oHeader, "mouseout", fnMouseOut, this, true);
		Event.on(oFooter, "mouseover", fnMouseOver, this, true);
		Event.on(oFooter, "mouseout", fnMouseOut, this, true);
		this._disableScrollHeader();
		this._enableScrollFooter();
	}
	else if (oHeader && oFooter) {
		if (bSetWidth) {
			this.cfg.setProperty("width", "");
		}
		this._enableScrollHeader();
		this._enableScrollFooter();
		Event.removeListener(oHeader, "mouseover", fnMouseOver);
		Event.removeListener(oHeader, "mouseout", fnMouseOut);
		Event.removeListener(oFooter, "mouseover", fnMouseOver);
		Event.removeListener(oFooter, "mouseout", fnMouseOut);
		oElement.removeChild(oHeader);
		oElement.removeChild(oFooter);
		this.header = null;
		this.footer = null;
	}
	this.cfg.refireEvent("iframe");
},
configClassName: function (p_sType, p_aArgs, p_oMenu) {
	var sClassName = p_aArgs[0];
	if (this._sClassName) {
		Dom.removeClass(this.element, this._sClassName);
	}
	Dom.addClass(this.element, sClassName);
	this._sClassName = sClassName;
},
_onItemAdded: function (p_sType, p_aArgs) {
	var oItem = p_aArgs[0];
	if (oItem) {
		oItem.cfg.setProperty("disabled", true);
	}
},
configDisabled: function (p_sType, p_aArgs, p_oMenu) {
	var bDisabled = p_aArgs[0],
		aItems = this.getItems(),
		nItems,
		i;
	if (Lang.isArray(aItems)) {
		nItems = aItems.length;
		if (nItems > 0) {
			i = nItems - 1;
			do {
				aItems[i].cfg.setProperty("disabled", bDisabled);
			}
			while (i--);
		}
		if (bDisabled) {
			this.clearActiveItem(true);
			Dom.addClass(this.element, "disabled");
			this.itemAddedEvent.subscribe(this._onItemAdded);
		}
		else {
			Dom.removeClass(this.element, "disabled");
			this.itemAddedEvent.unsubscribe(this._onItemAdded);
		}
	}
},
onRender: function (p_sType, p_aArgs) {
	function sizeShadow() {
		var oElement = this.element,
			oShadow = this._shadow;
		if (oShadow && oElement) {
			oShadow.style.width = (oElement.offsetWidth + 6) + "px";
			oShadow.style.height = (oElement.offsetHeight + 1) + "px";
		}
	}
	function replaceShadow() {
		this.element.appendChild(this._shadow);
	}
	function addShadowVisibleClass() {
		Dom.addClass(this._shadow, "yui-menu-shadow-visible");
	}
	function removeShadowVisibleClass() {
		Dom.removeClass(this._shadow, "yui-menu-shadow-visible");
	}
	function createShadow() {
		var oShadow = this._shadow,
			oElement,
			me;
		if (!oShadow) {
			oElement = this.element;
			me = this;
			if (!m_oShadowTemplate) {
				m_oShadowTemplate = document.createElement("div");
				m_oShadowTemplate.className = 
					"yui-menu-shadow yui-menu-shadow-visible";
			}
			oShadow = m_oShadowTemplate.cloneNode(false);
			oElement.appendChild(oShadow);
			this._shadow = oShadow;
			this.beforeShowEvent.subscribe(addShadowVisibleClass);
			this.beforeHideEvent.subscribe(removeShadowVisibleClass);
			if (UA.ie) {
				window.setTimeout(function () { 
					sizeShadow.call(me); 
					me.syncIframe();
				}, 0);
				this.cfg.subscribeToConfigEvent("width", sizeShadow);
				this.cfg.subscribeToConfigEvent("height", sizeShadow);
				this.cfg.subscribeToConfigEvent("maxheight", sizeShadow);
				this.changeContentEvent.subscribe(sizeShadow);
				Module.textResizeEvent.subscribe(sizeShadow, me, true);
				this.destroyEvent.subscribe(function () {
					Module.textResizeEvent.unsubscribe(sizeShadow, me);
				});
			}
			this.cfg.subscribeToConfigEvent("maxheight", replaceShadow);
		}
	}
	function onBeforeShow() {
		createShadow.call(this);
		this.beforeShowEvent.unsubscribe(onBeforeShow);
	}
	if (this.cfg.getProperty("position") == "dynamic") {
		if (this.cfg.getProperty("visible")) {
			createShadow.call(this);
		}
		else {
			this.beforeShowEvent.subscribe(onBeforeShow);
		}
	}
},
// Public methods
initEvents: function () {
	Menu.superclass.initEvents.call(this);
	var SIGNATURE = CustomEvent.LIST;
	this.mouseOverEvent = this.createEvent(EVENT_TYPES.MOUSE_OVER);
	this.mouseOverEvent.signature = SIGNATURE;
	this.mouseOutEvent = this.createEvent(EVENT_TYPES.MOUSE_OUT);
	this.mouseOutEvent.signature = SIGNATURE;
	this.mouseDownEvent = this.createEvent(EVENT_TYPES.MOUSE_DOWN);
	this.mouseDownEvent.signature = SIGNATURE;
	this.mouseUpEvent = this.createEvent(EVENT_TYPES.MOUSE_UP);
	this.mouseUpEvent.signature = SIGNATURE;
	this.clickEvent = this.createEvent(EVENT_TYPES.CLICK);
	this.clickEvent.signature = SIGNATURE;
	this.keyPressEvent = this.createEvent(EVENT_TYPES.KEY_PRESS);
	this.keyPressEvent.signature = SIGNATURE;
	this.keyDownEvent = this.createEvent(EVENT_TYPES.KEY_DOWN);
	this.keyDownEvent.signature = SIGNATURE;
	this.keyUpEvent = this.createEvent(EVENT_TYPES.KEY_UP);
	this.keyUpEvent.signature = SIGNATURE;
	this.focusEvent = this.createEvent(EVENT_TYPES.FOCUS);
	this.focusEvent.signature = SIGNATURE;
	this.blurEvent = this.createEvent(EVENT_TYPES.BLUR);
	this.blurEvent.signature = SIGNATURE;
	this.itemAddedEvent = this.createEvent(EVENT_TYPES.ITEM_ADDED);
	this.itemAddedEvent.signature = SIGNATURE;
	this.itemRemovedEvent = this.createEvent(EVENT_TYPES.ITEM_REMOVED);
	this.itemRemovedEvent.signature = SIGNATURE;
},
positionOffScreen: function () {
	var oIFrame = this.iframe,
		aPos = this.OFF_SCREEN_POSITION;
	Dom.setXY(this.element, aPos);
	if (oIFrame) {
		Dom.setXY(oIFrame, aPos);
	}
},
getRoot: function () {
	var oItem = this.parent,
		oParentMenu;
	if (oItem) {
		oParentMenu = oItem.parent;
		return oParentMenu ? oParentMenu.getRoot() : this;
	}
	else {
		return this;
	}
},
toString: function () {
	var sReturnVal = "Menu",
		sId = this.id;
	if (sId) {
		sReturnVal += (" " + sId);
	}
	return sReturnVal;
},
setItemGroupTitle: function (p_sGroupTitle, p_nGroupIndex) {
	var nGroupIndex,
		oTitle,
		i,
		nFirstIndex;
	if (typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) {
		nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
		oTitle = this._aGroupTitleElements[nGroupIndex];
		if (oTitle) {
			oTitle.innerHTML = p_sGroupTitle;
		}
		else {
			oTitle = document.createElement(this.GROUP_TITLE_TAG_NAME);
			oTitle.innerHTML = p_sGroupTitle;
			this._aGroupTitleElements[nGroupIndex] = oTitle;
		}
		i = this._aGroupTitleElements.length - 1;
		do {
			if (this._aGroupTitleElements[i]) {
				Dom.removeClass(this._aGroupTitleElements[i], "first-of-type");
				nFirstIndex = i;
			}
		}
		while(i--);
		if (nFirstIndex !== null) {
			Dom.addClass(this._aGroupTitleElements[nFirstIndex], 
				"first-of-type");
		}
		this.changeContentEvent.fire();
	}
},
addItem: function (p_oItem, p_nGroupIndex) {
	if (p_oItem) {
		return this._addItemToGroup(p_nGroupIndex, p_oItem);
	}
},
addItems: function (p_aItems, p_nGroupIndex) {
	var nItems,
		aItems,
		oItem,
		i;
	if (Lang.isArray(p_aItems)) {
		nItems = p_aItems.length;
		aItems = [];
		for(i=0; i<nItems; i++) {
			oItem = p_aItems[i];
			if (oItem) {
				if (Lang.isArray(oItem)) {
					aItems[aItems.length] = this.addItems(oItem, i);
				}
				else {
					aItems[aItems.length] = 
						this._addItemToGroup(p_nGroupIndex, oItem);
				}
			}
		}
		if (aItems.length) {
			return aItems;
		}
	}
},
insertItem: function (p_oItem, p_nItemIndex, p_nGroupIndex) {
	if (p_oItem) {
		return this._addItemToGroup(p_nGroupIndex, p_oItem, p_nItemIndex);
	}
},
removeItem: function (p_oObject, p_nGroupIndex) {
	var oItem;
	if (typeof p_oObject != "undefined") {
		if (p_oObject instanceof YAHOO.widget.MenuItem) {
			oItem = this._removeItemFromGroupByValue(p_nGroupIndex, p_oObject);		   
		}
		else if (typeof p_oObject == "number") {
			oItem = this._removeItemFromGroupByIndex(p_nGroupIndex, p_oObject);
		}
		if (oItem) {
			oItem.destroy();
			return oItem;
		}
	}
},
getItems: function () {
	var aGroups = this._aItemGroups,
		nGroups,
		aItems = [];
	if (Lang.isArray(aGroups)) {
		nGroups = aGroups.length;
		return ((nGroups == 1) ? aGroups[0] : 
					(Array.prototype.concat.apply(aItems, aGroups)));
	}
},
getItemGroups: function () {
	return this._aItemGroups;
},
getItem: function (p_nItemIndex, p_nGroupIndex) {
	var aGroup;
	if (typeof p_nItemIndex == "number") {
		aGroup = this._getItemGroup(p_nGroupIndex);
		if (aGroup) {
			return aGroup[p_nItemIndex];
		}
	}
},
getSubmenus: function () {
	var aItems = this.getItems(),
		nItems = aItems.length,
		aSubmenus,
		oSubmenu,
		oItem,
		i;
	if (nItems > 0) {
		aSubmenus = [];
		for(i=0; i<nItems; i++) {
			oItem = aItems[i];
			if (oItem) {
				oSubmenu = oItem.cfg.getProperty("submenu");
				if (oSubmenu) {
					aSubmenus[aSubmenus.length] = oSubmenu;
				}
			}
		}
	}
	return aSubmenus;
},
clearContent: function () {
	var aItems = this.getItems(),
		nItems = aItems.length,
		oElement = this.element,
		oBody = this.body,
		oHeader = this.header,
		oFooter = this.footer,
		oItem,
		oSubmenu,
		i;
	if (nItems > 0) {
		i = nItems - 1;
		do {
			oItem = aItems[i];
			if (oItem) {
				oSubmenu = oItem.cfg.getProperty("submenu");
				if (oSubmenu) {
					this.cfg.configChangedEvent.unsubscribe(
						this._onParentMenuConfigChange, oSubmenu);
					this.renderEvent.unsubscribe(this._onParentMenuRender, 
						oSubmenu);
				}
				this.removeItem(oItem);
			}
		}
		while(i--);
	}
	if (oHeader) {
		Event.purgeElement(oHeader);
		oElement.removeChild(oHeader);
	}
	if (oFooter) {
		Event.purgeElement(oFooter);
		oElement.removeChild(oFooter);
	}
	if (oBody) {
		Event.purgeElement(oBody);
		oBody.innerHTML = "";
	}
	this.activeItem = null;
	this._aItemGroups = [];
	this._aListElements = [];
	this._aGroupTitleElements = [];
	this.cfg.setProperty("width", null);
},
destroy: function () {
	this.clearContent();
	this._aItemGroups = null;
	this._aListElements = null;
	this._aGroupTitleElements = null;

	Menu.superclass.destroy.call(this);
},
setInitialFocus: function () {
	var oItem = this._getFirstEnabledItem();
	if (oItem) {
		oItem.focus();
	}
},
setInitialSelection: function () {
	var oItem = this._getFirstEnabledItem();
	if (oItem) {
		oItem.cfg.setProperty("selected", true);
	}
},
clearActiveItem: function (p_bBlur) {
	if (this.cfg.getProperty("showdelay") > 0) {
		this._cancelShowDelay();
	}
	var oActiveItem = this.activeItem,
		oConfig,
		oSubmenu;
	if (oActiveItem) {
		oConfig = oActiveItem.cfg;
		if (p_bBlur) {
			oActiveItem.blur();
		}
		oConfig.setProperty("selected", false);
		oSubmenu = oConfig.getProperty("submenu");
		if (oSubmenu) {
			oSubmenu.hide();
		}
		this.activeItem = null;
	}
},
focus: function () {
	if (!this.hasFocus()) {
		this.setInitialFocus();
	}
},
blur: function () {
	var oItem;
	if (this.hasFocus()) {
		oItem = MenuManager.getFocusedMenuItem();
		if (oItem) {
			oItem.blur();
		}
	}
},
hasFocus: function () {
	return (MenuManager.getFocusedMenu() == this.getRoot());
},
subscribe: function () {
	function onItemAdded(p_sType, p_aArgs, p_oObject) {
		var oItem = p_aArgs[0],
			oSubmenu = oItem.cfg.getProperty("submenu");
		if (oSubmenu) {
			oSubmenu.subscribe.apply(oSubmenu, p_oObject);
		}
	}
	function onSubmenuAdded(p_sType, p_aArgs, p_oObject) { 
		var oSubmenu = this.cfg.getProperty("submenu");
		if (oSubmenu) {
			oSubmenu.subscribe.apply(oSubmenu, p_oObject);
		}
	}
	Menu.superclass.subscribe.apply(this, arguments);
	Menu.superclass.subscribe.call(this, "itemAdded", onItemAdded, arguments);
	var aItems = this.getItems(),
		nItems,
		oItem,
		oSubmenu,
		i;
	if (aItems) {
		nItems = aItems.length;
		if (nItems > 0) {
			i = nItems - 1;
			do {
				oItem = aItems[i];
				oSubmenu = oItem.cfg.getProperty("submenu");
				if (oSubmenu) {
					oSubmenu.subscribe.apply(oSubmenu, arguments);
				}
				else {
					oItem.cfg.subscribeToConfigEvent("submenu", onSubmenuAdded, arguments);
				}
			}
			while (i--);
		}
	}
},
initDefaultConfig: function () {
	Menu.superclass.initDefaultConfig.call(this);
	var oConfig = this.cfg;

	
	
	
	
	
	

	oConfig.addProperty(
		DEFAULT_CONFIG.VISIBLE.key, 
		{
			handler: this.configVisible, 
			value: DEFAULT_CONFIG.VISIBLE.value, 
			validator: DEFAULT_CONFIG.VISIBLE.validator
		 }
	 );
	oConfig.addProperty(
		DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.key, 
		{
			handler: this.configConstrainToViewport, 
			value: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.value, 
			validator: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.validator, 
			supercedes: DEFAULT_CONFIG.CONSTRAIN_TO_VIEWPORT.supercedes 
		} 
	);
	oConfig.addProperty(
		DEFAULT_CONFIG.POSITION.key, 
		{
			handler: this.configPosition,
			value: DEFAULT_CONFIG.POSITION.value, 
			validator: DEFAULT_CONFIG.POSITION.validator,
			supercedes: DEFAULT_CONFIG.POSITION.supercedes
		}
	);
	oConfig.addProperty(
		DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, 
		{ 
			value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value,
			suppressEvent: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.suppressEvent
		}
	);
	oConfig.addProperty(
	   DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, 
	   { 
		   value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, 
		   validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator,
		   suppressEvent: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.suppressEvent
	   } 
	);
	oConfig.addProperty(
	   DEFAULT_CONFIG.SHOW_DELAY.key, 
	   { 
		   value: DEFAULT_CONFIG.SHOW_DELAY.value, 
		   validator: DEFAULT_CONFIG.SHOW_DELAY.validator,
		   suppressEvent: DEFAULT_CONFIG.SHOW_DELAY.suppressEvent
	   } 
	);
	oConfig.addProperty(
	   DEFAULT_CONFIG.HIDE_DELAY.key, 
	   { 
		   handler: this.configHideDelay,
		   value: DEFAULT_CONFIG.HIDE_DELAY.value, 
		   validator: DEFAULT_CONFIG.HIDE_DELAY.validator, 
		   suppressEvent: DEFAULT_CONFIG.HIDE_DELAY.suppressEvent
	   } 
	);
	oConfig.addProperty(
	   DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.key, 
	   { 
		   value: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.value, 
		   validator: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.validator,
		   suppressEvent: DEFAULT_CONFIG.SUBMENU_HIDE_DELAY.suppressEvent
	   } 
	);
	oConfig.addProperty(
		DEFAULT_CONFIG.CLICK_TO_HIDE.key,
		{
			value: DEFAULT_CONFIG.CLICK_TO_HIDE.value,
			validator: DEFAULT_CONFIG.CLICK_TO_HIDE.validator,
			suppressEvent: DEFAULT_CONFIG.CLICK_TO_HIDE.suppressEvent
		}
	);
	oConfig.addProperty(
	   DEFAULT_CONFIG.CONTAINER.key, 
	   { 
		   handler: this.configContainer,
		   value: document.body,
		   suppressEvent: DEFAULT_CONFIG.CONTAINER.suppressEvent
	   } 
   );
	oConfig.addProperty(
		DEFAULT_CONFIG.SCROLL_INCREMENT.key, 
		{ 
			value: DEFAULT_CONFIG.SCROLL_INCREMENT.value, 
			validator: DEFAULT_CONFIG.SCROLL_INCREMENT.validator,
			supercedes: DEFAULT_CONFIG.SCROLL_INCREMENT.supercedes,
			suppressEvent: DEFAULT_CONFIG.SCROLL_INCREMENT.suppressEvent
		}
	);
		oConfig.addProperty(
		DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.key, 
		{ 
			value: DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.value, 
			validator: DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.validator,
			supercedes: DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.supercedes,
			suppressEvent: DEFAULT_CONFIG.MIN_SCROLL_HEIGHT.suppressEvent
		}
	);
	oConfig.addProperty(
	   DEFAULT_CONFIG.MAX_HEIGHT.key, 
	   {
			handler: this.configMaxHeight,
			value: DEFAULT_CONFIG.MAX_HEIGHT.value,
			validator: DEFAULT_CONFIG.MAX_HEIGHT.validator,
			suppressEvent: DEFAULT_CONFIG.MAX_HEIGHT.suppressEvent,
			supercedes: DEFAULT_CONFIG.MAX_HEIGHT.supercedes
	   } 
	);
	oConfig.addProperty(
		DEFAULT_CONFIG.CLASS_NAME.key, 
		{ 
			handler: this.configClassName,
			value: DEFAULT_CONFIG.CLASS_NAME.value, 
			validator: DEFAULT_CONFIG.CLASS_NAME.validator,
			supercedes: DEFAULT_CONFIG.CLASS_NAME.supercedes	  
		}
	);
	oConfig.addProperty(
		DEFAULT_CONFIG.DISABLED.key, 
		{ 
			handler: this.configDisabled,
			value: DEFAULT_CONFIG.DISABLED.value, 
			validator: DEFAULT_CONFIG.DISABLED.validator,
			suppressEvent: DEFAULT_CONFIG.DISABLED.suppressEvent
		}
	);
}
}); // END YAHOO.lang.extend
})();
(function () {
YAHOO.widget.MenuItem = function (p_oObject, p_oConfig) {
	if (p_oObject) {
		if (p_oConfig) {
			this.parent = p_oConfig.parent;
			this.value = p_oConfig.value;
			this.id = p_oConfig.id;
		}
		this.init(p_oObject, p_oConfig);
	}
};
var Dom = YAHOO.util.Dom,
	Module = YAHOO.widget.Module,
	Menu = YAHOO.widget.Menu,
	MenuItem = YAHOO.widget.MenuItem,
	CustomEvent = YAHOO.util.CustomEvent,
	Lang = YAHOO.lang,
	m_oMenuItemTemplate,
	EVENT_TYPES = {
		"MOUSE_OVER": "mouseover",
		"MOUSE_OUT": "mouseout",
		"MOUSE_DOWN": "mousedown",
		"MOUSE_UP": "mouseup",
		"CLICK": "click",
		"KEY_PRESS": "keypress",
		"KEY_DOWN": "keydown",
		"KEY_UP": "keyup",
		"ITEM_ADDED": "itemAdded",
		"ITEM_REMOVED": "itemRemoved",
		"FOCUS": "focus",
		"BLUR": "blur",
		"DESTROY": "destroy"
	},
	DEFAULT_CONFIG = {
		"TEXT": { 
			key: "text", 
			value: "", 
			validator: Lang.isString, 
			suppressEvent: true 
		}, 
		"HELP_TEXT": { 
			key: "helptext",
			supercedes: ["text"], 
			suppressEvent: true 
		},
		"URL": { 
			key: "url", 
			value: "#", 
			suppressEvent: true 
		}, 
		"TARGET": { 
			key: "target", 
			suppressEvent: true 
		}, 
		"EMPHASIS": { 
			key: "emphasis", 
			value: false, 
			validator: Lang.isBoolean, 
			suppressEvent: true, 
			supercedes: ["text"]
		}, 
		"STRONG_EMPHASIS": { 
			key: "strongemphasis", 
			value: false, 
			validator: Lang.isBoolean, 
			suppressEvent: true,
			supercedes: ["text"]
		},
		"CHECKED": { 
			key: "checked", 
			value: false, 
			validator: Lang.isBoolean, 
			suppressEvent: true, 
			supercedes: ["disabled", "selected"]
		}, 
		"SUBMENU": { 
			key: "submenu",
			suppressEvent: true,
			supercedes: ["disabled", "selected"]
		},
		"DISABLED": { 
			key: "disabled", 
			value: false, 
			validator: Lang.isBoolean, 
			suppressEvent: true,
			supercedes: ["text", "selected"]
		},
		"SELECTED": { 
			key: "selected", 
			value: false, 
			validator: Lang.isBoolean, 
			suppressEvent: true
		},
		"ONCLICK": { 
			key: "onclick",
			suppressEvent: true
		},
		"CLASS_NAME": { 
			key: "classname", 
			value: null, 
			validator: Lang.isString,
			suppressEvent: true
		}
	};
MenuItem.prototype = {
		CSS_CLASS_NAME: "yuimenuitem",
		CSS_LABEL_CLASS_NAME: "yuimenuitemlabel",
	SUBMENU_TYPE: null,

	_oAnchor: null,
	_oHelpTextEM: null,
	_oSubmenu: null,
	_oOnclickAttributeValue: null,
	_sClassName: null,

	constructor: MenuItem,
	index: null,
	groupIndex: null,
	parent: null,
	element: null,
	srcElement: null,
	value: null,
	browser: Module.prototype.browser,
	id: null,
	destroyEvent: null,
	mouseOverEvent: null,
	mouseOutEvent: null,
	mouseDownEvent: null,
	mouseUpEvent: null,
	clickEvent: null,
	keyPressEvent: null,
	keyDownEvent: null,
	keyUpEvent: null,
	focusEvent: null,
	blurEvent: null,
	init: function (p_oObject, p_oConfig) {
		if (!this.SUBMENU_TYPE) {
			this.SUBMENU_TYPE = Menu;
		}

		this.cfg = new YAHOO.util.Config(this);
		this.initDefaultConfig();
		var SIGNATURE = CustomEvent.LIST,
			oConfig = this.cfg,
			sURL = "#",
			oAnchor,
			sTarget,
			sText,
			sId;
		if (Lang.isString(p_oObject)) {
			this._createRootNodeStructure();
			oConfig.queueProperty("text", p_oObject);
		}
		else if (p_oObject && p_oObject.tagName) {
			switch(p_oObject.tagName.toUpperCase()) {
				case "OPTION":
					this._createRootNodeStructure();
					oConfig.queueProperty("text", p_oObject.text);
					oConfig.queueProperty("disabled", p_oObject.disabled);
					this.value = p_oObject.value;
					this.srcElement = p_oObject;
				break;
				case "OPTGROUP":
					this._createRootNodeStructure();
					oConfig.queueProperty("text", p_oObject.label);
					oConfig.queueProperty("disabled", p_oObject.disabled);
					this.srcElement = p_oObject;
					this._initSubTree();
				break;
				case "LI":
					oAnchor = Dom.getFirstChild(p_oObject);

					if (oAnchor) {
						sURL = oAnchor.getAttribute("href");
						sTarget = oAnchor.getAttribute("target");
						sText = oAnchor.innerHTML;
					}
					this.srcElement = p_oObject;
					this.element = p_oObject;
					this._oAnchor = oAnchor;
					oConfig.setProperty("text", sText, true);
					oConfig.setProperty("url", sURL, true);
					oConfig.setProperty("target", sTarget, true);
					this._initSubTree();
				break;
			}
		}
		if (this.element) {
			sId = (this.srcElement || this.element).id;
			if (!sId) {
				sId = this.id || Dom.generateId();
				this.element.id = sId;
			}
			this.id = sId;
			Dom.addClass(this.element, this.CSS_CLASS_NAME);
			Dom.addClass(this._oAnchor, this.CSS_LABEL_CLASS_NAME);
			this.mouseOverEvent = this.createEvent(EVENT_TYPES.MOUSE_OVER);
			this.mouseOverEvent.signature = SIGNATURE;
			this.mouseOutEvent = this.createEvent(EVENT_TYPES.MOUSE_OUT);
			this.mouseOutEvent.signature = SIGNATURE;
			this.mouseDownEvent = this.createEvent(EVENT_TYPES.MOUSE_DOWN);
			this.mouseDownEvent.signature = SIGNATURE;
			this.mouseUpEvent = this.createEvent(EVENT_TYPES.MOUSE_UP);
			this.mouseUpEvent.signature = SIGNATURE;
			this.clickEvent = this.createEvent(EVENT_TYPES.CLICK);
			this.clickEvent.signature = SIGNATURE;
			this.keyPressEvent = this.createEvent(EVENT_TYPES.KEY_PRESS);
			this.keyPressEvent.signature = SIGNATURE;
			this.keyDownEvent = this.createEvent(EVENT_TYPES.KEY_DOWN);
			this.keyDownEvent.signature = SIGNATURE;
			this.keyUpEvent = this.createEvent(EVENT_TYPES.KEY_UP);
			this.keyUpEvent.signature = SIGNATURE;
			this.focusEvent = this.createEvent(EVENT_TYPES.FOCUS);
			this.focusEvent.signature = SIGNATURE;
			this.blurEvent = this.createEvent(EVENT_TYPES.BLUR);
			this.blurEvent.signature = SIGNATURE;
			this.destroyEvent = this.createEvent(EVENT_TYPES.DESTROY);
			this.destroyEvent.signature = SIGNATURE;
			if (p_oConfig) {
				oConfig.applyConfig(p_oConfig);
			}
			oConfig.fireQueue();
		}
	},

	_createRootNodeStructure: function () {
		var oElement,
			oAnchor;
		if (!m_oMenuItemTemplate) {
			m_oMenuItemTemplate = document.createElement("li");
			m_oMenuItemTemplate.innerHTML = "<a href=\"#\"></a>";
		}
		oElement = m_oMenuItemTemplate.cloneNode(true);
		oElement.className = this.CSS_CLASS_NAME;
		oAnchor = oElement.firstChild;
		oAnchor.className = this.CSS_LABEL_CLASS_NAME;
		this.element = oElement;
		this._oAnchor = oAnchor;
	},
	_initSubTree: function () {
		var oSrcEl = this.srcElement,
			oConfig = this.cfg,
			oNode,
			aOptions,
			nOptions,
			oMenu,
			n;
		if (oSrcEl.childNodes.length > 0) {
			if (this.parent.lazyLoad && this.parent.srcElement && 
				this.parent.srcElement.tagName.toUpperCase() == "SELECT") {
				oConfig.setProperty(
						"submenu", 
						{ id: Dom.generateId(), itemdata: oSrcEl.childNodes }
					);
			}
			else {
				oNode = oSrcEl.firstChild;
				aOptions = [];
				do {
					if (oNode && oNode.tagName) {
						switch(oNode.tagName.toUpperCase()) {
							case "DIV":
								oConfig.setProperty("submenu", oNode);
							break;
		 
							case "OPTION":
								aOptions[aOptions.length] = oNode;
							break;
			   
						}
					}
				}
				while((oNode = oNode.nextSibling));
				nOptions = aOptions.length;
				if (nOptions > 0) {
					oMenu = new this.SUBMENU_TYPE(Dom.generateId());
					oConfig.setProperty("submenu", oMenu);
					for(n=0; n<nOptions; n++) {
						oMenu.addItem((new oMenu.ITEM_TYPE(aOptions[n])));
					}
				}
			}
		}
	},

	configText: function (p_sType, p_aArgs, p_oItem) {
		var sText = p_aArgs[0],
			oConfig = this.cfg,
			oAnchor = this._oAnchor,
			sHelpText = oConfig.getProperty("helptext"),
			sHelpTextHTML = "",
			sEmphasisStartTag = "",
			sEmphasisEndTag = "";
		if (sText) {
			if (sHelpText) {
				sHelpTextHTML = "<em class=\"helptext\">" + sHelpText + "</em>";
			}
			if (oConfig.getProperty("emphasis")) {
				sEmphasisStartTag = "<em>";
				sEmphasisEndTag = "</em>";
			}
			if (oConfig.getProperty("strongemphasis")) {
				sEmphasisStartTag = "<strong>";
				sEmphasisEndTag = "</strong>";
			}
			oAnchor.innerHTML = (sEmphasisStartTag + sText + 
				sEmphasisEndTag + sHelpTextHTML);
		}
	},
	configHelpText: function (p_sType, p_aArgs, p_oItem) {
		this.cfg.refireEvent("text");
	},
	configURL: function (p_sType, p_aArgs, p_oItem) {
		var sURL = p_aArgs[0];
		if (!sURL) {
			sURL = "#";
		}
		var oAnchor = this._oAnchor;
		if (YAHOO.env.ua.opera) {
			oAnchor.removeAttribute("href");
		}
		oAnchor.setAttribute("href", sURL);
	},
	configTarget: function (p_sType, p_aArgs, p_oItem) {
		var sTarget = p_aArgs[0],
			oAnchor = this._oAnchor;
		if (sTarget && sTarget.length > 0) {
			oAnchor.setAttribute("target", sTarget);
		}
		else {
			oAnchor.removeAttribute("target");
		}
	},
	configEmphasis: function (p_sType, p_aArgs, p_oItem) {
		var bEmphasis = p_aArgs[0],
			oConfig = this.cfg;
		if (bEmphasis && oConfig.getProperty("strongemphasis")) {
			oConfig.setProperty("strongemphasis", false);
		}
		oConfig.refireEvent("text");
	},
	configStrongEmphasis: function (p_sType, p_aArgs, p_oItem) {
		var bStrongEmphasis = p_aArgs[0],
			oConfig = this.cfg;
		if (bStrongEmphasis && oConfig.getProperty("emphasis")) {
			oConfig.setProperty("emphasis", false);
		}
		oConfig.refireEvent("text");
	},
	configChecked: function (p_sType, p_aArgs, p_oItem) {
		var bChecked = p_aArgs[0],
			oElement = this.element,
			oAnchor = this._oAnchor,
			oConfig = this.cfg,
			sState = "-checked",
			sClassName = this.CSS_CLASS_NAME + sState,
			sLabelClassName = this.CSS_LABEL_CLASS_NAME + sState;
		if (bChecked) {
			Dom.addClass(oElement, sClassName);
			Dom.addClass(oAnchor, sLabelClassName);
		}
		else {
			Dom.removeClass(oElement, sClassName);
			Dom.removeClass(oAnchor, sLabelClassName);
		}
		oConfig.refireEvent("text");
		if (oConfig.getProperty("disabled")) {
			oConfig.refireEvent("disabled");
		}
		if (oConfig.getProperty("selected")) {
			oConfig.refireEvent("selected");
		}
	},
	configDisabled: function (p_sType, p_aArgs, p_oItem) {
		var bDisabled = p_aArgs[0],
			oConfig = this.cfg,
			oSubmenu = oConfig.getProperty("submenu"),
			bChecked = oConfig.getProperty("checked"),
			oElement = this.element,
			oAnchor = this._oAnchor,
			sState = "-disabled",
			sCheckedState = "-checked" + sState,
			sSubmenuState = "-hassubmenu" + sState,
			sClassName = this.CSS_CLASS_NAME + sState,
			sLabelClassName = this.CSS_LABEL_CLASS_NAME + sState,
			sCheckedClassName = this.CSS_CLASS_NAME + sCheckedState,
			sLabelCheckedClassName = this.CSS_LABEL_CLASS_NAME + sCheckedState,
			sSubmenuClassName = this.CSS_CLASS_NAME + sSubmenuState,
			sLabelSubmenuClassName = this.CSS_LABEL_CLASS_NAME + sSubmenuState;
		if (bDisabled) {
			if (oConfig.getProperty("selected")) {
				oConfig.setProperty("selected", false);
			}
			Dom.addClass(oElement, sClassName);
			Dom.addClass(oAnchor, sLabelClassName);
			if (oSubmenu) {
				Dom.addClass(oElement, sSubmenuClassName);
				Dom.addClass(oAnchor, sLabelSubmenuClassName);
			}
			if (bChecked) {
				Dom.addClass(oElement, sCheckedClassName);
				Dom.addClass(oAnchor, sLabelCheckedClassName);
			}
		}
		else {
			Dom.removeClass(oElement, sClassName);
			Dom.removeClass(oAnchor, sLabelClassName);
			if (oSubmenu) {
				Dom.removeClass(oElement, sSubmenuClassName);
				Dom.removeClass(oAnchor, sLabelSubmenuClassName);
			}
			if (bChecked) {
				Dom.removeClass(oElement, sCheckedClassName);
				Dom.removeClass(oAnchor, sLabelCheckedClassName);
			}
		}
	},
	configSelected: function (p_sType, p_aArgs, p_oItem) {
		var oConfig = this.cfg,
			bSelected = p_aArgs[0],
			oElement = this.element,
			oAnchor = this._oAnchor,
			bChecked = oConfig.getProperty("checked"),
			oSubmenu = oConfig.getProperty("submenu"),
			sState = "-selected",
			sCheckedState = "-checked" + sState,
			sSubmenuState = "-hassubmenu" + sState,
			sClassName = this.CSS_CLASS_NAME + sState,
			sLabelClassName = this.CSS_LABEL_CLASS_NAME + sState,
			sCheckedClassName = this.CSS_CLASS_NAME + sCheckedState,
			sLabelCheckedClassName = this.CSS_LABEL_CLASS_NAME + sCheckedState,
			sSubmenuClassName = this.CSS_CLASS_NAME + sSubmenuState,
			sLabelSubmenuClassName = this.CSS_LABEL_CLASS_NAME + sSubmenuState;
		if (YAHOO.env.ua.opera) {
			oAnchor.blur();
		}
		if (bSelected && !oConfig.getProperty("disabled")) {
			Dom.addClass(oElement, sClassName);
			Dom.addClass(oAnchor, sLabelClassName);
			if (oSubmenu) {
				Dom.addClass(oElement, sSubmenuClassName);
				Dom.addClass(oAnchor, sLabelSubmenuClassName);
			}
			if (bChecked) {
				Dom.addClass(oElement, sCheckedClassName);
				Dom.addClass(oAnchor, sLabelCheckedClassName);
			}
		}
		else {
			Dom.removeClass(oElement, sClassName);
			Dom.removeClass(oAnchor, sLabelClassName);
			if (oSubmenu) {
				Dom.removeClass(oElement, sSubmenuClassName);
				Dom.removeClass(oAnchor, sLabelSubmenuClassName);
			}
			if (bChecked) {
				Dom.removeClass(oElement, sCheckedClassName);
				Dom.removeClass(oAnchor, sLabelCheckedClassName);
			}
		}
		if (this.hasFocus() && YAHOO.env.ua.opera) {
			oAnchor.focus();
		}
	},
		_onSubmenuBeforeHide: function (p_sType, p_aArgs) {
		var oItem = this.parent,
			oMenu;
		function onHide() {
			oItem._oAnchor.blur();
			oMenu.beforeHideEvent.unsubscribe(onHide);
		}
		if (oItem.hasFocus()) {
			oMenu = oItem.parent;
			oMenu.beforeHideEvent.subscribe(onHide);
		}
	},
	configSubmenu: function (p_sType, p_aArgs, p_oItem) {
		var oSubmenu = p_aArgs[0],
			oConfig = this.cfg,
			oElement = this.element,
			oAnchor = this._oAnchor,
			bLazyLoad = this.parent && this.parent.lazyLoad,
			sState = "-hassubmenu",
			sClassName = this.CSS_CLASS_NAME + sState,
			sLabelClassName = this.CSS_LABEL_CLASS_NAME + sState,
			oMenu,
			sSubmenuId,
			oSubmenuConfig;
		if (oSubmenu) {
			if (oSubmenu instanceof Menu) {
				oMenu = oSubmenu;
				oMenu.parent = this;
				oMenu.lazyLoad = bLazyLoad;
			}
			else if (typeof oSubmenu == "object" && oSubmenu.id && 
				!oSubmenu.nodeType) {
				sSubmenuId = oSubmenu.id;
				oSubmenuConfig = oSubmenu;
				oSubmenuConfig.lazyload = bLazyLoad;
				oSubmenuConfig.parent = this;
				oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig);

				oConfig.setProperty("submenu", oMenu, true);
			}
			else {
				oMenu = new this.SUBMENU_TYPE(oSubmenu,
								{ lazyload: bLazyLoad, parent: this });
				oConfig.setProperty("submenu", oMenu, true);
			}
			if (oMenu) {
				Dom.addClass(oElement, sClassName);
				Dom.addClass(oAnchor, sLabelClassName);
				this._oSubmenu = oMenu;
				if (YAHOO.env.ua.opera) {
					oMenu.beforeHideEvent.subscribe(this._onSubmenuBeforeHide);			   
				}
			}
		}
		else {
			Dom.removeClass(oElement, sClassName);
			Dom.removeClass(oAnchor, sLabelClassName);
			if (this._oSubmenu) {
				this._oSubmenu.destroy();
			}
		}
		if (oConfig.getProperty("disabled")) {
			oConfig.refireEvent("disabled");
		}
		if (oConfig.getProperty("selected")) {
			oConfig.refireEvent("selected");
		}
	},
	configOnClick: function (p_sType, p_aArgs, p_oItem) {
		var oObject = p_aArgs[0];
		if (this._oOnclickAttributeValue && 
			(this._oOnclickAttributeValue != oObject)) {
			this.clickEvent.unsubscribe(this._oOnclickAttributeValue.fn, 
								this._oOnclickAttributeValue.obj);
			this._oOnclickAttributeValue = null;
		}
		if (!this._oOnclickAttributeValue && typeof oObject == "object" && 
			typeof oObject.fn == "function") {
			this.clickEvent.subscribe(oObject.fn, 
				((!YAHOO.lang.isUndefined(oObject.obj)) ? oObject.obj : this), 
				oObject.scope);
			this._oOnclickAttributeValue = oObject;
		}
	},
	configClassName: function (p_sType, p_aArgs, p_oItem) {
		var sClassName = p_aArgs[0];
		if (this._sClassName) {
			Dom.removeClass(this.element, this._sClassName);
		}
		Dom.addClass(this.element, sClassName);
		this._sClassName = sClassName;
	},

	initDefaultConfig : function () {
		var oConfig = this.cfg;

				oConfig.addProperty(
			DEFAULT_CONFIG.TEXT.key, 
			{ 
				handler: this.configText, 
				value: DEFAULT_CONFIG.TEXT.value, 
				validator: DEFAULT_CONFIG.TEXT.validator, 
				suppressEvent: DEFAULT_CONFIG.TEXT.suppressEvent 
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.HELP_TEXT.key,
			{
				handler: this.configHelpText, 
				supercedes: DEFAULT_CONFIG.HELP_TEXT.supercedes,
				suppressEvent: DEFAULT_CONFIG.HELP_TEXT.suppressEvent 
			}
		);
				oConfig.addProperty(
			DEFAULT_CONFIG.URL.key, 
			{
				handler: this.configURL, 
				value: DEFAULT_CONFIG.URL.value, 
				suppressEvent: DEFAULT_CONFIG.URL.suppressEvent
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.TARGET.key, 
			{
				handler: this.configTarget, 
				suppressEvent: DEFAULT_CONFIG.TARGET.suppressEvent
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.EMPHASIS.key, 
			{ 
				handler: this.configEmphasis, 
				value: DEFAULT_CONFIG.EMPHASIS.value, 
				validator: DEFAULT_CONFIG.EMPHASIS.validator, 
				suppressEvent: DEFAULT_CONFIG.EMPHASIS.suppressEvent,
				supercedes: DEFAULT_CONFIG.EMPHASIS.supercedes
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.STRONG_EMPHASIS.key,
			{
				handler: this.configStrongEmphasis,
				value: DEFAULT_CONFIG.STRONG_EMPHASIS.value,
				validator: DEFAULT_CONFIG.STRONG_EMPHASIS.validator,
				suppressEvent: DEFAULT_CONFIG.STRONG_EMPHASIS.suppressEvent,
				supercedes: DEFAULT_CONFIG.STRONG_EMPHASIS.supercedes
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.CHECKED.key, 
			{
				handler: this.configChecked, 
				value: DEFAULT_CONFIG.CHECKED.value, 
				validator: DEFAULT_CONFIG.CHECKED.validator, 
				suppressEvent: DEFAULT_CONFIG.CHECKED.suppressEvent,
				supercedes: DEFAULT_CONFIG.CHECKED.supercedes
			} 
		);
				oConfig.addProperty(
			DEFAULT_CONFIG.DISABLED.key,
			{
				handler: this.configDisabled,
				value: DEFAULT_CONFIG.DISABLED.value,
				validator: DEFAULT_CONFIG.DISABLED.validator,
				suppressEvent: DEFAULT_CONFIG.DISABLED.suppressEvent
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.SELECTED.key,
			{
				handler: this.configSelected,
				value: DEFAULT_CONFIG.SELECTED.value,
				validator: DEFAULT_CONFIG.SELECTED.validator,
				suppressEvent: DEFAULT_CONFIG.SELECTED.suppressEvent
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.SUBMENU.key, 
			{
				handler: this.configSubmenu, 
				supercedes: DEFAULT_CONFIG.SUBMENU.supercedes,
				suppressEvent: DEFAULT_CONFIG.SUBMENU.suppressEvent
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.ONCLICK.key, 
			{
				handler: this.configOnClick, 
				suppressEvent: DEFAULT_CONFIG.ONCLICK.suppressEvent 
			}
		);
		oConfig.addProperty(
			DEFAULT_CONFIG.CLASS_NAME.key, 
			{ 
				handler: this.configClassName,
				value: DEFAULT_CONFIG.CLASS_NAME.value, 
				validator: DEFAULT_CONFIG.CLASS_NAME.validator,
				suppressEvent: DEFAULT_CONFIG.CLASS_NAME.suppressEvent 
			}
		);
	},
	getNextEnabledSibling: function () {
		var nGroupIndex,
			aItemGroups,
			oNextItem,
			nNextGroupIndex,
			aNextGroup;
		function getNextArrayItem(p_aArray, p_nStartIndex) {
			return p_aArray[p_nStartIndex] || 
				getNextArrayItem(p_aArray, (p_nStartIndex+1));
		}
		if (this.parent instanceof Menu) {
			nGroupIndex = this.groupIndex;
			aItemGroups = this.parent.getItemGroups();
			if (this.index < (aItemGroups[nGroupIndex].length - 1)) {
				oNextItem = getNextArrayItem(aItemGroups[nGroupIndex], 
						(this.index+1));
			}
			else {
				if (nGroupIndex < (aItemGroups.length - 1)) {
					nNextGroupIndex = nGroupIndex + 1;
				}
				else {
					nNextGroupIndex = 0;
				}
				aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex);
				oNextItem = getNextArrayItem(aNextGroup, 0);
			}
			return (oNextItem.cfg.getProperty("disabled") || 
				oNextItem.element.style.display == "none") ? 
				oNextItem.getNextEnabledSibling() : oNextItem;
		}
	},
	getPreviousEnabledSibling: function () {
		var nGroupIndex,
			aItemGroups,
			oPreviousItem,
			nPreviousGroupIndex,
			aPreviousGroup;
		function getPreviousArrayItem(p_aArray, p_nStartIndex) {
			return p_aArray[p_nStartIndex] ||  
				getPreviousArrayItem(p_aArray, (p_nStartIndex-1));
		}
		function getFirstItemIndex(p_aArray, p_nStartIndex) {
			return p_aArray[p_nStartIndex] ? p_nStartIndex : 
				getFirstItemIndex(p_aArray, (p_nStartIndex+1));
		}
	   if (this.parent instanceof Menu) {
			nGroupIndex = this.groupIndex;
			aItemGroups = this.parent.getItemGroups();
			if (this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0)) {
				oPreviousItem = getPreviousArrayItem(aItemGroups[nGroupIndex], 
						(this.index-1));
			}
			else {
				if (nGroupIndex > getFirstItemIndex(aItemGroups, 0)) {
					nPreviousGroupIndex = nGroupIndex - 1;
				}
				else {
					nPreviousGroupIndex = aItemGroups.length - 1;
				}
				aPreviousGroup = getPreviousArrayItem(aItemGroups, 
					nPreviousGroupIndex);
				oPreviousItem = getPreviousArrayItem(aPreviousGroup, 
						(aPreviousGroup.length - 1));
			}
			return (oPreviousItem.cfg.getProperty("disabled") || 
				oPreviousItem.element.style.display == "none") ? 
				oPreviousItem.getPreviousEnabledSibling() : oPreviousItem;
		}
	},
	focus: function () {
		var oParent = this.parent,
			oAnchor = this._oAnchor,
			oActiveItem = oParent.activeItem,
			me = this;
		function setFocus() {
			try {
				if (YAHOO.env.ua.ie && !document.hasFocus()) {
					return;
				}
				if (oActiveItem) {
					oActiveItem.blurEvent.fire();
				}
				oAnchor.focus();
				me.focusEvent.fire();
			}
			catch(e) {
			}
		}
		if (!this.cfg.getProperty("disabled") && oParent && 
			oParent.cfg.getProperty("visible") && 
			this.element.style.display != "none") {
			window.setTimeout(setFocus, 0);
		}
	},
	blur: function () {
		var oParent = this.parent;
		if (!this.cfg.getProperty("disabled") && oParent && 
			oParent.cfg.getProperty("visible")) {
			var me = this;
			window.setTimeout(function () {
				try {
					me._oAnchor.blur();
					me.blurEvent.fire();
				} 
				catch (e) {
				}
			}, 0);
		}
	},
	hasFocus: function () {
		return (YAHOO.widget.MenuManager.getFocusedMenuItem() == this);
	},
	destroy: function () {
		var oEl = this.element,
			oSubmenu,
			oParentNode;
		if (oEl) {

			oSubmenu = this.cfg.getProperty("submenu");
			if (oSubmenu) {
				oSubmenu.destroy();
			}

			this.mouseOverEvent.unsubscribeAll();
			this.mouseOutEvent.unsubscribeAll();
			this.mouseDownEvent.unsubscribeAll();
			this.mouseUpEvent.unsubscribeAll();
			this.clickEvent.unsubscribeAll();
			this.keyPressEvent.unsubscribeAll();
			this.keyDownEvent.unsubscribeAll();
			this.keyUpEvent.unsubscribeAll();
			this.focusEvent.unsubscribeAll();
			this.blurEvent.unsubscribeAll();
			this.cfg.configChangedEvent.unsubscribeAll();

			oParentNode = oEl.parentNode;
			if (oParentNode) {
				oParentNode.removeChild(oEl);
				this.destroyEvent.fire();
			}
			this.destroyEvent.unsubscribeAll();
		}
	},
	toString: function () {
		var sReturnVal = "MenuItem",
			sId = this.id;
		if (sId) {
			sReturnVal += (" " + sId);
		}
		return sReturnVal;
	}
};
Lang.augmentProto(MenuItem, YAHOO.util.EventProvider);
})();
(function () {
YAHOO.widget.ContextMenu = function(p_oElement, p_oConfig) {
	YAHOO.widget.ContextMenu.superclass.constructor.call(this, 
			p_oElement, p_oConfig);
};
var Event = YAHOO.util.Event,
	ContextMenu = YAHOO.widget.ContextMenu,
	EVENT_TYPES = {
		"TRIGGER_CONTEXT_MENU": "triggerContextMenu",
		"CONTEXT_MENU": (YAHOO.env.ua.opera ? "mousedown" : "contextmenu"),
		"CLICK": "click"
	},
	DEFAULT_CONFIG = {
		"TRIGGER": { 
			key: "trigger",
			suppressEvent: true
		}
	};
function position(p_sType, p_aArgs, p_aPos) {
	this.cfg.setProperty("xy", p_aPos);
	this.beforeShowEvent.unsubscribe(position, p_aPos);
}
YAHOO.lang.extend(ContextMenu, YAHOO.widget.Menu, {
// Private properties
_oTrigger: null,
_bCancelled: false,
// Public properties
contextEventTarget: null,
// Events
triggerContextMenuEvent: null,
init: function(p_oElement, p_oConfig) {

	ContextMenu.superclass.init.call(this, p_oElement);
	this.beforeInitEvent.fire(ContextMenu);
	if(p_oConfig) {
		this.cfg.applyConfig(p_oConfig, true);
	}
	this.initEvent.fire(ContextMenu);
},
initEvents: function() {
	ContextMenu.superclass.initEvents.call(this);
	this.triggerContextMenuEvent = 
		this.createEvent(EVENT_TYPES.TRIGGER_CONTEXT_MENU);
	this.triggerContextMenuEvent.signature = YAHOO.util.CustomEvent.LIST;
},
cancel: function() {
	this._bCancelled = true;
},
// Private methods
_removeEventHandlers: function() {
	var oTrigger = this._oTrigger;

	if (oTrigger) {
		Event.removeListener(oTrigger, EVENT_TYPES.CONTEXT_MENU, 
			this._onTriggerContextMenu);
		if(YAHOO.env.ua.opera) {
			Event.removeListener(oTrigger, EVENT_TYPES.CLICK, 
				this._onTriggerClick);
		}
	}
},
// Private event handlers
_onTriggerClick: function(p_oEvent, p_oMenu) {
	if(p_oEvent.ctrlKey) {
		Event.stopEvent(p_oEvent);
	}
},
_onTriggerContextMenu: function(p_oEvent, p_oMenu) {
	if (p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) {
		return;
	}
	var aXY;
	Event.stopEvent(p_oEvent);
	this.contextEventTarget = Event.getTarget(p_oEvent);
	this.triggerContextMenuEvent.fire(p_oEvent);

	YAHOO.widget.MenuManager.hideVisible();
	if(!this._bCancelled) {
		aXY = Event.getXY(p_oEvent);
		if (!YAHOO.util.Dom.inDocument(this.element)) {
			this.beforeShowEvent.subscribe(position, aXY);
		}
		else {
			this.cfg.setProperty("xy", aXY);
		}
		this.show();
	}
	this._bCancelled = false;
},
// Public methods
toString: function() {
	var sReturnVal = "ContextMenu",
		sId = this.id;
	if(sId) {
		sReturnVal += (" " + sId);
	}
	return sReturnVal;
},
initDefaultConfig: function() {
	ContextMenu.superclass.initDefaultConfig.call(this);
	this.cfg.addProperty(DEFAULT_CONFIG.TRIGGER.key, 
		{
			handler: this.configTrigger, 
			suppressEvent: DEFAULT_CONFIG.TRIGGER.suppressEvent 
		}
	);
},
destroy: function() {
	this._removeEventHandlers();

	ContextMenu.superclass.destroy.call(this);
},
// Public event handlers for configuration properties
configTrigger: function(p_sType, p_aArgs, p_oMenu) {
	var oTrigger = p_aArgs[0];
	if(oTrigger) {
		if(this._oTrigger) {
			this._removeEventHandlers();
		}
		this._oTrigger = oTrigger;
  
		Event.on(oTrigger, EVENT_TYPES.CONTEXT_MENU, 
			this._onTriggerContextMenu, this, true);
		if(YAHOO.env.ua.opera) {
			Event.on(oTrigger, EVENT_TYPES.CLICK, this._onTriggerClick, 
				this, true);
		}
	}
	else {
   
		this._removeEventHandlers();
	}
}
}); // END YAHOO.lang.extend
}());
YAHOO.widget.ContextMenuItem = YAHOO.widget.MenuItem;
(function () {
YAHOO.widget.MenuBar = function(p_oElement, p_oConfig) {
	YAHOO.widget.MenuBar.superclass.constructor.call(this, 
		p_oElement, p_oConfig);
};
function checkPosition(p_sPosition) {
	if (typeof p_sPosition == "string") {
		return ("dynamic,static".indexOf((p_sPosition.toLowerCase())) != -1);
	}
}
var Event = YAHOO.util.Event,
	MenuBar = YAHOO.widget.MenuBar,
	DEFAULT_CONFIG = {
		"POSITION": { 
			key: "position", 
			value: "static", 
			validator: checkPosition, 
			supercedes: ["visible"] 
		}, 
		"SUBMENU_ALIGNMENT": { 
			key: "submenualignment", 
			value: ["tl","bl"],
			suppressEvent: true 
		},
		"AUTO_SUBMENU_DISPLAY": { 
			key: "autosubmenudisplay", 
			value: false, 
			validator: YAHOO.lang.isBoolean,
			suppressEvent: true
		}
	};
YAHOO.lang.extend(MenuBar, YAHOO.widget.Menu, {
init: function(p_oElement, p_oConfig) {
	if(!this.ITEM_TYPE) {
		this.ITEM_TYPE = YAHOO.widget.MenuBarItem;
	}

	MenuBar.superclass.init.call(this, p_oElement);
	this.beforeInitEvent.fire(MenuBar);
	if(p_oConfig) {
		this.cfg.applyConfig(p_oConfig, true);
	}
	this.initEvent.fire(MenuBar);
},
// Constants
CSS_CLASS_NAME: "yuimenubar",
// Protected event handlers
_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) {
	var oEvent = p_aArgs[0],
		oItem = p_aArgs[1],
		oSubmenu,
		oItemCfg,
		oNextItem;
	if(oItem && !oItem.cfg.getProperty("disabled")) {
		oItemCfg = oItem.cfg;
		switch(oEvent.keyCode) {
			case 37:
			case 39:
				if(oItem == this.activeItem && 
					!oItemCfg.getProperty("selected")) {
					oItemCfg.setProperty("selected", true);
				}
				else {
					oNextItem = (oEvent.keyCode == 37) ? 
						oItem.getPreviousEnabledSibling() : 
						oItem.getNextEnabledSibling();
					if(oNextItem) {
						this.clearActiveItem();
						oNextItem.cfg.setProperty("selected", true);
						if(this.cfg.getProperty("autosubmenudisplay")) {
							oSubmenu = oNextItem.cfg.getProperty("submenu");
							if(oSubmenu) {
								oSubmenu.show();
							}
						}		   
						oNextItem.focus();
					}
				}
				Event.preventDefault(oEvent);
			break;
			case 40:
				if(this.activeItem != oItem) {
					this.clearActiveItem();
					oItemCfg.setProperty("selected", true);
					oItem.focus();
				}
				oSubmenu = oItemCfg.getProperty("submenu");
				if(oSubmenu) {
					if(oSubmenu.cfg.getProperty("visible")) {
						oSubmenu.setInitialSelection();
						oSubmenu.setInitialFocus();
					}
					else {
						oSubmenu.show();
					}
				}
				Event.preventDefault(oEvent);
			break;
		}
	}
	if(oEvent.keyCode == 27 && this.activeItem) { // Esc key
		oSubmenu = this.activeItem.cfg.getProperty("submenu");
		if(oSubmenu && oSubmenu.cfg.getProperty("visible")) {
			oSubmenu.hide();
			this.activeItem.focus();
		}
		else {
			this.activeItem.cfg.setProperty("selected", false);
			this.activeItem.blur();
		}
		Event.preventDefault(oEvent);
	}
},
_onClick: function(p_sType, p_aArgs, p_oMenuBar) {
	MenuBar.superclass._onClick.call(this, p_sType, p_aArgs, p_oMenuBar);
	var oItem = p_aArgs[1],
		oEvent,
		oTarget,
		oActiveItem,
		oConfig,
		oSubmenu;
	if(oItem && !oItem.cfg.getProperty("disabled")) {
		oEvent = p_aArgs[0];
		oTarget = Event.getTarget(oEvent);
		oActiveItem = this.activeItem;
		oConfig = this.cfg;

		if(oActiveItem && oActiveItem != oItem) {
			this.clearActiveItem();
		}
		oItem.cfg.setProperty("selected", true);

		oSubmenu = oItem.cfg.getProperty("submenu");
		if(oSubmenu) {
			if(oSubmenu.cfg.getProperty("visible")) {
				oSubmenu.hide();
			}
			else {
				oSubmenu.show();
			}
		}
	}
},
// Public methods
toString: function() {
	var sReturnVal = "MenuBar",
		sId = this.id;
	if(sId) {
		sReturnVal += (" " + sId);
	}
	return sReturnVal;
},
initDefaultConfig: function() {
	MenuBar.superclass.initDefaultConfig.call(this);
	var oConfig = this.cfg;

	oConfig.addProperty(
		DEFAULT_CONFIG.POSITION.key, 
		{
			handler: this.configPosition, 
			value: DEFAULT_CONFIG.POSITION.value, 
			validator: DEFAULT_CONFIG.POSITION.validator,
			supercedes: DEFAULT_CONFIG.POSITION.supercedes
		}
	);
	oConfig.addProperty(
		DEFAULT_CONFIG.SUBMENU_ALIGNMENT.key, 
		{
			value: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.value,
			suppressEvent: DEFAULT_CONFIG.SUBMENU_ALIGNMENT.suppressEvent
		}
	);
	oConfig.addProperty(
	   DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key, 
	   {
		   value: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value, 
		   validator: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator,
		   suppressEvent: DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.suppressEvent
	   } 
	);
}
 
}); // END YAHOO.lang.extend
}());
YAHOO.widget.MenuBarItem = function(p_oObject, p_oConfig) {
	YAHOO.widget.MenuBarItem.superclass.constructor.call(this, 
		p_oObject, p_oConfig);
};
YAHOO.lang.extend(YAHOO.widget.MenuBarItem, YAHOO.widget.MenuItem, {
init: function(p_oObject, p_oConfig) {
	if(!this.SUBMENU_TYPE) {
		this.SUBMENU_TYPE = YAHOO.widget.Menu;
	}
	YAHOO.widget.MenuBarItem.superclass.init.call(this, p_oObject);  
	var oConfig = this.cfg;
	if(p_oConfig) {
		oConfig.applyConfig(p_oConfig, true);
	}
	oConfig.fireQueue();
},
// Constants
CSS_CLASS_NAME: "yuimenubaritem",
CSS_LABEL_CLASS_NAME: "yuimenubaritemlabel",
// Public methods
toString: function() {
	var sReturnVal = "MenuBarItem";
	if(this.cfg && this.cfg.getProperty("text")) {
		sReturnVal += (": " + this.cfg.getProperty("text"));
	}
	return sReturnVal;
}
}); // END YAHOO.lang.extend
YAHOO.register("menu", YAHOO.widget.Menu, {version: "2.5.0", build: "897"});
