//** All Levels Navigational Menu- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com //** Script Download/ instructions page: http://www.dynamicdrive.com/dynamicindex1/ddlevelsmenuadmin/ //** Usage Terms: http://www.dynamicdrive.com/notice.htm //** July 7th, 08'- Creation Date //** July 16th, 08'- Updated to v 1.3: //1) Adds "Side Bar" orientation option. //2) Drop Down Menus now auto adjust their positioning if too close to either right or bottom window edges. //3) Enhanced IFRAME shim "coverage" on the page. //** July 19th, 08'- Updated to v 1.31: Drop down menu now positions at top of window edge if there's neither room downwards or upwards to settle. //** Aug 13th, 08'- v1.32: Moved "rel" attribute from menu's
  • elements to inner , for validation reasons //** Sept 10th, 08'- Updated to v 1.4: //1) Added optional "sliding" animation when sub menus are revealed. //2) Arrow images now dynamically positioned, instead of relying on CSS's "right" property var ddlevelsmenuadmin = { downarrowpointer_adminmenu: ["ddlevelsfiles/arrow-down.gif", 11,7], //path to "down arrow" image that gets added to main menu items (last 2 parameters should be width/height of img) rightarrowpointer_admin: ["ddlevelsfiles/arrow-right.gif", 12,12], //path to "right arrow" image that gets added to LI elements within drop down menu containing additional menus hideinterval: 0, //delay in milliseconds before sub menu(s) disappears onmouseout. revealanimate: false, //enable sliding animation when revealing sub menus? (true/false) httpsiframesrc: "blank.htm", //If menu is run on a secure (https) page, the IFRAME shim feature used by the script should point to an *blank* page *within* the secure area to prevent an IE security prompt. Specify full URL to that page on your server (leave as is if not applicable). ///No need to edit beyond here//////////////////// topmenuids: [], //array containing ids of all the primary menus on the page topitems: {}, //object array containing all top menu item links subuls: {}, //object array containing all ULs topitemsindex: -1, ulindex: -1, hidetimers: {}, //object array timer shimadded: false, isff3orabove: /Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent) && RegExp.$1>=3, //detect FF3 or above getoffset:function(what, offsettype){ var offset = 0; p = what.offsetParent; while (p && p != this.standardbody) { offset += offsettype == "offsetTop" ? p.offsetTop : p.offsetLeft; p = p.offsetParent; } return (what.offsetParent)? what[offsettype] + this.getoffset(what.offsetParent, offsettype) : what[offsettype] }, getoffsetof:function(el){ el._offsets={left:this.getoffset(el, "offsetLeft"), top:this.getoffset(el, "offsetTop")} }, getwindowsize:function(){ this.docwidth=window.innerWidth? window.innerWidth-10 : this.standardbody.clientWidth-10 this.docheight=window.innerHeight? window.innerHeight-15 : this.standardbody.clientHeight-18 }, gettopitemsdimensions:function(){ for (var m=0; m0){ this.shimmy.topshim.style.left=scrollX+"px" this.shimmy.topshim.style.top=scrollY+"px" this.shimmy.topshim.style.width="99%" this.shimmy.topshim.style.height=topgap+"px" //distance from top window edge to top of menu item } if (bottomgap>0){ this.shimmy.bottomshim.style.left=scrollX+"px" this.shimmy.bottomshim.style.top=header._offsets.top + header._dimensions.h +"px" this.shimmy.bottomshim.style.width="99%" this.shimmy.bottomshim.style.height=bottomgap+"px" //distance from bottom of menu item to bottom window edge } } }, hideshim:function(){ this.shimmy.topshim.style.width=this.shimmy.bottomshim.style.width=0 this.shimmy.topshim.style.height=this.shimmy.bottomshim.style.height=0 }, buildmenu:function(mainmenuid, header, submenu, submenupos, istoplevel, dir){ header._master=mainmenuid //Indicate which top menu this header is associated with header._pos=submenupos //Indicate pos of sub menu this header is associated with header._istoplevel=istoplevel if (istoplevel){ this.addEvent(header, function(e){ ddlevelsmenuadmin.hidemenu(ddlevelsmenuadmin.subuls[this._master][parseInt(this._pos)]) }, "click") } this.subuls[mainmenuid][submenupos]=submenu header._dimensions={w:header.offsetWidth, h:header.offsetHeight, submenuw:submenu.offsetWidth, submenuh:submenu.offsetHeight} this.getoffsetof(header) submenu.style.left=0 submenu.style.top=0 submenu.style.visibility="hidden" this.addEvent(header, function(e){ //mouseover event if (!ddlevelsmenuadmin.isContained(this, e)){ if (typeof ddlevelsmenuadmin.hidetimers[this._master][parseInt(this._pos)]!="undefined") clearTimeout(ddlevelsmenuadmin.hidetimers[this._master][parseInt(this._pos)]) if (this._istoplevel) ddlevelsmenuadmin.css(this, "selected", "add") var submenu=ddlevelsmenuadmin.subuls[this._master][parseInt(this._pos)] ddlevelsmenuadmin.getoffsetof(header) var scrollX=window.pageXOffset? window.pageXOffset : ddlevelsmenuadmin.standardbody.scrollLeft var scrollY=window.pageYOffset? window.pageYOffset : ddlevelsmenuadmin.standardbody.scrollTop p = submenu.parentNode; scr = 0; while (p && p.nodeName.toLowerCase() != "body") { scr += p.scrollTop; p = p.parentNode; } p = submenu.offsetParent; var off = 0; while (p && p.nodeName.toLowerCase() != "body") { off += p.offsetTop; p = p.offsetParent; } var submenurightedge=this._offsets.left + this._dimensions.submenuw + (this._istoplevel && dir=="topbar"? 0 : this._dimensions.w) var submenubottomedge=this._offsets.top + this._dimensions.submenuh //Sub menu starting left position var menuleft=(this._istoplevel? this._offsets.left + (dir=="sidebar"? this._dimensions.w : 0) : this._dimensions.w) if (submenurightedge-scrollX>ddlevelsmenuadmin.docwidth){ menuleft+= -this._dimensions.submenuw + (this._istoplevel && dir=="topbar" ? this._dimensions.w : -this._dimensions.w) } //Sub menu starting top position var menutop=(this._istoplevel? this._offsets.top + (dir=="sidebar"? 0 : this._dimensions.h) : this.offsetTop) //if (document.all) menutop -= off; try { if (parent.top.JAVASCRIPTS) { menutop--; menuleft--; } } catch (e) {} //if (!document.all) menutop -= scr; submenu.style.left = menuleft + "px" if (submenubottomedge-scrollY>ddlevelsmenuadmin.docheight){ //no room downwards? if (this._dimensions.submenuh