/**
* @desc: a constructor, creates a new dhtmlxMenu object, baseId defines a base object for the top menu level
* @param: baseId - id of the html element to which a menu will be attached, in case of a contextual menu - if specified, will used as a contextual zone
* @type: public
*/
function dhtmlXMenuObject(baseId, skin) {
var main_self = this;
this.addBaseIdAsContextZone = null;
this.isDhtmlxMenuObject = true;
// skin settings
this.skin = (skin != null ? skin : (typeof(dhtmlx) != "undefined" && typeof(dhtmlx.skin) == "string" ? dhtmlx.skin : "dhx_skyblue"));
this.imagePath = "";
// iframe
this._isIE6 = false;
if (_isIE) this._isIE6 = (window.XMLHttpRequest==null?true:false);
if (baseId == null) {
this.base = document.body;
} else {
var baseObj = (typeof(baseId)=="string"?document.getElementById(baseId):baseId);
if (baseObj != null) {
this.base = baseObj;
if (!this.base.id) this.base.id = (new Date()).valueOf();
while (this.base.childNodes.length > 0) { this.base.removeChild(this.base.childNodes[0]); }
this.base.className += " dhtmlxMenu_"+this.skin+"_Middle dir_left";
this.base._autoSkinUpdate = true;
// preserv default oncontextmenu for future restorin in case of context menu
if (this.base.oncontextmenu) this.base._oldContextMenuHandler = this.base.oncontextmenu;
//
this.addBaseIdAsContextZone = this.base.id;
this.base.onselectstart = function(e) { e = e || event; e.returnValue = false; return false; }
this.base.oncontextmenu = function(e) { e = e || event; e.returnValue = false; return false; }
} else {
this.base = document.body;
}
}
// this.topId = topId;
this.topId = "dhxWebMenuTopId";
//
if (!this.extendedModule) {
// add notify for menu
var t = function(){alert(this.i18n.dhxmenuextalert);};
var extMethods = new Array("setItemEnabled", "setItemDisabled", "isItemEnabled", "_changeItemState", "getItemText", "setItemText",
"loadFromHTML", "hideItem", "showItem", "isItemHidden", "_changeItemVisible", "setUserData", "getUserData",
"setOpenMode", "setWebModeTimeout", "enableDynamicLoading", "_updateLoaderIcon", "getItemImage", "setItemImage",
"clearItemImage", "setAutoShowMode", "setAutoHideMode", "setContextMenuHideAllMode", "getContextMenuHideAllMode",
"setVisibleArea", "setTooltip", "getTooltip", "setHotKey", "getHotKey", "setItemSelected", "setTopText", "setRTL",
"setAlign", "setHref", "clearHref", "getCircuit", "_clearAllSelectedSubItemsInPolygon", "_checkArrowsState",
"_addUpArrow", "_addDownArrow", "_removeUpArrow", "_removeDownArrow", "_isArrowExists", "_doScrollUp", "_doScrollDown",
"_countPolygonItems", "setOverflowHeight", "_getRadioImgObj", "_setRadioState", "_radioOnClickHandler",
"getRadioChecked", "setRadioChecked", "addRadioButton", "_getCheckboxState", "_setCheckboxState", "_readLevel",
"_updateCheckboxImage", "_checkboxOnClickHandler", "setCheckboxState", "getCheckboxState", "addCheckbox", "serialize");
for (var q=0; q this.menuY1+this.menuY2) {
var t0 = Math.floor((this.menuY2-this.menuY1-35)/24);
this.limit = t0;
} else {
this.limit = 0;
if (this.idPull["arrowup_"+id] != null) this._removeUpArrow(String(id).replace(this.idPrefix,""));
if (this.idPull["arrowdown_"+id] != null) this._removeDownArrow(String(id).replace(this.idPrefix,""));
}
}
//#menu_overflow:06062008#{
if (this.limit > 0 && this.limit < itemCount) {
// add overflow arrows if they not exists
if (this.idPull["arrowup_"+id] == null) this._addUpArrow(String(id).replace(this.idPrefix,""));
if (this.idPull["arrowdown_"+id] == null) this._addDownArrow(String(id).replace(this.idPrefix,""));
// configure up arrow
arrowUp = this.idPull["arrowup_"+id];
arrowUp.style.visibility = "hidden";
arrowUp.style.display = "";
arrowUp.style.zIndex = this.zInd;
arrUpH = arrowUp.offsetHeight;
// configure bottom arrow
arrowDown = this.idPull["arrowdown_"+id];
arrowDown.style.visibility = "hidden";
arrowDown.style.display = "";
arrowDown.style.zIndex = this.zInd;
arrDownH = arrowDown.offsetHeight;
}
//#}
if (this.limit > 0) {
if (this.limit < itemCount) {
// set fixed size
// this.idPull[pId].style.height = this.idPull[pId].tbd.childNodes[0].offsetHeight*this.limit+"px";// + arrUpH + arrDownH;
this.idPull[pId].style.height = 24*this.limit+"px";
this.idPull[pId].scrollTop = 0;
} else {
// remove fixed size
this.idPull[pId].style.height = "";
}
}
//
this.zInd += this.zIndStep;
//
// console.log(this.idPull)
if (this.itemPull[id] != null) {
var parPoly = "polygon_"+this.itemPull[id]["parent"];
} else if (this.context) {
var parPoly = this.idPull[this.idPrefix+this.topId];
}
/*
// debug info
if (parPoly == null) {
alert("Implementation error. Please report support@dhtmlx.com");
}
*/
//
//
// define position
var srcX = (this.idPull[id].tagName != null ? getAbsoluteLeft(this.idPull[id]) : this.idPull[id][0]);
var srcY = (this.idPull[id].tagName != null ? getAbsoluteTop(this.idPull[id]) : this.idPull[id][1]);
var srcW = (this.idPull[id].tagName != null ? this.idPull[id].offsetWidth : 0);
var srcH = (this.idPull[id].tagName != null ? this.idPull[id].offsetHeight : 0);
var x = 0;
var y = 0;
var w = this.idPull[pId].offsetWidth;
var h = this.idPull[pId].offsetHeight + arrUpH + arrDownH;
//console.log(srcY,h,window.innerHeight,document.body.scrollTop)
/*
var bottomOverflow = (srcY+h > window.innerHeight+document.body.scrollTop);
if (bottomOverflow) {
if (openType == "bottom") openType = "top";
if (openType == "right" || openType == "left") {
srcY = srcY-h;
}
}
*/
// pos
if (openType == "bottom") {
if (this._rtl) {
x = srcX + (srcW!=null?srcW:0) - w;
} else {
if (this._align == "right") {
x = srcX + srcW - w;
} else {
x = srcX - 1 + (openType==this.dirTopLevel?this._topLevelRightMargin:0);
}
}
y = srcY - 1 + srcH + this._topLevelBottomMargin;
}
if (openType == "right") { x = srcX + srcW - 1; y = srcY + 2; }
if (openType == "left") { x = srcX - this.idPull[pId].offsetWidth + 2; y = srcY + 2; }
if (openType == "top") { x = srcX - 1; y = srcY - h + 2; }
// overflow check
if (this.fixedPosition) {
// use fixed document.body/window dimension if required
var mx = 65536;
var my = 65536;
} else {
var mx = (this.menuX2!=null?this.menuX2:0);
var my = (this.menuY2!=null?this.menuY2:0);
if (mx == 0) {
if (window.innerWidth) {
mx = window.innerWidth;
my = window.innerHeight;
} else {
mx = document.body.offsetWidth;
my = document.body.scrollHeight;
}
}
}
if (x+w > mx && !this._rtl) {
// no space on right, open to left
x = srcX - w + 2;
}
if (x < this.menuX1 && this._rtl) {
// no space on left, open to right
x = srcX + srcW - 2;
}
if (x < 0) {
// menu floats left
x = 0;
}
if (y+h > my && this.menuY2 != null) {
y = Math.max(srcY + srcH - h + 2, (this._isVisibleArea?this.menuY1+2:2));
// open from top level
if (this.context && this.idPrefix+this.topId == id && arrowDown != null) {
// autoscroll prevent because menu mouse pointer will right over downarrow
y = y-2;
}
if (this.itemPull[id] != null && !this.context) {
if (this.itemPull[id]["parent"] == this.idPrefix+this.topId) y = y - this.base.offsetHeight;
}
}
//
this.idPull[pId].style.left = x+"px";
this.idPull[pId].style.top = y+arrUpH+"px";
//
if (typeof(this._menuEffect) != "undefined" && this._menuEffect !== false) {
this._showPolygonEffect(pId);
} else {
this.idPull[pId].style.visibility = "";
//#menu_overflow:06062008#{
if (this.limit > 0 && this.limit < itemCount) {
// this.idPull[pId].scrollTop = 0;
arrowUp.style.left = x+"px";
arrowUp.style.top = y+"px";
arrowUp.style.width = w+this._arrowFFFix+"px";
arrowUp.style.visibility = "";
//
arrowDown.style.left = x+"px";
arrowDown.style.top = y+h-arrDownH+"px";
arrowDown.style.width = w+this._arrowFFFix+"px";
arrowDown.style.visibility = "";
//
this._checkArrowsState(id);
}
//#}
// show ie6 cover
if (this._isIE6) {
var pIdIE6 = pId+"_ie6cover";
if (this.idPull[pIdIE6] == null) {
var ifr = document.createElement("IFRAME");
ifr.className = "dhtmlxMenu_IE6CoverFix_"+this.skin;
ifr.frameBorder = 0;
ifr.setAttribute("src", "javascript:false;");
document.body.insertBefore(ifr, document.body.firstChild);
this.idPull[pIdIE6] = ifr;
}
this.idPull[pIdIE6].style.left = x+"px";
this.idPull[pIdIE6].style.top = y+"px";
this.idPull[pIdIE6].style.width = w+"px";
this.idPull[pIdIE6].style.height = h+"px";
this.idPull[pIdIE6].style.zIndex = this.idPull[pId].style.zIndex-1;
this.idPull[pIdIE6].style.display = "";
}
}
id = String(id).replace(this.idPrefix, "");
if (id == this.topId) id = null;
this.callEvent("onShow", [id]);
// corners
if (id != null && this.skin == "dhx_terrace" && this.itemPull[this.idPrefix+id].parent == this.idPrefix+this.topId) {
this._improveTerraceButton(this.idPrefix+id, false);
}
// this.callEvent("_onPolyShow",[id.replace(this.idPrefix,"")]);
}
}
/* redistrib sublevel selection: select id and deselect other, added in version 0.3 */
this._redistribSubLevelSelection = function(id, parentId) {
// clear previosly selected items
while (this._openedPolygons.length > 0) this._openedPolygons.pop();
// this._openedPolygons = new Array();
var i = this._getSubItemToDeselectByPolygon(parentId);
this._removeSubItemFromSelected(-1, -1);
for (var q=0; q 0) { m = j; }
}
}
return m;
}
/* return array of subitems for single menu object */
/* modified in version 0.3 */
this._getMenuNodes = function(node) {
var m = new Array;
for (var a in this.itemPull) { if (this.itemPull[a]["parent"] == node) { m[m.length] = a; } }
return m;
}
/* generate random string with specified length */
this._genStr = function(w) {
var s = ""; var z = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
for (var q=0; q 0) { main_self._openedPolygons.pop(); }
for (var q=0; q0));
item["complex"] = (this.dLoad?(r.getAttribute("complex")!=null?true:false):(this._buildMenu(r,item["id"])>0));
if (this.dLoad && item["complex"]) { item["loaded"] = "no"; }
this.itemPull[item["id"]] = item;
// check for user data
for (var w=0; w 1) {
item._menuOpenTM = window.setTimeout(function(){ main_self._showPolygon(pId, level); }, delay);
isShow = true;
}
}
}
if (!isShow) { main_self._showPolygon(pId, level); }
}
main_self.itemPull[main_self.idPrefix+parentId]["loaded"] = "yes";
// console.log(main_self.loaderIcon)
if (main_self.loaderIcon == true) { main_self._updateLoaderIcon(main_self.idPrefix+parentId, false); }
}
this.destructor();
main_self.callEvent("onXLE",[]);
} else {
var t = this.getXMLTopNode("menu");
// alert(3)
// main_self.idPrefix = main_self._genStr(12);
main_self._buildMenu(t, null);
main_self.init();
main_self.callEvent("onXLE",[]);
main_self._doOnLoad();
}
}
this._xmlLoader = new dtmlXMLLoaderObject(this._xmlParser, window);
/* show sublevel item */
this._showSubLevelItem = function(id,back) {
if (document.getElementById("arrow_" + this.idPrefix + id) != null) { document.getElementById("arrow_" + this.idPrefix + id).style.display = (back?"none":""); }
if (document.getElementById("image_" + this.idPrefix + id) != null) { document.getElementById("image_" + this.idPrefix + id).style.display = (back?"none":""); }
if (document.getElementById(this.idPrefix + id) != null) { document.getElementById(this.idPrefix + id).style.display = (back?"":"none"); }
}
/* hide sublevel item */
this._hideSubLevelItem = function(id) {
this._showSubLevelItem(id,true)
}
// generating id prefix
this.idPrefix = this._genStr(12);
/* attach body events */
this._bodyClick = function(e) {
e = e||event;
if (e.button == 2 || (_isOpera && e.ctrlKey == true)) return;
if (main_self.context) {
if (main_self.contextAutoHide && (!_isOpera || (main_self._isContextMenuVisible() && _isOpera))) main_self._hideContextMenu();
} else {
if (main_self._clearAndHide) main_self._clearAndHide();
}
}
this._bodyContext = function(e) {
e = e||event;
var t = String((e.srcElement||e.target).className);
if (t.search("dhtmlxMenu") != -1 && t.search("SubLevelArea") != -1) return;
var toHide = true;
var testZone = e.target || e.srcElement;
while (testZone != null) {
if (testZone.id != null) if (main_self.isContextZone(testZone.id)) toHide = false;
if (testZone == document.body) toHide = false;
testZone = testZone.parentNode;
}
if (toHide) main_self.hideContextMenu();
}
if (_isIE) {
document.body.attachEvent("onclick", this._bodyClick);
document.body.attachEvent("oncontextmenu", this._bodyContext);
} else {
window.addEventListener("click", this._bodyClick, false);
window.addEventListener("contextmenu", this._bodyContext, false);
}
// add menu to global store
this._UID = this._genStr(32);
dhtmlxMenuObjectLiveInstances[this._UID] = this;
/* events */
dhtmlxEventable(this);
//
return this;
}
dhtmlXMenuObject.prototype.init = function() {
if (this._isInited == true) return;
if (this.dLoad) {
this.callEvent("onXLS", []);
// this._xmlLoader.loadXML(this.dLoadUrl+"?action=loadMenu&parentId="+this.topId+"&topId="+this.topId);
this._xmlLoader.loadXML(this.dLoadUrl+this.dLoadSign+"action=loadMenu&etc="+new Date().getTime()); // &&parentId=topId&"+this.topId+"&topId="+this.topId);
} else {
this._initTopLevelMenu();
this._isInited = true;
}
}
dhtmlXMenuObject.prototype._countVisiblePolygonItems = function(id) {
/*
var count = 0;
if ((this.idPull["polygon_"+id] != null) && (this.idPull[id] != null)) {
for (var q=0; q 0) && (!this.itemPull[id]["complex"])) { this._updateItemComplexState(id, true, false); }
if ((u == 0) && (this.itemPull[id]["complex"])) { this._updateItemComplexState(id, false, false); }
}
}
/* complex arrow manipulations, over added in 0.4 */
dhtmlXMenuObject.prototype._updateItemComplexState = function(id, state, over) {
// 0.2 FIX :: topLevel's items can have complex items with arrow
if ((!this.context) && (this._getItemLevelType(id.replace(this.idPrefix,"")) == "TopLevel")) {
// 30.06.2008 fix > complex state for top level item, state only, no arrow
this.itemPull[id]["complex"] = state;
return;
}
if ((this.idPull[id] == null) || (this.itemPull[id] == null)) { return; }
// 0.2 FIX :: end
this.itemPull[id]["complex"] = state;
// fixed in 0.4 for context
if (id == this.idPrefix+this.topId) return;
// end fix
// try to retrieve arrow img object
var arrowObj = null;
var item = this.idPull[id].childNodes[this._rtl?0:2];
if (item.childNodes[0]) if (String(item.childNodes[0].className).search("complex_arrow") === 0) arrowObj = item.childNodes[0];
if (this.itemPull[id]["complex"]) {
// create arrow
if (arrowObj == null) {
arrowObj = document.createElement("DIV");
arrowObj.className = "complex_arrow";
arrowObj.id = "arrow_"+id;
while (item.childNodes.length > 0) item.removeChild(item.childNodes[0]);
item.appendChild(arrowObj);
}
// over state added in 0.4
if (this.dLoad && (this.itemPull[id]["loaded"] == "get") && this.loaderIcon) {
// change arrow to loader
if (arrowObj.className != "complex_arrow_loading") arrowObj.className = "complex_arrow_loading";
} else {
arrowObj.className = "complex_arrow";
}
return;
}
if ((!this.itemPull[id]["complex"]) && (arrowObj!=null)) {
item.removeChild(arrowObj);
if (this.itemPull[id]["hotkey_backup"] != null && this.setHotKey) { this.setHotKey(id.replace(this.idPrefix, ""), this.itemPull[id]["hotkey_backup"]); }
}
}
/* return css-part level type */
dhtmlXMenuObject.prototype._getItemLevelType = function(id) {
return (this.itemPull[this.idPrefix+id]["parent"]==this.idPrefix+this.topId?"TopLevel":"SubLevelArea");
}
/****************************************************************************************************************************************************/
/* "TOPLEVEL" LOW-LEVEL RENDERING */
/* redistrib selection in case of top node in real-time mode */
dhtmlXMenuObject.prototype._redistribTopLevelSelection = function(id, parent) {
// kick polygons and decelect before selected menues
var i = this._getSubItemToDeselectByPolygon("parent");
this._removeSubItemFromSelected(-1, -1);
for (var q=0; q 0) m.title = this.itemPull[id]["tip"];
//
// image in top level
if ((this.itemPull[id]["imgen"]!="")||(this.itemPull[id]["imgdis"]!="")) {
var imgTop=this.itemPull[id][(this.itemPull[id]["state"]=="enabled")?"imgen":"imgdis"];
if (imgTop) {
var img = document.createElement("IMG");
img.border = "0";
img.id = "image_"+id;
img.src= this.imagePath+imgTop;
img.className = "dhtmlxMenu_TopLevel_Item_Icon";
if (m.childNodes.length > 0 && !this._rtl) m.insertBefore(img, m.childNodes[0]); else m.appendChild(img);
}
}
m.onselectstart = function(e) { e = e || event; e.returnValue = false; return false; }
m.oncontextmenu = function(e) { e = e || event; e.returnValue = false; return false; }
// add container for top-level items if not exists yet
if (!this.cont) {
this.cont = document.createElement("DIV");
this.cont.dir = "ltr";
this.cont.className = (this._align=="right"?"align_right":"align_left");
this.base.appendChild(this.cont);
}
// insert
/*
if (pos != null) { pos++; if (pos < 0) pos = 0; if (pos > this.base.childNodes.length - 1) pos = null; }
if (pos != null) this.base.insertBefore(m, this.base.childNodes[pos]); else this.base.appendChild(m);
*/
if (pos != null) { pos++; if (pos < 0) pos = 0; if (pos > this.cont.childNodes.length - 1) pos = null; }
if (pos != null) this.cont.insertBefore(m, this.cont.childNodes[pos]); else this.cont.appendChild(m);
//
this.idPull[m.id] = m;
// create submenues
if (this.itemPull[id]["complex"] && (!this.dLoad)) this._addSubMenuPolygon(this.itemPull[id]["id"], this.itemPull[id]["id"]);
// events
m.onmouseover = function() {
if (main_self.menuMode == "web") { window.clearTimeout(main_self.menuTimeoutHandler); }
// kick polygons and decelect before selected menues
var i = main_self._getSubItemToDeselectByPolygon("parent");
main_self._removeSubItemFromSelected(-1, -1);
for (var q=0; q 0) {
if (imgObj != null) {
imgObj.src = this.imagePath+imgSrc;
} else {
if (isTopLevel) {
var imgObj = document.createElement("IMG");
imgObj.className = "dhtmlxMenu_TopLevel_Item_Icon";
imgObj.src = this.imagePath+imgSrc;
imgObj.border = "0";
imgObj.id = "image_"+id;
if (!this._rtl && this.idPull[id].childNodes.length > 0) this.idPull[id].insertBefore(imgObj,this.idPull[id].childNodes[0]); else this.idPull[id].appendChild(imgObj);
} else {
var imgObj = document.createElement("IMG");
imgObj.className = "sub_icon";
imgObj.src = this.imagePath+imgSrc;
imgObj.border = "0";
imgObj.id = "image_"+id;
var item = this.idPull[id].childNodes[this._rtl?2:0];
while (item.childNodes.length > 0) item.removeChild(item.childNodes[0]);
item.appendChild(imgObj);
}
}
} else {
if (imgObj != null) imgObj.parentNode.removeChild(imgObj);
}
}
/**
* @desc: removes an item from the menu with all nested sublevels
* @param: id - id of the item for removing
* @type: public
*/
dhtmlXMenuObject.prototype.removeItem = function(id, _isTId, _recCall) {
if (!_isTId) id = this.idPrefix + id;
var pId = null;
if (id != this.idPrefix+this.topId) {
if (this.itemPull[id] == null) return;
// effects
if (this.idPull["polygon_"+id] && this.idPull["polygon_"+id]._tmShow) window.clearTimeout(this.idPull["polygon_"+id]._tmShow);
// separator top
var t = this.itemPull[id]["type"];
if (t == "separator") {
var item = this.idPull["separator_"+id];
if (this.itemPull[id]["parent"] == this.idPrefix+this.topId) {
item.onclick = null;
item.onselectstart = null;
item.id = null;
item.parentNode.removeChild(item);
} else {
item.childNodes[0].childNodes[0].onclick = null;
item.childNodes[0].childNodes[0].onselectstart = null;
item.childNodes[0].childNodes[0].id = null;
item.childNodes[0].removeChild(item.childNodes[0].childNodes[0]);
item.removeChild(item.childNodes[0]);
item.parentNode.removeChild(item);
}
this.idPull["separator_"+id] = null;
this.itemPull[id] = null;
delete this.idPull["separator_"+id];
delete this.itemPull[id];
item = null;
} else {
// item checkbox radio
pId = this.itemPull[id]["parent"];
var item = this.idPull[id];
item.onclick = null;
item.oncontextmenu = null;
item.onmouseover = null;
item.onmouseout = null;
item.onselectstart = null;
item.id = null;
while (item.childNodes.length > 0) item.removeChild(item.childNodes[0]);
item.parentNode.removeChild(item);
this.idPull[id] = null;
this.itemPull[id] = null;
delete this.idPull[id];
delete this.itemPull[id];
item = null;
}
t = null;
}
// clear nested items
for (var a in this.itemPull) if (this.itemPull[a]["parent"] == id) this.removeItem(a, true, true);
// check if empty polygon left
var p2 = new Array(id);
if (pId != null && !_recCall) {
if (this.idPull["polygon_"+pId] != null) {
if (this.idPull["polygon_"+pId].tbd.childNodes.length == 0) {
p2.push(pId);
this._updateItemComplexState(pId, false, false);
}
}
}
// delete nested polygons and parent's if any
for (var q=0; q= this.menuX1) && (x+w<=this.menuX2) && (y >= this.menuY1) && (y+h <= this.menuY2));
}*/
//#}
/**
* @desc: returns item's position in the current polygon
* @param: id - the item
* @type: public
*/
dhtmlXMenuObject.prototype.getItemPosition = function(id) {
id = this.idPrefix+id;
var pos = -1;
if (this.itemPull[id] == null) return pos;
var parent = this.itemPull[id]["parent"];
// var obj = (this.idPull["polygon_"+parent]!=null?this.idPull["polygon_"+parent].tbd:this.base);
var obj = (this.idPull["polygon_"+parent]!=null?this.idPull["polygon_"+parent].tbd:this.cont);
for (var q=0; q 0 && !this.itemPull[id]["complex"]) {
var t3t = document.createElement("DIV");
t3t.className = "sub_item_hk";
t3t.innerHTML = this.itemPull[id]["hotkey"];
t3.appendChild(t3t);
} else {
t3.innerHTML = " ";
}
}
tr.appendChild(this._rtl?t3:t1);
tr.appendChild(t2);
tr.appendChild(this._rtl?t1:t3);
//
tr.id = this.itemPull[id]["id"];
tr.parent = this.itemPull[id]["parent"];
// tooltip, added in 0.4
if (this.itemPull[id]["tip"].length > 0) tr.title = this.itemPull[id]["tip"];
//
if (!this._hideTMData) this._hideTMData = {};
tr.onselectstart = function(e) { e = e || event; e.returnValue = false; return false; }
tr.onmouseover = function(e) {
if (main_self._hideTMData[this.id]) window.clearTimeout(main_self._hideTMData[this.id]);
if (main_self.menuMode == "web") window.clearTimeout(main_self.menuTimeoutHandler);
if (!this._visible) main_self._redistribSubLevelSelection(this.id, this.parent); // if not visible
this._visible = true;
}
tr.onmouseout = function() {
if (main_self.menuMode == "web") {
if (main_self.menuTimeoutHandler) window.clearTimeout(main_self.menuTimeoutHandler);
main_self.menuTimeoutHandler = window.setTimeout(function(){if(main_self&&main_self._clearAndHide)main_self._clearAndHide();}, main_self.menuTimeoutMsec, "JavaScript");
}
var k = this;
if (main_self._hideTMData[this.id]) window.clearTimeout(main_self._hideTMData[this.id]);
main_self._hideTMData[this.id] = window.setTimeout(function(){k._visible=false;}, 50);
}
tr.onclick = function(e) {
// added in 0.4, preven complex closing if user event not defined
if (!main_self.checkEvent("onClick") && main_self.itemPull[this.id]["complex"]) return;
//
e = e || event; e.cancelBubble = true;
e.returnValue = false;
tc = (main_self.itemPull[this.id]["complex"]?"c":"-");
td = (main_self.itemPull[this.id]["state"]=="enabled"?"-":"d");
var cas = {"ctrl": e.ctrlKey, "alt": e.altKey, "shift": e.shiftKey};
switch (main_self.itemPull[this.id]["type"]) {
case "checkbox":
main_self._checkboxOnClickHandler(this.id.replace(main_self.idPrefix, ""), tc+td+"n", cas);
break;
case "radio":
main_self._radioOnClickHandler(this.id.replace(main_self.idPrefix, ""), tc+td+"n", cas);
break;
case "item":
main_self._doOnClick(this.id.replace(main_self.idPrefix, ""), tc+td+"n", cas);
break;
}
return false;
}
// add
var polygon = this.idPull["polygon_"+this.itemPull[id]["parent"]];
if (pos != null) { pos++; if (pos < 0) pos = 0; if (pos > polygon.tbd.childNodes.length - 1) pos = null; }
if (pos != null && polygon.tbd.childNodes[pos] != null) polygon.tbd.insertBefore(tr, polygon.tbd.childNodes[pos]); else polygon.tbd.appendChild(tr);
this.idPull[tr.id] = tr;
}
/****************************************************************************************************************************************************/
/* SEPARATOR */
dhtmlXMenuObject.prototype._renderSeparator = function(id, pos) {
var level = (this.context?"SubLevelArea":(this.itemPull[id]["parent"]==this.idPrefix+this.topId?"TopLevel":"SubLevelArea"));
if (level == "TopLevel" && this.context) return;
var main_self = this;
if (level != "TopLevel") {
var tr = document.createElement("TR");
tr.className = "sub_sep";
var td = document.createElement("TD");
td.colSpan = "3";
tr.appendChild(td);
}
var k = document.createElement("DIV");
k.id = "separator_"+id;
k.className = (level=="TopLevel"?"top_sep":"sub_sep");
k.onselectstart = function(e) { e = e || event; e.returnValue = false; }
k.onclick = function(e) {
e = e || event; e.cancelBubble = true;
var cas = {"ctrl": e.ctrlKey, "alt": e.altKey, "shift": e.shiftKey};
main_self._doOnClick(this.id.replace("separator_" + main_self.idPrefix, ""), "--s", cas);
}
if (level == "TopLevel") {
if (pos != null) {
pos++; if (pos < 0) { pos = 0; }
// if (this.base.childNodes[pos] != null) { this.base.insertBefore(k, this.base.childNodes[pos]); } else { this.base.appendChild(k); }
if (this.cont.childNodes[pos] != null) { this.cont.insertBefore(k, this.cont.childNodes[pos]); } else { this.cont.appendChild(k); }
} else {
// add as a last item
// var last = this.base.childNodes[this.base.childNodes.length-1];
var last = this.cont.childNodes[this.cont.childNodes.length-1];
// if (String(last).search("TopLevel_Text") == -1) { this.base.appendChild(k); } else { this.base.insertBefore(k, last); }
if (String(last).search("TopLevel_Text") == -1) { this.cont.appendChild(k); } else { this.cont.insertBefore(k, last); }
}
this.idPull[k.id] = k;
} else {
var polygon = this.idPull["polygon_"+this.itemPull[id]["parent"]];
if (pos != null) { pos++; if (pos < 0) pos = 0; if (pos > polygon.tbd.childNodes.length - 1) pos = null; }
if (pos != null && polygon.tbd.childNodes[pos] != null) polygon.tbd.insertBefore(tr, polygon.tbd.childNodes[pos]); else polygon.tbd.appendChild(tr);
td.appendChild(k);
this.idPull[k.id] = tr;
}
}
/**
* @desc: add a new separator
* @param: nextToId - id of the element after which a new separator will be inserted
* @param: itemId - id of a new separator
* @type: public
*/
dhtmlXMenuObject.prototype.addNewSeparator = function(nextToId, itemId) { //, disabled) {
itemId = this.idPrefix+(itemId!=null?itemId:this._genStr(24));
var parentId = this.idPrefix+this.getParentId(nextToId);
// if ((parentId == this.idPrefix+this.topId) && (!this.context)) { return; }
// this._addItemIntoGlobalStrorage(itemId, parentId, "", "item", disabled, "", "");
// this._addItemIntoGlobalStrorage(itemId, parentId, "", "item", false, "", "");
this._addItemIntoGlobalStrorage(itemId, parentId, "", "separator", false, "", "");
this._renderSeparator(itemId, this.getItemPosition(nextToId));
}
/****************************************************************************************************************************************************/
// hide any opened polygons
/**
* @desc: hides any open menu polygons
* @type: public
*/
dhtmlXMenuObject.prototype.hide = function() {
this._clearAndHide();
}
/**
* @desc: clear all loaded items
* @type: public
*/
dhtmlXMenuObject.prototype.clearAll = function() {
/*
for (var a in this.itemPull) {
if (this.itemPull[a]["parent"] == this.idPrefix+this.topId) {
this.removeItem(String(a).replace(this.idPrefix,""));
}
}
*/
this.removeItem(this.idPrefix+this.topId, true);
this._isInited = false;
this.idPrefix = this._genStr(12);
this.itemPull = {};
}
/****************************************************************************************************************************************************/
/**
* @desc: unloads menu from page (destructor)
* @type: public
*/
dhtmlXMenuObject.prototype.unload = function() {
if (_isIE) {
document.body.detachEvent("onclick", this._bodyClick);
document.body.detachEvent("oncontextmenu", this._bodyContext);
} else {
window.removeEventListener("click", this._bodyClick, false);
window.removeEventListener("contextmenu", this._bodyContext, false);
}
this._bodyClick = null;
this._bodyContext = null;
// will recursively remove all items
this.removeItem(this.idPrefix+this.topId, true);
this.itemPull = null;
this.idPull = null;
// clear context zones
if (this.context) for (var a in this.contextZones) this.removeContextZone(a);
if (this.cont != null) {
this.cont.className = "";
this.cont.parentNode.removeChild(this.cont);
this.cont = null;
}
if (this.base != null) {
this.base.className = "";
if (!this.context) this.base.oncontextmenu = (this.base._oldContextMenuHandler||null);
this.base.onselectstart = null;
this.base = null;
}
this.setSkin = null;
this.detachAllEvents();
if (this._xmlLoader) {
this._xmlLoader.destructor();
this._xmlLoader = null;
}
this._align = null;
this._arrowFFFix = null;
this._isIE6 = null;
this._isInited = null;
this._rtl = null;
this._scrollDownTMStep = null;
this._scrollDownTMTime = null;
this._scrollUpTMStep = null;
this._scrollUpTMTime = null;
this._topLevelBottomMargin = null;
this._topLevelOffsetLeft = null;
this._topLevelBottomMargin = null;
this._topLevelRightMargin = null;
this.addBaseIdAsContextZone = null;
this.context = null;
this.contextAutoHide = null;
this.contextAutoShow = null;
this.contextHideAllMode = null;
this.contextMenuZoneId = null;
this.dLoad = null;
this.dLoadSign = null;
this.dLoadUrl = null;
this.loaderIcon = null;
this.fixedPosition = null;
this.dirSubLevel = null;
this.dirTopLevel = null;
this.limit = null;
this.menuSelected = null;
this.menuLastClicked = null;
this.idPrefix = null;
this.imagePath = null;
this.menuMode = null;
this.menuModeTopLevelTimeout = null;
this.menuModeTopLevelTimeoutTime = null;
this.menuTimeoutHandler = null;
this.menuTimeoutMsec = null;
this.menuTouched = null;
this.isDhtmlxMenuObject = null;
this.itemHotKeyTagName = null;
this.itemHrefTagName = null;
this.itemTagName = null;
this.itemTextTagName = null;
this.itemTipTagName = null;
this.userDataTagName = null;
this.skin = null;
this.topId = null;
this.dacCycles = null;
this.dacCyclesIE = null;
this.dacSpeed = null;
this.dacSpeedIE = null;
this.zInd = null;
this.zIndInit = null;
this.zIndStep = null;
//
// unload basic methods
this._enableDacSupport = null;
this._selectedSubItems = null;
this._openedPolygons = null;
this._addSubItemToSelected = null;
this._removeSubItemFromSelected = null;
this._getSubItemToDeselectByPolygon = null;
this._hidePolygon = null;
this._showPolygon = null;
this._redistribSubLevelSelection = null;
this._doOnClick = null;
this._doOnTouchMenu = null;
this._searchMenuNode = null;
this._getMenuNodes = null;
this._genStr = null;
this._clearAndHide = null;
this._doOnLoad = null;
this.getItemType = null;
this.forEachItem = null;
this.init = null;
this.loadXML = null;
this.loadXMLString = null;
this._buildMenu = null;
this._xmlParser = null;
this._showSubLevelItem = null;
this._hideSubLevelItem = null;
this._countVisiblePolygonItems = null;
this._redefineComplexState = null;
this._updateItemComplexState = null;
this._getItemLevelType = null;
this._redistribTopLevelSelection = null;
this._initTopLevelMenu = null;
this._renderToplevelItem = null;
this.setImagePath = null;
this.setIconsPath = null;
this.setIconPath = null;
this._updateItemImage = null;
this.removeItem = null;
this._getAllParents = null;
this.renderAsContextMenu = null;
this.addContextZone = null;
this.removeContextZone = null;
this.isContextZone = null;
this._isContextMenuVisible = null;
this._showContextMenu = null;
this._doOnContextBeforeCall = null;
this._autoDetectVisibleArea = null;
this._addItemIntoGlobalStrorage = null;
this._addSubMenuPolygon = null;
this._renderSublevelPolygon = null;
this._renderSublevelItem = null;
this._renderSeparator = null;
this._hideContextMenu = null;
this.clearAll = null;
this.getItemPosition = null;
this.setItemPosition = null;
this.getParentId = null;
this.addNewSibling = null;
this.addNewChild = null;
this.addNewSeparator = null;
this.attachEvent = null;
this.callEvent = null;
this.checkEvent = null;
this.eventCatcher = null;
this.detachEvent = null;
this.dhx_Event = null;
this.unload = null;
this.items = null;
this.radio = null;
this.detachAllEvents = null;
this.hide = null;
this.showContextMenu = null;
this.hideContextMenu = null;
// unload extended methods
this._changeItemState = null;
this._changeItemVisible = null;
this._updateLoaderIcon = null;
this._clearAllSelectedSubItemsInPolygon = null;
this._checkArrowsState = null;
this._addUpArrow = null;
this._addDownArrow = null;
this._removeUpArrow = null;
this._removeDownArrow = null;
this._isArrowExists = null;
this._doScrollUp = null;
this._doScrollDown = null;
this._countPolygonItems = null;
this._getRadioImgObj = null;
this._setRadioState = null;
this._radioOnClickHandler = null;
this._getCheckboxState = null;
this._setCheckboxState = null;
this._readLevel = null;
this._updateCheckboxImage = null;
this._checkboxOnClickHandler = null;
this._removeArrow = null;
this.setItemEnabled = null;
this.setItemDisabled = null;
this.isItemEnabled = null;
this.getItemText = null;
this.setItemText = null;
this.loadFromHTML = null;
this.hideItem = null;
this.showItem = null;
this.isItemHidden = null;
this.setUserData = null;
this.getUserData = null;
this.setOpenMode = null;
this.setWebModeTimeout = null;
this.enableDynamicLoading = null;
this.getItemImage = null;
this.setItemImage = null;
this.clearItemImage = null;
this.setAutoShowMode = null;
this.setAutoHideMode = null;
this.setContextMenuHideAllMode = null;
this.getContextMenuHideAllMode = null;
this.setVisibleArea = null;
this.setTooltip = null;
this.getTooltip = null;
this.setHotKey = null;
this.getHotKey = null;
this.setItemSelected = null;
this.setTopText = null;
this.setRTL = null;
this.setAlign = null;
this.setHref = null;
this.clearHref = null;
this.getCircuit = null;
this.contextZones = null;
this.setOverflowHeight = null;
this.userData = null;
this.getRadioChecked = null;
this.setRadioChecked = null;
this.addRadioButton = null;
this.setCheckboxState = null;
this.getCheckboxState = null;
this.addCheckbox = null;
this.serialize = null;
this.extendedModule = null;
// remove menu from global store
dhtmlxMenuObjectLiveInstances[this._UID] = null;
try { delete dhtmlxMenuObjectLiveInstances[this._UID]; } catch(e) {}
this._UID = null;
}
// dhtmlxmenu global store
var dhtmlxMenuObjectLiveInstances = {};
dhtmlXMenuObject.prototype.i18n = {
dhxmenuextalert: "dhtmlxmenu_ext.js required"
};
//menu
(function(){
dhtmlx.extend_api("dhtmlXMenuObject",{
_init:function(obj){
return [obj.parent, obj.skin];
},
align:"setAlign",
top_text:"setTopText",
context:"renderAsContextMenu",
icon_path:"setIconsPath",
open_mode:"setOpenMode",
rtl:"setRTL",
skin:"setSkin",
dynamic:"enableDynamicLoading",
xml:"loadXML",
items:"items",
overflow:"setOverflowHeight"
},{
items:function(arr,parent){
var pos = 100000;
var lastItemId = null;
for (var i=0; i < arr.length; i++) {
var item=arr[i];
if (item.type == "separator") {
this.addNewSeparator(lastItemId, pos, item.id);
lastItemId = item.id;
} else {
this.addNewChild(parent, pos, item.id, item.text, item.disabled, item.img, item.img_disabled);
lastItemId = item.id;
if (item.items) this.items(item.items,item.id);
}
}
}
});
})();
// terrace
dhtmlXMenuObject.prototype._improveTerraceSkin = function() {
for (var a in this.itemPull) {
if (this.itemPull[a].parent == this.idPrefix+this.topId && this.idPull[a] != null) { // this.idPull[a] will null for separator
var bl = false;
var br = false;
// left side, first item, not sep
if (this.idPull[a].parentNode.firstChild == this.idPull[a]) {
bl = true;
}
// right side, last item, not sep
if (this.idPull[a].parentNode.lastChild == this.idPull[a]) {
br = true;
}
// check siblings
for (var b in this.itemPull) {
if (this.itemPull[b].type == "separator" && this.itemPull[b].parent == this.idPrefix+this.topId) {
if (this.idPull[a].nextSibling == this.idPull["separator_"+b]) {
br = true;
}
if (this.idPull[a].previousSibling == this.idPull["separator_"+b]) {
bl = true;
}
}
}
this.idPull[a].style.borderLeft = (bl?"1px solid #cecece":"0px solid white");
this.idPull[a].style.borderTopLeftRadius = this.idPull[a].style.borderBottomLeftRadius = (bl?"5px":"0px");
this.idPull[a].style.borderTopRightRadius = this.idPull[a].style.borderBottomRightRadius = (br?"5px":"0px");
this.idPull[a]._bl = bl;
this.idPull[a]._br = br;
}
}
};
dhtmlXMenuObject.prototype._improveTerraceButton = function(id, state) {
if (state) {
this.idPull[id].style.borderBottomLeftRadius = (this.idPull[id]._bl ? "5px" : "0px");
this.idPull[id].style.borderBottomRightRadius = (this.idPull[id]._br ? "5px" : "0px");
} else {
this.idPull[id].style.borderBottomLeftRadius = "0px";
this.idPull[id].style.borderBottomRightRadius = "0px";
}
};