/*
Copyright (c) 2007, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.3.0
 */

( 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_oMenus) {
					if (YAHOO.lang.hasOwnProperty(m_oMenus, i)) {
						oMenu = m_oMenus[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) {
			var sId = this.id;
			if (sId && m_oItems[sId]) {
				if (m_oFocusedMenuItem == this) {
					m_oFocusedMenuItem = null;
				}
				delete m_oItems[sId];
			}
		}
		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.destroyEvent
							.subscribe(onMenuDestroy, p_oMenu, this);
					p_oMenu.cfg.subscribeToConfigEvent("visible",
							onMenuVisibleConfigChange);
					p_oMenu.itemAddedEvent.subscribe(onItemAdded);
					p_oMenu.focusEvent.subscribe(onMenuFocus);
					p_oMenu.blurEvent.subscribe(onMenuBlur);
				}
			},
			removeMenu : function(p_oMenu) {
				var sId;
				if (p_oMenu) {
					sId = p_oMenu.id;
					if (m_oMenus[sId] == p_oMenu) {
						delete m_oMenus[sId];
						if (m_oVisibleMenus[sId] == p_oMenu) {
							delete m_oVisibleMenus[sId];
						}
					}
				}
			},
			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();
						}
					}
				}
			},
			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, 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" ]
		},
		"AUTO_SUBMENU_DISPLAY" : {
			key : "autosubmenudisplay",
			value : true,
			validator : Lang.isBoolean
		},
		"SHOW_DELAY" : {
			key : "showdelay",
			value : 250,
			validator : Lang.isNumber
		},
		"HIDE_DELAY" : {
			key : "hidedelay",
			value : 0,
			validator : Lang.isNumber,
			suppressEvent : true
		},
		"SUBMENU_HIDE_DELAY" : {
			key : "submenuhidedelay",
			value : 250,
			validator : Lang.isNumber
		},
		"CLICK_TO_HIDE" : {
			key : "clicktohide",
			value : true,
			validator : Lang.isBoolean
		},
		"CONTAINER" : {
			key : "container"
		},
		"MAX_HEIGHT" : {
			key : "maxheight",
			value : 0,
			validator : Lang.isNumber,
			supercedes : [ "iframe" ]
		},
		"CLASS_NAME" : {
			key : "classname",
			value : null,
			validator : Lang.isString
		},
		"DISABLED" : {
			key : "disabled",
			value : false,
			validator : Lang.isBoolean
		}
	};
	YAHOO.lang
			.extend(
					Menu,
					Overlay,
					{
						CSS_CLASS_NAME : "yuimenu",
						ITEM_TYPE : null,
						GROUP_TITLE_TAG_NAME : "h6",
						_nHideDelayId : null,
						_nShowDelayId : null,
						_nSubmenuHideDelayId : null,
						_nBodyScrollId : null,
						_bHideDelayEventHandlersAssigned : false,
						_bHandledMouseOverEvent : false,
						_bHandledMouseOutEvent : false,
						_aGroupTitleElements : null,
						_aItemGroups : null,
						_aListElements : null,
						_nCurrentMouseX : 0,
						_nMaxHeight : -1,
						_bStopMouseEventHandlers : false,
						_sClassName : null,
						_bDisabled : false,
						lazyLoad : false,
						itemData : null,
						activeItem : null,
						parent : null,
						srcElement : null,
						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.showEvent.subscribe(this._onShow);
								this.beforeHideEvent
										.subscribe(this._onBeforeHide);
								this.hideEvent.subscribe(this._onHide);
								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);
								Module.textResizeEvent.subscribe(
										this._onTextResize, this, true);
								if (p_oConfig) {
									this.cfg.applyConfig(p_oConfig, true);
								}
								MenuManager.addMenu(this);
								this.initEvent.fire(Menu);
							}
						},
						_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, bDisabled = this.cfg
									.getProperty("disabled"), 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, null,
										oSubmenu);
								oSubmenu.showEvent.subscribe(
										this._onSubmenuShow, null, p_oItem);
								oSubmenu.hideEvent.subscribe(
										this._onSubmenuHide, null, p_oItem);
							}
						},
						_subscribeToItemEvents : function(p_oItem) {
							p_oItem.focusEvent.subscribe(this._onMenuItemFocus);
							p_oItem.blurEvent.subscribe(this._onMenuItemBlur);
							p_oItem.cfg.configChangedEvent
									.subscribe(this._onMenuItemConfigChange,
											p_oItem, this);
						},
						_getOffsetWidth : function() {
							var oClone = this.element.cloneNode(true);
							Dom.removeClass(oClone, "visible");
							Dom.setStyle(oClone, "width", "");
							document.body.appendChild(oClone);
							var sWidth = oClone.offsetWidth;
							document.body.removeChild(oClone);
							return sWidth;
						},
						_setWidth : function() {
							var oElement = this.element, bVisible = false, sWidth;
							if (oElement.parentNode.tagName.toUpperCase() == "BODY") {
								if (YAHOO.env.ua.opera) {
									sWidth = this._getOffsetWidth();
								} else {
									if (Dom.hasClass(oElement, "visible")) {
										bVisible = true;
										Dom.removeClass(oElement, "visible");
									}
									Dom.setStyle(oElement, "width", "auto");
									sWidth = oElement.offsetWidth;
								}
							} else {
								sWidth = this._getOffsetWidth();
							}
							this.cfg.setProperty("width", (sWidth + "px"));
							if (bVisible) {
								Dom.addClass(oElement, "visible");
							}
						},
						_onWidthChange : function(p_sType, p_aArgs) {
							var sWidth = p_aArgs[0];
							if (sWidth && !this._hasSetWidthHandlers) {
								this.itemAddedEvent.subscribe(this._setWidth);
								this.itemRemovedEvent.subscribe(this._setWidth);
								this._hasSetWidthHandlers = true;
							} else if (this._hasSetWidthHandlers) {
								this.itemAddedEvent.unsubscribe(this._setWidth);
								this.itemRemovedEvent
										.unsubscribe(this._setWidth);
								this._hasSetWidthHandlers = false;
							}
						},
						_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);
						},
						_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);
								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 oEvent = p_aArgs[0], oItem = p_aArgs[1], oTarget, oItemCfg, oSubmenu, sURL, oRoot;
							if (oItem && !oItem.cfg.getProperty("disabled")) {
								oTarget = Event.getTarget(oEvent);
								oItemCfg = oItem.cfg;
								oSubmenu = oItemCfg.getProperty("submenu");
								if (oTarget == oItem.submenuIndicator
										&& oSubmenu) {
									if (oSubmenu.cfg.getProperty("visible")) {
										oSubmenu.hide();
										oSubmenu.parent.focus();
									} else {
										this.clearActiveItem();
										oItemCfg.setProperty("selected", true);
										oSubmenu.show();
										oSubmenu.setInitialFocus();
									}
									Event.preventDefault(oEvent);
								} else {
									sURL = oItemCfg.getProperty("url");
									if ((sURL.substr((sURL.length - 1), 1) == "#")) {
										Event.preventDefault(oEvent);
										oItem.focus();
									}
									if (!oSubmenu) {
										oRoot = this.getRoot();
										if (oRoot instanceof YAHOO.widget.MenuBar
												|| oRoot.cfg
														.getProperty("position") == "static") {
											oRoot.clearActiveItem();
										} else if (oRoot.cfg
												.getProperty("clicktohide")) {
											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 {
												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) {
								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);
							}
						},
						_onTextResize : function(p_sType, p_aArgs, p_oMenu) {
							if (YAHOO.env.ua.gecko && !this._handleResize) {
								this._handleResize = true;
								return;
							}
							var oConfig = this.cfg;
							if (oConfig.getProperty("position") == "dynamic") {
								oConfig.setProperty("width", (this
										._getOffsetWidth() + "px"));
							}
						},
						_onScrollTargetMouseOver : function(p_oEvent, p_oMenu) {
							this._cancelHideDelay();
							var oTarget = Event.getTarget(p_oEvent), oBody = this.body, me = this, nScrollTarget, fnScrollFunction;
							function scrollBodyDown() {
								var nScrollTop = oBody.scrollTop;
								if (nScrollTop < nScrollTarget) {
									oBody.scrollTop = (nScrollTop + 1);
									me._enableScrollHeader();
								} else {
									oBody.scrollTop = nScrollTarget;
									window.clearInterval(me._nBodyScrollId);
									me._disableScrollFooter();
								}
							}
							function scrollBodyUp() {
								var nScrollTop = oBody.scrollTop;
								if (nScrollTop > 0) {
									oBody.scrollTop = (nScrollTop - 1);
									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();
						},
						_onInit : function(p_sType, p_aArgs) {
							this.cfg.subscribeToConfigEvent("width",
									this._onWidthChange);
							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 oConfig = this.cfg, 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"
									&& !this.cfg.getProperty("width")) {
								this._setWidth();
							}
						},
						_onBeforeShow : function(p_sType, p_aArgs) {
							var nOptions, n, nViewportHeight, oRegion, nMaxHeight, oBody, 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"));
										this.cfg.refireEvent("xy");
									}
								}
							}
							if (!(this instanceof YAHOO.widget.MenuBar)
									&& this.cfg.getProperty("position") == "dynamic") {
								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 = this.cfg
											.getProperty("maxheight");
									this._nMaxHeight = nMaxHeight;
									this.cfg.setProperty("maxheight",
											(nViewportHeight - 20));
								}
								if (this.cfg.getProperty("maxheight") > 0) {
									oBody = this.body;
									if (oBody.scrollTop > 0) {
										oBody.scrollTop = 0;
									}
									this._disableScrollHeader();
									this._enableScrollFooter();
								}
							}
						},
						_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();
							}
						},
						_onHide : function(p_sType, p_aArgs) {
							if (this._nMaxHeight != -1) {
								this.cfg.setProperty("maxheight",
										this._nMaxHeight);
								this._nMaxHeight = -1;
							}
						},
						_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":
								p_oSubmenu.cfg.setProperty(sPropertyName,
										oPropertyValue);
								break;
							}
						},
						_onParentMenuRender : function(p_sType, p_aArgs,
								p_oSubmenu) {
							var oParentMenu = p_oSubmenu.parent.parent, oConfig = {
								constraintoviewport : oParentMenu.cfg
										.getProperty("constraintoviewport"),
								xy : [ 0, 0 ],
								clicktohide : oParentMenu.cfg
										.getProperty("clicktohide"),
								effect : oParentMenu.cfg.getProperty("effect"),
								showdelay : oParentMenu.cfg
										.getProperty("showdelay"),
								hidedelay : oParentMenu.cfg
										.getProperty("hidedelay"),
								submenuhidedelay : oParentMenu.cfg
										.getProperty("submenuhidedelay"),
								classname : oParentMenu.cfg
										.getProperty("classname")
							}, oLI;
							if (this.cfg.getProperty("position") == oParentMenu.cfg
									.getProperty("position")) {
								oConfig.iframe = oParentMenu.cfg
										.getProperty("iframe");
							}
							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");
							this.cfg.setProperty("context", [ oParent.element,
									aAlignment[0], aAlignment[1] ]);
							var nScrollTop = oParent.parent.body.scrollTop;
							if ((YAHOO.env.ua.gecko || YAHOO.env.ua.webkit)
									&& nScrollTop > 0) {
								this.cfg.setProperty("y", (this.cfg
										.getProperty("y") - nScrollTop));
							}
						},
						_onSubmenuShow : function(p_sType, p_aArgs) {
							this.submenuIndicator.innerHTML = this.EXPANDED_SUBMENU_INDICATOR_TEXT;
						},
						_onSubmenuHide : function(p_sType, p_aArgs) {
							this.submenuIndicator.innerHTML = this.COLLAPSED_SUBMENU_INDICATOR_TEXT;
						},
						_onMenuItemFocus : function(p_sType, p_aArgs) {
							this.parent.focusEvent.fire(this);
						},
						_onMenuItemBlur : function(p_sType, p_aArgs) {
							this.parent.blurEvent.fire(this);
						},
						_onMenuItemConfigChange : function(p_sType, p_aArgs,
								p_oItem) {
							var sPropertyName = p_aArgs[0][0], oPropertyValue = p_aArgs[0][1], sWidth, 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;
							case "text":
							case "helptext":
								if (this.element.style.width) {
									sWidth = this._getOffsetWidth() + "px";
									Dom.setStyle(this.element, "width", sWidth);
								}
								break;
							}
						},
						enforceConstraints : function(type, args, obj) {
							var oParentMenuItem = this.parent, oElement, oConfig, pos, x, y, offsetHeight, offsetWidth, viewPortWidth, viewPortHeight, scrollX, scrollY, nPadding, topConstraint, leftConstraint, bottomConstraint, rightConstraint, aContext, oContextElement;
							if (oParentMenuItem
									&& !(oParentMenuItem.parent instanceof YAHOO.widget.MenuBar)) {
								oElement = this.element;
								oConfig = this.cfg;
								pos = args[0];
								x = pos[0];
								y = pos[1];
								offsetHeight = oElement.offsetHeight;
								offsetWidth = oElement.offsetWidth;
								viewPortWidth = Dom.getViewportWidth();
								viewPortHeight = Dom.getViewportHeight();
								scrollX = Dom.getDocumentScrollLeft();
								scrollY = Dom.getDocumentScrollTop();
								nPadding = (oParentMenuItem.parent instanceof YAHOO.widget.MenuBar) ? 0
										: 10;
								topConstraint = scrollY + nPadding;
								leftConstraint = scrollX + nPadding;
								bottomConstraint = scrollY + viewPortHeight
										- offsetHeight - nPadding;
								rightConstraint = scrollX + viewPortWidth
										- offsetWidth - nPadding;
								aContext = oConfig.getProperty("context");
								oContextElement = aContext ? aContext[0] : null;
								if (x < 10) {
									x = leftConstraint;
								} else if ((x + offsetWidth) > viewPortWidth) {
									if (oContextElement
											&& ((x - oContextElement.offsetWidth) > offsetWidth)) {
										x = (x - (oContextElement.offsetWidth + offsetWidth));
									} else {
										x = rightConstraint;
									}
								}
								if (y < 10) {
									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);
							} else if (this == this.getRoot()
									&& this.cfg.getProperty("position") == "dynamic") {
								Menu.superclass.enforceConstraints.call(this,
										type, args, obj);
							}
						},
						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");
								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", sCurrentPosition = Dom
									.getStyle(oElement, "position"), oCfg = this.cfg, nZIndex;
							Dom
									.setStyle(this.element, "position",
											sCSSPosition);
							if (sCSSPosition == "static") {
								oCfg.setProperty("iframe", false);
								Dom.setStyle(this.element, "display", "block");
								oCfg.setProperty("visible", true);
							} else {
								if (sCurrentPosition != "absolute") {
									oCfg.setProperty("iframe",
											(YAHOO.env.ua.ie == 6 ? true
													: false));
								}
								Dom.setStyle(this.element, "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], oBody = this.body, oHeader = this.header, oFooter = this.footer, fnMouseOver = this._onScrollTargetMouseOver, fnMouseOut = this._onScrollTargetMouseOut, nHeight;
							if (this.lazyLoad && !oBody) {
								this.renderEvent
										.unsubscribe(this._setMaxHeight);
								if (nMaxHeight > 0) {
									this.renderEvent.subscribe(
											this._setMaxHeight, nMaxHeight,
											this);
								}
								return;
							}
							Dom.setStyle(oBody, "height", "auto");
							Dom.setStyle(oBody, "overflow", "visible");
							if ((nMaxHeight > 0)
									&& (oBody.offsetHeight > nMaxHeight)) {
								if (!this.cfg.getProperty("width")) {
									this._setWidth();
								}
								if (!oHeader && !oFooter) {
									this.setHeader("&#32;");
									this.setFooter("&#32;");
									oHeader = this.header;
									oFooter = this.footer;
									Dom.addClass(oHeader, "topscrollbar");
									Dom.addClass(oFooter, "bottomscrollbar");
									this.element.insertBefore(oHeader, oBody);
									this.element.appendChild(oFooter);
									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);
								}
								nHeight = (nMaxHeight - (this.footer.offsetHeight + this.header.offsetHeight));
								Dom.setStyle(oBody, "height", (nHeight + "px"));
								Dom.setStyle(oBody, "overflow", "hidden");
							} else if (oHeader && oFooter) {
								Dom.setStyle(oBody, "height", "auto");
								Dom.setStyle(oBody, "overflow", "visible");
								Event.removeListener(oHeader, "mouseover",
										fnMouseOver);
								Event.removeListener(oHeader, "mouseout",
										fnMouseOut);
								Event.removeListener(oFooter, "mouseover",
										fnMouseOver);
								Event.removeListener(oFooter, "mouseout",
										fnMouseOut);
								this.element.removeChild(oHeader);
								this.element.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, nItems, i;
							if (this._bDisabled != bDisabled) {
								aItems = this.getItems();
								nItems = aItems.length;
								if (nItems > 0) {
									i = nItems - 1;
									do {
										aItems[i].cfg.setProperty("disabled",
												bDisabled);
									} while (i--);
								}
								Dom[(bDisabled ? "addClass" : "removeClass")](
										this.element, "disabled");
								this.itemAddedEvent[(bDisabled ? "subscribe"
										: "unsubscribe")](this._onItemAdded);
								this._bDisabled = bDisabled;
							}
						},
						onRender : function(p_sType, p_aArgs) {
							function sizeShadow() {
								var oElement = this.element, oShadow = this._shadow;
								if (oShadow) {
									oShadow.style.width = (oElement.offsetWidth + 6)
											+ "px";
									oShadow.style.height = (oElement.offsetHeight + 1)
											+ "px";
								}
							}
							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";
									}
									oShadow = m_oShadowTemplate
											.cloneNode(false);
									oElement.appendChild(oShadow);
									this._shadow = oShadow;
									addShadowVisibleClass.call(this);
									this.beforeShowEvent
											.subscribe(addShadowVisibleClass);
									this.beforeHideEvent
											.subscribe(removeShadowVisibleClass);
									if (YAHOO.env.ua.ie) {
										window.setTimeout( function() {
											sizeShadow.call(me);
											me.syncIframe();
										}, 0);
										this.cfg.subscribeToConfigEvent(
												"width", sizeShadow);
										this.cfg.subscribeToConfigEvent(
												"height", sizeShadow);
										this.changeContentEvent
												.subscribe(sizeShadow);
										Module.textResizeEvent.subscribe(
												sizeShadow, me, true);
										this.destroyEvent
												.subscribe( function() {
													Module.textResizeEvent
															.unsubscribe(
																	sizeShadow,
																	me);
												});
									}
								}
							}
							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);
								}
							}
						},
						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;
						},
						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 = aGroups.length;
							return ((nGroups == 1) ? aGroups[0]
									: (Array.prototype.concat.apply( [],
											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._aItemGroups = [];
							this._aListElements = [];
							this._aGroupTitleElements = [];
							this.cfg.setProperty("width", null);
						},
						destroy : function() {
							Module.textResizeEvent.unsubscribe(
									this._onTextResize, this);
							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);
								}
							}
							Menu.superclass.subscribe.apply(this, arguments);
							Menu.superclass.subscribe.call(this, "itemAdded",
									onItemAdded, arguments);
							var aSubmenus = this.getSubmenus(), nSubmenus, oSubmenu, i;
							if (aSubmenus) {
								nSubmenus = aSubmenus.length;
								if (nSubmenus > 0) {
									i = nSubmenus - 1;
									do {
										oSubmenu = aSubmenus[i];
										oSubmenu.subscribe.apply(oSubmenu,
												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
											});
							oConfig
									.addProperty(
											DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key,
											{
												value : DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value,
												validator : DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator
											});
							oConfig
									.addProperty(
											DEFAULT_CONFIG.SHOW_DELAY.key,
											{
												value : DEFAULT_CONFIG.SHOW_DELAY.value,
												validator : DEFAULT_CONFIG.SHOW_DELAY.validator
											});
							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
											});
							oConfig
									.addProperty(
											DEFAULT_CONFIG.CLICK_TO_HIDE.key,
											{
												value : DEFAULT_CONFIG.CLICK_TO_HIDE.value,
												validator : DEFAULT_CONFIG.CLICK_TO_HIDE.validator
											});
							oConfig.addProperty(DEFAULT_CONFIG.CONTAINER.key, {
								handler : this.configContainer,
								value : document.body
							});
							oConfig
									.addProperty(
											DEFAULT_CONFIG.MAX_HEIGHT.key,
											{
												handler : this.configMaxHeight,
												value : DEFAULT_CONFIG.MAX_HEIGHT.value,
												validator : DEFAULT_CONFIG.MAX_HEIGHT.validator
											});
							oConfig
									.addProperty(
											DEFAULT_CONFIG.CLASS_NAME.key,
											{
												handler : this.configClassName,
												value : DEFAULT_CONFIG.CLASS_NAME.value,
												validator : DEFAULT_CONFIG.CLASS_NAME.validator
											});
							oConfig.addProperty(DEFAULT_CONFIG.DISABLED.key, {
								handler : this.configDisabled,
								value : DEFAULT_CONFIG.DISABLED.value,
								validator : DEFAULT_CONFIG.DISABLED.validator
							});
						}
					});
})();
( 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" ]
		},
		"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 : [ "text" ]
		},
		"DISABLED" : {
			key : "disabled",
			value : false,
			validator : Lang.isBoolean,
			suppressEvent : true,
			supercedes : [ "text" ]
		},
		"SELECTED" : {
			key : "selected",
			value : false,
			validator : Lang.isBoolean,
			suppressEvent : true
		},
		"SUBMENU" : {
			key : "submenu",
			supercedes : [ "text" ]
		},
		"ONCLICK" : {
			key : "onclick"
		},
		"CLASS_NAME" : {
			key : "classname",
			value : null,
			validator : Lang.isString
		}
	};
	MenuItem.prototype = {
		COLLAPSED_SUBMENU_INDICATOR_TEXT : "Submenu collapsed.  Click to expand submenu.",
		EXPANDED_SUBMENU_INDICATOR_TEXT : "Submenu expanded.  Click to collapse submenu.",
		DISABLED_SUBMENU_INDICATOR_TEXT : "Submenu collapsed.  (Item disabled.)",
		CHECKED_TEXT : "Menu item checked.",
		DISABLED_CHECKED_TEXT : "Checked. (Item disabled.)",
		CSS_CLASS_NAME : "yuimenuitem",
		CSS_LABEL_CLASS_NAME : "yuimenuitemlabel",
		SUBMENU_TYPE : null,
		_oAnchor : null,
		_oHelpTextEM : null,
		_oSubmenu : null,
		_oCheckedIndicator : null,
		_oOnclickAttributeValue : null,
		_sClassName : null,
		constructor : MenuItem,
		index : null,
		groupIndex : null,
		parent : null,
		element : null,
		srcElement : null,
		value : null,
		submenuIndicator : 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);
					this.srcElement = p_oObject;
					break;
				case "OPTGROUP":
					this._createRootNodeStructure();
					oConfig.queueProperty("text", p_oObject.label);
					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.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 = "", sCheckHTML = "", oSubmenu = oConfig
					.getProperty("submenu"), sSubmenuIndicatorHTML = "", sEmphasisStartTag = "", sEmphasisEndTag = "";
			if (sText) {
				if (sHelpText) {
					sHelpTextHTML = "<em class=\"helptext\">" + sHelpText
							+ "</em>";
				}
				if (oConfig.getProperty("checked")) {
					sCheckHTML = "<em class=\"checkedindicator\">"
							+ this.CHECKED_TEXT + "</em>";
				}
				if (oSubmenu) {
					sSubmenuIndicatorHTML = "<em class=\"submenuindicator\">"
							+ ((oSubmenu instanceof Menu && oSubmenu.cfg
									.getProperty("visible")) ? this.EXPANDED_SUBMENU_INDICATOR_TEXT
									: this.COLLAPSED_SUBMENU_INDICATOR_TEXT)
							+ "</em>";
				}
				if (oConfig.getProperty("emphasis")) {
					sEmphasisStartTag = "<em>";
					sEmphasisEndTag = "</em>";
				}
				if (oConfig.getProperty("strongemphasis")) {
					sEmphasisStartTag = "<strong>";
					sEmphasisEndTag = "</strong>";
				}
				oAnchor.innerHTML = (sEmphasisStartTag + sText
						+ sEmphasisEndTag + sHelpTextHTML + sCheckHTML + sSubmenuIndicatorHTML);
				if (oSubmenu) {
					this.submenuIndicator = oAnchor.lastChild;
				}
			}
		},
		configHelpText : function(p_sType, p_aArgs, p_oItem) {
			var sHelpText = p_aArgs[0], oAnchor = this._oAnchor;
			if (sHelpText) {
				Dom.addClass(oAnchor, "hashelptext");
			} else {
				Dom.removeClass(oAnchor, "hashelptext");
			}
			this.cfg.refireEvent("text");
		},
		configURL : function(p_sType, p_aArgs, p_oItem) {
			var sURL = p_aArgs[0];
			if (!sURL) {
				sURL = "#";
			}
			this._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], oAnchor = this._oAnchor;
			if (bChecked) {
				Dom.addClass(oAnchor, "checked");
			} else {
				Dom.removeClass(oAnchor, "checked");
			}
			this.cfg.refireEvent("text");
		},
		configDisabled : function(p_sType, p_aArgs, p_oItem) {
			var bDisabled = p_aArgs[0], oConfig = this.cfg, oAnchor = this._oAnchor;
			if (bDisabled) {
				if (oConfig.getProperty("selected")) {
					oConfig.setProperty("selected", false);
				}
				oAnchor.removeAttribute("href");
				Dom.addClass(oAnchor, "disabled");
			} else {
				oAnchor.setAttribute("href", oConfig.getProperty("url"));
				Dom.removeClass(oAnchor, "disabled");
			}
		},
		configSelected : function(p_sType, p_aArgs, p_oItem) {
			var bSelected, oAnchor;
			if (!this.cfg.getProperty("disabled")) {
				bSelected = p_aArgs[0];
				oAnchor = this._oAnchor;
				if (bSelected) {
					Dom.addClass(oAnchor, "selected");
				} else {
					Dom.removeClass(oAnchor, "selected");
				}
			}
		},
		configSubmenu : function(p_sType, p_aArgs, p_oItem) {
			var oAnchor = this._oAnchor, oSubmenu = p_aArgs[0], oSubmenuIndicator = this.submenuIndicator, oConfig = this.cfg, bLazyLoad = this.parent
					&& this.parent.lazyLoad, 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);
					this.cfg.setProperty("submenu", oMenu, true);
				} else {
					oMenu = new this.SUBMENU_TYPE(oSubmenu, {
						lazyload : bLazyLoad,
						parent : this
					});
					this.cfg.setProperty("submenu", oMenu, true);
				}
				if (oMenu) {
					Dom.addClass(oAnchor, "hassubmenu");
					this._oSubmenu = oMenu;
				}
			} else {
				Dom.removeClass(oAnchor, "hassubmenu");
				if (oSubmenuIndicator) {
					oAnchor.removeChild(oSubmenuIndicator);
				}
				if (this._oSubmenu) {
					this._oSubmenu.destroy();
				}
			}
			oConfig.refireEvent("text");
		},
		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
			});
			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
			});
			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
			});
			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
			});
			oConfig.addProperty(DEFAULT_CONFIG.ONCLICK.key, {
				handler : this.configOnClick
			});
			oConfig.addProperty(DEFAULT_CONFIG.CLASS_NAME.key, {
				handler : this.configClassName,
				value : DEFAULT_CONFIG.CLASS_NAME.value,
				validator : DEFAULT_CONFIG.CLASS_NAME.validator
			});
		},
		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;
					}
					oAnchor.focus();
				} catch (e) {
				}
			}
			if (!this.cfg.getProperty("disabled") && oParent
					&& oParent.cfg.getProperty("visible")
					&& this.element.style.display != "none") {
				if (oActiveItem) {
					oActiveItem.blur();
				}
				window.setTimeout(setFocus, 0);
				this.focusEvent.fire();
			}
		},
		blur : function() {
			var oParent = this.parent;
			if (!this.cfg.getProperty("disabled") && oParent
					&& oParent.cfg.getProperty("visible")) {
				this._oAnchor.blur();
				this.blurEvent.fire();
			}
		},
		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"
		}
	};
	YAHOO.lang
			.extend(
					ContextMenu,
					YAHOO.widget.Menu,
					{
						_oTrigger : null,
						_bCancelled : false,
						contextEventTarget : null,
						triggerContextMenuEvent : null,
						init : function(p_oElement, p_oConfig) {
							if (!this.ITEM_TYPE) {
								this.ITEM_TYPE = YAHOO.widget.ContextMenuItem;
							}
							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;
						},
						_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);
								}
							}
						},
						_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;
							}
							Event.stopEvent(p_oEvent);
							YAHOO.widget.MenuManager.hideVisible();
							this.contextEventTarget = Event.getTarget(p_oEvent);
							this.triggerContextMenuEvent.fire(p_oEvent);
							if (!this._bCancelled) {
								this.cfg.setProperty("xy", Event
										.getXY(p_oEvent));
								this.show();
							}
							this._bCancelled = false;
						},
						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
							});
						},
						destroy : function() {
							this._removeEventHandlers();
							ContextMenu.superclass.destroy.call(this);
						},
						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();
							}
						}
					});
}());
YAHOO.widget.ContextMenuItem = function(p_oObject, p_oConfig) {
	YAHOO.widget.ContextMenuItem.superclass.constructor.call(this, p_oObject,
			p_oConfig);
};
YAHOO.lang.extend(YAHOO.widget.ContextMenuItem, YAHOO.widget.MenuItem, {
	init : function(p_oObject, p_oConfig) {
		if (!this.SUBMENU_TYPE) {
			this.SUBMENU_TYPE = YAHOO.widget.ContextMenu;
		}
		YAHOO.widget.ContextMenuItem.superclass.init.call(this, p_oObject);
		var oConfig = this.cfg;
		if (p_oConfig) {
			oConfig.applyConfig(p_oConfig, true);
		}
		oConfig.fireQueue();
	},
	toString : function() {
		var sReturnVal = "ContextMenuItem";
		if (this.cfg && this.cfg.getProperty("text")) {
			sReturnVal += (": " + this.cfg.getProperty("text"));
		}
		return sReturnVal;
	}
});
( 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, Dom = YAHOO.util.Dom, MenuBar = YAHOO.widget.MenuBar, DEFAULT_CONFIG = {
		"POSITION" : {
			key : "position",
			value : "static",
			validator : checkPosition,
			supercedes : [ "visible" ]
		},
		"SUBMENU_ALIGNMENT" : {
			key : "submenualignment",
			value : [ "tl", "bl" ]
		},
		"AUTO_SUBMENU_DISPLAY" : {
			key : "autosubmenudisplay",
			value : false,
			validator : YAHOO.lang.isBoolean
		}
	};
	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);
						},
						CSS_CLASS_NAME : "yuimenubar",
						_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) {
								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
										&& oTarget != oItem.submenuIndicator) {
									if (oSubmenu.cfg.getProperty("visible")) {
										oSubmenu.hide();
									} else {
										oSubmenu.show();
									}
								}
							}
						},
						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
											});
							oConfig
									.addProperty(
											DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.key,
											{
												value : DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.value,
												validator : DEFAULT_CONFIG.AUTO_SUBMENU_DISPLAY.validator
											});
						}
					});
}());
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();
	},
	CSS_CLASS_NAME : "yuimenubaritem",
	CSS_LABEL_CLASS_NAME : "yuimenubaritemlabel",
	toString : function() {
		var sReturnVal = "MenuBarItem";
		if (this.cfg && this.cfg.getProperty("text")) {
			sReturnVal += (": " + this.cfg.getProperty("text"));
		}
		return sReturnVal;
	}
});
YAHOO.register("menu", YAHOO.widget.Menu, {
	version : "2.3.0",
	build : "442"
});
