YAHOO.widget.MenuModuleItem = function(p_oObject, p_oUserConfig) {
if(p_oObject) {
this.init(p_oObject, p_oUserConfig);
}
};
YAHOO.widget.MenuModuleItem.prototype = {
SUBMENU_INDICATOR_IMAGE_PATH: "nt/ic/ut/alt1/menuarorght9_nrm_1.gif",
SELECTED_SUBMENU_INDICATOR_IMAGE_PATH:
"nt/ic/ut/alt1/menuarorght9_hov_1.gif",
DISABLED_SUBMENU_INDICATOR_IMAGE_PATH:
"nt/ic/ut/alt1/menuarorght9_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,
_oAnchor: null,
_oText: null,
_oHelpTextEM: null,
_oSubmenu: null,
_oDom: YAHOO.util.Dom,
_sUserAgent: window.navigator.userAgent.toLowerCase(),
constructor: YAHOO.widget.MenuModuleItem,
imageRoot: YAHOO.widget.Module.IMG_ROOT,
isSecure: function() {
if(window.location.href.toLowerCase().indexOf("https") === 0) {
this.imageRoot = YAHOO.widget.Module.IMG_ROOT_SSL;
return true;
} else {
return false;
}
}(),
index: null,
groupIndex: null,
parent: null,
element: null,
srcElement: null,
value: null,
subMenuIndicator: null,
browser: function() {
var sUserAgent = navigator.userAgent.toLowerCase();
if(sUserAgent.indexOf("opera")!=-1) {
return "opera";
} else if(sUserAgent.indexOf("msie 7")!=-1) {
return "ie7";
} else if(sUserAgent.indexOf("msie") !=-1) {
return "ie";
} else if(sUserAgent.indexOf("safari")!=-1) {
return "safari";
} else if(sUserAgent.indexOf("gecko") != -1) {
return "gecko";
} else {
return false;
}
}(),
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_oUserConfig) {
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.cfg.addProperty(
"text",
{
value:"",
handler: this.configText,
validator: this._checkString,
suppressEvent: true
}
);
this.cfg.addProperty("helptext", { handler: this.configHelpText });
this.cfg.addProperty(
"url",
{ value: "#", handler: this.configURL, suppressEvent: true }
);
this.cfg.addProperty(
"emphasis",
{
value: false,
handler: this.configEmphasis,
validator: this.cfg.checkBoolean,
suppressEvent: true
}
);
this.cfg.addProperty(
"strongemphasis",
{
value: false,
handler: this.configStrongEmphasis,
validator: this.cfg.checkBoolean,
suppressEvent: true
}
);
this.cfg.addProperty(
"disabled",
{
value: false,
handler: this.configDisabled,
validator: this.cfg.checkBoolean,
suppressEvent: true
}
);
this.cfg.addProperty(
"selected",
{
value: false,
handler: this.configSelected,
validator: this.cfg.checkBoolean,
suppressEvent: true
}
);
this.cfg.addProperty("submenu", { handler: this.configSubmenu });
if(this._checkString(p_oObject)) {
this._createRootNodeStructure();
this.cfg.setProperty("text", p_oObject);
}
else if(this._checkDOMNode(p_oObject)) {
switch(p_oObject.tagName) {
case "OPTION":
this._createRootNodeStructure();
this.cfg.setProperty("text", p_oObject.text);
this.srcElement = p_oObject;
break;
case "OPTGROUP":
this._createRootNodeStructure();
this.cfg.setProperty("text", p_oObject.label);
this.srcElement = p_oObject;
this._initSubTree();
break;
case "LI":
var oAnchor = this._getFirstElement(p_oObject, "A"),
sURL = null,
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");
p_oObject.replaceChild(oAnchor, oText);
oAnchor.appendChild(oText);
}
this.srcElement = p_oObject;
this.element = p_oObject;
this._oAnchor = oAnchor;
var oEmphasisNode = this._getFirstElement(oAnchor),
bEmphasis = false,
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;
}
this.cfg.setProperty("text", sText, true);
this.cfg.setProperty("url", sURL, true);
this.cfg.setProperty("emphasis", bEmphasis, true);
this.cfg.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_oUserConfig) {
this.cfg.applyConfig(p_oUserConfig);
}
this.cfg.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,
MenuModuleItem = this.SUBMENU_ITEM_TYPE;
if(this.srcElement.childNodes.length > 0) {
var oNode = this.srcElement.firstChild,
aOptions = [];
do {
switch(oNode.tagName) {
case "DIV":
this.cfg.setProperty("submenu", (new Menu(oNode)));
break;
case "OPTION":
aOptions[aOptions.length] = oNode;
break;
}
}
while((oNode = oNode.nextSibling));
var nOptions = aOptions.length;
if(nOptions > 0) {
this.cfg.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_aArguments, p_oItem) {
var sText = p_aArguments[0];
if(this._oText) {
this._oText.nodeValue = sText;
}
},
configHelpText: function(p_sType, p_aArguments, p_oItem) {
var oHelpText = p_aArguments[0],
aNodes = [this.element, this._oAnchor],
me = this;
function initHelpText() {
me._oDom.addClass(aNodes, "hashelptext");
if(me.cfg.getProperty("disabled")) {
me.cfg.refireEvent("disabled");
}
if(me.cfg.getProperty("selected")) {
me.cfg.refireEvent("selected");
}
}
function removeHelpText() {
me._oDom.removeClass(aNodes, "hashelptext");
me.element.removeChild(me._oHelpTextEM);
me._oHelpTextEM = null;
}
if(this._checkDOMNode(oHelpText)) {
if(this._oHelpTextEM) {
var oParentNode = this._oHelpTextEM.parentNode;
oParentNode.replaceChild(oHelpText, this._oHelpTextEM);
}
else {
this._oHelpTextEM = oHelpText;
this.element.insertBefore(
this._oHelpTextEM,
this.subMenuIndicator
);
}
initHelpText();
}
else if(this._checkString(oHelpText)) {
if(oHelpText.length === 0) {
removeHelpText();
}
else {
if(!this._oHelpTextEM) {
this._oHelpTextEM = document.createElement("em");
this.element.insertBefore(
this._oHelpTextEM,
this.subMenuIndicator
);
}
this._oHelpTextEM.innerHTML = oHelpText;
initHelpText();
}
}
else if(!oHelpText && this._oHelpTextEM) {
removeHelpText();
}
},
configURL: function(p_sType, p_aArguments, p_oItem) {
var sURL = p_aArguments[0];
if(!sURL) {
sURL = "#";
}
this._oAnchor.setAttribute("href", sURL);
},
configEmphasis: function(p_sType, p_aArguments, p_oItem) {
var bEmphasis = p_aArguments[0];
if(bEmphasis && this.cfg.getProperty("strongemphasis")) {
this.cfg.setProperty("strongemphasis", false);
}
if(this._oAnchor) {
var oEM;
if(bEmphasis) {
oEM = document.createElement("em");
oEM.appendChild(this._oText);
this._oAnchor.appendChild(oEM);
}
else {
oEM = this._getFirstElement(this._oAnchor, "EM");
this._oAnchor.removeChild(oEM);
this._oAnchor.appendChild(this._oText);
}
}
},
configStrongEmphasis: function(p_sType, p_aArguments, p_oItem) {
var bStrongEmphasis = p_aArguments[0];
if(bStrongEmphasis && this.cfg.getProperty("emphasis")) {
this.cfg.setProperty("emphasis", false);
}
if(this._oAnchor) {
var oStrong;
if(bStrongEmphasis) {
oStrong = document.createElement("strong");
oStrong.appendChild(this._oText);
this._oAnchor.appendChild(oStrong);
}
else {
oStrong = this._getFirstElement(this._oAnchor, "STRONG");
this._oAnchor.removeChild(oStrong);
this._oAnchor.appendChild(this._oText);
}
}
},
configDisabled: function(p_sType, p_aArguments, p_oItem) {
var bDisabled = p_aArguments[0],
aNodes = [this.element, this._oAnchor],
sImageId,
sImageAlt;
if(this._oHelpTextEM) {
aNodes[2] = this._oHelpTextEM;
}
if(bDisabled) {
if(this.cfg.getProperty("selected")) {
this.cfg.setProperty("selected", false);
}
this._oAnchor.removeAttribute("href");
this._oDom.addClass(aNodes, "disabled");
sImageId = "yuidisabledsubmenuindicator";
sImageAlt = this.DISABLED_SUBMENU_INDICATOR_ALT_TEXT;
}
else {
this._oAnchor.setAttribute("href", this.cfg.getProperty("url"));
this._oDom.removeClass(aNodes, "disabled");
sImageId = "yuisubmenuindicator";
sImageAlt = this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
}
if(this.subMenuIndicator) {
this.subMenuIndicator.src = document.getElementById(sImageId).src;
this.subMenuIndicator.alt = sImageAlt;
}
},
configSelected: function(p_sType, p_aArguments, p_oItem) {
var bSelected = p_aArguments[0],
aNodes = [this.element, this._oAnchor],
sImageId;
if(this._oHelpTextEM) {
aNodes[2] = this._oHelpTextEM;
}
if(bSelected) {
this._oDom.addClass(aNodes, "selected");
sImageId = "yuiselectedsubmenuindicator";
}
else {
this._oDom.removeClass(aNodes, "selected");
sImageId = "yuisubmenuindicator";
}
if(this.subMenuIndicator) {
this.subMenuIndicator.src = document.getElementById(sImageId).src;
}
},
configSubmenu: function(p_sType, p_aArguments, p_oItem) {
var oSubmenu = p_aArguments[0],
aNodes = [this.element, this._oAnchor];
if(oSubmenu) {
oSubmenu.parent = this;
this._oSubmenu = oSubmenu;
if(!this.subMenuIndicator) {
var oSubMenuIndicator =
document.getElementById("yuisubmenuindicator");
if(!oSubMenuIndicator) {
oSubMenuIndicator = document.createElement("img");
oSubMenuIndicator.src =
(this.imageRoot + this.SUBMENU_INDICATOR_IMAGE_PATH);
oSubMenuIndicator.alt =
this.COLLAPSED_SUBMENU_INDICATOR_ALT_TEXT;
oSubMenuIndicator.id = "yuisubmenuindicator";
var oSelectedSubMenuIndicator =
document.createElement("img");
oSelectedSubMenuIndicator.src =
(
this.imageRoot +
this.SELECTED_SUBMENU_INDICATOR_IMAGE_PATH
);
oSelectedSubMenuIndicator.id =
"yuiselectedsubmenuindicator";
var oDisabledSubMenuIndicator =
document.createElement("img");
oDisabledSubMenuIndicator.src =
(
this.imageRoot +
this.DISABLED_SUBMENU_INDICATOR_IMAGE_PATH
);
oDisabledSubMenuIndicator.id =
"yuidisabledsubmenuindicator";
var oDIV = document.createElement("div");
oDIV.style.position = "absolute";
oDIV.style.left = "-1000px";
oDIV.appendChild(oSubMenuIndicator);
oDIV.appendChild(oSelectedSubMenuIndicator);
oDIV.appendChild(oDisabledSubMenuIndicator);
document.body.appendChild(oDIV);
}
var oClone = oSubMenuIndicator.cloneNode(false);
oClone.removeAttribute("id");
this.subMenuIndicator = oClone;
this.element.appendChild(this.subMenuIndicator);
this._oDom.addClass(aNodes, "hassubmenu");
if(this.cfg.getProperty("disabled")) {
this.cfg.refireEvent("disabled");
}
if(this.cfg.getProperty("selected")) {
this.cfg.refireEvent("selected");
}
}
}
else {
this._oDom.removeClass(aNodes, "hassubmenu");
if(this.subMenuIndicator) {
this.element.removeChild(this.subMenuIndicator);
}
if(this._oSubmenu) {
this._oSubmenu.destroy();
}
}
},
getNextEnabledSibling: function() {
if(this.parent instanceof YAHOO.widget.MenuModule) {
function getNextArrayItem(p_aArray, p_nStartIndex) {
return p_aArray[p_nStartIndex] ||
getNextArrayItem(p_aArray, (p_nStartIndex+1));
}
var aItemGroups = this.parent.getItemGroups(),
oNextItem;
if(this.index < (aItemGroups[this.groupIndex].length - 1)) {
oNextItem = getNextArrayItem(
aItemGroups[this.groupIndex],
(this.index+1)
);
}
else {
var nNextGroupIndex;
if(this.groupIndex < (aItemGroups.length - 1)) {
nNextGroupIndex = this.groupIndex + 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) {
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(),
oPreviousItem;
if(
this.index > getFirstItemIndex(aItemGroups[this.groupIndex], 0)
) {
oPreviousItem =
getPreviousArrayItem(
aItemGroups[this.groupIndex],
(this.index-1)
);
}
else {
var nPreviousGroupIndex;
if(this.groupIndex > getFirstItemIndex(aItemGroups, 0)) {
nPreviousGroupIndex = this.groupIndex - 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() {
if(
!this.cfg.getProperty("disabled") &&
this.parent &&
this.parent.cfg.getProperty("visible")
) {
var oActiveItem = this.parent.activeItem;
if(oActiveItem) {
oActiveItem.blur();
}
this._oAnchor.focus();
if(
this.parent &&
this.parent.browser == "opera" &&
this._oSubmenu
) {
this._oAnchor.focus();
}
this.focusEvent.fire();
}
},
blur: function() {
if(
!this.cfg.getProperty("disabled") &&
this.parent &&
this.parent.cfg.getProperty("visible")
) {
this._oAnchor.blur();
this.blurEvent.fire();
}
},
destroy: function() {
if(this.element) {
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 = this.element.parentNode;
if(oParentNode) {
oParentNode.removeChild(this.element);
this.destroyEvent.fire();
}
this.destroyEvent.unsubscribeAll();
}
}
};