var isDOM = false, isNS4 = false; if (document.all) var isDOM = true, docObj = 'document.all.', styObj = '.style'; else if (document.layers) var isNS4 = true, docObj = 'document.', styObj = ''; // Hide timeout var popTimer = 0; var litNow = new Array(); function popOver(menuNum, itemNum) { clearTimeout(popTimer); hideAllBut(menuNum); litNow = getTree(menuNum, itemNum); changeCol(litNow, true); targetNum = menu[menuNum][itemNum].target; if (targetNum > 0) { targetName = menu[targetNum][0].id; menuName = menu[menuNum][0].id; menuRef = eval(docObj + menuName + styObj); thisX = parseInt(menuRef.left); thisY = parseInt(menuRef.top); // Add onto this the position of the trigger item within the menu itemPath = docObj; if (isNS4) itemPath += menuName + '.document.'; itemRef = eval(itemPath + menuName + itemNum.toString() + styObj); thisX += parseInt(itemRef.left); thisY += parseInt(itemRef.top); // Add those to the target's offset to set the target's position, show it. with (eval(docObj + targetName + styObj)) { left = parseInt(thisX + menu[targetNum][0].x); top = parseInt(thisY + menu[targetNum][0].y); visibility = 'visible'; } } } function popOut(menuNum, itemNum) { // Hide menu in 1/2 sec, *UNLESS* another mouseover clears the timeout! popTimer = setTimeout('hideAllBut(0)', 500); } function getTree(menuNum, itemNum) { // Array index is the menu number. The contents are null (if that menu is not a parent) // or the item number in that menu that is an ancestor (to light it up). itemArray = new Array(menu.length); while(1) { itemArray[menuNum] = itemNum; if (menuNum == 0) return itemArray; itemNum = menu[menuNum][0].parentItem; menuNum = menu[menuNum][0].parentMenu; } } // Pass an array and a boolean to specify colour change, true = over colour. function changeCol(changeArray, isOver) { for (menuCount = 0; menuCount < changeArray.length; menuCount++) { if (changeArray[menuCount]) { thisMenu = menu[menuCount][0].id; thisItem = thisMenu + changeArray[menuCount].toString(); newCol = isOver ? menu[menuCount][0].overCol : menu[menuCount][0].backCol; if (isDOM) document.all[thisItem].style.backgroundColor = newCol; if (isNS4) document[thisMenu].document[thisItem].bgColor = newCol; } } } function hideAllBut(menuNum) { var keepMenus = getTree(menuNum, 1); for (count = 0; count < menu.length; count++) if (!keepMenus[count]) eval(docObj + menu[count][0].id + styObj + '.visibility = "hidden"'); changeCol(litNow, false); } // *** MENU CONSTRUCTION FUNCTIONS *** // Variable to end a div or layer based on browser. var endDL = isDOM ? '' : ''; function Menu(id, x, y, width, overCol, backCol, borderCol) { this.id = id; this.x = x; this.y = y; this.width = width; // Colours of menu and items. this.overCol = overCol; this.backCol = backCol; this.borderCol = borderCol; // Parent menu and item numbers, indexed later. this.parentMenu = null; this.parentItem = null; } function Item(text, href, height, target) { this.text = text; this.href = href; this.height = height; this.target = target; } function startDL(id, x, y, width, height, vis, back, border, zIndex, extraProps) { // Write a div in IE that resembles a layer's settings, or a layer in NS. if (isDOM) { str = '
'; } function mouseProps(currMenu, currItem) { return 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' + currMenu + ',' + currItem + ')"'; } function writeMenus(customRoot, popInd) { for (currMenu = 0; currMenu < menu.length; currMenu++) { showMenu = true; if ((currMenu == 0) && customRoot) { document.write(customRoot); showMenu = false; } with (menu[currMenu][0]) { // Start generating a div with position offset - no dimensions, colours, mouseovers. // This position is only relevant for root menu anyway as all others are altered later. menuHTML = startDL(id, x, y, 0, 0, 'hidden', null, null, 100, ''); // Width is less padding (3 left & right) and border (1 left & right). var back = backCol, bord = borderCol, currWidth = width - 8; } // Y-position of next item, increase if you want a menu header. itemPos = 0; // Remember, items start from 1 in the array (0 is menu object itself, above). for (currItem = 1; currItem < menu[currMenu].length; currItem++) { // Auto-generate ID's in numerical sequence. trigID = menu[currMenu][0].id + currItem.toString(); // Now, work with properties of individual menu items. with (menu[currMenu][currItem]) { // Start a menu item positioned vertically, with mouse events and colours. menuHTML += startDL(trigID, 0, itemPos, 0, 0, 'inherit', back, bord, 100, mouseProps(currMenu, currItem)) + '' + '' + '
' + text + '' + (target ? popInd : '') + '
' + endDL; if (target > 0) { // Set target's parents to this and offset it by the current position. menu[target][0].parentMenu = currMenu; menu[target][0].parentItem = currItem; } // Move next item position down by this item's height. itemPos += height; } } // Write this menu to the document. if (showMenu) document.write(menuHTML + endDL); litNow[currMenu] = null; } }