//** All Levels Navigational Menu- (c) Dynamic Drive DHTML code library: http://www.dynamicdrive.com //** Script Download/ instructions page: http://www.dynamicdrive.com/dynamicindex1/ddlevelsmenu/ //** Usage Terms: http://www.dynamicdrive.com/notice.htm //** Current version: 2.2 See changelog.txt for details /* deleting - jquery in use... if (typeof dd_domreadycheck=="undefined") //global variable to detect if DOM is ready var dd_domreadycheck=false; */ var moveLeft={}; var moveUp={}; var ddlevelsmenu={ enableshim: false,//true, //enable IFRAME shim to prevent drop down menus from being hidden below SELECT or FLASH elements? (tip: disable if not in use, for efficiency) arrowpointers:{ //downarrow: ["ddlevelsfiles/arrow-down.gif", 11,7], //[path_to_down_arrow, arrowwidth, arrowheight] downarrow: ["ddlevelsfiles/spacer.gif", 0,0], rightarrow: ["ddlevelsfiles/spacer.gif", 0,0], //rightarrow: ["ddlevelsfiles/arrow-right.gif", 12,12], //[path_to_right_arrow, arrowwidth, arrowheight] //showarrow: {toplevel: true, sublevel: true} //Show arrow images on top level items and sub level items, respectively? showarrow: {toplevel: false, sublevel: false} }, hideinterval: 500, //delay in milliseconds before entire menu disappears onmouseout. effects: {enableswipe: false, enablefade: false, duration: 300}, //effects: {enableswipe: true, enablefade: true, duration: 200}, 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 lastactivesubul: {}, //object object containing info for last mouse out menu item's UL topitemsindex: -1, ulindex: -1, hidetimers: {},//{}, //object array timer shimadded: false, nonFF: !/Firefox[\/\s](\d+\.\d+)/.test(navigator.userAgent), //detect non FF browsers getoffset:function(what, offsettype){ return (what.offsetParent)? what[offsettype]+this.getoffset(what.offsetParent, offsettype) : what[offsettype] }, getoffsetof:function(el,mainmenuid){ var gpos = jQuery(el).position(); //el._offsets={left:this.getoffset(el, "offsetLeft")+parseInt(moveLeft[mainmenuid]), top:this.getoffset(el, "offsetTop")+parseInt(moveUp[mainmenuid])} el._offsets={left:gpos.left+parseInt(moveLeft[mainmenuid]), top:gpos.top+parseInt(moveUp[mainmenuid])} }, getwindowsize:function(){ //this.docwidth=window.innerWidth? window.innerWidth-10 : this.standardbody.clientWidth-10; //this.docheight=window.innerHeight? window.innerHeight-15 : this.standardbody.clientHeight-18 this.docwidth=jQuery(window).width(); this.docheight=jQuery(window).height(); }, 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 }, /* ======================================================================= BUILD a SUBMENU - this was called when page was loaded, it'll build a submenu struture and prepare it to show/hide ======================================================================= */ buildmenu:function(mainmenuid, realpageid, 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){ ddlevelsmenu.hidemenu(ddlevelsmenu.subuls[this._master][parseInt(this._pos)]) }, "click") } this.subuls[mainmenuid][submenupos]=submenu; //alert(realpageid+', '+header) //rel="dropmenu_1_2">< /* 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){ddlevelsmenu.hidemenu(ddlevelsmenu.subuls[this._master][parseInt(this._pos)])}, "click"); } this.subuls[mainmenuid][submenupos]=submenu;*/ //alert(jQuery(header).height()) // get positioning... /* var hpos=jQuery(header).height(); var wpos=jQuery(header).width(); var shpos=jQuery(submenu).height(); var swpos=jQuery(submenu).width(); header._dimensions={w:wpos, h:hpos, submenuw:swpos, submenuh:shpos}; //header._dimensions={w:header.offsetWidth, h:header.offsetHeight, submenuw:submenu.offsetWidth, submenuh:submenu.offsetHeight}; //alert('buildmenu: '+header._dimensions.w+'('+wpos+'), '+header._dimensions.h+'('+hpos+'), '+header._dimensions.submenuw+', '+header._dimensions.submenuh); */ //alert(header+', '+"a[rel=dropmenu_"+realpageid+"] - "+jQuery("a[rel=dropmenu_"+realpageid+"]").height()+"..."+jQuery(header).width()+jQuery(submenu).height()+"..."+jQuery(submenu).width()) header._dimensions={w:jQuery(header).width(), h:jQuery(header).height(), submenuw:jQuery(submenu).width(), submenuh:jQuery(submenu).height()}; /* if(header._dimensions.h==0){ if(jQuery(header).attr('id')==undefined || jQuery(header).attr('id')==''){ var newId = Math.random(); newId = realpageid+Math.ceil((newId * 100) -1); jQuery(header).attr('id',newId); } else var newId=jQuery(header).attr('id'); alert(newId+', '+jQuery(header).attr('id')); alert('wrong, IE?'+document.getElementById(newId).offsetHeight+' , '+jQuery("#"+newId).height()) // values are WRONG. Probably older IE, which for some reason can't calculate height? header._dimensions={w:header.offsetWidth, h:header.offsetHeight, submenuw:submenu.offsetWidth, submenuh:submenu.offsetHeight}; }*/ // do some additional positioning (need to investigate) this.getoffsetof(header); // apply style to submenu jQuery(submenu).css({left:0,top:0,visibility:"hidden"}); // on MOUSE-OVER... this.addEvent(header, function(e){ if (!ddlevelsmenu.isContained(this, e)){ var submenu=ddlevelsmenu.subuls[this._master][parseInt(this._pos)]; if (this._istoplevel){ ddlevelsmenu.css(this, "selected", "add"); clearTimeout(ddlevelsmenu.hidetimers[this._master][this._pos]) } //moveLeft[mainmenuid]=mleft; //moveUp[mainmenuid]=mup; //alert(moveLeft[mainmenuid]) // positioning... ddlevelsmenu.getoffsetof(header,mainmenuid); var scrollX=window.pageXOffset? window.pageXOffset : ddlevelsmenu.standardbody.scrollLeft; var scrollY=window.pageYOffset? window.pageYOffset : ddlevelsmenu.standardbody.scrollTop; var submenurightedge=jQuery(this).offset().left + this._dimensions.submenuw + (this._istoplevel && dir=="topbar"? 0 : this._dimensions.w); var submenubottomedge=jQuery(this).offset().top + this._dimensions.submenuh; //Sub menu starting left position var menuleft=(this._istoplevel? jQuery(this).offset().left + (dir=="sidebar"? this._dimensions.w : 0) : this._dimensions.w); if (submenurightedge-scrollX>ddlevelsmenu.docwidth){ menuleft+= -this._dimensions.submenuw + (this._istoplevel && dir=="topbar" ? this._dimensions.w : -this._dimensions.w); } //Sub menu starting top position var menutop=(this._istoplevel? jQuery(this).offset().top + (dir=="sidebar"? 0 : this._dimensions.h) : jQuery(this).position().top); if (submenubottomedge-scrollY>ddlevelsmenu.docheight){ //no room downwards? if (this._dimensions.submenuh