if (document.all) var isDOM = true, docObj = 'document.all.', styObj = '.style';
else if (document.layers) var isNS4 = true, docObj = 'document.', styObj = '';

if (!((isDOM)|(isNS4))) {
   alert("Unknown object model!");
}

// Hide timeout
var popTimer = 30;
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 ? '</div>' : '</layer>';

function Menu(id, x, y, width, overCol, backCol, borderCol) {

	if (!isDOM) width = width*1.1;

	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 = '<div id="' + id + '" style="position: absolute; left: ' + x + '; top: ' + y +
 		'; width: ' + width + '; height: ' + height + '; visibility: ' + vis + '; ';
		if (back) str += 'background: ' + back + '; ';
		if (border) str += 'padding: 3px; border: 1px solid ' + border + '; ';
		if (zIndex) str += 'z-index: ' + zIndex + '; ';
		// End style declaration.
		str += '" ';
	}
	if (isNS4) {
		str = '<layer id="' + id + '" left="' + x + '" top="' + y + '" width="' + width +
 		'" height="' + height + '" visibility="' + vis + '" ';
		if (back) str += 'bgcolor="' + back + '" ';
		if (border) str += 'style="border: 1px solid ' + border + ';" ';
		if (zIndex) str += 'z-index="' + zIndex + '" ';
	}
	return str + extraProps + '>';
}

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 = -3;

	// 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)) + '<table width="' + currWidth + '" border="0" cellspacing="0" cellpadding="3" class=ItemTable onClick=gotoURL("' + href + '"); ><tr>' + '<td align="left" class="Item" width=99%>&nbsp;&nbsp;<a class="Item" href="' + href + '">' + text + '</a></td>' + '<td class="Item" align="right">' + (target ? popInd : '') + '</td></tr></table>' + 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;
   	}
}

