/* WIMenu - author: Emmanuel C. Halos (my_mudspring@yahoo.com) */
function objWIMenu(pVar) { var cs = { pVar: null, zIndex: 1, visMenuIDs: [], menuName: '__echmenu', showMenu: 0 }, isIE = (navigator.userAgent.search(/MSIE/) != -1) ? 1 : 0; this.init = init; this.show = show; this.hide = hide; this.hideAll = hideAll; this.objLink = objLink; function init(pVar) { var ls = {}; cs.pVar = pVar; if (cs.pVar) { if (document.getElementById && document.createElement) { cs.pVar = _checkDefaultMenuProperties(cs.pVar); cs.pVar.autoHide = (parseInt(cs.pVar.autoHide)) ? parseInt(cs.pVar.autoHide) : 0; cs.pVar.hideDelay = (typeof(cs.pVar.hideDelay) == 'number') ? cs.pVar.hideDelay : 300; if (cs.pVar.menu && cs.pVar.menu.push) { for (ls.i=0; ls.i < cs.pVar.menu.length; ls.i++) { create(cs.pVar.menu[ls.i], cs.menuName + ls.i); ls.obj = document.getElementById(cs.pVar.menu[ls.i].refID); if (ls.obj) _objEvent(ls.obj, cs.pVar.menu[ls.i], 1); } _attachEvent(document, 'onclick', hideAll); } } } return this; } function create(pObjMenu, pPrefix, pReset) { var ls = { objMenu: '', appendOK: 1, ok: 0 }; if (!pReset) pReset = 0; pObjMenu = _checkMenuProperties(pObjMenu); if (pObjMenu.menu && pObjMenu.menu.push && pObjMenu.menu.length) { ls.ok = 1; if (pObjMenu.id) ls.objMenu = document.getElementById(pObjMenu.id); else pObjMenu.id = pPrefix; pPrefix += '_'; if (pReset && ls.objMenu) { document.body.removeChild(ls.objMenu); ls.objMenu = ''; } if (!ls.objMenu) { ls.objMenu = document.createElement('div'); ls.objMenu.id = pObjMenu.id; } else ls.appendOK = 0; with (ls.objMenu) { className = pObjMenu.blockClassName; style.position = 'absolute'; style.top = '0'; style.left = '0'; } _hideBlock(ls.objMenu); ls.menuCount = 0; for (ls.i=0; ls.i<pObjMenu.menu.length; ls.i++) { ls.om = _checkLinkProperties(pObjMenu.menu[ls.i]); if (ls.appendOK) { if (ls.om.href.length) { ls.objLink = document.createElement('a'); with (ls.objLink) { href = ls.om.href; if (ls.om.target.length) target = ls.om.target; } } else ls.objLink = document.createElement('span'); with (ls.objLink) { id = (ls.om.id && ls.om.id.length) ? ls.om.id : ls.objMenu.id + 'ln' + ls.i; className = ls.om.className; title = ls.om.title; innerHTML = ls.om.innerHTML; } ls.objMenu.appendChild(ls.objLink); } else ls.objLink = document.getElementById(ls.om.id); ls.om = _checkMenuProperties(ls.om); ls.om.refID = ls.objLink.id; if (ls.om.menu) { create(ls.om, pPrefix + ls.menuCount); ls.menuCount++; } if (ls.objLink) _objEvent(ls.objLink, ls.om); } document.body.appendChild(ls.objMenu); } return ls.ok; } function _objEvent(pObj, pMenu, pIsFirstLevel) { var ls = { event: pMenu.eventHandler, ok: 1 }; if (!pIsFirstLevel) pIsFirstLevel = 0; _attachEvent(pObj, ls.event, function (e) { if (isIE) e = window.event; hideChildren(pObj); _show(pObj, e, pIsFirstLevel); if (e) _eStop(e); return false; } ); return ls.ok; } function show(pMenuID, pEvent) { var ls = { ok : 0 }; ls.objMenu = getMenuPropertiesByMenuId(pMenuID); if (ls.objMenu) { _show(document.getElementById(ls.objMenu.id), pEvent); cs.showMenu = 1; ls.ok = 1; } return ls.ok; } function _show(pObj, pEvent, pIsFirstLevel) { var ls = { isVisible: 0 }; if (!pIsFirstLevel) pIsFirstLevel = 0; ls.objMenu = getMenuPropertiesByRefId(pObj.id); if (ls.objMenu) { ls.obj = document.getElementById(ls.objMenu.id); if (ls.obj && !isVisible(ls.obj)) { ls.isFound = -1; for (ls.i=0; ls.i<cs.visMenuIDs.length; ls.i++) if (cs.visMenuIDs[ls.i] == ls.objMenu.id) { cs.visMenuIDs.splice(ls.i, 1); break; } cs.visMenuIDs.unshift(ls.objMenu.id); pObj.className = ls.objMenu.menuSelectedClassName; ls.obj.style.display = 'block'; ls.obj.style.zIndex = cs.zIndex++; ls.objAlign = ls.objMenu.align; ls.objPosn = ls.objMenu.position; ls.refTop = ls.top = _objTop(pObj); ls.refLeft = ls.left = _objLeft(pObj); if (ls.objAlign.search(/right/i) != -1 && ls.objPosn.search(/right/) == -1) ls.refLeft = ls.left = ls.left - (ls.obj.offsetWidth - pObj.offsetWidth); if (ls.objAlign.search(/bottom/i) != -1 && ls.objPosn.search(/bottom/) == -1) ls.refTop = ls.top = ls.top + pObj.offsetHeight - ls.obj.offsetHeight; if (ls.objPosn.search(/top/i) != -1) ls.top -= ls.obj.offsetHeight; if (ls.objPosn.search(/right/i) != -1) ls.left += pObj.offsetWidth; if (ls.objPosn.search(/bottom/i) != -1 && !ls.isContext) ls.top += pObj.offsetHeight; if (ls.objPosn.search(/left/i) != -1) ls.left -= ls.obj.offsetWidth; if (ls.objMenu.menuOffsetX) ls.left += ls.objMenu.menuOffsetX; if (ls.objMenu.menuOffsetY) ls.top += ls.objMenu.menuOffsetY; ls.space = ls.left + ls.obj.offsetWidth; ls.sWidth = _maxWidth(); if (ls.space > ls.sWidth) { ls.left = ls.sWidth - ls.obj.offsetWidth; if (ls.left <= ls.refLeft + 10 && ls.objPosn.search(/bottom|top/) == -1) ls.left = ls.refLeft - ls.obj.offsetWidth; } if (ls.left < 0) ls.left = 0; ls.space = ls.top + ls.obj.offsetHeight; ls.sHeight = _maxHeight(); if (ls.space > ls.sHeight) { ls.top = ls.sHeight - ls.obj.offsetHeight; if (ls.refTop <= ls.top && ls.objPosn.search(/right|left/) == -1) ls.top = ls.refTop - ls.obj.offsetHeight; } if (ls.top < 0) ls.top = 0; with (ls.obj.style) { top = ls.top + 'px'; left = ls.left + 'px'; } ls.obj.style.visibility = 'visible'; } } } function isVisible(pObj) { return ((pObj.style.visibility == 'visible' && pObj.style.display != 'none') ? true : false); } function hide(pID) { var ls = {}; } function hideAll(pMenu) { var ls = {}; if (!pMenu || !pMenu.menu) pMenu = cs.pVar.menu; for (ls.i=0; ls.i<pMenu.length; ls.i++) { ls.om = pMenu[ls.i]; if (ls.om.refID) { ls.tmp = { id: ls.om.refID }; hideChildren(ls.tmp); } } } function hideChildren(pObj, pMenu) { var ls = { ok: 0, isFound: -1, isRoot: 0 }; if (!pMenu) pMenu = cs.pVar; if (pMenu.menu) { for (ls.i=0; ls.i<pMenu.menu.length; ls.i++) { ls.obj = pMenu.menu[ls.i]; if (ls.obj.refID == pObj.id) { ls.isFound = ls.i; break; } else if (ls.obj.menu) { if (hideChildren(pObj, ls.obj) && !ls.ok) ls.ok = 1; } } if (ls.isFound != -1) { ls.ok = 1; for (ls.i=0; ls.i < pMenu.menu.length; ls.i++) { ls.om = pMenu.menu[ls.i]; if (ls.i != ls.isFound) _hideChildren(ls.om); } } } return ls.ok; } function _hideChildren(pMenu) { var ls = { ok: 0 }; if (pMenu.id) { ls.ok = 1; ls.obj = document.getElementById(pMenu.id); if (ls.obj) { ls.pID = document.getElementById(pMenu.refID); if (ls.pID) ls.pID.className = pMenu.className; if (_hideBlock(ls.obj)) cs.zIndex--; } if (pMenu.menu) for (ls.i=0; ls.i<pMenu.menu.length; ls.i++) _hideChildren(pMenu.menu[ls.i]); } return ls.ok; } function _hideBlock(pObj) { var ls = { ok : 0 }; if (pObj && pObj.style && pObj.style.display != 'none') { ls.ok = 1; with (pObj.style) { display = 'none'; visibility = 'hidden'; } } return ls.ok; } function _maxHeight() { var ls = { height: screen.height, b: document.body, de: document.documentElement }; if (typeof(window.pageYOffset) == 'number') { ls.height = window.innerHeight + window.pageYOffset; } else if (isIE) { ls.height = ls.de.clientHeight; if (ls.de.scrollTop) ls.height = ls.de.clientHeight + ls.de.scrollTop; if (!ls.height) ls.height = ls.de.offsetHeight + ls.b.scrollTop; } else if (ls.de) ls.height = ls.de.offsetHeight; return ls.height; } function _maxWidth() { var ls = { width: screen.width, isMoz: (navigator.userAgent.search(/Gecko/) != -1) ? 1 : 0, de: document.documentElement }; if (typeof(window.pageXOffset) == 'number' && !ls.isMoz) { ls.width = window.innerWidth + window.pageXOffset; } else if (isIE) { ls.width = ls.de.clientWidth; if (ls.de.scrollLeft) ls.width = ls.de.clientWidth + ls.de.scrollLeft; if (!ls.width) { ls.width = ls.de.offsetWidth + ls.de.scrollLeft; } } else if (ls.de) { ls.width = ls.de.offsetWidth; } return ls.width; } function _objLeft(pObj) { var ls = { left: 0 }; do ls.left += pObj.offsetLeft; while ((pObj = pObj.offsetParent)); return ls.left; } function _objTop(pObj) { var ls = { top: 0 }; do ls.top += pObj.offsetTop; while ((pObj = pObj.offsetParent)); return ls.top; } function _eStop(e) { if (isIE) e.cancelBubble = true; else if (e.stopPropagation) e.stopPropagation(); } function _attachEvent(pObj, pEvent, pFunc) { if (pEvent) { if (pObj.addEventListener) pObj.addEventListener(pEvent.replace(/^on/, ''), pFunc, false); else if (pObj.attachEvent) pObj.attachEvent(pEvent, pFunc); } } function _checkDefaultMenuProperties(pProp) { if (!pProp.defaultMenuClassName) pProp.defaultMenuClassName = ''; if (!pProp.defaultMenuSelectedClassName) pProp.defaultMenuSelectedClassName = ''; if (!pProp.defaultBlockClassName) pProp.defaultBlockClassName = ''; pProp.defaultEventHandler = (pProp.defaultEventHandler) ? pProp.defaultEventHandler.toLowerCase() : 'onmouseover'; pProp.defaultPosition = (pProp.defaultPosition) ? pProp.defaultPosition.toLowerCase() : 'bottom'; pProp.defaultAlign = (pProp.defaultAlign) ? pProp.defaultAlign.toLowerCase() : 'right'; pProp.defaultMenuOffsetX = (typeof(pProp.defaultMenuOffsetX) == 'number') ? pProp.defaultMenuOffsetX : 0; pProp.defaultMenuOffsetY = (typeof(pProp.defaultMenuOffsetY) == 'number') ? pProp.defaultMenuOffsetY : 0; return pProp; } function _checkMenuProperties(pProp, pParent) { if (!pParent) pParent = cs.pVar; pProp.menuClassName = (pProp.menuClassName) ? pProp.menuClassName.toLowerCase() : ((pParent.defaultMenuClassName) ? pParent.defaultMenuClassName : ''); pProp.menuSelectedClassName = (typeof(pProp.menuSelectedClassName) == 'string') ? pProp.menuSelectedClassName.toLowerCase() : ((typeof(pParent.defaultMenuSelectedClassName) == 'string') ? pParent.defaultMenuSelectedClassName: pProp.menuClassName ); pProp.blockClassName = (typeof(pProp.blockClassName) == 'string') ? pProp.blockClassName : ((typeof(pParent.defaultBlockClassName) == 'string') ? pParent.defaultBlockClassName : ''); pProp.eventHandler = (typeof(pProp.eventHandler) == 'string') ? pProp.eventHandler.toLowerCase() : ((typeof(pParent.eventHandler) == 'string') ? pParent.eventHandler : ((typeof(pParent.defaultEventHandler) == 'string') ? pParent.defaultEventHandler : 'onmouseover')); pProp.position = (pProp.position) ? pProp.position.toLowerCase() : ((pParent.defaultPosition) ? pParent.defaultPosition : 'bottom'); pProp.align = (pProp.align) ? pProp.align.toLowerCase() : ((pParent.defaultAlign) ? pParent.defaultAlign : 'right'); pProp.menuOffsetX = (typeof(pProp.menuOffsetX) == 'number') ? pProp.menuOffsetX : ( (typeof(pParent.menuOffsetX) == 'number') ? pParent.menuOffsetX : ((typeof(pParent.defaultMenuOffsetX) == 'number') ? pParent.defaultMenuOffsetX : 0 ) ); pProp.menuOffsetY = (typeof(pProp.menuOffsetY) == 'number') ? pProp.menuOffsetY : ( (typeof(pParent.menuOffsetY) == 'number') ? pParent.menuOffsetY : ((typeof(pParent.defaultMenuOffsetY) == 'number') ? pParent.defaultMenuOffsetY : 0 ) ); return pProp; } function _checkLinkProperties(pLink, pParent) { if (!pParent) pParent = cs.pVar; if (!pLink.className) pLink.className = (pParent.menuClassName && pParent.menuClassName.length) ? pParent.menuClassName : ((pParent.defaultMenuClassName) ? pParent.defaultMenuClassName : ''); if (!pLink.href) pLink.href = ''; if (!pLink.target) pLink.target = ''; if (!pLink.title) pLink.title = ''; if (!pLink.innerHTML) pLink.innerHTML = ''; return pLink; } function getMenuPropertiesByRefId(pID, pMenu) { var ls = { obj: '', ok: 1 }; if (!pMenu) pMenu = cs.pVar.menu; if (!pID) ls.ok = 0; if (!pMenu || !pMenu.push) ls.ok = 0; if (ls.ok) { for (ls.i=0; ls.i<pMenu.length; ls.i++) if (pMenu[ls.i].refID == pID) { ls.obj = pMenu[ls.i]; break; } else if (pMenu[ls.i].menu) { ls.obj = getMenuPropertiesByRefId(pID, pMenu[ls.i].menu); if (ls.obj) break; } } return ls.obj; } function objLink(pHref, pInnerHTML, pTarget, pClassName) { var ls = { className: pClassName, innerHTML: pInnerHTML, href: pHref, target: pTarget }; return ls; } init(pVar); }
