// global menu state var menuReady = false; // pre-cache menubar image pairs if (document.images) { var imagesNormal = new Array(); imagesNormal["venue"] = new Image(24, 190); imagesNormal["venue"].src = "/venuetools/images/buttonVenue.png"; imagesNormal["quotetool"] = new Image(24, 190); imagesNormal["quotetool"].src = "/venuetools/images/buttonQuote.png"; imagesNormal["ccd"] = new Image(24, 190); imagesNormal["ccd"].src = "/venuetools/images/buttonCCD.png"; imagesNormal["tst"] = new Image(24, 190); imagesNormal["tst"].src = "/venuetools/images/buttonTST.png"; imagesNormal["acinfo"] = new Image(24, 190); imagesNormal["acinfo"].src = "/venuetools/images/buttonAircraftInfo.png"; imagesNormal["amkt"] = new Image(24, 190); imagesNormal["amkt"].src = "/venuetools/images/buttonAMKT.png"; var imagesHilite = new Array(); imagesHilite["venue"] = new Image(24, 190); imagesHilite["venue"].src = "/venuetools/images/buttonVenueOvr.png"; imagesHilite["quotetool"] = new Image(24, 190); imagesHilite["quotetool"].src = "/venuetools/images/buttonQuoteOver.png"; imagesHilite["ccd"] = new Image(24, 190); imagesHilite["ccd"].src = "/venuetools/images/buttonCCDOvr.png"; imagesHilite["tst"] = new Image(24, 190); imagesHilite["tst"].src = "/venuetools/images/buttonTSTOvr.png"; imagesHilite["acinfo"] = new Image(24, 190); imagesHilite["acinfo"].src = "/venuetools/images/buttonAircraftInfoOvr.png"; imagesHilite["amkt"] = new Image(24, 190); imagesHilite["amkt"].src = "/venuetools/images/buttonAMKTOvr.png"; } // specifications for menu contents and menubar image associations var menus = new Array(); menus[0] = {topMenuImage:"menuImg_1", mBarImgNormal:imagesNormal["venue"], mBarImgHilite:imagesHilite["venue"], menuItems:[ {text:"About Venue", href:"/venuetools/Venue/AboutVenue.aspx", divider:false} ], elemId:"" }; menus[1] = {topMenuImage:"menuImg_2", mBarImgNormal:imagesNormal["quotetool"], mBarImgHilite:imagesHilite["quotetool"], menuItems:[ {text:"About Quote Tool", href:"/venuetools/QuoteTool/AboutQuote.aspx", divider:true} ], elemId:"" }; menus[2] = {topMenuImage:"menuImg_3", mBarImgNormal:imagesNormal["ccd"], mBarImgHilite:imagesHilite["ccd"], menuItems:[ {text:"About CCD", href:"/venuetools/Venue/AboutCCD.aspx", divider:true} ], elemId:"" }; menus[3] = {topMenuImage:"menuImg_4", mBarImgNormal:imagesNormal["tst"], mBarImgHilite:imagesHilite["tst"], menuItems:[ {text:"About TST", href:"/venuetools/Venue/AboutTST.aspx", divider:true} ], elemId:"" }; menus[4] = {topMenuImage:"menuImg_5", mBarImgNormal:imagesNormal["acinfo"], mBarImgHilite:imagesHilite["acinfo"], menuItems:[ {text:"About Aircraft Information", href:"/venuetools/Venue/AboutACInfo.aspx", divider:false} ], elemId:"" }; menus[5] = {topMenuImage:"menuImg_6", mBarImgNormal:imagesNormal["amkt"], mBarImgHilite:imagesHilite["amkt"], menuItems:[ {text:"About AMKT", href:"/venuetools/Venue/AboutAMKT.aspx", divider:true} ], elemId:"" }; // 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].topMenuImage] = 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].topMenuImage); if(elem) { 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; // Override variable pixel size height menuItemH = 22; // 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 = "menuBlock"; if (menus[i].menuItems.length > 0) { menuDiv.style.height = ((menuItemH * menus[i].menuItems.length) - 4) + "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++) { menuItemBase = document.createElement("div"); menuItemBase.id = "popupmenuItemBase_" + i + "_" + j; menuItemBase.onmouseover = toggleHighlight; menuItemBase.onmouseout = toggleHighlight; menuItemBase.onclick = hideMenus; if ( j == 0 ) { menuItemBase.style.top = "0px"; menuItemBase.className = "menuItemInitial"; } else { menuItemBase.style.top = ((menuItemH * j) - 4) + "px"; if ( menus[i].menuItems[j].divider == true ) { menuItemBase.className = "menuItemDivider"; } else { menuItemBase.className = "menuItemBase"; } } itemLink = document.createElement("a"); itemLink.id = "popupmenuItemLink_" + i + "_" + j; itemLink.href = menus[i].menuItems[j].href; itemLink.className = "menuItem"; itemLink.onmouseover = toggleHighlight; itemLink.onmouseout = toggleHighlight; if ( j == 0 ) { itemLink.style.top = "2px"; } else { itemLink.style.top = "6px"; } itemLink.style.left = "20px"; textNode = document.createTextNode(menus[i].menuItems[j].text); itemLink.appendChild(textNode); menuItemBase.appendChild(itemLink); menuItemDot = document.createElement("div"); menuItemDot.id = "popupmenuItemDot__" + i + "_" + j; menuItemDot.onmouseover = toggleHighlight; menuItemDot.onmouseout = toggleHighlight; menuItemDot.style.zIndex = 1005; if ( j == 0 ) { menuItemDot.className = "menuItemDotInitial"; } else { menuItemDot.className = "menuItemDot"; } menuItemBase.appendChild(menuItemDot); menuItemDot.style.visibility = "hidden"; menuItemDotImage = document.createElement("img"); menuItemDotImage.src = "../images/menuDot.gif"; menuItemDotImage.width = "6"; menuItemDotImage.height = "6"; menuItemDot.appendChild(menuItemDotImage); menuDiv.appendChild(menuItemBase); } // 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].topMenuImage).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].topMenuImage); 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); if (mBarImg) { menuDiv.style.left = offsetLeft + "px"; menuDiv.style.top = offsetTop + mBarImg.offsetHeight + "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 bg 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; } var suffixStart = elem.id.indexOf("popupmenuItemBase"); var suffix = elem.id.substr(17, elem.id.length - 17); var dot = document.getElementById("popupmenuItemDot_" + suffix); var menuItem = document.getElementById("popupmenuItemLink" + suffix); if (evt.type == "mouseover") { keepMenu(); if ( menuItem ) { menuItem.className ="menuItemOn"; } if ( dot ) { dot.style.visibility = "visible"; } } else { if ( menuItem ) { menuItem.className ="menuItem"; } if ( dot ) { dot.style.visibility = "hidden"; } 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; } } addOnLoadEvent(initMenus);