/* Copyright (c) 2006, Yahoo! Inc. All rights reserved. Code licensed under the BSD License: http://developer.yahoo.com/yui/license.txt version: 0.12.0 */ /** * @module menu * @description
The Menu Library features a collection of widgets that make * it easy to add menus to your website or web application. With the Menu * Library you can create website fly-out menus, customized context menus, or * application-style menu bars with just a small amount of scripting.
*<div>
element of the menu.
* @param {String} p_oElement String specifying the id attribute of the
* <select>
element to be used as the data source
* for the menu.
* @param {HTMLDivElement} p_oElement Object
* specifying the <div>
element of the menu.
* @param {HTMLSelectElement} p_oElement
* Object specifying the <select>
element to be used as
* the data source for the menu.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu. See configuration class documentation for
* more details.
* @namespace YAHOO.widget
* @class Menu
* @constructor
* @extends YAHOO.widget.Overlay
*/
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, {
// Constants
/**
* @property CSS_CLASS_NAME
* @description String representing the CSS class(es) to be applied to the
* menu's <div>
element.
* @default "yuimenu"
* @final
* @type String
*/
CSS_CLASS_NAME: "yuimenu",
/**
* @property ITEM_TYPE
* @description Object representing the type of menu item to instantiate and
* add when parsing the child nodes (either <li>
element,
* <optgroup>
element or <option>
)
* of the menu's source HTML element.
* @default YAHOO.widget.MenuItem
* @final
* @type YAHOO.widget.MenuItem
*/
ITEM_TYPE: null,
/**
* @property GROUP_TITLE_TAG_NAME
* @description String representing the tagname of the HTML element used to
* title the menu's item groups.
* @default H6
* @final
* @type String
*/
GROUP_TITLE_TAG_NAME: "h6",
// Private properties
/**
* @property _nHideDelayId
* @description Number representing the time-out setting used to cancel the
* hiding of a menu.
* @default null
* @private
* @type Number
*/
_nHideDelayId: null,
/**
* @property _nShowDelayId
* @description Number representing the time-out setting used to cancel the
* showing of a menu.
* @default null
* @private
* @type Number
*/
_nShowDelayId: null,
/**
* @property _hideDelayEventHandlersAssigned
* @description Boolean indicating if the "mouseover" and "mouseout" event
* handlers used for hiding the menu via a call to "window.setTimeout" have
* already been assigned.
* @default false
* @private
* @type Boolean
*/
_hideDelayEventHandlersAssigned: false,
/**
* @property _bHandledMouseOverEvent
* @description Boolean indicating the current state of the menu's
* "mouseover" event.
* @default false
* @private
* @type Boolean
*/
_bHandledMouseOverEvent: false,
/**
* @property _bHandledMouseOutEvent
* @description Boolean indicating the current state of the menu's
* "mouseout" event.
* @default false
* @private
* @type Boolean
*/
_bHandledMouseOutEvent: false,
/**
* @property _aGroupTitleElements
* @description Array of HTML element used to title groups of menu items.
* @default []
* @private
* @type Array
*/
_aGroupTitleElements: null,
/**
* @property _aItemGroups
* @description Array of menu items.
* @default []
* @private
* @type Array
*/
_aItemGroups: null,
/**
* @property _aListElements
* @description Array of <ul>
elements, each of which is
* the parent node for each item's <li>
element.
* @default []
* @private
* @type Array
*/
_aListElements: null,
// Public properties
/**
* @property lazyLoad
* @description Boolean indicating if the menu's "lazy load" feature is
* enabled. If set to "true," initialization and rendering of the menu's
* items will be deferred until the first time it is made visible. This
* property should be set via the constructor using the configuration
* object literal.
* @default false
* @type Boolean
*/
lazyLoad: false,
/**
* @property itemData
* @description Array of items to be added to the menu. The array can contain
* strings representing the text for each item to be created, object literals
* representing the menu item configuration properties, or MenuItem instances.
* This property should be set via the constructor using the configuration
* object literal.
* @default null
* @type Array
*/
itemData: null,
/**
* @property activeItem
* @description Object reference to the item in the menu that has focus.
* @default null
* @type YAHOO.widget.MenuItem
*/
activeItem: null,
/**
* @property parent
* @description Object reference to the menu's parent menu or menu item.
* This property can be set via the constructor using the configuration
* object literal.
* @default null
* @type YAHOO.widget.MenuItem
*/
parent: null,
/**
* @property srcElement
* @description Object reference to the HTML element (either
* <select>
or <div>
) used to
* create the menu.
* @default null
* @type HTMLSelectElement|HTMLDivElement
*/
srcElement: null,
// Events
/**
* @event mouseOverEvent
* @description Fires when the mouse has entered the menu. Passes back
* the DOM Event object as an argument.
*/
mouseOverEvent: null,
/**
* @event mouseOutEvent
* @description Fires when the mouse has left the menu. Passes back the DOM
* Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
mouseOutEvent: null,
/**
* @event mouseDownEvent
* @description Fires when the user mouses down on the menu. Passes back the
* DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
mouseDownEvent: null,
/**
* @event mouseUpEvent
* @description Fires when the user releases a mouse button while the mouse is
* over the menu. Passes back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
mouseUpEvent: null,
/**
* @event clickEvent
* @description Fires when the user clicks the on the menu. Passes back the
* DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
clickEvent: null,
/**
* @event keyPressEvent
* @description Fires when the user presses an alphanumeric key when one of the
* menu's items has focus. Passes back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
keyPressEvent: null,
/**
* @event keyDownEvent
* @description Fires when the user presses a key when one of the menu's items
* has focus. Passes back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
keyDownEvent: null,
/**
* @event keyUpEvent
* @description Fires when the user releases a key when one of the menu's items
* has focus. Passes back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
keyUpEvent: null,
/**
* @event itemAddedEvent
* @description Fires when an item is added to the menu.
* @type YAHOO.util.CustomEvent
*/
itemAddedEvent: null,
/**
* @event itemRemovedEvent
* @description Fires when an item is removed to the menu.
* @type YAHOO.util.CustomEvent
*/
itemRemovedEvent: null,
/**
* @method init
* @description The Menu class's initialization method. This method is
* automatically called by the constructor, and sets up all DOM references
* for pre-existing markup, and creates required markup if it is not
* already present.
* @param {String} p_oElement String specifying the id attribute of the
* <div>
element of the menu.
* @param {String} p_oElement String specifying the id attribute of the
* <select>
element to be used as the data source
* for the menu.
* @param {HTMLDivElement} p_oElement Object
* specifying the <div>
element of the menu.
* @param {HTMLSelectElement} p_oElement
* Object specifying the <select>
element to be used as
* the data source for the menu.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu. See configuration class documentation for
* more details.
*/
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());
}
/*
Note: we don't pass the user config in here yet
because we only want it executed once, at the lowest
subclass level.
*/
YAHOO.widget.Menu.superclass.init.call(this, oElement);
this.beforeInitEvent.fire(YAHOO.widget.Menu);
break;
case "SELECT":
this.srcElement = oElement;
/*
The source element is not something that we can use
outright, so we need to create a new Overlay
Note: we don't pass the user config in here yet
because we only want it executed once, at the lowest
subclass level.
*/
YAHOO.widget.Menu.superclass.init.call(this, Dom.generateId());
this.beforeInitEvent.fire(YAHOO.widget.Menu);
break;
}
}
else {
/*
Note: we don't pass the user config in here yet
because we only want it executed once, at the lowest
subclass level.
*/
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);
}
},
// Private methods
/**
* @method _initSubTree
* @description Iterates the childNodes of the source element to find nodes
* used to instantiate menu and menu items.
* @private
*/
_initSubTree: function() {
var oNode;
if(this.srcElement.tagName == "DIV") {
/*
Populate the collection of item groups and item
group titles
*/
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));
/*
Apply the "first-of-type" class to the first UL to mimic
the "first-of-type" CSS3 psuedo class.
*/
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;
}
}
},
/**
* @method _getFirstEnabledItem
* @description Returns the first enabled item in the menu.
* @return {YAHOO.widget.MenuItem}
* @private
*/
_getFirstEnabledItem: function() {
var nGroups = this._aItemGroups.length;
var oItem;
var aItemGroup;
for(var i=0; i<ul>
element. Returns an aray of menu item groups.
* @private
* @param {Number} p_nIndex Number indicating the group to create.
* @return {Array}
*/
_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];
}
},
/**
* @method _getItemGroup
* @description Returns the menu item group at the specified index.
* @private
* @param {Number} p_nIndex Number indicating the index of the menu item group
* to be retrieved.
* @return {Array}
*/
_getItemGroup: function(p_nIndex) {
var nIndex = ((typeof p_nIndex == "number") ? p_nIndex : 0);
return this._aItemGroups[nIndex];
},
/**
* @method _configureSubmenu
* @description Subscribes the menu item's submenu to its parent menu's events.
* @private
* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
* instance with the submenu to be configured.
*/
_configureSubmenu: function(p_oItem) {
var oSubmenu = p_oItem.cfg.getProperty("submenu");
if(oSubmenu) {
/*
Listen for configuration changes to the parent menu
so they they can be applied to the submenu.
*/
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
);
}
},
/**
* @method _subscribeToItemEvents
* @description Subscribes a menu to a menu item's event.
* @private
* @param {YAHOO.widget.MenuItem} p_oItem Object reference for the MenuItem
* instance whose events should be subscribed to.
*/
_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
);
},
/**
* @method _getOffsetWidth
* @description Returns the offset width of the menu's
* <div>
element.
* @private
*/
_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;
},
/**
* @method _cancelHideDelay
* @description Cancels the call to "hideMenu."
* @private
*/
_cancelHideDelay: function() {
var oRoot = this.getRoot();
if(oRoot._nHideDelayId) {
window.clearTimeout(oRoot._nHideDelayId);
}
},
/**
* @method _execHideDelay
* @description Hides the menu after the number of milliseconds specified by
* the "hidedelay" configuration property.
* @private
*/
_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"));
},
/**
* @method _cancelShowDelay
* @description Cancels the call to the "showMenu."
* @private
*/
_cancelShowDelay: function() {
var oRoot = this.getRoot();
if(oRoot._nShowDelayId) {
window.clearTimeout(oRoot._nShowDelayId);
}
},
/**
* @method _execShowDelay
* @description Shows the menu after the number of milliseconds specified by
* the "showdelay" configuration property have ellapsed.
* @private
* @param {YAHOO.widget.Menu} p_oMenu Object specifying the menu that should
* be made visible.
*/
_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"));
},
// Protected methods
/**
* @method _onMouseOver
* @description "mouseover" event handler for the menu.
* @protected
* @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.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_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;
}
},
/**
* @method _onMouseOut
* @description "mouseout" event handler for the menu.
* @protected
* @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.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_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;
}
},
/**
* @method _onClick
* @description "click" event handler for the menu.
* @protected
* @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.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_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");
/*
ACCESSIBILITY FEATURE FOR SCREEN READERS:
Expand/collapse the submenu when the user clicks
on the submenu indicator image.
*/
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
) {
/*
Follow the URL of the item regardless of
whether or not the user clicked specifically
on the anchor element.
*/
document.location = sURL;
}
/*
If the item doesn't navigate to a URL and it doesn't have
a submenu, then collapse the menu tree.
*/
if(bCurrentPageURL && !oSubmenu) {
var oRoot = this.getRoot();
if(oRoot.cfg.getProperty("position") == "static") {
oRoot.clearActiveItem();
}
else {
oRoot.hide();
}
}
}
}
},
/**
* @method _onKeyDown
* @description "keydown" event handler for the menu.
* @protected
* @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.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_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);
}
},
// Private methods
/**
* @method _onInit
* @description "init" event handler for the menu.
* @private
* @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.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_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();
}
},
/**
* @method _onBeforeRender
* @description "beforerender" event handler for the menu. Appends all of the
* <ul>
, <li>
and their accompanying
* title elements to the body element of the menu.
* @private
* @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.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_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);
}
},
/**
* @method _onRender
* @description "render" event handler for the menu.
* @private
* @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.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_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"));
}
},
/**
* @method _onBeforeShow
* @description "beforeshow" event handler for the menu.
* @private
* @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.Menu} p_oMenu Object representing the menu that
* fired the event.
*/
_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<div>
* element's "visibility" style property between "visible" (true) or
* "hidden" (false). If the menu's "position" configuration property is
* set to "static" this property toggles the menu's
* <div>
element's "display" style property
* between "block" (true) or "none" (false).
* @default false
* @type Boolean
*/
oConfig.addProperty(
"visible",
{
value:false,
handler:this.configVisible,
validator:this.cfg.checkBoolean
}
);
/*
Change the default value for the "constraintoviewport" configuration
property to "true" by re-adding the property.
*/
/**
* @config constraintoviewport
* @description Boolean indicating if the menu will try to remain inside
* the boundaries of the size of viewport.
* @default true
* @type Boolean
*/
oConfig.addProperty(
"constraintoviewport",
{
value:true,
handler:this.configConstrainToViewport,
validator:this.cfg.checkBoolean,
supercedes:["iframe","x","y","xy"]
}
);
/**
* @config position
* @description String indicating how a menu should be positioned on the
* screen. Possible values are "static" and "dynamic." Static menus are
* visible by default and reside in the normal flow of the document
* (CSS position: static). Dynamic menus are hidden by default, reside
* out of the normal flow of the document (CSS position: absolute), and
* can overlay other elements on the screen.
* @default dynamic
* @type String
*/
oConfig.addProperty(
"position",
{
value: "dynamic",
handler: this.configPosition,
validator: this._checkPosition,
supercedes: ["visible"]
}
);
/**
* @config submenualignment
* @description Array defining how submenus should be aligned to their
* parent menu item. The format is: [itemCorner, submenuCorner]. By default
* a submenu's top left corner is aligned to its parent menu item's top
* right corner.
* @default ["tl","tr"]
* @type Array
*/
oConfig.addProperty("submenualignment", { value: ["tl","tr"] } );
/**
* @config autosubmenudisplay
* @description Boolean indicating if submenus are automatically made
* visible when the user mouses over the menu's items.
* @default true
* @type Boolean
*/
oConfig.addProperty(
"autosubmenudisplay",
{
value: true,
validator: oConfig.checkBoolean
}
);
/**
* @config showdelay
* @description Number indicating the time (in milliseconds) that should
* expire before a submenu is made visible when the user mouses over
* the menu's items.
* @default 0
* @type Number
*/
oConfig.addProperty(
"showdelay",
{
value: 0,
validator: oConfig.checkNumber
}
);
/**
* @config hidedelay
* @description Number indicating the time (in milliseconds) that should
* expire before the menu is hidden.
* @default 0
* @type Number
*/
oConfig.addProperty(
"hidedelay",
{
value: 0,
validator: oConfig.checkNumber,
handler: this.configHideDelay,
suppressEvent: true
}
);
/**
* @config clicktohide
* @description Boolean indicating if the menu will automatically be
* hidden if the user clicks outside of it.
* @default true
* @type Boolean
*/
oConfig.addProperty(
"clicktohide",
{
value: true,
validator: oConfig.checkBoolean
}
);
/**
* @config container
* @description HTML element reference or string specifying the id
* attribute of the HTML element that the menu's markup should be rendered into.
* @type HTMLElement|String
* @default document.body
*/
this.cfg.addProperty(
"container",
{ value:document.body, handler:this.configContainer }
);
}
}); // END YAHOO.extend
})();
/**
* The base class for all menuing containers.
*
* @param {String} p_oElement String specifying the id attribute of the
* <div>
element of the menu module.
* @param {String} p_oElement String specifying the id attribute of the
* <select>
element to be used as the data source for the
* menu module.
* @param {HTMLDivElement} p_oElement Object
* specifying the <div>
element of the menu module.
* @param {HTMLSelectElement} p_oElement Object
* specifying the <select>
element to be used as the data
* source for the menu module.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu module. See configuration class documentation for
* more details.
* @class MenuModule
* @constructor
* @extends YAHOO.widget.Overlay
* @deprecated As of version 0.12, all MenuModule functionality has been
* implemented directly in YAHOO.widget.Menu, making YAHOO.widget.Menu the base
* class for all menuing containers.
*/
YAHOO.widget.MenuModule = YAHOO.widget.Menu;
(function() {
var Dom = YAHOO.util.Dom;
var Module = YAHOO.widget.Module;
var Menu = YAHOO.widget.Menu;
/**
* Creates an item for a menu.
*
* @param {String} p_oObject String specifying the text of the menu item.
* @param {HTMLLIElement} p_oObject Object specifying
* the <li>
element of the menu item.
* @param {HTMLOptGroupElement} p_oObject Object
* specifying the <optgroup>
element of the menu item.
* @param {HTMLOptionElement} p_oObject Object
* specifying the <option>
element of the menu item.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu item. See configuration class documentation
* for more details.
* @class MenuItem
* @constructor
*/
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 = {
// Constants
/**
* @property SUBMENU_INDICATOR_IMAGE_PATH
* @description String representing the path to the image to be used for the
* menu item's submenu arrow indicator.
* @default "nt/ic/ut/alt1/menuarorght8_nrm_1.gif"
* @final
* @type String
*/
SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght8_nrm_1.gif",
/**
* @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH
* @description String representing the path to the image to be used for the
* submenu arrow indicator when the menu item is selected.
* @default "nt/ic/ut/alt1/menuarorght8_hov_1.gif"
* @final
* @type String
*/
SELECTED_SUBMENU_INDICATOR_IMAGE_PATH:
"nt/ic/ut/alt1/menuarorght8_hov_1.gif",
/**
* @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH
* @description String representing the path to the image to be used for the
* submenu arrow indicator when the menu item is disabled.
* @default "nt/ic/ut/alt1/menuarorght8_dim_1.gif"
* @final
* @type String
*/
DISABLED_SUBMENU_INDICATOR_IMAGE_PATH:
"nt/ic/ut/alt1/menuarorght8_dim_1.gif",
/**
* @property COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT
* @description String representing the alt text for the image to be used
* for the submenu arrow indicator.
* @default "Collapsed. Click to expand."
* @final
* @type String
*/
COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT: "Collapsed. Click to expand.",
/**
* @property EXPANDED_SUBMENU_INDICATOR_ALT_TEXT
* @description String representing the alt text for the image to be used
* for the submenu arrow indicator when the submenu is visible.
* @default "Expanded. Click to collapse."
* @final
* @type String
*/
EXPANDED_SUBMENU_INDICATOR_ALT_TEXT: "Expanded. Click to collapse.",
/**
* @property DISABLED_SUBMENU_INDICATOR_ALT_TEXT
* @description String representing the alt text for the image to be used
* for the submenu arrow indicator when the menu item is disabled.
* @default "Disabled."
* @final
* @type String
*/
DISABLED_SUBMENU_INDICATOR_ALT_TEXT: "Disabled.",
/**
* @property CHECKED_IMAGE_PATH
* @description String representing the path to the image to be used for
* the checked state.
* @default "nt/ic/ut/bsc/menuchk8_nrm_1.gif"
* @final
* @type String
*/
CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_nrm_1.gif",
/**
* @property SELECTED_CHECKED_IMAGE_PATH
* @description String representing the path to the image to be used for
* the selected checked state.
* @default "nt/ic/ut/bsc/menuchk8_hov_1.gif"
* @final
* @type String
*/
SELECTED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_hov_1.gif",
/**
* @property DISABLED_CHECKED_IMAGE_PATH
* @description String representing the path to the image to be used for
* the disabled checked state.
* @default "nt/ic/ut/bsc/menuchk8_dim_1.gif"
* @final
* @type String
*/
DISABLED_CHECKED_IMAGE_PATH: "nt/ic/ut/bsc/menuchk8_dim_1.gif",
/**
* @property CHECKED_IMAGE_ALT_TEXT
* @description String representing the alt text for the image to be used
* for the checked image.
* @default "Checked."
* @final
* @type String
*/
CHECKED_IMAGE_ALT_TEXT: "Checked.",
/**
* @property DISABLED_CHECKED_IMAGE_ALT_TEXT
* @description String representing the alt text for the image to be used
* for the checked image when the item is disabled.
* @default "Checked. (Item disabled.)"
* @final
* @type String
*/
DISABLED_CHECKED_IMAGE_ALT_TEXT: "Checked. (Item disabled.)",
/**
* @property CSS_CLASS_NAME
* @description String representing the CSS class(es) to be applied to the
* <li>
element of the menu item.
* @default "yuimenuitem"
* @final
* @type String
*/
CSS_CLASS_NAME: "yuimenuitem",
/**
* @property SUBMENU_TYPE
* @description Object representing the type of menu to instantiate and
* add when parsing the child nodes of the menu item's source HTML element.
* @final
* @type YAHOO.widget.Menu
*/
SUBMENU_TYPE: null,
/**
* @property IMG_ROOT
* @description String representing the prefix path to use for
* non-secure images.
* @default "http://us.i1.yimg.com/us.yimg.com/i/"
* @type String
*/
IMG_ROOT: "http://us.i1.yimg.com/us.yimg.com/i/",
/**
* @property IMG_ROOT_SSL
* @description String representing the prefix path to use for securely
* served images.
* @default "https://a248.e.akamai.net/sec.yimg.com/i/"
* @type String
*/
IMG_ROOT_SSL: "https://a248.e.akamai.net/sec.yimg.com/i/",
// Private member variables
/**
* @property _oAnchor
* @description Object reference to the menu item's
* <a>
element.
* @default null
* @private
* @type HTMLAnchorElement
*/
_oAnchor: null,
/**
* @property _oText
* @description Object reference to the menu item's text node.
* @default null
* @private
* @type TextNode
*/
_oText: null,
/**
* @property _oHelpTextEM
* @description Object reference to the menu item's help text
* <em>
element.
* @default null
* @private
* @type HTMLElement
*/
_oHelpTextEM: null,
/**
* @property _oSubmenu
* @description Object reference to the menu item's submenu.
* @default null
* @private
* @type YAHOO.widget.Menu
*/
_oSubmenu: null,
/**
* @property _checkImage
* @description Object reference to the menu item's checkmark image.
* @default null
* @private
* @type HTMLImageElement
*/
_checkImage: null,
// Public properties
/**
* @property constructor
* @description Object reference to the menu item's constructor function.
* @default YAHOO.widget.MenuItem
* @type YAHOO.widget.MenuItem
*/
constructor: YAHOO.widget.MenuItem,
/**
* @property imageRoot
* @description String representing the root path for all of the menu
* item's images.
* @type String
*/
imageRoot: null,
/**
* @property isSecure
* @description Boolean representing whether or not the current browsing
* context is secure (HTTPS).
* @type Boolean
*/
isSecure: Module.prototype.isSecure,
/**
* @property index
* @description Number indicating the ordinal position of the menu item in
* its group.
* @default null
* @type Number
*/
index: null,
/**
* @property groupIndex
* @description Number indicating the index of the group to which the menu
* item belongs.
* @default null
* @type Number
*/
groupIndex: null,
/**
* @property parent
* @description Object reference to the menu item's parent menu.
* @default null
* @type YAHOO.widget.Menu
*/
parent: null,
/**
* @property element
* @description Object reference to the menu item's
* <li>
element.
* @default HTMLLIElement
* @type HTMLLIElement
*/
element: null,
/**
* @property srcElement
* @description Object reference to the HTML element (either
* <li>
, <optgroup>
or
* <option>
) used create the menu item.
* @default HTMLLIElement|HTMLOptGroupElement|HTMLOptionElement
* @type HTMLLIElement|
* HTMLOptGroupElement|HTMLOptionElement
*/
srcElement: null,
/**
* @property value
* @description Object reference to the menu item's value.
* @default null
* @type Object
*/
value: null,
/**
* @property submenuIndicator
* @description Object reference to the <img>
element
* used to create the submenu indicator for the menu item.
* @default HTMLImageElement
* @type HTMLImageElement
*/
submenuIndicator: null,
/**
* @property browser
* @description String representing the browser.
* @type String
*/
browser: Module.prototype.browser,
// Events
/**
* @event destroyEvent
* @description Fires when the menu item's <li>
* element is removed from its parent <ul>
element.
* @type YAHOO.util.CustomEvent
*/
destroyEvent: null,
/**
* @event mouseOverEvent
* @description Fires when the mouse has entered the menu item. Passes
* back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
mouseOverEvent: null,
/**
* @event mouseOutEvent
* @description Fires when the mouse has left the menu item. Passes back
* the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
mouseOutEvent: null,
/**
* @event mouseDownEvent
* @description Fires when the user mouses down on the menu item. Passes
* back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
mouseDownEvent: null,
/**
* @event mouseUpEvent
* @description Fires when the user releases a mouse button while the mouse
* is over the menu item. Passes back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
mouseUpEvent: null,
/**
* @event clickEvent
* @description Fires when the user clicks the on the menu item. Passes
* back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
clickEvent: null,
/**
* @event keyPressEvent
* @description Fires when the user presses an alphanumeric key when the
* menu item has focus. Passes back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
keyPressEvent: null,
/**
* @event keyDownEvent
* @description Fires when the user presses a key when the menu item has
* focus. Passes back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
keyDownEvent: null,
/**
* @event keyUpEvent
* @description Fires when the user releases a key when the menu item has
* focus. Passes back the DOM Event object as an argument.
* @type YAHOO.util.CustomEvent
*/
keyUpEvent: null,
/**
* @event focusEvent
* @description Fires when the menu item receives focus.
* @type YAHOO.util.CustomEvent
*/
focusEvent: null,
/**
* @event blurEvent
* @description Fires when the menu item loses the input focus.
* @type YAHOO.util.CustomEvent
*/
blurEvent: null,
/**
* @method init
* @description The MenuItem class's initialization method. This method is
* automatically called by the constructor, and sets up all DOM references
* for pre-existing markup, and creates required markup if it is not
* already present.
* @param {String} p_oObject String specifying the text of the menu item.
* @param {HTMLLIElement} p_oObject Object specifying
* the <li>
element of the menu item.
* @param {HTMLOptGroupElement} p_oObject Object
* specifying the <optgroup>
element of the menu item.
* @param {HTMLOptionElement} p_oObject Object
* specifying the <option>
element of the menu item.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu item. See configuration class documentation
* for more details.
*/
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;
}
/*
Set these properties silently to sync up the
configuration object without making changes to the
element's DOM
*/
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();
}
},
// Private methods
/**
* @method _getFirstElement
* @description Returns an HTML element's first HTML element node.
* @private
* @param {HTMLElement} p_oElement Object
* reference specifying the element to be evaluated.
* @param {String} p_sTagName Optional. String specifying the tagname of
* the element to be retrieved.
* @return {HTMLElement}
*/
_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;
},
/**
* @method _checkString
* @description Determines if an object is a string.
* @private
* @param {Object} p_oObject Object to be evaluated.
* @return {Boolean}
*/
_checkString: function(p_oObject) {
return (typeof p_oObject == "string");
},
/**
* @method _checkDOMNode
* @description Determines if an object is an HTML element.
* @private
* @param {Object} p_oObject Object to be evaluated.
* @return {Boolean}
*/
_checkDOMNode: function(p_oObject) {
return (p_oObject && p_oObject.tagName);
},
/**
* @method _createRootNodeStructure
* @description Creates the core DOM structure for the menu item.
* @private
*/
_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);
},
/**
* @method _initSubTree
* @description Iterates the source element's childNodes collection and uses
* the child nodes to instantiate other menus.
* @private
*/
_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{ id: [menu id], itemdata:
* [array of values for
* items] }
.<div>
element of the menu.<div>
element of the
* menu.<li>
element
* from its parent <ul>
element.
*/
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();
}
},
/**
* @method toString
* @description Returns a string representing the menu item.
* @return {String}
*/
toString: function() {
return ("MenuItem: " + this.cfg.getProperty("text"));
}
};
})();
/**
* Creates an item for a menu module.
*
* @param {String} p_oObject String specifying the text of the menu module item.
* @param {HTMLLIElement} p_oObject Object specifying the
* <li>
element of the menu module item.
* @param {HTMLOptGroupElement} p_oObject Object specifying
* the <optgroup>
element of the menu module item.
* @param {HTMLOptionElement} p_oObject Object specifying the
* <option>
element of the menu module item.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu module item. See configuration class documentation
* for more details.
* @class MenuModuleItem
* @constructor
* @deprecated As of version 0.12, all MenuModuleItem functionality has been
* implemented directly in YAHOO.widget.MenuItem, making YAHOO.widget.MenuItem
* the base class for all menu items.
*/
YAHOO.widget.MenuModuleItem = YAHOO.widget.MenuItem;
/**
* Creates a list of options or commands which are made visible in response to
* an HTML element's "contextmenu" event ("mousedown" for Opera).
*
* @param {String} p_oElement String specifying the id attribute of the
* <div>
element of the context menu.
* @param {String} p_oElement String specifying the id attribute of the
* <select>
element to be used as the data source for the
* context menu.
* @param {HTMLDivElement} p_oElement Object specifying the
* <div>
element of the context menu.
* @param {HTMLSelectElement} p_oElement Object specifying
* the <select>
element to be used as the data source for
* the context menu.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the context menu. See configuration class documentation
* for more details.
* @class ContextMenu
* @constructor
* @extends YAHOO.widget.Menu
* @namespace YAHOO.widget
*/
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, {
// Private properties
/**
* @property _oTrigger
* @description Object reference to the current value of the "trigger"
* configuration property.
* @default null
* @private
* @type String|HTMLElement|Array
*/
_oTrigger: null,
// Public properties
/**
* @property contextEventTarget
* @description Object reference for the HTML element that was the target of the
* "contextmenu" DOM event ("mousedown" for Opera) that triggered the display of
* the context menu.
* @default null
* @type HTMLElement
*/
contextEventTarget: null,
/**
* @method init
* @description The ContextMenu class's initialization method. This method is
* automatically called by the constructor, and sets up all DOM references for
* pre-existing markup, and creates required markup if it is not already present.
* @param {String} p_oElement String specifying the id attribute of the
* <div>
element of the context menu.
* @param {String} p_oElement String specifying the id attribute of the
* <select>
element to be used as the data source for
* the context menu.
* @param {HTMLDivElement} p_oElement Object specifying the
* <div>
element of the context menu.
* @param {HTMLSelectElement} p_oElement Object specifying
* the <select>
element to be used as the data source for
* the context menu.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the context menu. See configuration class documentation
* for more details.
*/
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);
},
// Private methods
/**
* @method _removeEventHandlers
* @description Removes all of the DOM event handlers from the HTML element(s)
* whose "context menu" event ("click" for Opera) trigger the display of
* the context menu.
* @private
*/
_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);
}
},
// Private event handlers
/**
* @method _onTriggerClick
* @description "click" event handler for the HTML element(s) identified as the
* "trigger" for the context menu. Used to cancel default behaviors in Opera.
* @private
* @param {Event} p_oEvent Object representing the DOM event object passed back
* by the event utility (YAHOO.util.Event).
* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context
* menu that is handling the event.
*/
_onTriggerClick: function(p_oEvent, p_oMenu) {
if(p_oEvent.ctrlKey) {
YAHOO.util.Event.stopEvent(p_oEvent);
}
},
/**
* @method _onTriggerContextMenu
* @description "contextmenu" event handler ("mousedown" for Opera) for the HTML
* element(s) that trigger the display of the context menu.
* @private
* @param {Event} p_oEvent Object representing the DOM event object passed back
* by the event utility (YAHOO.util.Event).
* @param {YAHOO.widget.ContextMenu} p_oMenu Object representing the context
* menu that is handling the event.
*/
_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();
/*
Prevent the browser's default context menu from appearing and
stop the propagation of the "contextmenu" event so that
other ContextMenu instances are not displayed.
*/
Event.stopEvent(p_oEvent);
},
// Public methods
/**
* @method toString
* @description Returns a string representing the context menu.
* @return {String}
*/
toString: function() {
return ("ContextMenu " + this.id);
},
/**
* @method initDefaultConfig
* @description Initializes the class's configurable properties which can be
* changed using the context menu's Config object ("cfg").
*/
initDefaultConfig: function() {
YAHOO.widget.ContextMenu.superclass.initDefaultConfig.call(this);
/**
* @config trigger
* @description The HTML element(s) whose "contextmenu" event ("mousedown"
* for Opera) trigger the display of the context menu. Can be a string
* representing the id attribute of the HTML element, an object reference
* for the HTML element, or an array of strings or HTML element references.
* @default null
* @type String|HTMLElement|Array
*/
this.cfg.addProperty("trigger", { handler: this.configTrigger });
},
/**
* @method destroy
* @description Removes the context menu's <div>
element
* (and accompanying child nodes) from the document.
*/
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);
},
// Public event handlers for configuration properties
/**
* @method configTrigger
* @description Event handler for when the value of the "trigger" configuration
* property 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.ContextMenu} p_oMenu Object representing the context
* menu that fired the event.
*/
configTrigger: function(p_sType, p_aArgs, p_oMenu) {
var Event = YAHOO.util.Event;
var oTrigger = p_aArgs[0];
if(oTrigger) {
/*
If there is a current "trigger" - remove the event handlers
from that element(s) before assigning new ones
*/
if(this._oTrigger) {
this._removeEventHandlers();
}
this._oTrigger = oTrigger;
/*
Listen for the "mousedown" event in Opera b/c it does not
support the "contextmenu" event
*/
var bOpera = (this.browser == "opera");
Event.addListener(
oTrigger,
(bOpera ? "mousedown" : "contextmenu"),
this._onTriggerContextMenu,
this,
true
);
/*
Assign a "click" event handler to the trigger element(s) for
Opera to prevent default browser behaviors.
*/
if(bOpera) {
Event.addListener(
oTrigger,
"click",
this._onTriggerClick,
this,
true
);
}
}
else {
this._removeEventHandlers();
}
}
}); // END YAHOO.extend
/**
* Creates an item for a context menu.
*
* @param {String} p_oObject String specifying the text of the context menu item.
* @param {HTMLLIElement} p_oObject Object specifying the
* <li>
element of the context menu item.
* @param {HTMLOptGroupElement} p_oObject Object
* specifying the <optgroup>
element of the context
* menu item.
* @param {HTMLOptionElement} p_oObject Object specifying
* the <option>
element of the context menu item.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the context menu item. See configuration class
* documentation for more details.
* @class ContextMenuItem
* @constructor
* @extends YAHOO.widget.MenuItem
*/
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, {
/**
* @method init
* @description The ContextMenuItem class's initialization method. This method
* is automatically called by the constructor, and sets up all DOM references
* for pre-existing markup, and creates required markup if it is not
* already present.
* @param {String} p_oObject String specifying the text of the context menu item.
* @param {HTMLLIElement} p_oObject Object specifying the
* <li>
element of the context menu item.
* @param {HTMLOptGroupElement} p_oObject Object
* specifying the <optgroup>
element of the context
* menu item.
* @param {HTMLOptionElement} p_oObject Object specifying
* the <option>
element of the context menu item.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the context menu item. See configuration class
* documentation for more details.
*/
init: function(p_oObject, p_oConfig) {
if(!this.SUBMENU_TYPE) {
this.SUBMENU_TYPE = YAHOO.widget.ContextMenu;
}
/*
Call the init of the superclass (YAHOO.widget.MenuItem)
Note: We don't pass the user config in here yet
because we only want it executed once, at the lowest
subclass level.
*/
YAHOO.widget.ContextMenuItem.superclass.init.call(this, p_oObject);
var oConfig = this.cfg;
if(p_oConfig) {
oConfig.applyConfig(p_oConfig, true);
}
oConfig.fireQueue();
},
// Public methods
/**
* @method toString
* @description Returns a string representing the context menu item.
* @return {String}
*/
toString: function() {
return ("MenuBarItem: " + this.cfg.getProperty("text"));
}
}); // END YAHOO.extend
/**
* Horizontal collection of items, each of which can contain a submenu.
*
* @param {String} p_oElement String specifying the id attribute of the
* <div>
element of the menu bar.
* @param {String} p_oElement String specifying the id attribute of the
* <select>
element to be used as the data source for the
* menu bar.
* @param {HTMLDivElement} p_oElement Object specifying
* the <div>
element of the menu bar.
* @param {HTMLSelectElement} p_oElement Object
* specifying the <select>
element to be used as the data
* source for the menu bar.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu bar. See configuration class documentation for
* more details.
* @class Menubar
* @constructor
* @extends YAHOO.widget.Menu
* @namespace YAHOO.widget
*/
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, {
/**
* @method init
* @description The MenuBar class's initialization method. This method is
* automatically called by the constructor, and sets up all DOM references for
* pre-existing markup, and creates required markup if it is not already present.
* @param {String} p_oElement String specifying the id attribute of the
* <div>
element of the menu bar.
* @param {String} p_oElement String specifying the id attribute of the
* <select>
element to be used as the data source for the
* menu bar.
* @param {HTMLDivElement} p_oElement Object specifying
* the <div>
element of the menu bar.
* @param {HTMLSelectElement} p_oElement Object
* specifying the <select>
element to be used as the data
* source for the menu bar.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu bar. See configuration class documentation for
* more details.
*/
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);
},
// Constants
/**
* @property CSS_CLASS_NAME
* @description String representing the CSS class(es) to be applied to the menu
* bar's <div>
element.
* @default "yuimenubar"
* @final
* @type String
*/
CSS_CLASS_NAME: "yuimenubar",
// Protected event handlers
/**
* @method _onKeyDown
* @description "keydown" Custom Event handler for the menu bar.
* @private
* @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.MenuBar} p_oMenuBar Object representing the menu bar
* that fired the event.
*/
_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;
}
},
/**
* @method _onClick
* @description "click" event handler for the menu bar.
* @protected
* @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.MenuBar} p_oMenuBar Object representing the menu bar
* that fired the event.
*/
_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();
}
}
}
},
// Public methods
/**
* @method toString
* @description Returns a string representing the menu bar.
* @return {String}
*/
toString: function() {
return ("MenuBar " + this.id);
},
/**
* @description Initializes the class's configurable properties which can be
* changed using the menu bar's Config object ("cfg").
* @method initDefaultConfig
*/
initDefaultConfig: function() {
YAHOO.widget.MenuBar.superclass.initDefaultConfig.call(this);
var oConfig = this.cfg;
// Add configuration properties
/*
Set the default value for the "position" configuration property
to "static" by re-adding the property.
*/
/**
* @config position
* @description String indicating how a menu bar should be positioned on the
* screen. Possible values are "static" and "dynamic." Static menu bars
* are visible by default and reside in the normal flow of the document
* (CSS position: static). Dynamic menu bars are hidden by default, reside
* out of the normal flow of the document (CSS position: absolute), and can
* overlay other elements on the screen.
* @default static
* @type String
*/
oConfig.addProperty(
"position",
{
value: "static",
handler: this.configPosition,
validator: this._checkPosition,
supercedes: ["visible"]
}
);
/*
Set the default value for the "submenualignment" configuration property
to ["tl","bl"] by re-adding the property.
*/
/**
* @config submenualignment
* @description Array defining how submenus should be aligned to their
* parent menu bar item. The format is: [itemCorner, submenuCorner].
* @default ["tl","bl"]
* @type Array
*/
oConfig.addProperty("submenualignment", { value: ["tl","bl"] } );
/*
Change the default value for the "autosubmenudisplay" configuration
property to "false" by re-adding the property.
*/
/**
* @config autosubmenudisplay
* @description Boolean indicating if submenus are automatically made
* visible when the user mouses over the menu bar's items.
* @default false
* @type Boolean
*/
oConfig.addProperty(
"autosubmenudisplay",
{ value: false, validator: oConfig.checkBoolean }
);
}
}); // END YAHOO.extend
/**
* Creates an item for a menu bar.
*
* @param {String} p_oObject String specifying the text of the menu bar item.
* @param {HTMLLIElement} p_oObject Object specifying the
* <li>
element of the menu bar item.
* @param {HTMLOptGroupElement} p_oObject Object
* specifying the <optgroup>
element of the menu bar item.
* @param {HTMLOptionElement} p_oObject Object specifying
* the <option>
element of the menu bar item.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu bar item. See configuration class documentation
* for more details.
* @class MenuBarItem
* @constructor
* @extends YAHOO.widget.MenuItem
*/
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, {
/**
* @method init
* @description The MenuBarItem class's initialization method. This method is
* automatically called by the constructor, and sets up all DOM references for
* pre-existing markup, and creates required markup if it is not already present.
* @param {String} p_oObject String specifying the text of the menu bar item.
* @param {HTMLLIElement} p_oObject Object specifying the
* <li>
element of the menu bar item.
* @param {HTMLOptGroupElement} p_oObject Object
* specifying the <optgroup>
element of the menu bar item.
* @param {HTMLOptionElement} p_oObject Object specifying
* the <option>
element of the menu bar item.
* @param {Object} p_oConfig Optional. Object literal specifying the
* configuration for the menu bar item. See configuration class documentation
* for more details.
*/
init: function(p_oObject, p_oConfig) {
if(!this.SUBMENU_TYPE) {
this.SUBMENU_TYPE = YAHOO.widget.Menu;
}
/*
Call the init of the superclass (YAHOO.widget.MenuItem)
Note: We don't pass the user config in here yet
because we only want it executed once, at the lowest
subclass level.
*/
YAHOO.widget.MenuBarItem.superclass.init.call(this, p_oObject);
var oConfig = this.cfg;
if(p_oConfig) {
oConfig.applyConfig(p_oConfig, true);
}
oConfig.fireQueue();
},
// Constants
/**
* @property CSS_CLASS_NAME
* @description String representing the CSS class(es) to be applied to the
* <li>
element of the menu bar item.
* @default "yuimenubaritem"
* @final
* @type String
*/
CSS_CLASS_NAME: "yuimenubaritem",
/**
* @property SUBMENU_INDICATOR_IMAGE_PATH
* @description String representing the path to the image to be used for the
* menu bar item's submenu arrow indicator.
* @default "nt/ic/ut/alt1/menuarodwn8_nrm_1.gif"
* @final
* @type String
*/
SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_nrm_1.gif",
/**
* @property SELECTED_SUBMENU_INDICATOR_IMAGE_PATH
* @description String representing the path to the image to be used for the
* submenu arrow indicator when the menu bar item is selected.
* @default "nt/ic/ut/alt1/menuarodwn8_hov_1.gif"
* @final
* @type String
*/
SELECTED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_hov_1.gif",
/**
* @property DISABLED_SUBMENU_INDICATOR_IMAGE_PATH
* @description String representing the path to the image to be used for the
* submenu arrow indicator when the menu bar item is disabled.
* @default "nt/ic/ut/alt1/menuarodwn8_dim_1.gif"
* @final
* @type String
*/
DISABLED_SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarodwn8_dim_1.gif",
// Public methods
/**
* @method toString
* @description Returns a string representing the menu bar item.
* @return {String}
*/
toString: function() {
return ("MenuBarItem: " + this.cfg.getProperty("text"));
}
}); // END YAHOO.extend