// global menu state var menuReady = false; var basePageUrl = ""; var adjustBottom = false; if (typeof nibco_base_page_url != "undefined") { basePageUrl = nibco_base_page_url; adjustBottom = true; } if (navigator.product == "Gecko") { adjustBottom = true; } // specifications for menu contents and menubar image associations var menus = new Array(); menus[0] = {mBarImgId:"menu_products_services", menuItems:[ {text:"New Products", href:"/cms.do?id=16"}, {text:"NIBCO® DURA-PEX® Piping", href:"/cms.do?id=2&pId=210"}, {text:"Chemtrol\u00AE", href:"/cms.do?id=2&pId=1"}, {text:"Fire Protection Products", href:"/cms.do?id=2&pId=306"}, {text:"Fittings", href:"/cms.do?id=2&pId=46"}, {text:"Lead-Free Products", href:"/cms.do?id=2&pId=344"}, {text:"NIBCO® Press System®", href:"/cms.do?id=2&pId=231"}, {text:"TOLCO®", href:"/cms.do?id=2&pId=17"}, {text:"Valves & Actuation", href:"/cms.do?id=2&pId=104"}, {text:"Specification Services", href:"/cms.do?id=9"}, {text:"Technical Library", href:"/cms.do?id=10"} ], elemId:"" }; menus[1] = {mBarImgId:"menu_b_to_b", menuItems:[ {text:"NIBCOpartner.com", href:"/cms.do?id=180"}, {text:"Electronic Data Interchange (EDI)", href:"/cms.do?id=182"}, {text:"Vendor Managed Inventory (VMI)", href:"/cms.do?id=184"} ], elemId:"" }; menus[2] = {mBarImgId:"menu_about", menuItems:[ {text:"2nd Century of Leadership", href:"/cms.do?id=167"}, {text:"Global Offices", href:"/cms.do?id=78"}, {text:"Manufacturing and Distribution Centers", href:"/cms.do?id=124"}, {text:"Careers", href:"/cms.do?id=126"}, {text:"NIBCO in the Community", href:"/cms.do?id=29"}, {text:"Contact Us", href:"/contact/index.do"}, {text:"FAQs", href:"/cms.do?id=39"} ], elemId:"" }; menus[3] = {mBarImgId:"menu_industry", menuItems:[ {text:"Industry Organizations", href:"/cms.do?id=113"}, {text:"Standards and Codes", href:"/cms.do?id=116"}, {text:"Reference Sites", href:"/cms.do?id=120"}, {text:"Trade Publications", href:"/cms.do?id=122"} ], elemId:"" }; menus[4] = {mBarImgId:"menu_news", menuItems:[ {text:"Press Releases", href:"/cms.do?id=8"}, {text:"Reporter Resource", href:"/cms.do?id=17"}, {text:"Trade Shows and Events", href:"/cms.do?id=15"} ], elemId:"" }; function getElementStyle(elem, IEStyleProp, CSSStyleProp) { if (elem.currentStyle) { return elem.currentStyle[IEStyleProp]; } else if (window.getComputedStyle) { var compStyle = window.getComputedStyle(elem, ""); return compStyle.getPropertyValue(CSSStyleProp); } return ""; } // carry over some critical menu style sheet attribute values var CSSRuleValues = {menuItemHeight:"20px", menuItemLineHeight:"1.5em", menuWrapperBorderWidth:"1px", menuWrapperPadding:"3px", defaultBodyFontSize:"10px" }; // create hash table-like lookup for menu objects with id string indexes function makeHashes() { for (var i = 0; i < menus.length; i++) { menus[menus[i].elemId] = menus[i]; menus[menus[i].mBarImgId] = menus[i]; } } // assign menu label image event handlers function assignLabelEvents() { var elem; for (var i = 0; i < menus.length; i++) { elem = document.getElementById(menus[i].mBarImgId); elem.onmouseover = swap; elem.onmouseout = swap; } } // invoked from init(), generates the menu div elements and their contents. // all this action is invisible to user during construction function makeMenus() { var menuDiv, menuItem, itemLink, mbarImg, textNode, offsetLeft, offsetTop; // determine key adjustment factors for the total height of menu divs var menuItemH = 0; var bodyFontSize = parseInt(getElementStyle(document.body, "fontSize", "font-size")); // test to see if browser's font size has been adjusted by the user // and that the new size registers as an applied style property if (bodyFontSize == parseInt(CSSRuleValues.defaultBodyFontSize)) { menuItemH = (parseFloat(CSSRuleValues.menuItemHeight)); } else { // works nicely in Netscape 7 menuItemH = parseInt(parseFloat(CSSRuleValues.menuItemLineHeight) * bodyFontSize); } var heightAdjust = parseInt(CSSRuleValues.menuWrapperPadding) + parseInt(CSSRuleValues.menuWrapperBorderWidth); if (navigator.appName == "Microsoft Internet Explorer" && navigator.userAgent.indexOf("Win") != -1 && (typeof document.compatMode == "undefined" || document.compatMode == "BackCompat")) { heightAdjust = -heightAdjust; } // use menus array to drive div creation loop for (var i = 0; i < menus.length; i++) { menuDiv = document.createElement("div"); menuDiv.id = "popupmenu" + i; // preserve menu's ID as property of the menus array item menus[i].elemId = "popupmenu" + i; menuDiv.className = "menuWrapper"; if (menus[i].menuItems.length > 0) { menuDiv.style.height = (menuItemH * menus[i].menuItems.length) - heightAdjust + "px"; } else { // don't display any menu div lacking menu items menuDiv.style.display = "none"; } // define event handlers menuDiv.onmouseover = keepMenu; menuDiv.onmouseout = requestHide; // set stacking order in case other layers are around the page menuDiv.style.zIndex = 1000; // assemble menu item elements for inside menu div for (var j = 0; j < menus[i].menuItems.length; j++) { menuItem = document.createElement("div"); menuItem.id = "popupmenuItem_" + i + "_" + j; menuItem.className = "menuItem"; menuItem.onmouseover = toggleHighlight; menuItem.onmouseout = toggleHighlight; menuItem.onclick = hideMenus; menuItem.style.top = menuItemH * j + "px"; itemLink = document.createElement("a"); itemLink.href = basePageUrl + menus[i].menuItems[j].href; itemLink.className = "menuItem"; itemLink.onmouseover = toggleHighlight; itemLink.onmouseout = toggleHighlight; textNode = document.createTextNode(menus[i].menuItems[j].text); itemLink.appendChild(textNode); menuItem.appendChild(itemLink); menuDiv.appendChild(menuItem); } // append each menu div to the body document.body.appendChild(menuDiv); } makeHashes(); assignLabelEvents(); // pre-position menu for (i = 0; i < menus.length; i++) { positionMenu(menus[i].elemId); } menuReady = true; } // initialize global that helps manage menu hiding var timer; // invoked from mouseovers inside menus to cancel hide // request from mouseout of menu bar image et al. function keepMenu() { clearTimeout(timer); } function cancelAll() { keepMenu(); menuReady = false; } // invoked from mouseouts to request hiding all menus // in 1/4 second, unless cancelled function requestHide() { timer = setTimeout("hideMenus()", 250); } // "brute force" hiding of all menus and restoration // of normal menu bar images function hideMenus() { for (var i = 0; i < menus.length; i++) { //document.getElementById(menus[i].mBarImgId).src = menus[i].mBarImgNormal.src; var menu = document.getElementById(menus[i].elemId) menu.style.visibility = "hidden"; } } // set menu position just before displaying it function positionMenu(menuId){ // use the menu bar image for position reference of related div var mBarImg = document.getElementById(menus[menuId].mBarImgId); var offsetTrail = mBarImg; var offsetLeft = 0; var offsetTop = 0; while (offsetTrail) { offsetLeft += offsetTrail.offsetLeft; offsetTop += offsetTrail.offsetTop; offsetTrail = offsetTrail.offsetParent; } if (navigator.userAgent.indexOf("Mac") != -1 && typeof document.body.leftMargin != "undefined") { offsetLeft += document.body.leftMargin; offsetTop += document.body.topMargin; } var menuDiv = document.getElementById(menuId); menuDiv.style.left = offsetLeft + "px"; if (offsetTop + mBarImg.height > 500) { //alert("menuDiv.style.height:"+menuDiv.style.height+"offsetTop + mBarImg.height:"+(offsetTop + mBarImg.height) + "| offsetTop " +offsetTop +" mBarImg.height "+ mBarImg.height) if (adjustBottom) { menuDiv.style.top = (offsetTop - parseInt(menuDiv.style.height) - 8) + "px"; } else { menuDiv.style.top = (offsetTop - parseInt(menuDiv.style.height)) + "px"; } } else { menuDiv.style.top = offsetTop + mBarImg.height + 1 + "px"; } } // display a particular menu div function showMenu(menuId) { if (menuReady) { keepMenu(); hideMenus(); positionMenu(menuId); var menu = document.getElementById(menuId); menu.style.visibility = "visible"; } } // menu bar image swapping, invoked from mouse events in menu bar // swap style sheets for menu items during rollovers function toggleHighlight(evt) { evt = (evt) ? evt : ((event) ? event : null); if (typeof menuReady != "undefined") { if (menuReady && evt) { var elem = (evt.target) ? evt.target : evt.srcElement; if (elem.nodeType == 3) { elem = elem.parentNode; } if (evt.type == "mouseover") { keepMenu(); elem.className ="menuItemOn"; } else { elem.className ="menuItem"; requestHide(); } evt.cancelBubble = true; } } } function swap(evt) { evt = (evt) ? evt : ((event) ? event : null); if (typeof menuReady != "undefined") { if (evt && (document.getElementById && document.styleSheets) && menuReady) { var elem = (evt.target) ? evt.target : evt.srcElement; if (elem.className == "menuImg") { if (evt.type == "mouseover") { showMenu(menus[elem.id].elemId); //elem.src = menus[elem.id].mBarImgHilite.src; } else if (evt.type == "mouseout") { requestHide(); } evt.cancelBubble = true; } } } } // create menus only if key items are supported function initMenus() { if (document.getElementById && document.styleSheets) { setTimeout("makeMenus()", 5); window.onunload=cancelAll; } } if (typeof addLoadEvent == "function") { addLoadEvent(initMenus); } else { var oldonload = window.onload; if (typeof window.onload != 'function') { window.onload = initMenus; } else { window.onload = function() { oldonload(); initMenus(); } } }