YAHOO.widget.MenuModuleItem = function(p_oObject, p_oConfig) {
if(p_oObject) {
this.init(p_oObject, p_oConfig);
}
};
YAHOO.widget.MenuModuleItem.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.",
CSS_CLASS_NAME: "yuimenuitem",
SUBMENU_TYPE: null,
SUBMENU_ITEM_TYPE: null,
IMG_ROOT: "http://us.i1.yimg.com/us.yimg.com/i/",
IMG_ROOT_SSL: "https://a248.e.akamai.net/sec.yimg.com/i/",
_oAnchor: null,
_oText: null,
_oHelpTextEM: null,
_oSubmenu: null,
_oDom: YAHOO.util.Dom,
constructor: YAHOO.widget.MenuModuleItem,
imageRoot: null,
isSecure: YAHOO.widget.Module.prototype.isSecure,
index: null,
groupIndex: null,
parent: null,
element: null,
srcElement: null,
value: null,
submenuIndicator: null,
browser: YAHOO.widget.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 = YAHOO.widget.MenuModule;
}
if(!this.SUBMENU_ITEM_TYPE) {
this.SUBMENU_ITEM_TYPE = YAHOO.widget.MenuModuleItem;
}
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) {
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":
var oAnchor = this._getFirstElement(p_oObject, "A");
var sURL = "#";
var sText = null;
if(oAnchor) {
sURL = oAnchor.getAttribute("href");
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;
var oEmphasisNode = this._getFirstElement(oAnchor);
var bEmphasis = false;
var bStrongEmphasis = false;
if(oEmphasisNode) {
this._oText = oEmphasisNode.firstChild;
switch(oEmphasisNode.tagName) {
case "EM":
bEmphasis = true;
break;
case "STRONG":
bStrongEmphasis = true;
break;
}
}
else {
this._oText = oAnchor.firstChild;
}
oConfig.setProperty("text", sText, true);
oConfig.setProperty("url", sURL, true);
oConfig.setProperty("emphasis", bEmphasis, true);
oConfig.setProperty(
"strongemphasis",
bStrongEmphasis,
true
);
this._initSubTree();
break;
}
}
if(this.element) {
this._oDom.addClass(this.element, this.CSS_CLASS_NAME);
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 == 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 Menu = this.SUBMENU_TYPE;
var MenuModuleItem = this.SUBMENU_ITEM_TYPE;
var oSrcEl = this.srcElement;
var oConfig = this.cfg;
if(oSrcEl.childNodes.length > 0) {
var oNode = oSrcEl.firstChild;
var aOptions = [];
do {
switch(oNode.tagName) {
case "DIV":
oConfig.setProperty("submenu", (new Menu(oNode)));
break;
case "OPTION":
aOptions[aOptions.length] = oNode;
break;
}
}
while((oNode = oNode.nextSibling));
var nOptions = aOptions.length;
if(nOptions > 0) {
oConfig.setProperty(
"submenu",
(new Menu(this._oDom.generateId()))
);
for(var n=0; n<nOptions; n++) {
this._oSubmenu.addItem((new MenuModuleItem(aOptions[n])));
}
}
}
},
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 Dom = this._oDom;
var oHelpText = p_aArgs[0];
var oEl = this.element;
var oConfig = this.cfg;
var aNodes = [oEl, this._oAnchor];
var oImg = this.submenuIndicator;
function initHelpText() {
Dom.addClass(aNodes, "hashelptext");
if(oConfig.getProperty("disabled")) {
oConfig.refireEvent("disabled");
}
if(oConfig.getProperty("selected")) {
oConfig.refireEvent("selected");
}
}
function removeHelpText() {
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);
},
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);
}
}
},
configDisabled: function(p_sType, p_aArgs, p_oItem) {
var bDisabled = p_aArgs[0];
var Dom = this._oDom;
var oAnchor = this._oAnchor;
var aNodes = [this.element, oAnchor];
var oEM = this._oHelpTextEM;
var oConfig = this.cfg;
var oImg = this.submenuIndicator;
var sImageSrc;
var sImageAlt;
if(oEM) {
aNodes[2] = oEM;
}
if(bDisabled) {
if(oConfig.getProperty("selected")) {
oConfig.setProperty("selected", false);
}
oAnchor.removeAttribute("href");
Dom.addClass(aNodes, "disabled");
sImageSrc = this.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH;
sImageAlt = this.DISABLED_SUBMENU_INDICATOR_ALT_TEXT;
}
else {
oAnchor.setAttribute("href", oConfig.getProperty("url"));
Dom.removeClass(aNodes, "disabled");
sImageSrc = this.SUBMENU_INDICATOR_IMAGE_PATH;
sImageAlt = this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
}
if(oImg) {
oImg.src = this.imageRoot + sImageSrc;
oImg.alt = sImageAlt;
}
},
configSelected: function(p_sType, p_aArgs, p_oItem) {
if(!this.cfg.getProperty("disabled")) {
var Dom = this._oDom;
var bSelected = p_aArgs[0];
var oEM = this._oHelpTextEM;
var aNodes = [this.element, this._oAnchor];
var oImg = this.submenuIndicator;
var sImageSrc;
if(oEM) {
aNodes[2] = oEM;
}
if(bSelected) {
Dom.addClass(aNodes, "selected");
sImageSrc = this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH;
}
else {
Dom.removeClass(aNodes, "selected");
sImageSrc = this.SUBMENU_INDICATOR_IMAGE_PATH;
}
if(oImg) {
oImg.src = document.images[(this.imageRoot + sImageSrc)].src;
}
}
},
configSubmenu: function(p_sType, p_aArgs, p_oItem) {
var Dom = this._oDom;
var oEl = this.element;
var oSubmenu = p_aArgs[0];
var oImg = this.submenuIndicator;
var oConfig = this.cfg;
var aNodes = [this.element, this._oAnchor];
if(oSubmenu) {
oSubmenu.parent = this;
this._oSubmenu = oSubmenu;
if(!oImg) {
var me = this;
function preloadImage(p_sPath) {
var sPath = me.imageRoot + p_sPath;
if(!document.images[sPath]) {
var oImg = document.createElement("img");
oImg.src = sPath;
oImg.name = sPath;
oImg.id = sPath;
oImg.style.display = "none";
document.body.appendChild(oImg);
}
}
preloadImage(this.SUBMENU_INDICATOR_IMAGE_PATH);
preloadImage(this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH);
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(
"emphasis",
{
value: false,
handler: this.configEmphasis,
validator: CheckBoolean,
suppressEvent: true
}
);
oConfig.addProperty(
"strongemphasis",
{
value: false,
handler: this.configStrongEmphasis,
validator: CheckBoolean,
suppressEvent: true
}
);
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 YAHOO.widget.MenuModule) {
var nGroupIndex = this.groupIndex;
function getNextArrayItem(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);
oNextItem = getNextArrayItem(aNextGroup, 0);
}
return oNextItem.cfg.getProperty("disabled") ?
oNextItem.getNextEnabledSibling() : oNextItem;
}
},
getPreviousEnabledSibling: function() {
if(this.parent instanceof YAHOO.widget.MenuModule) {
var nGroupIndex = this.groupIndex;
function getPreviousArrayItem(p_aArray, p_nStartIndex) {
return p_aArray[p_nStartIndex] ||
getPreviousArrayItem(p_aArray, (p_nStartIndex-1));
}
function getFirstItemIndex(p_aArray, p_nStartIndex) {
return p_aArray[p_nStartIndex] ?
p_nStartIndex :
getFirstItemIndex(p_aArray, (p_nStartIndex+1));
}
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.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")
) {
if(oActiveItem) {
oActiveItem.blur();
}
oAnchor.focus();
if(oParent && this.browser == "opera" && this._oSubmenu) {
oAnchor.focus();
}
this.focusEvent.fire();
}
},
blur: function() {
var oParent = this.parent;
if(
!this.cfg.getProperty("disabled") &&
oParent &&
this._oDom.getStyle(oParent.element, "visibility") == "visible"
) {
this._oAnchor.blur();
this.blurEvent.fire();
}
},
destroy: function() {
var oEl = this.element;
if(oEl) {
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();
var oParentNode = oEl.parentNode;
if(oParentNode) {
oParentNode.removeChild(oEl);
this.destroyEvent.fire();
}
this.destroyEvent.unsubscribeAll();
}
}
};