/*hierMenus.js * by Peter Belesis. v4.0.1 010104 * Copyright (c) 2001 Peter Belesis. All Rights Reserved. * Originally published and documented at http://www.dhtmlab.com/ * You may use this code on a public Web site only if this entire * copyright notice appears unchanged and you publicly display * on the Web page a link to http://www.dhtmlab.com/. * * Contact pbel@meteor.com for all other uses. */ /*************************************************************************** BROWSER DETECTION ***************************************************************************/ HM_DOM = (document.getElementById) ? true : false; HM_IE = (document.all) ? true : false; HM_IE4 = HM_IE && !HM_DOM; HM_IE5 = HM_IE && HM_DOM; HM_Mac = (navigator.appVersion.indexOf("Mac") != -1); HM_IE5M = HM_IE5 && HM_Mac; HM_IEW = HM_IE && !HM_Mac; HM_IE4W = HM_IE4 && HM_IEW; HM_IE5W = HM_IE5 && HM_IEW; HM_NS = navigator.appName == ("Netscape"); HM_NS4 = (document.layers) ? true : false; HM_NS6 = navigator.vendor == ("Netscape6"); if(HM_IE5M) {HM_DOM = false;HM_IE4 = true} /*************************************************************************** GLOBAL PARAMETERS - optional - apply to all pages using menus - can be overridden by page-specific parameters ***************************************************************************/ HM_PG_MenuWidth = 180; HM_PG_FontFamily = "Arial,sans-serif"; HM_PG_FontSize = 8; HM_PG_FontBold = true; HM_PG_FontItalic = false; HM_PG_FontColor = "#808080"; HM_PG_FontColorOver = "#57a6fd"; HM_PG_BGColor = "#dcdcdc"; HM_PG_BGColorOver = "#dcdcdc"; HM_PG_ItemPadding = 2; HM_PG_BorderWidth = 1; HM_PG_BorderColor = "#808080"; HM_PG_BorderStyle = "solid"; HM_PG_SeparatorSize = 0; HM_PG_SeparatorColor = "black"; HM_PG_ImageSrc = "images/tri.gif"; HM_PG_ImageSize = 3; HM_PG_ImageHorizSpace = 5; HM_PG_ImageVertSpace = 4; HM_PG_KeepHilite = true; HM_PG_ClickStart = 0; HM_PG_ClickKill = false; HM_PG_ChildOverlap = 5; HM_PG_ChildOffset = -1; HM_PG_ChildPerCentOver = null; HM_PG_TopSecondsVisible = .5; HM_PG_StatusDisplayBuild = 0; HM_PG_StatusDisplayLink = 1; HM_PG_UponDisplay = null; HM_PG_UponHide = null; HM_PG_RightToLeft = false; /********************** PLEASE DO NOT MODIFY CODE BELOW ************************** ********************** UNLESS COMFORTABLE WITH SCRIPTING ************************* ****************** The menu parameters in the HM_a_Parameters array ************** ****************** can be changed. If you change them, then there is ************* ****************** no need to retain the Global Parameters above. ************* ****************** They may be deleted. ************/ /*************************************************************************** MENU PARAMETERS ***************************************************************************/ HM_MenuIDPrefix = "HM_Menu"; HM_ItemIDPrefix = "HM_Item"; HM_ArrayIDPrefix = "HM_Array"; HM_a_Parameters = [ ["MenuWidth", 150], ["FontFamily", "Arial,sans-serif"], ["FontSize", 10], ["FontBold", false], ["FontItalic", false], ["FontColor", "black"], ["FontColorOver", "white"], ["BGColor", "white"], ["BGColorOver", "black"], ["ItemPadding", 3], ["BorderWidth", 2], ["BorderColor", "red"], ["BorderStyle", "solid"], ["SeparatorSize", 1], ["SeparatorColor", "yellow"], ["ImageSrc", "tri.gif"], ["ImageSrcLeft", "triL.gif"], ["ImageSize", 5], ["ImageHorizSpace", 0], ["ImageVertSpace", 0], ["KeepHilite", false], ["ClickStart", false], ["ClickKill", true], ["ChildOverlap", 20], ["ChildOffset", 10], ["ChildPerCentOver", null], ["TopSecondsVisible", .5], ["StatusDisplayBuild", 1], ["StatusDisplayLink", 1], ["UponDisplay", null], ["UponHide", null], ["RightToLeft", false] ] /*************************************************************************** MAIN SCRIPT ***************************************************************************/ function HM_f_StringTrim(){ var TestString = this; var SpaceChar = " "; while (TestString.charAt(0) == SpaceChar) {TestString = TestString.substr(1)}; while (TestString.charAt(TestString.length-1) == SpaceChar) {TestString = TestString.substr(0,TestString.length-1)}; return TestString.toString(); } String.prototype.trim = HM_f_StringTrim; function HM_f_GetTestString(teststring){ var CommaIndex = teststring.indexOf(","); if(CommaIndex!=-1) teststring = teststring.substr(0,CommaIndex); var DotIndex = teststring.indexOf("."); if(DotIndex!=-1) { DotIndexLast = teststring.lastIndexOf("."); if(DotIndex == DotIndexLast)teststring = teststring.substr(0,DotIndex); } // 4.0.1 // omit slashes from test strings to allow path specifiers for images var SlashIndex = teststring.indexOf("/"); if(SlashIndex!=-1) { SlashIndexLast = teststring.lastIndexOf("/"); teststring = teststring.substr(SlashIndexLast + 1); } // 4.0.1 // omit spaces from test strings to allow for font names with spaces var SpaceIndex = teststring.indexOf(" "); if(SpaceIndex!=-1) { SpaceIndexLast = teststring.lastIndexOf(" "); teststring = teststring.substr(SpaceIndexLast + 1); } return teststring; } function HM_f_AssignParameters(paramname,defaultvalue){ var FullParamName = "HM_" + paramname; if (typeof eval("window.HM_PG_" + paramname) == "undefined") { if (typeof eval("window.HM_GL_" + paramname) == "undefined") { eval(FullParamName + "= defaultvalue"); } else { eval(FullParamName + "= HM_GL_" + paramname); } } else { eval(FullParamName + "= HM_PG_" + paramname); } var TestString = eval(FullParamName); if(eval("typeof(TestString)") == "string") { TestString = TestString.trim(); if(TestString.length == 0) { eval(FullParamName + "= null"); return; } if(TestString.charAt(0)=="#")return; else TestString = HM_f_GetTestString(TestString); } if (eval("typeof(" + TestString +")") != 'undefined') { eval(FullParamName + "= eval("+ FullParamName +")"); } } for (i=0;i 1)) } /* Check for existence of array specifying which menus should be built (HM_a_TreesToBuild) If array is not defined, then use all existing menu arrays to build menus, as in Version 3. Unlike Version 3, menu arrays do not have to be consecutively numbered. Create an empty HM_a_TreesToBuild array. Cycle through array names HM_Array1 to HM_Array100. Any arrays found are added to HM_a_TreesToBuild. */ if(!window.HM_a_TreesToBuild) { HM_a_TreesToBuild = []; for(i=1; i<100; i++){ if(HM_f_ValidateArray(HM_ArrayIDPrefix + i)) HM_a_TreesToBuild[HM_a_TreesToBuild.length] = i; } } HM_CurrentArray = null; HM_CurrentTree = null; HM_CurrentMenu = null; HM_a_TopMenus = []; HM_ZIndex = 5000; HM_AreLoaded = false; HM_AreCreated = false; HM_BeingCreated = false; HM_UserOverMenu = false; HM_HideAllTimer = null; HM_TotalTrees = 0; function HM_f_Initialize() { if(HM_AreCreated) { // 4.0.1 // fixed typo [totalTrees should have been HM_TotalTrees] // for(var i=0; i" + TempString + ""; var TempStringOver = TempString.fontcolor(HM_CurrentTree.FontColorOver); TempString = TempString.fontcolor(HM_CurrentTree.FontColor); return [TempString,TempStringOver]; } function HM_f_GetItemLyrStr(itemid,htmlstrings,hasmore){ var TempString = "" + "" + htmlstrings[0] +"" + "" + htmlstrings[1] +"" + "" if(hasmore && HM_CurrentMenu.showImage) TempString += ""; TempString += ""; return TempString; } function HM_f_GetItemDivStr(itemid,disptext,hasmore){ var WidthValue = HM_CurrentMenu.isHorizontal ? (ItemElement.isLastItem) ? (HM_CurrentTree.MenuWidth - HM_BorderWidth - HM_SeparatorSize) : (HM_CurrentTree.MenuWidth - HM_BorderWidth) : HM_CurrentTree.ItemWidth; var TempString = "
"; if(HM_CurrentMenu.showImage) { var FullPadding = (HM_ItemPadding*2) + HM_ImageSize + HM_ImageHorizSpace; } if(hasmore && HM_CurrentMenu.showImage) { var ImgPosition = HM_RightToLeft ? "absolute;" : "relative;"; var ImgSrc = HM_RightToLeft ? HM_ImageSrcLeft : HM_ImageSrc; var ImgHSpace = (HM_RightToLeft || HM_IE5M) ? 0 : HM_ItemPadding; var ImgStyle = HM_RightToLeft ? ("left:"+ (HM_ItemPadding + HM_ImageHorizSpace) + "px;top:"+ (HM_ItemPadding + HM_ImageVertSpace) + "px;") : ("float:right;margin-right:"+ (HM_IE5M ? -(HM_ImageSize + HM_ItemPadding) : (-FullPadding)) +"px;margin-top:"+ HM_ImageVertSpace + "px;width:"+ HM_ImageSize + "px;"); var ImgString = ""; TempString += ImgString; } TempString += disptext + "
"; return TempString; } function HM_f_SetItemProperties(itemid,itemidsuffix) { this.tree = HM_CurrentTree; this.itemsetup = HM_f_ItemSetup; this.index = HM_CurrentMenu.itemCount - 1; this.tree = HM_CurrentTree; this.isLastItem = (HM_CurrentMenu.itemCount == HM_CurrentMenu.maxItems); this.array = HM_CurrentMenu.array[HM_CurrentMenu.itemCount]; this.dispText = this.array[0]; this.linkText = this.array[1]; this.hasRollover = this.array[2]; this.permHilite = (!this.hasRollover && this.array[3]); this.hasMore = this.array[4]; this.childID = this.hasMore ? (HM_MenuIDPrefix + itemidsuffix) : null; this.child = null; this.onmouseover = HM_f_ItemOver; this.onmouseout = HM_f_ItemOut; if(HM_NS4) { var HtmlStrings = HM_f_GetItemHtmlStr(this.dispText); this.htmStr = HtmlStrings[0]; this.htmStrOver = HtmlStrings[1]; this.itemStr = HM_f_GetItemLyrStr(itemid,HtmlStrings,this.hasMore); } else { this.setItemStyle = HM_f_SetItemStyle; if(HM_IE4) { this.itemStr = HM_f_GetItemDivStr(itemid,this.dispText,this.hasMore); } } } function HM_f_Make4ItemElement(menucount) { var ItemIDSuffix = menucount + "_" + HM_CurrentMenu.itemCount; var LayerID = HM_ItemIDPrefix + ItemIDSuffix; var ObjectID = LayerID + "Obj"; eval(ObjectID + " = new Object()"); ItemElement = eval(ObjectID); ItemElement.setItemProperties = HM_f_SetItemProperties; ItemElement.setItemProperties(LayerID,ItemIDSuffix); return ItemElement; } function HM_f_MakeElement(menuid) { var MenuObject; if (HM_DOM) { MenuObject = document.createElement("DIV"); with(MenuObject){ id = menuid; with(style) { position = "absolute"; visibility = "hidden"; width = (HM_NS6 ? HM_CurrentTree.ItemWidth : HM_CurrentTree.MenuWidth) + "px"; } } document.body.appendChild(MenuObject); } else { var LayerID = menuid; var ObjectID = LayerID + "Obj"; eval(ObjectID + " = new Object()"); MenuObject = eval(ObjectID); } return MenuObject; } function HM_f_MakeMenu(menucount) { if(!HM_f_ValidateArray(HM_ArrayIDPrefix + menucount)) return false; HM_CurrentArray = eval(HM_ArrayIDPrefix + menucount); NewMenu = HM_f_MakeElement(HM_MenuIDPrefix + menucount); NewMenu.array = HM_CurrentArray; NewMenu.tree = HM_CurrentTree; if(HM_CurrentMenu) { NewMenu.parentMenu = HM_CurrentMenu; NewMenu.parentItem = HM_CurrentMenu.itemElement; NewMenu.parentItem.child = NewMenu; NewMenu.hasParent = true; NewMenu.isHorizontal = HM_CurrentTree.TreeIsHorizontal; NewMenu.showImage = HM_CurrentTree.TreeImageShow; } else { NewMenu.isHorizontal = HM_CurrentTree.TopIsHorizontal; NewMenu.showImage = HM_CurrentTree.TopImageShow; } NewMenu.itemCount = 0; NewMenu.maxItems = NewMenu.array.length - 1; NewMenu.zIndex = ++HM_ZIndex; NewMenu.showIt = HM_f_ShowIt; NewMenu.keepInWindow = HM_f_KeepInWindow; NewMenu.onmouseover = HM_f_MenuOver; NewMenu.onmouseout = HM_f_MenuOut; NewMenu.hideTree = HM_f_HideTree NewMenu.hideParents = HM_f_HideParents; NewMenu.hideChildren = HM_f_HideChildren; NewMenu.hideTop = HM_f_HideTop; NewMenu.hideSelf = HM_f_HideSelf; NewMenu.hasChildVisible = false; NewMenu.isOn = false; NewMenu.hideTimer = null; NewMenu.currentItem = null; NewMenu.setMenuStyle = HM_f_SetMenuStyle; if(HM_IE) NewMenu.onselectstart = HM_f_CancelSelect; if(!HM_NS4) NewMenu.moveTo = HM_f_MoveTo; if(HM_NS4) NewMenu.htmlString = ""; if(HM_IE4) NewMenu.htmlString = ""); menuLyr = document.all[HM_MenuIDPrefix + menucount]; menuLyr.propertyTransfer = propertyTransfer; menuLyr.propertyTransfer(); NewMenu = menuLyr; NewMenu.setMenuStyle(); if(!HM_IE5M) NewMenu.childNodes = NewMenu.children; NewMenu.lastItem = NewMenu.childNodes[NewMenu.childNodes.length-1]; for(var i=0; i0 ? NewMenu.childNodes[i-1] : null; it.propertyTransfer = propertyTransfer; it.propertyTransfer(); it.itemsetup(i+1); } } if(HM_NS4) { document.write(NewMenu.htmlString + ""); menuLyr = document.layers[document.layers.length-1]; menuLyr.propertyTransfer(); eval(menuLyr.id + "= menuLyr"); NewMenu = menuLyr; NewMenu.childNodes = NewMenu.document.layers; NewMenu.lastItem = NewMenu.childNodes[NewMenu.childNodes.length-1]; for(var i=0; i3) { this.imgLyr = this.document.layers[3]; with(this.imgLyr) { moveBelow(this.txtLyrOff); left = (HM_RightToLeft) ? 0 : this.tree.ItemWidth - (HM_ItemPadding * 2) - HM_ImageSize - HM_ImageHorizSpace; top = HM_ImageVertSpace; } } this.fullClip = this.txtLyrOff.document.height + (HM_ItemPadding * 2); if(this.menu.isHorizontal) { if(this.index) this.fullClip = Math.max(this.siblingBelow.fullClip,this.fullClip); } this.clip.height = this.fullClip; } } function HM_f_PopUp(menuname,e){ if(HM_IE) e = event; if (!HM_AreLoaded) return; menuname = menuname.replace("elMenu",HM_MenuIDPrefix); HM_CurrentMenu = (HM_NS4) ? document.layers[menuname] : (HM_DOM) ? document.getElementById(menuname) : document.all(menuname); if(!HM_CurrentMenu)return; var LinkElement = (HM_IE) ? e.srcElement : e.target; if (HM_ClickStart) LinkElement.onclick = HM_f_PopMenu; else HM_f_PopMenu(e); } function HM_f_PopMenu(e){ if(HM_IE) e = event; if (!HM_AreLoaded || !HM_AreCreated) return true; if (HM_ClickStart && e.type != "click") return true; HM_f_HideAll(); HM_CurrentMenu.hasParent = false; HM_CurrentMenu.tree.startChild = HM_CurrentMenu; var EventX = (HM_IE) ? (e.clientX + document.body.scrollLeft) : e.pageX; var EventY = (HM_IE) ? (e.clientY + document.body.scrollTop) : e.pageY; HM_CurrentMenu.xPos = (HM_CurrentMenu.tree.MenuLeft) ? HM_CurrentMenu.tree.MenuLeft : EventX; HM_CurrentMenu.yPos = (HM_CurrentMenu.tree.MenuTop) ? HM_CurrentMenu.tree.MenuTop : EventY; HM_CurrentMenu.keepInWindow(); HM_CurrentMenu.moveTo(HM_CurrentMenu.xPos,HM_CurrentMenu.yPos); HM_CurrentMenu.isOn = true; HM_CurrentMenu.showIt(true); return false; } function HM_f_MenuOver(e) { if(!this.tree.startChild){this.tree.startChild = this} if(this.tree.startChild == this) HM_f_HideAll(this) this.isOn = true; HM_UserOverMenu = true; HM_CurrentMenu = this; if (this.hideTimer) clearTimeout(this.hideTimer); } function HM_f_MenuOut() { if(HM_IE5 && event.srcElement.contains(event.toElement)) return; this.isOn = false; HM_UserOverMenu = false; if(HM_StatusDisplayLink) status = ""; if(!HM_ClickKill) HM_HideAllTimer = setTimeout("HM_CurrentMenu.hideTree()",10); } function HM_f_ItemOver(){ if (HM_KeepHilite) { if (this.menu.currentItem && this.menu.currentItem != this && this.menu.currentItem.hasRollover) { if (HM_NS4) { with(this.menu.currentItem){ bgColor = this.tree.BGColor; txtLyrOff.visibility = "inherit"; txtLyrOn.visibility = "hide"; } } else { with(this.menu.currentItem.style){ backgroundColor = this.tree.BGColor; color = this.tree.FontColor } } } } if(HM_IE5 && event.srcElement.tagName == "IMG") return; if(this.hasRollover) { if (HM_NS4) { this.bgColor = this.tree.BGColorOver; this.txtLyrOff.visibility = "hide"; this.txtLyrOn.visibility = "inherit"; } else { this.style.backgroundColor = this.tree.BGColorOver; this.style.color = this.tree.FontColorOver; } } if(HM_StatusDisplayLink) status = this.linkText; this.menu.currentItem = this; if (this.menu.hasChildVisible && (this.menu.visibleChild != this.child)) { this.menu.hideChildren(this); } if (this.hasMore) { if (this.tree.PositionUnder && (this.menu == this.tree.treeParent)) { if (HM_NS4) { this.child.xPos = this.pageX + this.clip.left - HM_BorderWidth; this.child.yPos = this.menu.top + this.menu.clip.height - HM_BorderWidth; } else { this.child.xPos = parseInt(this.menu.style.left) + parseInt(this.style.left); this.child.yPos = parseInt(this.menu.style.top) + this.menu.offsetHeight - (HM_BorderWidth); } } else { if(HM_NS4) { this.oL = this.pageX + this.clip.left; this.child.offsetWidth = this.child.clip.width; this.oT = this.pageY + this.clip.top - HM_BorderWidth; } else { if(HM_IE5M) { this.oL = parseInt(this.menu.style.left) - HM_BorderWidth; this.oL += this.offsetLeft; this.oT = parseInt(this.menu.style.top) -HM_BorderWidth; this.oT += this.offsetTop; } else { this.oL = (HM_IE) ? parseInt(this.menu.style.left) : -HM_BorderWidth; this.oL += this.offsetLeft; this.oT = (HM_IE) ? parseInt(this.menu.style.top) : -HM_BorderWidth; this.oT += this.offsetTop; } } if(HM_RightToLeft) { this.child.xPos = this.oL + (this.tree.HorizOffsetRight - this.child.offsetWidth); } else { this.child.xPos = this.oL + this.tree.HorizOffsetLeft; } this.child.yPos = this.oT + HM_ChildOffset + HM_BorderWidth; } if(!this.tree.PositionUnder) this.child.keepInWindow(); this.child.moveTo(this.child.xPos,this.child.yPos); this.menu.hasChildVisible = true; this.menu.visibleChild = this.child; this.child.showIt(true); } } function HM_f_ItemOut() { if (HM_IE5 && (event.srcElement.contains(event.toElement) || (event.fromElement.tagName=="IMG" && event.toElement.contains(event.fromElement)))) return; if ( (!HM_KeepHilite || ((this.tree.TopIsPermanent && (this.tree.treeParent==this)) && !this.menu.hasChildVisible)) && this.hasRollover) { if(HM_NS4) { // 4.0.1 // added "this" object, inadvertently omitted. // Thanks to Armand Niculescu and Waymon Campbell for the heads-up. with(this){ bgColor = this.tree.BGColor; txtLyrOff.visibility = "inherit"; txtLyrOn.visibility = "hide"; } } else { with(this.style) { backgroundColor = this.tree.BGColor; color = this.tree.FontColor } } } if(HM_NS4 && !HM_ClickKill && !HM_UserOverMenu) { HM_HideAllTimer = setTimeout("HM_CurrentMenu.hideTree()",10); } } function HM_f_MoveTo(xPos,yPos) { this.style.left = xPos + "px"; this.style.top = yPos + "px"; } function HM_f_ShowIt(on) { if (!(this.tree.TopIsPermanent && (this.tree.treeParent==this))) { if(!this.hasParent || (this.hasParent && this.tree.TopIsPermanent)) { var IsVisible = (HM_NS4) ? this.visibility == "show" : this.style.visibility == "visible"; if ((on && !IsVisible) || (!on && IsVisible)) eval(on ? this.tree.UponDisplay : this.tree.UponHide) } if(HM_NS4) {this.visibility = (on) ? "show" : "hide"} else {this.style.visibility = (on) ? "visible" : "hidden"} } if (HM_KeepHilite && this.currentItem && this.currentItem.hasRollover) { if(HM_NS4) { with(this.currentItem){ bgColor = this.tree.BGColor; txtLyrOff.visibility = "inherit"; txtLyrOn.visibility = "hide"; } } else { with(this.currentItem.style){ backgroundColor = this.tree.BGColor; color = this.tree.FontColor; } } } this.currentItem = null; } function HM_f_KeepInWindow() { var ExtraSpace = 10; var WindowLeftEdge = (HM_IE) ? document.body.scrollLeft : window.pageXOffset; var WindowTopEdge = (HM_IE) ? document.body.scrollTop : window.pageYOffset; var WindowWidth = (HM_IE) ? document.body.clientWidth : window.innerWidth; var WindowHeight = (HM_IE) ? document.body.clientHeight : window.innerHeight; var WindowRightEdge = (WindowLeftEdge + WindowWidth) - ExtraSpace; var WindowBottomEdge = (WindowTopEdge + WindowHeight) - ExtraSpace; var MenuLeftEdge = this.xPos; var MenuRightEdge = MenuLeftEdge + ((HM_NS4) ? this.clip.width : this.offsetWidth); var MenuBottomEdge = this.yPos + ((HM_NS4) ? this.clip.height : this.offsetHeight); if (this.hasParent) { var ParentLeftEdge = (HM_NS4) ? this.parentMenu.pageX : parseInt(this.parentMenu.style.left); if(HM_NS4) this.offsetWidth = this.clip.width; } if (MenuRightEdge > WindowRightEdge) { if (this.hasParent) { this.xPos = ParentLeftEdge + this.tree.HorizOffsetRight - this.offsetWidth; } else { dif = MenuRightEdge - WindowRightEdge; this.xPos -= dif; } } if (MenuBottomEdge > WindowBottomEdge) { dif = MenuBottomEdge - WindowBottomEdge; this.yPos -= dif; } if (MenuLeftEdge < WindowLeftEdge) { if (this.hasParent) { this.xPos = ParentLeftEdge + this.tree.HorizOffsetLeft; } else {this.xPos = 5} } } function HM_f_LinkIt() { HM_f_HideAll(); if (this.linkText.indexOf("javascript")!=-1) eval(this.linkText) else location.href = this.linkText; } function HM_f_PopDown(menuname){ if (!HM_AreLoaded || !HM_AreCreated) return; menuname = menuname.replace("elMenu",HM_MenuIDPrefix); var MenuToHide = (HM_NS4) ? document.layers[menuname] : (HM_DOM) ? document.getElementById(menuname) : document.all(menuname); if(!MenuToHide)return; MenuToHide.isOn = false; if (!HM_ClickKill) MenuToHide.hideTop(); } function HM_f_HideAll(callingmenu) { for(var i=0; i