(function() {
var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;
YAHOO.widget.MenuManager = new function() {
    var m_bInitializedEventHandlers = false;
    var m_oMenus = {};
    var m_oItems = {};
    var m_oVisibleMenus = {};
    
    var addItem = function(p_oItem) {
        var sYUIId = Dom.generateId();
        if(p_oItem && m_oItems[sYUIId] != p_oItem) {
            p_oItem.element.setAttribute("yuiid", sYUIId);
            m_oItems[sYUIId] = p_oItem;
            p_oItem.destroyEvent.subscribe(onItemDestroy, p_oItem);

        }
    };
   
    var removeItem = function(p_oItem) {
        var sYUIId = p_oItem.element.getAttribute("yuiid");
        if(sYUIId && m_oItems[sYUIId]) {
            delete m_oItems[sYUIId];

        }
    };
   
    var getMenuRootElement = function(p_oElement) {
        var oParentNode;
        if(p_oElement && p_oElement.tagName) {
            switch(p_oElement.tagName.toUpperCase()) {
                case "DIV":
                    oParentNode = p_oElement.parentNode;
                    // Check if the DIV is the inner "body" node of a menu
                    if(
                        Dom.hasClass(p_oElement, "bd") &&
                        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;
            }
        }
    };
   
    var onDOMEvent = function(p_oEvent) {
        // Get the target node of the DOM event
        var oTarget = Event.getTarget(p_oEvent);
        // See if the target of the event was a menu, or a menu item
        var oElement = getMenuRootElement(oTarget);
        var oMenuItem;
        var oMenu;
        if(oElement) {
            var sTagName = oElement.tagName.toUpperCase();
            if(sTagName == "LI") {
                var sYUIId = oElement.getAttribute("yuiid");
                if(sYUIId) {
                    oMenuItem = m_oItems[sYUIId];
                    oMenu = oMenuItem.parent;
                }
            }
            else if(sTagName == "DIV") {
                if(oElement.id) {
                    oMenu = m_oMenus[oElement.id];
                }
            }
        }
        if(oMenu) {
            // Map of DOM event names to CustomEvent names
            var oEventTypes =  {
                    "click": "clickEvent",
                    "mousedown": "mouseDownEvent",
                    "mouseup": "mouseUpEvent",
                    "mouseover": "mouseOverEvent",
                    "mouseout": "mouseOutEvent",
                    "keydown": "keyDownEvent",
                    "keyup": "keyUpEvent",
                    "keypress": "keyPressEvent"
                };
            var sCustomEventType = oEventTypes[p_oEvent.type];
            // Fire the Custom Even that corresponds the current DOM event
            if(oMenuItem && !oMenuItem.cfg.getProperty("disabled")) {
                oMenuItem[sCustomEventType].fire(p_oEvent);
            }
            oMenu[sCustomEventType].fire(p_oEvent, oMenuItem);
        }
        else if(p_oEvent.type == "mousedown") {
            /*
                If the target of the event wasn't a menu, hide all
                dynamically positioned menus
            */
            var oActiveItem;
            for(var i in m_oMenus) {
                if(m_oMenus.hasOwnProperty(i)) {
                    oMenu = m_oMenus[i];
                    if(
                        oMenu.cfg.getProperty("clicktohide") &&
                        oMenu.cfg.getProperty("position") == "dynamic"
                    ) {
                        oMenu.hide();
                    }
                    else {
                        oMenu.clearActiveItem(true);
                    }
                }
            }
        }
    };
 
    var onMenuDestroy = function(p_sType, p_aArgs, p_oMenu) {
        this.removeMenu(p_oMenu);
    };
   
    var onItemDestroy = function(p_sType, p_aArgs, p_oItem) {
        var sYUIId = p_oItem.element.getAttribute("yuiid");
        if(sYUIId) {
            delete m_oItems[sYUIId];
        }
    };
    
    var onMenuVisibleConfigChange = function(p_sType, p_aArgs, p_oMenu) {
        var bVisible = p_aArgs[0];
        if(bVisible) {
            m_oVisibleMenus[p_oMenu.id] = p_oMenu;

        }
        else if(m_oVisibleMenus[p_oMenu.id]) {
            delete m_oVisibleMenus[p_oMenu.id];

        }
    };
   
    var onItemAdded = function(p_sType, p_aArgs) {
        addItem(p_aArgs[0]);
    };

   
    var onItemRemoved = function(p_sType, p_aArgs) {
        removeItem(p_aArgs[0]);
    };
    
    this.addMenu = function(p_oMenu) {
        if(p_oMenu && p_oMenu.id && !m_oMenus[p_oMenu.id]) {
            m_oMenus[p_oMenu.id] = p_oMenu;

            if(!m_bInitializedEventHandlers) {
                var oDoc = document;
                Event.addListener(oDoc, "mouseover", onDOMEvent, this, true);
                Event.addListener(oDoc, "mouseout", onDOMEvent, this, true);
                Event.addListener(oDoc, "mousedown", onDOMEvent, this, true);
                Event.addListener(oDoc, "mouseup", onDOMEvent, this, true);
                Event.addListener(oDoc, "click", onDOMEvent, this, true);
                Event.addListener(oDoc, "keydown", onDOMEvent, this, true);
                Event.addListener(oDoc, "keyup", onDOMEvent, this, true);
                Event.addListener(oDoc, "keypress", onDOMEvent, this, true);
                m_bInitializedEventHandlers = true;

            }
            p_oMenu.destroyEvent.subscribe(onMenuDestroy, p_oMenu, this);
            p_oMenu.cfg.subscribeToConfigEvent(
                "visible",
                onMenuVisibleConfigChange,
                p_oMenu
            );
            p_oMenu.itemAddedEvent.subscribe(onItemAdded);
            p_oMenu.itemRemovedEvent.subscribe(onItemRemoved);

        }
    };
   
    this.removeMenu = function(p_oMenu) {
        if(p_oMenu && m_oMenus[p_oMenu.id]) {
            delete m_oMenus[p_oMenu.id];

        }
    };
   
    this.hideVisible = function() {
        var oMenu;
        for(var i in m_oVisibleMenus) {
            if(m_oVisibleMenus.hasOwnProperty(i)) {
                oMenu = m_oVisibleMenus[i];
                if(oMenu.cfg.getProperty("position") == "dynamic") {
                    oMenu.hide();
                }
            }
        }
    };
   
    this.getMenus = function() {
        return m_oMenus;
    };
   
    this.getMenu = function(p_sId) {
        if(m_oMenus[p_sId]) {
            return m_oMenus[p_sId];
        }
    };

   
    this.toString = function() {
        return ("MenuManager");
    };
};
})();
(function() {
var Dom = YAHOO.util.Dom;
var Event = YAHOO.util.Event;

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
    );
};
YAHOO.extend(YAHOO.widget.Menu, YAHOO.widget.Overlay, {
CSS_CLASS_NAME: "yuimenu",
ITEM_TYPE: null,
GROUP_TITLE_TAG_NAME: "h6",
_nHideDelayId: null,
_nShowDelayId: null,
_hideDelayEventHandlersAssigned: false,
_bHandledMouseOverEvent: false,
_bHandledMouseOutEvent: false,
_aGroupTitleElements: null,
_aItemGroups: null,
_aListElements: null,
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());
                }
                YAHOO.widget.Menu.superclass.init.call(this, oElement);
                this.beforeInitEvent.fire(YAHOO.widget.Menu);

            break;
            case "SELECT":
                this.srcElement = oElement;

                YAHOO.widget.Menu.superclass.init.call(this, Dom.generateId());
                this.beforeInitEvent.fire(YAHOO.widget.Menu);
            break;
        }
    }
    else {
        YAHOO.widget.Menu.superclass.init.call(this, p_oElement);
        this.beforeInitEvent.fire(YAHOO.widget.Menu);
    }
    if(this.element) {
        var oEl = this.element;
        Dom.addClass(oEl, this.CSS_CLASS_NAME);
        // Subscribe to Custom Events
        this.initEvent.subscribe(this._onInit, this, true);
        this.beforeRenderEvent.subscribe(this._onBeforeRender, this, true);
        this.renderEvent.subscribe(this._onRender, this, true);
        this.beforeShowEvent.subscribe(this._onBeforeShow, this, true);
        this.showEvent.subscribe(this._onShow, this, true);
        this.beforeHideEvent.subscribe(this._onBeforeHide, this, true);
        this.mouseOverEvent.subscribe(this._onMouseOver, this, true);
        this.mouseOutEvent.subscribe(this._onMouseOut, this, true);
        this.clickEvent.subscribe(this._onClick, this, true);
        this.keyDownEvent.subscribe(this._onKeyDown, this, true);
        if(p_oConfig) {
            this.cfg.applyConfig(p_oConfig, true);
        }
        // Register the Menu instance with the MenuManager
        YAHOO.widget.MenuManager.addMenu(this);

        this.initEvent.fire(YAHOO.widget.Menu);
    }
},
_initSubTree: function() {
    var oNode;
    if(this.srcElement.tagName == "DIV") {
        oNode = this.body.firstChild;
        var nGroup = 0;
        var 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(this.srcElement.tagName) {
        switch(this.srcElement.tagName.toUpperCase()) {
            case "DIV":
                if(this._aListElements.length > 0) {

                    var i = this._aListElements.length - 1;
                    do {
                        oNode = this._aListElements[i].firstChild;

                        do {
                            if(oNode && oNode.tagName) {
                                switch(oNode.tagName.toUpperCase()) {
                                    case "LI":

                                        this.addItem(
                                                new this.ITEM_TYPE(
                                                    oNode,
                                                    { parent: this }
                                                ),
                                                i
                                            );
                                    break;
                                }
                            }
                        }
                        while((oNode = oNode.nextSibling));
                    }
                    while(i--);
                }
            break;
            case "SELECT":

                oNode = this.srcElement.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 nGroups = this._aItemGroups.length;
    var oItem;
    var aItemGroup;
    for(var i=0; i<nGroups; i++) {
        aItemGroup = this._aItemGroups[i];
        if(aItemGroup) {
            var nItems = aItemGroup.length;
            for(var n=0; n<nItems; n++) {
                oItem = aItemGroup[n];
                if(
                    !oItem.cfg.getProperty("disabled") &&
                    oItem.element.style.display != "none"
                ) {
                    return oItem;
                }
                oItem = null;
            }
        }
    }
},
_checkPosition: function(p_sPosition) {
    if(typeof p_sPosition == "string") {
        var sPosition = p_sPosition.toLowerCase();
        return ("dynamic,static".indexOf(sPosition) != -1);
    }
},

_addItemToGroup: function(p_nGroupIndex, p_oItem, p_nItemIndex) {
    var oItem;
    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.text) {
        var sText = p_oItem.text;
        delete p_oItem["text"];
        p_oItem.parent = this;
        oItem = new this.ITEM_TYPE(sText, p_oItem);
    }
    if(oItem) {
        var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
        var aGroup = this._getItemGroup(nGroupIndex);
        var oGroupItem;
        if(!aGroup) {
            aGroup = this._createItemGroup(nGroupIndex);
        }
        if(typeof p_nItemIndex == "number") {
            var 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 {

                    var getNextItemSibling =
                        function(p_aArray, p_nStartIndex) {
                            return (
                                    p_aArray[p_nStartIndex] ||
                                    getNextItemSibling(
                                        p_aArray,
                                        (p_nStartIndex+1)
                                    )
                                );
                        };

                    var 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);
                return oGroupItem;
            }
        }
        else {
            var 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);
                return oGroupItem;
            }
        }
    }
},
_removeItemFromGroupByIndex: function(p_nGroupIndex, p_nItemIndex) {
    var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
    var aGroup = this._getItemGroup(nGroupIndex);
    if(aGroup) {
        var aArray = aGroup.splice(p_nItemIndex, 1);
        var oItem = aArray[0];
        if(oItem) {
            // Update the index and className properties of each member
            this._updateItemProperties(nGroupIndex);
            if(aGroup.length === 0) {
                // Remove the UL
                var oUL = this._aListElements[nGroupIndex];
                if(this.body && oUL) {
                    this.body.removeChild(oUL);
                }
                // Remove the group from the array of items
                this._aItemGroups.splice(nGroupIndex, 1);

                // Remove the UL from the array of ULs
                this._aListElements.splice(nGroupIndex, 1);

                /*
                     Assign the "first-of-type" class to the new first UL
                     in the collection
                */
                oUL = this._aListElements[0];
                if(oUL) {
                    Dom.addClass(oUL, "first-of-type");
                }
            }

            this.itemRemovedEvent.fire(oItem);
            // Return a reference to the item that was removed
            return oItem;
        }
    }
},
_removeItemFromGroupByValue: function(p_nGroupIndex, p_oItem) {
    var aGroup = this._getItemGroup(p_nGroupIndex);
    if(aGroup) {
        var nItems = aGroup.length;
        var nItemIndex = -1;
        if(nItems > 0) {
            var 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);
    var nItems = aGroup.length;
    if(nItems > 0) {
        var i = nItems - 1;
        var oItem;
        var oLI;
        // Update the index and className properties of each member
        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) {
    if(!this._aItemGroups[p_nIndex]) {
        this._aItemGroups[p_nIndex] = [];
        var 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,
                oSubmenu,
                true
            );
        oSubmenu.showEvent.subscribe(
                this._onSubmenuShow,
                oSubmenu,
                true
            );
        oSubmenu.hideEvent.subscribe(
                this._onSubmenuHide,
                oSubmenu,
                true
            );
    }
},

_subscribeToItemEvents: function(p_oItem) {
    p_oItem.focusEvent.subscribe(this._onMenuItemFocus, p_oItem, this);
    p_oItem.blurEvent.subscribe(this._onMenuItemBlur, this, true);
    p_oItem.cfg.configChangedEvent.subscribe(
        this._onMenuItemConfigChange,
        p_oItem,
        this
    );
},

_getOffsetWidth: function() {
    var oClone = this.element.cloneNode(true);
    Dom.setStyle(oClone, "width", "");
    document.body.appendChild(oClone);
    var sWidth = oClone.offsetWidth;
    document.body.removeChild(oClone);
    return sWidth;
},

_cancelHideDelay: function() {
    var oRoot = this.getRoot();
    if(oRoot._nHideDelayId) {
        window.clearTimeout(oRoot._nHideDelayId);
    }
},

_execHideDelay: function() {
    this._cancelHideDelay();
    var oRoot = this.getRoot();
    var me = this;
    var hideMenu = function() {
        if(oRoot.activeItem) {
            oRoot.clearActiveItem();
        }
        if(oRoot == me && 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) {
    this._cancelShowDelay();
    var oRoot = this.getRoot();
    var showMenu = function() {
        p_oMenu.show();
    };
    oRoot._nShowDelayId =
        window.setTimeout(showMenu, oRoot.cfg.getProperty("showdelay"));
},
_onMouseOver: function(p_sType, p_aArgs, p_oMenu) {
    var oEvent = p_aArgs[0];
    var oItem = p_aArgs[1];
    var oTarget = Event.getTarget(oEvent);
    if(
        !this._bHandledMouseOverEvent &&
        (oTarget == this.element || Dom.isAncestor(this.element, oTarget))
    ) {
        // MENU  MOUSEOVER LOGIC HERE
        this.clearActiveItem();
        this._bHandledMouseOverEvent = true;
        this._bHandledMouseOutEvent = false;
    }
    if(
        oItem && !oItem.handledMouseOverEvent &&
        (oTarget == oItem.element || Dom.isAncestor(oItem.element, oTarget))
    ) {
        var oItemCfg = oItem.cfg;
        // Select and focus the current menu item
        oItemCfg.setProperty("selected", true);
        oItem.focus();
        if(this.cfg.getProperty("autosubmenudisplay")) {
            // Show the submenu this menu item
            var oSubmenu = oItemCfg.getProperty("submenu");
            if(oSubmenu) {
                if(this.cfg.getProperty("showdelay") > 0) {
                    this._execShowDelay(oSubmenu);
                }
                else {
                    oSubmenu.show();
                }
            }
        }
        oItem.handledMouseOverEvent = true;
        oItem.handledMouseOutEvent = false;
    }
},

_onMouseOut: function(p_sType, p_aArgs, p_oMenu) {
    var oEvent = p_aArgs[0];
    var oItem = p_aArgs[1];
    var oRelatedTarget = Event.getRelatedTarget(oEvent);
    var bMovingToSubmenu = false;
    if(oItem) {
        var oItemCfg = oItem.cfg;
        var 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(this.cfg.getProperty("showdelay") > 0) {
                this._cancelShowDelay();
            }
            if(!bMovingToSubmenu) {
                oItemCfg.setProperty("selected", false);
            }
            if(this.cfg.getProperty("autosubmenudisplay")) {
                if(oSubmenu) {
                    if(
                        !(
                            oRelatedTarget == oSubmenu.element ||
                            YAHOO.util.Dom.isAncestor(
                                oSubmenu.element,
                                oRelatedTarget
                            )
                        )
                    ) {
                        oSubmenu.hide();
                    }
                }
            }
            oItem.handledMouseOutEvent = true;
            oItem.handledMouseOverEvent = false;
        }
    }
    if(
        !this._bHandledMouseOutEvent &&
        (
            (
                oRelatedTarget != this.element &&
                !Dom.isAncestor(this.element, oRelatedTarget)
            )
            || bMovingToSubmenu
        )
    ) {
        this._bHandledMouseOutEvent = true;
        this._bHandledMouseOverEvent = false;
    }
},

_onClick: function(p_sType, p_aArgs, p_oMenu) {
    var oEvent = p_aArgs[0];
    var oItem = p_aArgs[1];
    var oTarget = Event.getTarget(oEvent);
    if(oItem) {
        var oItemCfg = oItem.cfg;
        var oSubmenu = oItemCfg.getProperty("submenu");
        if(oTarget == oItem.submenuIndicator && oSubmenu) {
            if(oSubmenu.cfg.getProperty("visible")) {
                oSubmenu.hide();
            }
            else {
                this.clearActiveItem();
                this.activeItem = oItem;
                oItem.cfg.setProperty("selected", true);
                oSubmenu.show();
            }
        }
        else {
            var sURL = oItemCfg.getProperty("url");
            var bCurrentPageURL = (sURL.substr((sURL.length-1),1) == "#");
            var sTarget = oItemCfg.getProperty("target");
            var bHasTarget = (sTarget && sTarget.length > 0);
            /*
                Prevent the browser from following links
                equal to "#"
            */
            if(
                oTarget.tagName.toUpperCase() == "A" &&
                bCurrentPageURL && !bHasTarget
            ) {
                Event.preventDefault(oEvent);
            }
            if(
                oTarget.tagName.toUpperCase() != "A" &&
                !bCurrentPageURL && !bHasTarget
            ) {
                document.location = sURL;
            }
            if(bCurrentPageURL && !oSubmenu) {
                var oRoot = this.getRoot();
                if(oRoot.cfg.getProperty("position") == "static") {
                    oRoot.clearActiveItem();
                }
                else {
                    oRoot.hide();
                }
            }
        }
    }
},

_onKeyDown: function(p_sType, p_aArgs, p_oMenu) {
    var oEvent = p_aArgs[0];
    var oItem = p_aArgs[1];
    var oSubmenu;
    if(oItem) {
        var oItemCfg = oItem.cfg;
        var oParentItem = this.parent;
        var oRoot;
        var oNextItem;
        switch(oEvent.keyCode) {
            case 38:    // Up arrow
            case 40:    // Down arrow
                if(
                    oItem == this.activeItem &&
                    !oItemCfg.getProperty("selected")
                ) {
                    oItemCfg.setProperty("selected", true);
                }
                else {
                    oNextItem = (oEvent.keyCode == 38) ?
                        oItem.getPreviousEnabledSibling() :
                        oItem.getNextEnabledSibling();
                    if(oNextItem) {
                        this.clearActiveItem();
                        oNextItem.cfg.setProperty("selected", true);
                        oNextItem.focus();
                    }
                }
                Event.preventDefault(oEvent);
            break;

            case 39:    // Right arrow
                oSubmenu = oItemCfg.getProperty("submenu");
                if(oSubmenu) {
                    if(!oItemCfg.getProperty("selected")) {
                        oItemCfg.setProperty("selected", true);
                    }
                    oSubmenu.show();
                    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);
            break;

            case 37:    // Left arrow
                if(oParentItem) {
                    var 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);
            break;
        }
    }
    if(oEvent.keyCode == 27) { // Esc key
        if(this.cfg.getProperty("position") == "dynamic") {
            this.hide();
            if(this.parent) {
                this.parent.focus();
            }
        }
        else if(this.activeItem) {
            oSubmenu = this.activeItem.cfg.getProperty("submenu");
            if(oSubmenu && oSubmenu.cfg.getProperty("visible")) {
                oSubmenu.hide();
                this.activeItem.focus();
            }
            else {
                this.activeItem.cfg.setProperty("selected", false);
                this.activeItem.blur();
            }
        }
        Event.preventDefault(oEvent);
    }
},
_onInit: function(p_sType, p_aArgs, p_oMenu) {
    if(
        (
            (this.parent && !this.lazyLoad) ||
            (!this.parent && this.cfg.getProperty("position") == "static") ||
            (
                !this.parent &&
                !this.lazyLoad &&
                this.cfg.getProperty("position") == "dynamic"
            )
        ) &&
        this.getItemGroups().length === 0
    ) {
        if(this.srcElement) {
            this._initSubTree();
        }
        if(this.itemData) {
            this.addItems(this.itemData);
        }
    }
    else if(this.lazyLoad) {
        this.cfg.fireQueue();
    }
},

_onBeforeRender: function(p_sType, p_aArgs, p_oMenu) {
    var oConfig = this.cfg;
    var oEl = this.element;
    var nListElements = this._aListElements.length;
    if(nListElements > 0) {
        var i = 0;
        var bFirstList = true;
        var oUL;
        var oGroupTitle;
        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, p_oMenu) {
    if(this.cfg.getProperty("position") == "dynamic") {
        var sWidth =
            this.element.parentNode.tagName.toUpperCase() == "BODY" ?
            this.element.offsetWidth : this._getOffsetWidth();
        this.cfg.setProperty("width", (sWidth + "px"));
    }
},

_onBeforeShow: function(p_sType, p_aArgs, p_oMenu) {
    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"
            ) {
                var nOptions = this.itemData.length;
                for(var n=0; n<nOptions; n++) {
                    if(this.itemData[n].tagName) {
                        this.addItem((new this.ITEM_TYPE(this.itemData[n])));
                    }
                }
            }
            else {
                this.addItems(this.itemData);
            }
        }
        if(this.srcElement) {
            this.render();
        }
        else {
            if(this.parent) {
                this.render(this.parent.element);
            }
            else {
                this.render(this.cfg.getProperty("container"));
            }
        }
    }
},

_onShow: function(p_sType, p_aArgs, p_oMenu) {
    this.setInitialFocus();
    var oParent = this.parent;
    if(oParent) {
        var oParentMenu = oParent.parent;
        var aParentAlignment = oParentMenu.cfg.getProperty("submenualignment");
        var 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.cfg.getProperty("position") == "static"
        ) {
            oParentMenu.cfg.setProperty("autosubmenudisplay", true);
            var disableAutoSubmenuDisplay = function(p_oEvent) {
                if(
                    p_oEvent.type == "mousedown" ||
                    (p_oEvent.type == "keydown" && p_oEvent.keyCode == 27)
                ) {
                    var oTarget = Event.getTarget(p_oEvent);
                    if(
                        oTarget != oParentMenu.element ||
                        !YAHOO.util.Dom.isAncestor(oParentMenu.element, oTarget)
                    ) {
                        oParentMenu.cfg.setProperty(
                            "autosubmenudisplay",
                            false
                        );
                        Event.removeListener(
                                document,
                                "mousedown",
                                disableAutoSubmenuDisplay
                            );
                        Event.removeListener(
                                document,
                                "keydown",
                                disableAutoSubmenuDisplay
                            );
                    }
                }
            };
            Event.addListener(document, "mousedown", disableAutoSubmenuDisplay);
            Event.addListener(document, "keydown", disableAutoSubmenuDisplay);
        }
    }
},
_onBeforeHide: function(p_sType, p_aArgs, p_oMenu) {
    this.clearActiveItem(true);
},
_onParentMenuConfigChange: function(p_sType, p_aArgs, p_oSubmenu) {
    var sPropertyName = p_aArgs[0][0];
    var oPropertyValue = p_aArgs[0][1];
    switch(sPropertyName) {
        case "iframe":
        case "constraintoviewport":
        case "hidedelay":
        case "showdelay":
        case "clicktohide":
        case "effect":
            p_oSubmenu.cfg.setProperty(sPropertyName, oPropertyValue);
        break;
    }
},
_onParentMenuRender: function(p_sType, p_aArgs, p_oSubmenu) {
    var oParentMenu = p_oSubmenu.parent.parent;
    var oConfig = {
            constraintoviewport:
                oParentMenu.cfg.getProperty("constraintoviewport"),
            xy: [0,0],
            clicktohide:
                oParentMenu.cfg.getProperty("clicktohide"),
            effect:
                oParentMenu.cfg.getProperty("effect")
        };
    var nShowDelay = oParentMenu.cfg.getProperty("showdelay");
    if(nShowDelay > 0) {
        oConfig.showdelay = nShowDelay;
    }
    var nHideDelay = oParentMenu.cfg.getProperty("hidedelay");
    if(nHideDelay > 0) {
        oConfig.hidedelay = nHideDelay;
    }
    if(
        this.cfg.getProperty("position") ==
        oParentMenu.cfg.getProperty("position")
    ) {
        oConfig.iframe = oParentMenu.cfg.getProperty("iframe");
    }

    p_oSubmenu.cfg.applyConfig(oConfig);
    if(!this.lazyLoad) {
        if(Dom.inDocument(this.element)) {
            this.render();
        }
        else {
            this.render(this.parent.element);
        }
    }
},
_onSubmenuBeforeShow: function(p_sType, p_aArgs, p_oSubmenu) {
    var oParent = this.parent;
    var aAlignment = oParent.parent.cfg.getProperty("submenualignment");
    this.cfg.setProperty(
        "context",
        [oParent.element, aAlignment[0], aAlignment[1]]
    );
    oParent.submenuIndicator.alt = oParent.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT;
},
_onSubmenuShow: function(p_sType, p_aArgs, p_oSubmenu) {
    var oParent = this.parent;
    oParent.submenuIndicator.alt = oParent.EXPANDED_SUBMENU_INDICATOR_ALT_TEXT;
},
_onSubmenuHide: function(p_sType, p_aArgs, p_oSubmenu) {
    var oParent = this.parent;
    oParent.submenuIndicator.alt = oParent.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
},
_onMenuItemFocus: function(p_sType, p_aArgs, p_oItem) {
    this.activeItem = p_oItem;
},
_onMenuItemBlur: function(p_sType, p_aArgs) {
    this.activeItem = null;
},
_onMenuItemConfigChange: function(p_sType, p_aArgs, p_oItem) {
    var sProperty = p_aArgs[0][0];
    switch(sProperty) {
        case "submenu":
            var oSubmenu = p_aArgs[0][1];
            if(oSubmenu) {
                this._configureSubmenu(p_oItem);
            }
        break;
        case "text":
        case "helptext":
            if(this.element.style.width) {
                var sWidth = this._getOffsetWidth() + "px";
                Dom.setStyle(this.element, "width", sWidth);
            }
        break;
    }
},
enforceConstraints: function(type, args, obj) {
    var oConfig = this.cfg;
    var pos = args[0];
    var x = pos[0];
    var y = pos[1];
    var bod = document.getElementsByTagName('body')[0];
    var htm = document.getElementsByTagName('html')[0];
    var bodyOverflow = Dom.getStyle(bod, "overflow");
    var htmOverflow = Dom.getStyle(htm, "overflow");
    var offsetHeight = this.element.offsetHeight;
    var offsetWidth = this.element.offsetWidth;
    var viewPortWidth = Dom.getClientWidth();
    var viewPortHeight = Dom.getClientHeight();
    var scrollX = window.scrollX || document.body.scrollLeft;
    var scrollY = window.scrollY || document.body.scrollTop;
    var topConstraint = scrollY + 10;
    var leftConstraint = scrollX + 10;
    var bottomConstraint = scrollY + viewPortHeight - offsetHeight - 10;
    var rightConstraint = scrollX + viewPortWidth - offsetWidth - 10;
    var aContext = oConfig.getProperty("context");
    var 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);
},

configVisible: function(p_sType, p_aArgs, p_oMenu) {
    if(this.cfg.getProperty("position") == "dynamic") {
        YAHOO.widget.Menu.superclass.configVisible.call(
            this,
            p_sType,
            p_aArgs,
            p_oMenu
        );
    }
    else {
        var bVisible = p_aArgs[0];
    	var 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 sCSSPosition = p_aArgs[0] == "static" ? "static" : "absolute";
    var oCfg = this.cfg;
    Dom.setStyle(this.element, "position", sCSSPosition);
    if(sCSSPosition == "static") {
       
        oCfg.setProperty("iframe", false);
        // Statically positioned menus are visible by default
        Dom.setStyle(this.element, "display", "block");
        oCfg.setProperty("visible", true);
    }
    else {
       
        Dom.setStyle(this.element, "visibility", "hidden");
    }
    if(sCSSPosition == "absolute") {
        var 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") {
        YAHOO.widget.Menu.superclass.configIframe.call(
            this,
            p_sType,
            p_aArgs,
            p_oMenu
        );
    }
},

configHideDelay: function(p_sType, p_aArgs, p_oMenu) {
    var nHideDelay = p_aArgs[0];
    var oMouseOutEvent = this.mouseOutEvent;
    var oMouseOverEvent = this.mouseOverEvent;
    var oKeyDownEvent = this.keyDownEvent;
    if(nHideDelay > 0) {
        /*
            Only assign event handlers once. This way the user change
            the value for the hidedelay as many times as they want.
        */
        if(!this._hideDelayEventHandlersAssigned) {
            oMouseOutEvent.subscribe(this._execHideDelay, true);
            oMouseOverEvent.subscribe(this._cancelHideDelay, this, true);
            oKeyDownEvent.subscribe(this._cancelHideDelay, this, true);
            this._hideDelayEventHandlersAssigned = true;
        }
    }
    else {
        oMouseOutEvent.unsubscribe(this._execHideDelay, this);
        oMouseOverEvent.unsubscribe(this._cancelHideDelay, this);
        oKeyDownEvent.unsubscribe(this._cancelHideDelay, this);
        this._hideDelayEventHandlersAssigned = 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
            );
	}
},

onDomResize: function(e, obj) {
    if(!this._handleResize) {
        this._handleResize = true;
        return;
    }
    var oConfig = this.cfg;
    if(oConfig.getProperty("position") == "dynamic") {
        oConfig.setProperty("width", (this._getOffsetWidth() + "px"));
    }
    YAHOO.widget.Menu.superclass.onDomResize.call(this, e, obj);
},

initEvents: function() {
	YAHOO.widget.Menu.superclass.initEvents.call(this);
    // Create custom events
    var CustomEvent = YAHOO.util.CustomEvent;
    this.mouseOverEvent = new CustomEvent("mouseOverEvent", this);
    this.mouseOutEvent = new CustomEvent("mouseOutEvent", this);
    this.mouseDownEvent = new CustomEvent("mouseDownEvent", this);
    this.mouseUpEvent = new CustomEvent("mouseUpEvent", this);
    this.clickEvent = new CustomEvent("clickEvent", this);
    this.keyPressEvent = new CustomEvent("keyPressEvent", this);
    this.keyDownEvent = new CustomEvent("keyDownEvent", this);
    this.keyUpEvent = new CustomEvent("keyUpEvent", this);
    this.itemAddedEvent = new CustomEvent("itemAddedEvent", this);
    this.itemRemovedEvent = new CustomEvent("itemRemovedEvent", this);
},

getRoot: function() {
    var oItem = this.parent;
    if(oItem) {
        var oParentMenu = oItem.parent;
        return oParentMenu ? oParentMenu.getRoot() : this;
    }
    else {
        return this;
    }
},

toString: function() {
    return ("Menu " + this.id);
},

setItemGroupTitle: function(p_sGroupTitle, p_nGroupIndex) {
    if(typeof p_sGroupTitle == "string" && p_sGroupTitle.length > 0) {
        var nGroupIndex = typeof p_nGroupIndex == "number" ? p_nGroupIndex : 0;
        var 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;
        }
        var i = this._aGroupTitleElements.length - 1;
        var nFirstIndex;
        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"
            );
        }
    }
},

addItem: function(p_oItem, p_nGroupIndex) {
    if(p_oItem) {
        return this._addItemToGroup(p_nGroupIndex, p_oItem);
    }
},

addItems: function(p_aItems, p_nGroupIndex) {
    function isArray(p_oValue) {
        return (typeof p_oValue == "object" && p_oValue.constructor == Array);
    }
    if(isArray(p_aItems)) {
        var nItems = p_aItems.length;
        var aItems = [];
        var oItem;
        for(var i=0; i<nItems; i++) {
            oItem = p_aItems[i];
            if(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) {
    if(typeof p_oObject != "undefined") {
        var oItem;
        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;
        }
    }
},

getItemGroups: function() {
    return this._aItemGroups;
},

getItem: function(p_nItemIndex, p_nGroupIndex) {
    if(typeof p_nItemIndex == "number") {
        var aGroup = this._getItemGroup(p_nGroupIndex);
        if(aGroup) {
            return aGroup[p_nItemIndex];
        }
    }
},

destroy: function() {
    // Remove Custom Event listeners
    this.mouseOverEvent.unsubscribeAll();
    this.mouseOutEvent.unsubscribeAll();
    this.mouseDownEvent.unsubscribeAll();
    this.mouseUpEvent.unsubscribeAll();
    this.clickEvent.unsubscribeAll();
    this.keyPressEvent.unsubscribeAll();
    this.keyDownEvent.unsubscribeAll();
    this.keyUpEvent.unsubscribeAll();
    var nItemGroups = this._aItemGroups.length;
    var nItems;
    var oItemGroup;
    var oItem;
    var i;
    var n;
    // Remove all items
    if(nItemGroups > 0) {
        i = nItemGroups - 1;
        do {
            oItemGroup = this._aItemGroups[i];
            if(oItemGroup) {
                nItems = oItemGroup.length;
                if(nItems > 0) {
                    n = nItems - 1;
                    do {
                        oItem = this._aItemGroups[i][n];
                        if(oItem) {
                            oItem.destroy();
                        }
                    }
                    while(n--);
                }
            }
        }
        while(i--);
    }
    // Continue with the superclass implementation of this method
    YAHOO.widget.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;
    if(oActiveItem) {
        var oConfig = oActiveItem.cfg;
        oConfig.setProperty("selected", false);
        var oSubmenu = oConfig.getProperty("submenu");
        if(oSubmenu) {
            oSubmenu.hide();
        }
        if(p_bBlur) {
            oActiveItem.blur();
        }
    }
},

initDefaultConfig: function() {
    YAHOO.widget.Menu.superclass.initDefaultConfig.call(this);
    var oConfig = this.cfg;
	
    oConfig.addProperty(
        "visible",
        {
            value:false,
            handler:this.configVisible,
            validator:this.cfg.checkBoolean
         }
     );
   
    oConfig.addProperty(
        "constraintoviewport",
        {
            value:true,
            handler:this.configConstrainToViewport,
            validator:this.cfg.checkBoolean,
            supercedes:["iframe","x","y","xy"]
        }
    );
    
    oConfig.addProperty(
        "position",
        {
            value: "dynamic",
            handler: this.configPosition,
            validator: this._checkPosition,
            supercedes: ["visible"]
        }
    );
    
    oConfig.addProperty("submenualignment", { value: ["tl","tr"] } );
   
	oConfig.addProperty(
	   "autosubmenudisplay",
	   {
	       value: true,
	       validator: oConfig.checkBoolean
       }
    );
    
	oConfig.addProperty(
	   "showdelay",
	   {
	       value: 0,
	       validator: oConfig.checkNumber
       }
    );
   
	oConfig.addProperty(
	   "hidedelay",
	   {
	       value: 0,
	       validator: oConfig.checkNumber,
	       handler: this.configHideDelay,
	       suppressEvent: true
       }
    );
    
    oConfig.addProperty(
        "clicktohide",
        {
            value: true,
            validator: oConfig.checkBoolean
        }
    );
	
	this.cfg.addProperty(
	   "container",
	   { value:document.body, handler:this.configContainer }
   );
}
}); // END YAHOO.extend
})();
YAHOO.widget.MenuModule = YAHOO.widget.Menu;
(function() {
var Dom = YAHOO.util.Dom;
var Module = YAHOO.widget.Module;
var Menu = YAHOO.widget.Menu;

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.init(p_oObject, p_oConfig);
    }
};
YAHOO.widget.MenuItem.prototype = {
    
    SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_nrm_1.gif",
    SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_hov_1.gif",
    DISABLED_SUBMENU_INDICATOR_IMAGE_PATH:"nt/ic/ut/alt1/menuarorght8_dim_1.gif",
    COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT: "Collapsed.  Click to expand.",
    EXPANDED_SUBMENU_INDICATOR_ALT_TEXT: "Expanded.  Click to collapse.",
    DISABLED_SUBMENU_INDICATOR_ALT_TEXT: "Disabled.",
    CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_nrm_1.gif",
    SELECTED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_hov_1.gif",
    DISABLED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_dim_1.gif",
    CHECKED_IMAGE_ALT_TEXT: "Checked.",
    DISABLED_CHECKED_IMAGE_ALT_TEXT: "Checked. (Item disabled.)",
    CSS_CLASS_NAME: "yuimenuitem",
    SUBMENU_TYPE: null,
    _oAnchor: null,
    _oText: null,
    _oHelpTextEM: null,
    _oSubmenu: null,
    _checkImage: null,
	constructor: YAHOO.widget.MenuItem,
	imageRoot: null,
	isSecure: Module.prototype.isSecure,
    index: null,
    groupIndex: null,
    parent: null,
    element: null,
    srcElement: null,
    
    value: null,
    submenuIndicator: null,
	browser: Module.prototype.browser,
    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) {
        this.imageRoot = (this.isSecure) ? this.IMG_ROOT_SSL : this.IMG_ROOT;
        if(!this.SUBMENU_TYPE) {
            this.SUBMENU_TYPE = Menu;
        }
        // Create the config object
        this.cfg = new YAHOO.util.Config(this);
        this.initDefaultConfig();
        var oConfig = this.cfg;
        if(this._checkString(p_oObject)) {
            this._createRootNodeStructure();
            oConfig.setProperty("text", p_oObject);
        }
        else if(this._checkDOMNode(p_oObject)) {
            switch(p_oObject.tagName.toUpperCase()) {
                case "OPTION":
                    this._createRootNodeStructure();
                    oConfig.setProperty("text", p_oObject.text);
                    this.srcElement = p_oObject;
                break;
                case "OPTGROUP":
                    this._createRootNodeStructure();
                    oConfig.setProperty("text", p_oObject.label);
                    this.srcElement = p_oObject;
                    this._initSubTree();
                break;
                case "LI":
                    // Get the anchor node (if it exists)
                    var oAnchor = this._getFirstElement(p_oObject, "A");
                    var sURL = "#";
                    var sTarget = null;
                    var sText = null;
                    // Capture the "text" and/or the "URL"
                    if(oAnchor) {
                        sURL = oAnchor.getAttribute("href");
                        sTarget = oAnchor.getAttribute("target");
                        if(oAnchor.innerText) {
                            sText = oAnchor.innerText;
                        }
                        else {
                            var oRange = oAnchor.ownerDocument.createRange();
                            oRange.selectNodeContents(oAnchor);
                            sText = oRange.toString();
                        }
                    }
                    else {
                        var oText = p_oObject.firstChild;
                        sText = oText.nodeValue;
                        oAnchor = document.createElement("a");
                        oAnchor.setAttribute("href", sURL);
                        p_oObject.replaceChild(oAnchor, oText);
                        oAnchor.appendChild(oText);
                    }
                    this.srcElement = p_oObject;
                    this.element = p_oObject;
                    this._oAnchor = oAnchor;

                    // Check if emphasis has been applied to the MenuItem
                    var oEmphasisNode = this._getFirstElement(oAnchor);
                    var bEmphasis = false;
                    var bStrongEmphasis = false;
                    if(oEmphasisNode) {
                        // Set a reference to the text node
                        this._oText = oEmphasisNode.firstChild;
                        switch(oEmphasisNode.tagName.toUpperCase()) {
                            case "EM":
                                bEmphasis = true;
                            break;
                            case "STRONG":
                                bStrongEmphasis = true;
                            break;
                        }
                    }
                    else {
                        // Set a reference to the text node
                        this._oText = oAnchor.firstChild;
                    }
                    oConfig.setProperty("text", sText, true);
                    oConfig.setProperty("url", sURL, true);
                    oConfig.setProperty("target", sTarget, true);
                    oConfig.setProperty("emphasis", bEmphasis, true);
                    oConfig.setProperty(
                        "strongemphasis",
                        bStrongEmphasis,
                        true
                    );
                    this._initSubTree();
                break;
            }
        }
        if(this.element) {
            Dom.addClass(this.element, this.CSS_CLASS_NAME);
            // Create custom events
            var CustomEvent = YAHOO.util.CustomEvent;
            this.destroyEvent = new CustomEvent("destroyEvent", this);
            this.mouseOverEvent = new CustomEvent("mouseOverEvent", this);
            this.mouseOutEvent = new CustomEvent("mouseOutEvent", this);
            this.mouseDownEvent = new CustomEvent("mouseDownEvent", this);
            this.mouseUpEvent = new CustomEvent("mouseUpEvent", this);
            this.clickEvent = new CustomEvent("clickEvent", this);
            this.keyPressEvent = new CustomEvent("keyPressEvent", this);
            this.keyDownEvent = new CustomEvent("keyDownEvent", this);
            this.keyUpEvent = new CustomEvent("keyUpEvent", this);
            this.focusEvent = new CustomEvent("focusEvent", this);
            this.blurEvent = new CustomEvent("blurEvent", this);
            if(p_oConfig) {
                oConfig.applyConfig(p_oConfig);
            }
            oConfig.fireQueue();
        }
    },
      _getFirstElement: function(p_oElement, p_sTagName) {
        var oElement;
        if(p_oElement.firstChild && p_oElement.firstChild.nodeType == 1) {
            oElement = p_oElement.firstChild;
        }
        else if(
            p_oElement.firstChild &&
            p_oElement.firstChild.nextSibling &&
            p_oElement.firstChild.nextSibling.nodeType == 1
        ) {
            oElement = p_oElement.firstChild.nextSibling;
        }
        if(p_sTagName) {
            return (oElement && oElement.tagName.toUpperCase() == p_sTagName) ?
                oElement : false;
        }
        return oElement;
    },
    _checkString: function(p_oObject) {
        return (typeof p_oObject == "string");
    },
    _checkDOMNode: function(p_oObject) {
        return (p_oObject && p_oObject.tagName);
    },
    _createRootNodeStructure: function () {
        this.element = document.createElement("li");
        this._oText = document.createTextNode("");
        this._oAnchor = document.createElement("a");
        this._oAnchor.appendChild(this._oText);
        this.cfg.refireEvent("url");
        this.element.appendChild(this._oAnchor);
    },
    _initSubTree: function() {
        var oSrcEl = this.srcElement;
        var oConfig = this.cfg;
        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 {
                var oNode = oSrcEl.firstChild;
                var 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));

                var nOptions = aOptions.length;
                if(nOptions > 0) {
                    var oMenu = new this.SUBMENU_TYPE(Dom.generateId());
                    oConfig.setProperty("submenu", oMenu);
                    for(var n=0; n<nOptions; n++) {
                        oMenu.addItem((new oMenu.ITEM_TYPE(aOptions[n])));
                    }
                }
            }
        }
    },
    _preloadImage: function(p_sPath) {
        var sPath = this.imageRoot + p_sPath;
        if(!document.images[sPath]) {
            var oImage = document.createElement("img");
            oImage.src = sPath;
            oImage.name = sPath;
            oImage.id = sPath;
            oImage.style.display = "none";
            document.body.appendChild(oImage);
        }
    },
    configText: function(p_sType, p_aArgs, p_oItem) {
        var sText = p_aArgs[0];
        if(this._oText) {
            this._oText.nodeValue = sText;
        }
    },
    configHelpText: function(p_sType, p_aArgs, p_oItem) {
        var me = this;
        var oHelpText = p_aArgs[0];
        var oEl = this.element;
        var oConfig = this.cfg;
        var aNodes = [oEl, this._oAnchor];
        var oImg = this.submenuIndicator;
        var initHelpText = function() {
            Dom.addClass(aNodes, "hashelptext");
            if(oConfig.getProperty("disabled")) {
                oConfig.refireEvent("disabled");
            }
            if(oConfig.getProperty("selected")) {
                oConfig.refireEvent("selected");
            }
        };
        var removeHelpText = function() {
            Dom.removeClass(aNodes, "hashelptext");
            oEl.removeChild(me._oHelpTextEM);
            me._oHelpTextEM = null;
        };
        if(this._checkDOMNode(oHelpText)) {
            if(this._oHelpTextEM) {
                this._oHelpTextEM.parentNode.replaceChild(
                    oHelpText,
                    this._oHelpTextEM
                );
            }
            else {
                this._oHelpTextEM = oHelpText;
                oEl.insertBefore(this._oHelpTextEM, oImg);
            }
            initHelpText();
        }
        else if(this._checkString(oHelpText)) {
            if(oHelpText.length === 0) {
                removeHelpText();
            }
            else {
                if(!this._oHelpTextEM) {
                    this._oHelpTextEM = document.createElement("em");
                    oEl.insertBefore(this._oHelpTextEM, oImg);
                }
                this._oHelpTextEM.innerHTML = oHelpText;
                initHelpText();
            }
        }
        else if(!oHelpText && this._oHelpTextEM) {
            removeHelpText();
        }
    },
    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];
        var 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];
        var oAnchor = this._oAnchor;
        var oText = this._oText;
        var oConfig = this.cfg;
        var oEM;
        if(bEmphasis && oConfig.getProperty("strongemphasis")) {
            oConfig.setProperty("strongemphasis", false);
        }
        if(oAnchor) {
            if(bEmphasis) {
                oEM = document.createElement("em");
                oEM.appendChild(oText);
                oAnchor.appendChild(oEM);
            }
            else {
                oEM = this._getFirstElement(oAnchor, "EM");
                oAnchor.removeChild(oEM);
                oAnchor.appendChild(oText);
            }
        }
    },
    configStrongEmphasis: function(p_sType, p_aArgs, p_oItem) {
        var bStrongEmphasis = p_aArgs[0];
        var oAnchor = this._oAnchor;
        var oText = this._oText;
        var oConfig = this.cfg;
        var oStrong;
        if(bStrongEmphasis && oConfig.getProperty("emphasis")) {
            oConfig.setProperty("emphasis", false);
        }
        if(oAnchor) {
            if(bStrongEmphasis) {
                oStrong = document.createElement("strong");
                oStrong.appendChild(oText);
                oAnchor.appendChild(oStrong);
            }
            else {
                oStrong = this._getFirstElement(oAnchor, "STRONG");
                oAnchor.removeChild(oStrong);
                oAnchor.appendChild(oText);
            }
        }
    },
    configChecked: function(p_sType, p_aArgs, p_oItem) {
        var bChecked = p_aArgs[0];
        var oEl = this.element;
        var oConfig = this.cfg;
        var oImg;

        if(bChecked) {
            this._preloadImage(this.CHECKED_IMAGE_PATH);
            this._preloadImage(this.SELECTED_CHECKED_IMAGE_PATH);
            this._preloadImage(this.DISABLED_CHECKED_IMAGE_PATH);
            oImg = document.createElement("img");
            oImg.src = (this.imageRoot + this.CHECKED_IMAGE_PATH);
            oImg.alt = this.CHECKED_IMAGE_ALT_TEXT;
            var oSubmenu = this.cfg.getProperty("submenu");
            if(oSubmenu) {
                oEl.insertBefore(oImg, oSubmenu.element);
            }
            else {
                oEl.appendChild(oImg);
            }
            Dom.addClass([oEl, oImg], "checked");
            this._checkImage = oImg;
            if(oConfig.getProperty("disabled")) {
                oConfig.refireEvent("disabled");
            }
            if(oConfig.getProperty("selected")) {
                oConfig.refireEvent("selected");
            }
        }
        else {
            oImg = this._checkImage;
            Dom.removeClass([oEl, oImg], "checked");
            if(oImg) {
                oEl.removeChild(oImg);
            }
            this._checkImage = null;
        }
    },
    /**
    * @method configDisabled
    * @description Event handler for when the "disabled" configuration property
    * of the menu item changes.
    * @param {String} p_sType String representing the name of the event that
    * was fired.
    * @param {Array} p_aArgs Array of arguments sent when the event was fired.
    * @param {YAHOO.widget.MenuItem} p_oItem Object representing the menu item
    * that fired the event.
    */
    configDisabled: function(p_sType, p_aArgs, p_oItem) {
        var bDisabled = p_aArgs[0];
        var oAnchor = this._oAnchor;
        var aNodes = [this.element, oAnchor];
        var oEM = this._oHelpTextEM;
        var oConfig = this.cfg;
        var oImg;
        var sImgSrc;
        var sImgAlt;
        if(oEM) {
            aNodes[2] = oEM;
        }
        if(this.cfg.getProperty("checked")) {
            sImgAlt = this.CHECKED_IMAGE_ALT_TEXT;
            sImgSrc = this.CHECKED_IMAGE_PATH;
            oImg = this._checkImage;
            if(bDisabled) {
                sImgAlt = this.DISABLED_CHECKED_IMAGE_ALT_TEXT;
                sImgSrc = this.DISABLED_CHECKED_IMAGE_PATH;
            }
            oImg.src = document.images[(this.imageRoot + sImgSrc)].src;
            oImg.alt = sImgAlt;
        }
        oImg = this.submenuIndicator;
        if(bDisabled) {
            if(oConfig.getProperty("selected")) {
                oConfig.setProperty("selected", false);
            }
            oAnchor.removeAttribute("href");
            Dom.addClass(aNodes, "disabled");
            sImgSrc = this.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH;
            sImgAlt = this.DISABLED_SUBMENU_INDICATOR_ALT_TEXT;
        }
        else {
            oAnchor.setAttribute("href", oConfig.getProperty("url"));
            Dom.removeClass(aNodes, "disabled");
            sImgSrc = this.SUBMENU_INDICATOR_IMAGE_PATH;
            sImgAlt = this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
        }
        if(oImg) {
            oImg.src = this.imageRoot + sImgSrc;
            oImg.alt = sImgAlt;
        }
    },
    configSelected: function(p_sType, p_aArgs, p_oItem) {
        if(!this.cfg.getProperty("disabled")) {
            var bSelected = p_aArgs[0];
            var oEM = this._oHelpTextEM;
            var aNodes = [this.element, this._oAnchor];
            var oImg = this.submenuIndicator;
            var sImgSrc;
            if(oEM) {
                aNodes[aNodes.length] = oEM;
            }
            if(oImg) {
                aNodes[aNodes.length] = oImg;
            }

            if(this.cfg.getProperty("checked")) {
                sImgSrc = this.imageRoot + (bSelected ?
                    this.SELECTED_CHECKED_IMAGE_PATH : this.CHECKED_IMAGE_PATH);
                this._checkImage.src = document.images[sImgSrc].src;
            }
            if(bSelected) {
                Dom.addClass(aNodes, "selected");
                sImgSrc = this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH;
            }
            else {
                Dom.removeClass(aNodes, "selected");
                sImgSrc = this.SUBMENU_INDICATOR_IMAGE_PATH;
            }
            if(oImg) {
                oImg.src = document.images[(this.imageRoot + sImgSrc)].src;
            }
        }
    },
    configSubmenu: function(p_sType, p_aArgs, p_oItem) {
        var oEl = this.element;
        var oSubmenu = p_aArgs[0];
        var oImg = this.submenuIndicator;
        var oConfig = this.cfg;
        var aNodes = [this.element, this._oAnchor];
        var oMenu;
        var bLazyLoad = this.parent && this.parent.lazyLoad;
        if(oSubmenu) {
            if(oSubmenu instanceof Menu) {
                oMenu = oSubmenu;
                oMenu.parent = this;
                oMenu.lazyLoad = bLazyLoad;
            }
            else if(
                typeof oSubmenu == "object" &&
                oSubmenu.id &&
                !oSubmenu.nodeType
            ) {
                var sSubmenuId = oSubmenu.id;
                var oSubmenuConfig = oSubmenu;
                delete oSubmenu["id"];
                oSubmenuConfig.lazyload = bLazyLoad;
                oSubmenuConfig.parent = this;
                oMenu = new this.SUBMENU_TYPE(sSubmenuId, oSubmenuConfig);
                // Set the value of the property to the Menu instance
                this.cfg.setProperty("submenu", oMenu, true);
            }
            else {
                oMenu = new this.SUBMENU_TYPE(
                                oSubmenu,
                                { lazyload: bLazyLoad, parent: this }
                            );
                // Set the value of the property to the Menu instance
                this.cfg.setProperty("submenu", oMenu, true);
            }
            if(oMenu) {
                this._oSubmenu = oMenu;
                if(!oImg) {
                    this._preloadImage(this.SUBMENU_INDICATOR_IMAGE_PATH);
                    this._preloadImage(
                            this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH
                        );
                    this._preloadImage(
                            this.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH
                        );
                    oImg = document.createElement("img");
                    oImg.src =
                        (this.imageRoot + this.SUBMENU_INDICATOR_IMAGE_PATH);
                    oImg.alt = this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
                    oEl.appendChild(oImg);
                    this.submenuIndicator = oImg;
                    Dom.addClass(aNodes, "hassubmenu");
                    if(oConfig.getProperty("disabled")) {
                        oConfig.refireEvent("disabled");
                    }
                    if(oConfig.getProperty("selected")) {
                        oConfig.refireEvent("selected");
                    }
                }
            }
        }
        else {
            Dom.removeClass(aNodes, "hassubmenu");
            if(oImg) {
                oEl.removeChild(oImg);
            }
            if(this._oSubmenu) {
                this._oSubmenu.destroy();
            }
        }
    },
    initDefaultConfig : function() {
        var oConfig = this.cfg;
        var CheckBoolean = oConfig.checkBoolean;
        oConfig.addProperty(
            "text",
            {
                value: "",
                handler: this.configText,
                validator: this._checkString,
                suppressEvent: true
            }
        );
        oConfig.addProperty("helptext", { handler: this.configHelpText });
        oConfig.addProperty(
            "url",
            { value: "#", handler: this.configURL, suppressEvent: true }
        );
        oConfig.addProperty(
            "target",
            { handler: this.configTarget, suppressEvent: true }
        );
        oConfig.addProperty(
            "emphasis",
            {
                value: false,
                handler: this.configEmphasis,
                validator: CheckBoolean,
                suppressEvent: true
            }
        );
        oConfig.addProperty(
            "strongemphasis",
            {
                value: false,
                handler: this.configStrongEmphasis,
                validator: CheckBoolean,
                suppressEvent: true
            }
        );
        oConfig.addProperty(
            "checked",
            {
                value: false,
                handler: this.configChecked,
                validator: this.cfg.checkBoolean,
                suppressEvent: true,
                supercedes:["disabled"]
            }
        );
        oConfig.addProperty(
            "disabled",
            {
                value: false,
                handler: this.configDisabled,
                validator: CheckBoolean,
                suppressEvent: true
            }
        );
     
        oConfig.addProperty(
            "selected",
            {
                value: false,
                handler: this.configSelected,
                validator: CheckBoolean,
                suppressEvent: true
            }
        );
       
        oConfig.addProperty("submenu", { handler: this.configSubmenu });
	},
    getNextEnabledSibling: function() {
        if(this.parent instanceof Menu) {
            var nGroupIndex = this.groupIndex;
            var getNextArrayItem = function(p_aArray, p_nStartIndex) {
                return p_aArray[p_nStartIndex] ||
                    getNextArrayItem(p_aArray, (p_nStartIndex+1));
            };

            var aItemGroups = this.parent.getItemGroups();
            var oNextItem;

            if(this.index < (aItemGroups[nGroupIndex].length - 1)) {
                oNextItem = getNextArrayItem(
                        aItemGroups[nGroupIndex],
                        (this.index+1)
                    );
            }
            else {
                var nNextGroupIndex;
                if(nGroupIndex < (aItemGroups.length - 1)) {
                    nNextGroupIndex = nGroupIndex + 1;
                }
                else {
                    nNextGroupIndex = 0;
                }
                var aNextGroup = getNextArrayItem(aItemGroups, nNextGroupIndex);
                // Retrieve the first menu item in the next group
                oNextItem = getNextArrayItem(aNextGroup, 0);
            }
            return (
                oNextItem.cfg.getProperty("disabled") ||
                oNextItem.element.style.display == "none"
            ) ?
            oNextItem.getNextEnabledSibling() : oNextItem;
        }
    },
    getPreviousEnabledSibling: function() {
        if(this.parent instanceof Menu) {
            var nGroupIndex = this.groupIndex;
            var getPreviousArrayItem = function(p_aArray, p_nStartIndex) {
                return p_aArray[p_nStartIndex] ||
                    getPreviousArrayItem(p_aArray, (p_nStartIndex-1));
            };
            var getFirstItemIndex = function(p_aArray, p_nStartIndex) {
                return p_aArray[p_nStartIndex] ?
                    p_nStartIndex :
                    getFirstItemIndex(p_aArray, (p_nStartIndex+1));
            };
            var aItemGroups = this.parent.getItemGroups();
            var oPreviousItem;
            if(
                this.index > getFirstItemIndex(aItemGroups[nGroupIndex], 0)
            ) {
                oPreviousItem =
                    getPreviousArrayItem(
                        aItemGroups[nGroupIndex],
                        (this.index-1)
                    );
            }
            else {
                var nPreviousGroupIndex;
                if(nGroupIndex > getFirstItemIndex(aItemGroups, 0)) {
                    nPreviousGroupIndex = nGroupIndex - 1;
                }
                else {
                    nPreviousGroupIndex = aItemGroups.length - 1;
                }
                var 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;
        var oAnchor = this._oAnchor;
        var oActiveItem = oParent.activeItem;
        if(
            !this.cfg.getProperty("disabled") &&
            oParent &&
            oParent.cfg.getProperty("visible") &&
            this.element.style.display != "none"
        ) {
            if(oActiveItem) {
                oActiveItem.blur();
            }
            try {
                oAnchor.focus();
            }
            catch(e) {
            }
            this.focusEvent.fire();
        }
    },
    blur: function() {
        var oParent = this.parent;
        if(
            !this.cfg.getProperty("disabled") &&
            oParent &&
            Dom.getStyle(oParent.element, "visibility") == "visible"
        ) {
            this._oAnchor.blur();
            this.blurEvent.fire();
        }
    },
    destroy: function() {
        var oEl = this.element;
        if(oEl) {
            // Remove CustomEvent listeners
            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();
            // Remove the element from the parent node
            var oParentNode = oEl.parentNode;
            if(oParentNode) {
                oParentNode.removeChild(oEl);
                this.destroyEvent.fire();
            }
            this.destroyEvent.unsubscribeAll();
        }
    },
    toString: function() {
        return ("MenuItem: " + this.cfg.getProperty("text"));
    }
};
})();

YAHOO.widget.MenuModuleItem = YAHOO.widget.MenuItem;
YAHOO.widget.ContextMenu = function(p_oElement, p_oConfig) {
    YAHOO.widget.ContextMenu.superclass.constructor.call(
            this,
            p_oElement,
            p_oConfig
        );
};
YAHOO.extend(YAHOO.widget.ContextMenu, YAHOO.widget.Menu, {

_oTrigger: null,

contextEventTarget: null,

init: function(p_oElement, p_oConfig) {
    if(!this.ITEM_TYPE) {
        this.ITEM_TYPE = YAHOO.widget.ContextMenuItem;
    }
    // Call the init of the superclass (YAHOO.widget.Menu)
    YAHOO.widget.ContextMenu.superclass.init.call(this, p_oElement);
    this.beforeInitEvent.fire(YAHOO.widget.ContextMenu);
    if(p_oConfig) {
        this.cfg.applyConfig(p_oConfig, true);
    }

    this.initEvent.fire(YAHOO.widget.ContextMenu);
},

_removeEventHandlers: function() {
    var Event = YAHOO.util.Event;
    var oTrigger = this._oTrigger;
    var bOpera = (this.browser == "opera");
    // Remove the event handlers from the trigger(s)
    Event.removeListener(
        oTrigger,
        (bOpera ? "mousedown" : "contextmenu"),
        this._onTriggerContextMenu
    );
    if(bOpera) {
        Event.removeListener(oTrigger, "click", this._onTriggerClick);
    }
},

_onTriggerClick: function(p_oEvent, p_oMenu) {
    if(p_oEvent.ctrlKey) {
        YAHOO.util.Event.stopEvent(p_oEvent);
    }
},

_onTriggerContextMenu: function(p_oEvent, p_oMenu) {
    // Hide any other ContextMenu instances that might be visible
    YAHOO.widget.MenuManager.hideVisible();
    var Event = YAHOO.util.Event;
    var oConfig = this.cfg;
    if(p_oEvent.type == "mousedown" && !p_oEvent.ctrlKey) {
        return;
    }
    this.contextEventTarget = Event.getTarget(p_oEvent);
    // Position and display the context menu
    var nX = Event.getPageX(p_oEvent);
    var nY = Event.getPageY(p_oEvent);
    oConfig.applyConfig( { xy:[nX, nY], visible:true } );
    oConfig.fireQueue();
    
    Event.stopEvent(p_oEvent);
},

toString: function() {
    return ("ContextMenu " + this.id);
},

initDefaultConfig: function() {
    YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this);
 
    this.cfg.addProperty("trigger", { handler: this.configTrigger });
},

destroy: function() {
    // Remove the DOM event handlers from the current trigger(s)
    this._removeEventHandlers();

    // Continue with the superclass implementation of this method
    YAHOO.widget.ContextMenu.superclass.destroy.call(this);
},

configTrigger: function(p_sType, p_aArgs, p_oMenu) {
    var Event = YAHOO.util.Event;
    var oTrigger = p_aArgs[0];
    if(oTrigger) {
        if(this._oTrigger) {
            this._removeEventHandlers();
        }
        this._oTrigger = oTrigger;
        var bOpera = (this.browser == "opera");
        Event.addListener(
            oTrigger,
            (bOpera ? "mousedown" : "contextmenu"),
            this._onTriggerContextMenu,
            this,
            true
        );
        if(bOpera) {
            Event.addListener(
                oTrigger,
                "click",
                this._onTriggerClick,
                this,
                true
            );
        }
    }
    else {
        this._removeEventHandlers();
    }
}
}); // END YAHOO.extend

YAHOO.widget.ContextMenuItem = function(p_oObject, p_oConfig) {
    YAHOO.widget.ContextMenuItem.superclass.constructor.call(
        this,
        p_oObject,
        p_oConfig
    );
};
YAHOO.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() {
    return ("MenuBarItem: " + this.cfg.getProperty("text"));
}
}); // END YAHOO.extend

YAHOO.widget.MenuBar = function(p_oElement, p_oConfig) {
    YAHOO.widget.MenuBar.superclass.constructor.call(
            this,
            p_oElement,
            p_oConfig
        );
};
YAHOO.extend(YAHOO.widget.MenuBar, YAHOO.widget.Menu, {

init: function(p_oElement, p_oConfig) {
    if(!this.ITEM_TYPE) {
        this.ITEM_TYPE = YAHOO.widget.MenuBarItem;
    }
    // Call the init of the superclass (YAHOO.widget.Menu)
    YAHOO.widget.MenuBar.superclass.init.call(this, p_oElement);
    this.beforeInitEvent.fire(YAHOO.widget.MenuBar);
    if(p_oConfig) {
        this.cfg.applyConfig(p_oConfig, true);
    }
    this.initEvent.fire(YAHOO.widget.MenuBar);
},

CSS_CLASS_NAME: "yuimenubar",

_onKeyDown: function(p_sType, p_aArgs, p_oMenuBar) {
    var Event = YAHOO.util.Event;
    var oEvent = p_aArgs[0];
    var oItem = p_aArgs[1];
    var oItemCfg = oItem.cfg;
    var oSubmenu;
    switch(oEvent.keyCode) {
        case 27:    // Esc key
            if(this.cfg.getProperty("position") == "dynamic") {
                this.hide();
                if(this.parent) {
                    this.parent.focus();
                }
            }
            else if(this.activeItem) {
                oSubmenu = this.activeItem.cfg.getProperty("submenu");
                if(oSubmenu && oSubmenu.cfg.getProperty("visible")) {
                    oSubmenu.hide();
                    this.activeItem.focus();
                }
                else {
                    this.activeItem.cfg.setProperty("selected", false);
                    this.activeItem.blur();
                }
            }

            Event.preventDefault(oEvent);
        break;
        case 37:    // Left arrow
        case 39:    // Right arrow
            if(
                oItem == this.activeItem &&
                !oItemCfg.getProperty("selected")
            ) {
                oItemCfg.setProperty("selected", true);
            }
            else {
                var 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();
                            oSubmenu.activeItem.blur();
                            oSubmenu.activeItem = null;
                        }
                    }
                    oNextItem.focus();
                }
            }
            Event.preventDefault(oEvent);
        break;
        case 40:    // Down arrow
            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;
    }
},
_onClick: function(p_sType, p_aArgs, p_oMenuBar) {
    YAHOO.widget.MenuBar.superclass._onClick.call(
        this,
        p_sType,
        p_aArgs,
        p_oMenuBar
    );
    var oItem = p_aArgs[1];
    if(oItem) {
        var Event = YAHOO.util.Event;
        var Dom = YAHOO.util.Dom;
        var oEvent = p_aArgs[0];
        var oTarget = Event.getTarget(oEvent);
        var oActiveItem = this.activeItem;
        var oConfig = this.cfg;
        // Hide any other submenus that might be visible
        if(oActiveItem && oActiveItem != oItem) {
            this.clearActiveItem();
        }

        // Select and focus the current item
        oItem.cfg.setProperty("selected", true);
        oItem.focus();

        // Show the submenu for the item
        var oSubmenu = oItem.cfg.getProperty("submenu");
        if(oSubmenu && oTarget != oItem.submenuIndicator) {
            if(oSubmenu.cfg.getProperty("visible")) {
                oSubmenu.hide();
            }
            else {
                oSubmenu.show();
            }
        }
    }
},

toString: function() {
    return ("MenuBar " + this.id);
},

initDefaultConfig: function() {
    YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this);
    var oConfig = this.cfg;
	
    oConfig.addProperty(
        "position",
        {
            value: "static",
            handler: this.configPosition,
            validator: this._checkPosition,
            supercedes: ["visible"]
        }
    );
  
    oConfig.addProperty("submenualignment", { value: ["tl","bl"] } );
    
	oConfig.addProperty(
	   "autosubmenudisplay",
	   { value: false, validator: oConfig.checkBoolean }
    );
}
}); // END YAHOO.extend

YAHOO.widget.MenuBarItem = function(p_oObject, p_oConfig) {
    YAHOO.widget.MenuBarItem.superclass.constructor.call(
        this,
        p_oObject,
        p_oConfig
    );
};
YAHOO.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",
SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_nrm_1.gif",
SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_hov_1.gif",
DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_dim_1.gif",

toString: function() {
    return ("MenuBarItem: " + this.cfg.getProperty("text"));
}
}); // END YAHOO.extend