// global vertical menu statevar menubarReady = false;// create hash table-like lookup for menu objects with id string indexesfunction makeMenuBarHashes() {    for (var i = 0; i < vmenus.length; i++) {        vmenus[vmenus[i].elemId] = vmenus[i];        vmenus[vmenus[i].mBarImgId] = vmenus[i];    }}// assign menu label image event handlersfunction assignMenuBarLabelEvents() {    var elem;    for (var i = 0; i < vmenus.length; i++) {        elem = document.getElementById(vmenus[i].mBarImgId);        elem.onmouseover = vswap;        elem.onmouseout = vswap;    }}// invoked from init(), generates the menu div elements and their contents.// all this action is invisible to user during constructionfunction makeMenuBar() {    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 < vmenus.length; i++) {        menuDiv = document.createElement("div");        menuDiv.id = "vpopupmenu" + i;        // preserve menu's ID as property of the menus array item        vmenus[i].elemId = "vpopupmenu" + i;        menuDiv.className = "menubarWrapper";        if (vmenus[i].menuItems.length > 0) {            menuDiv.style.height = (menuItemH * vmenus[i].menuItems.length) - heightAdjust + "px";        } else {            // don't display any menu div lacking menu items            menuDiv.style.display = "none";        }        // define event handlers        menuDiv.onmouseover = keepMenuBar;        menuDiv.onmouseout = requestMenuBarHide;        // 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 < vmenus[i].menuItems.length; j++) {            menuItem = document.createElement("div");            menuItem.id = "vpopupmenuItem_" + i + "_" + j;            menuItem.className = "menubarItem";            menuItem.onmouseover = vtoggleHighlight;            menuItem.onmouseout = vtoggleHighlight;            menuItem.onclick = hideMenuBar;            menuItem.style.top = menuItemH * j + "px";            itemLink = document.createElement("a");            itemLink.href = vmenus[i].menuItems[j].href;            itemLink.className = "menubarItem";            itemLink.onmouseover = vtoggleHighlight;            itemLink.onmouseout = vtoggleHighlight;            textNode = document.createTextNode(vmenus[i].menuItems[j].text);            itemLink.appendChild(textNode);            menuItem.appendChild(itemLink);            menuDiv.appendChild(menuItem);        }        // append each menu div to the body        document.body.appendChild(menuDiv);    }    makeMenuBarHashes();    assignMenuBarLabelEvents();    // pre-position menu    for (i = 0; i < vmenus.length; i++) {        positionMenuBar(vmenus[i].elemId);    }    menubarReady = true;}// initialize global that helps manage menu hidingvar menubarTimer;// invoked from mouseovers inside menus to cancel hide// request from mouseout of menu bar image et al.function keepMenuBar() {    clearTimeout(menubarTimer);}function vcancelAll() {    keepMenuBar();    menubarReady = false;}// invoked from mouseouts to request hiding all menus// in 1/4 second, unless cancelledfunction requestMenuBarHide() {    menubarTimer = setTimeout("hideMenuBar()", 250);}// "brute force" hiding of all menus and restoration// of normal menu bar imagesfunction hideMenuBar() {    for (var i = 0; i < vmenus.length; i++) {       document.getElementById(vmenus[i].mBarImgId).className = "menuBar";       var menu = document.getElementById(vmenus[i].elemId)       menu.style.visibility = "hidden";    }}// set menu position just before displaying itfunction positionMenuBar(menuId){    // use the menu bar image for position reference of related div    var mBarImg = document.getElementById(vmenus[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.top = offsetTop + "px";	menuDiv.style.left = offsetLeft + parseInt(CSSRuleValues.menuItemWidth) + "px";}// display a particular menu divfunction showMenuBar(menuId) {    if (menubarReady) {        keepMenuBar();        hideMenuBar();        positionMenuBar(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 vtoggleHighlight(evt) {    evt = (evt) ? evt : ((event) ? event : null);    if (typeof menubarReady != "undefined") {        if (menubarReady && evt) {            var elem = (evt.target) ? evt.target : evt.srcElement;            if (elem.nodeType == 3) {                elem = elem.parentNode;            }            if (evt.type == "mouseover") {                keepMenuBar();                elem.className ="menubarItemOn";            } else {                elem.className ="menubarItem";                requestMenuBarHide();            }            evt.cancelBubble = true;        }    }}function vswap(evt) {    evt = (evt) ? evt : ((event) ? event : null);    if (typeof menubarReady != "undefined") {        if (evt && (document.getElementById && document.styleSheets) && menubarReady) {            var elem = (evt.target) ? evt.target : evt.srcElement;			if (elem.className == "menuBar" || elem.className == "menuBarHilite") {				if (elem.nodeName == "A") {					elem = elem.parentNode;				}				if (evt.type == "mouseover") {                    showMenuBar(vmenus[elem.id].elemId);                    elem.className = "menuBarHilite";                } else if (evt.type == "mouseout") {                    requestMenuBarHide();                }                evt.cancelBubble = true;            }        }    }}// create menus only if key items are supportedfunction initMenuBar() {    if (document.getElementById && document.styleSheets) {        setTimeout("makeMenuBar()", 5);        window.onunload=vcancelAll;    }}
