var tmrPop;
var tmrShow;
var tMnu=-1;
var tItm=-1;
var gzIndex = 500;

// Array showing highlighted menu items.
var litNow = new Array();
var blnShown = false;

function HideOneEle(objEle, top, left, width, height, objArr, Cnt, doHide) {
var X, Y;
if(doHide == null){
	doHide = true;
}

	Y=FindY(objEle);
	if ((top + height) > Y &&
		Y + objEle.offsetHeight > (top)) {
		X=FindX(objEle);
		if ((left + width) > X &&
			X + objEle.offsetWidth > (left)) {
			if(doHide){
				objEle.style.visibility = 'hidden';
			}else{
				objEle.style.visibility = 'visible';
			}
			objArr[Cnt++] = objEle;
		}				 				
	}
	return Cnt;
}

function HideDocElements(top, left, width, height, doc, objArr, Cnt, doHide) {
var i, j;
var objForm;
var objEle;
if(doHide == null){
	doHide = true;
}
	
	for(i=0; i < doc.forms.length; i++) {
		objForm = doc.forms[i];
		
		for (j=0; j < objForm.length; j++) {
			objEle = objForm.elements[j];
			switch( objEle.type ) {
				case "select-one":
				case "select-multiple":
					break;
				default:
				if (ExpVer >= 5.5) {
					continue;
				} 
				break;
			}
			if (objEle.style.visibility.indexOf('hidden') == -1 && doHide) {
				Cnt = HideOneEle(objEle,top,left,width,height,objArr,Cnt,doHide);
			}else if(!doHide){
				Cnt = HideOneEle(objEle,top,left,width,height,objArr,Cnt,doHide);
			}
		}
	}
	return Cnt;
}

function HideFrameElements(top, left, width, height, objArr, Cnt, doc) {
var k;
var ScrollTop;
	if (HideInFrames) {
		for(k=0; k < HideInFrames.length; k++) {
		
			var Frame = doc.getElementById(HideInFrames[k]);

			if (Frame) {
				
				var framedoc = Frame.contentWindow.document;
				
				var docY = FindY(Frame);
				if (framedoc) {
				
					ScrollTop = framedoc.body.scrollTop;
					if (!ScrollTop) { 
						ScrollTop = 0;
					}
					HideDocElements(top - docY + ScrollTop, left, width, height, framedoc, objArr, Cnt);
					if (framedoc.frames.length > 0) {
						HideFrameElements(top - docY, left, width, height, objArr, Cnt, framedoc);
					}
				}		
			}
		}
	}

	return Cnt;
}

function HideElements(top, left, width, height) {
var i, j, k;
var objForm;
var X, Y;	
var objArr = new Array();
var Cnt = 0;
var objEle;

	if (document.all) {
		
		HideFrameElements(top, left, width, height, objArr, Cnt, document);
		Cnt=HideDocElements(top, left, width, height, document, objArr, Cnt)
		if (document.applets) {
			for (j=0; j<document.applets.length; j++) {
				HideOneEle(document.applets[j],top,left,width,height,objArr,Cnt);
			}
		}
	} else if (document.layers && document.layers.idMainLayer) {
		objEle = document.layers.idMainLayer;
		LayerTop = LayerTop==(-999)?objEle.top:LayerTop;
		if (top + height > objEle.top) {
			if (NS4Move) {
				objEle.top = top + height;
			} else {
				document.layers.idMainLayer.layers[0].visibility='hidden';
			}
		}
	} else {
		// Netscape 6
		// Hide Java Applets and ActiveX Controls
		// Look for Java Applets
		var arrTmp = document.getElementsByTagName("*");
		for (j=0; j< arrTmp.length; j++) {
			if( arrTmp[j].type ) {
				if(	arrTmp[j].type.indexOf('java-applet') >= 0) {
					HideOneEle(arrTmp[j],top,left,width,height,objArr,Cnt);
				}							
			}
		}
	}
	return objArr;
}

function popOver(Mnu, Itm, what, IgnoreTmr) {
var aTmp = new Array(menu.length);
var i;

	IgnoreTmr = (IgnoreTmr==null?false:IgnoreTmr);
	
	menu[Mnu][Itm].what = what;
	if(tmrPop) {
		clearTimeout(tmrPop);
		tmrPop = null;
	}

	// Highlight the new menu
    	litNow[Mnu] = Itm;
    	changeCol(litNow, true, (Mnu==0?true:false));
    	aTmp[Mnu] = 0;
    	for (i=1; i < menu[Mnu].length; i++) {
    		// Unhighlight any other menus
    		if (i != Itm) {
    			aTmp[Mnu] = i;
    			changeCol(aTmp, false, (Mnu==0?true:false));
    		}
    	}
    
	tMnu = Mnu;
	tItm = Itm;
	if (tmrShow) {
		clearTimeout(tmrShow);
	}

	if (overTimer && overTimer >= 0 && !IgnoreTmr ) {
		tmrShow = setTimeout('ShowMnu(' + Mnu + ',' + Itm + ');', overTimer);
	} else if (overTimer >= 0 || IgnoreTmr || blnShown){
		ShowMnu(Mnu, Itm);
	}
}
function ShowMnu(Mnu, Itm) {
var objMnu;
var ScWdth=isExp?document.body.clientWidth:innerWidth;
var	ScHght=isExp?document.body.clientHeight:innerHeight;
var intTemp;
var thisX;
var thisY;
	if (tMnu != Mnu || tItm != Itm) {
		return;
	}
	var SubMnu = menu[Mnu][Itm].SubMnu;
	if (!menu[SubMnu][0].IsDrawn) {
		writeMenus( SubMnu );
	}

	hideAllBut(Mnu,true);
    if( !menu[Mnu][Itm].disabled) {
    	litNow = getTree(Mnu, Itm);
    	changeCol(litNow, true, (Mnu==0?true:false));
    }
	blnShown=true;
	if (SubMnu > 0) {

		thisX = parseInt(menu[Mnu][0].ref.left) + parseInt(menu[Mnu][Itm].ref.left);
		thisY = parseInt(menu[Mnu][0].ref.top) + parseInt(menu[Mnu][Itm].ref.top);

		objMnu = menu[SubMnu][0];
		
		with (menu[SubMnu][0].ref) {
		
			if (thisX +  objMnu.x + objMnu.width > ScWdth) {
				if (Mnu > 0) {
					intTemp = parseInt(thisX - objMnu.width - (objMnu.x - menu[Mnu][0].width));
				} else {
					intTemp = ScWdth - objMnu.width;
				}
				left = intTemp>0?intTemp:0;
			} else {
				left = parseInt(thisX + objMnu.x);
			}
			if(thisY + objMnu.y + objMnu.height > ScHght) {
				intTemp = ScHght - objMnu.height - 2;
				top = intTemp>0?intTemp:0;
			} else {
				
				if (Mnu==0) {
					top = parseInt(thisY + objMnu.y) + 2 * menu[Mnu][0].borderWidth;
				} else {
					top = parseInt(thisY + objMnu.y);
				}
			} 
			visibility = 'visible';
			objMnu.HiddenElements=
				HideElements(parseInt(top), parseInt(left), objMnu.width, 
					parseInt(objMnu.height));
		}							
	}
}
function popOut(Mnu, Itm, what) {
	if (Mnu == tMnu && Itm == tItm) {
		tMnu = -1;
	}
	if ((Mnu == 0) && !menu[Mnu][Itm].SubMnu) {
		hideAllBut(0,false)
	} else {
 		tmrPop = setTimeout('hideAllBut(0,false)', outTimer);
	}
}
function getTree(Mnu, Itm) {
	// 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).
	Itms = new Array(menu.length);
	while(1) {
		Itms[Mnu] = Itm;
		// If we've reached the top of the hierarchy, return.
		if (Mnu == 0) return Itms;
			Itm = menu[Mnu][0].parentItem;
		Mnu = menu[Mnu][0].parentMenu;
	}
}
// Pass an array and a boolean to specify color change, true = over colour.
function changeCol(Itms, isOver, isAll) {
var strClass;
var strHTML;
var i;
	for (i = 0; i < Itms.length; i++) {
		if (Itms[i] && menu[i][Itms[i]].what) {
			strHTML = menu[i][Itms[i]].innerHTML;
			if (isOver) {
				newCol = menu[i][0].overCol;
				strClass = (i==0?menu[i][0].textOnClass:menu[i][0].textOnSubClass)
				if (isNS4) {
					strHTML = NSRepClass(
						strHTML, 
						strClass);
				}
			} else {
				if (!isAll && i==0) {
					// Not resetting all, do not reset the main menu, it
					// can stay like it is.
					continue;
				}			
				if(menu[i][Itms[i]].disabled) {
					newCol = menu[i][0].disabledCol;
					strClass = menu[i][0].disabledStyle;
				} else {
					newCol = menu[i][0].backCol;			
					strClass = (i==0?menu[i][0].textClass:menu[i][0].textSubClass);
				}
			}
			// Change the colours of the div/layer background.
			with (menu[i][Itms[i]].ref) {
				if (isNS4) {
					NSChangeContent(
						menu[i][Itms[i]].what,
						strHTML);
					menu[i][Itms[i]].what.bgColor = newCol;
					if (i != 0) {
						menu[i][Itms[i]].what.parentLayer.bgColor = newCol;
					}
				} else {
					 backgroundColor = newCol;
					 DOMRepClass('a' + menu[i][Itms[i]].what.id,
					 	strClass);
				}
			}
		}
	}
}
function hideAllBut(Mnu, blnNewMenu) {
var objMnu;
var keepMenus = getTree(Mnu, 1);
var i, j;

	if (!blnNewMenu) {
		blnShown=false;
	}
	for (i = 0; i < menu.length; i++) {
		if (!keepMenus[i]) {
			objMnu = menu[i][0];
			if (objMnu.ref) {
				objMnu.ref.visibility = 'hidden';
				if (!isNS4 && objMnu.HiddenElements) {
					for(j=0; j<objMnu.HiddenElements.length; j++) {
						objMnu.HiddenElements[j].style.visibility='visible';
					}
					objMnu.HiddenElements = null;
				} else if (isNS4 && Mnu == 0 && blnNewMenu==false && 
					document.layers.idMainLayer) {
					objMnu = document.layers.idMainLayer;
					if (NS4Move) {
						if (LayerTop != objMnu.top &&
							LayerTop != -999) {
							objMnu.top = LayerTop;
					
						}
					} else {
						document.layers.idMainLayer.layers[0].visibility='visible';
					}
				}
			}
		}
	}			
	changeCol(litNow, false, (Mnu==0?true:false));
}

function NSRepClass(Txt, NTxt) {
	return Txt.replace("class=[\",\'][^\"\']*[\",\']", "class=\"" + NTxt + "\"")
}
function DOMRepClass( strElement, NTxt) {
var objEle;
	objEle = getRef(strElement);
	if (objEle) {
		objEle.className=NTxt;
	}					
}
function NSChangeContent(what,text) {
    if (document.layers) {
        what.document.write(text);
        what.document.close();
    }
}
function Menu(
	x, y, width, 
	isVert,  
	popInd, overCol, backCol, 
	borderColor, borderWidth, 
	textClass, textOnClass, textSubClass, textOnSubClass,
	MainBorderStyle, SubBorderStyle, LstBorderStyle, disabledCol, disabledStyle) {
	
	// Position and size settings.
	this.x = x;
	this.y = y;
	this.width = width;

	// True or false - a vertical menu?
	this.isVert = (isVert==null?true:isVert);
	
	// The popout indicator used (if any) for this menu.
	this.popInd = (popInd==null?defpopInd:popInd);

	// Colours of menu and items.
	this.overCol = (overCol==null?defOver:overCol);
	this.backCol = (backCol==null?defBack:backCol);
    this.disabledCol = (disabledCol==null?defDisabled:disabledCol);
    this.disabledStyle = (disabledStyle==null?defDisabledStyle:disabledStyle);
	// The stylesheet class used for item borders and the text within items.
	this.borderColor = (borderColor==null?defBorderColor:borderColor);
	this.borderWidth = (borderWidth==null?defBorderWidth:borderWidth);
	this.MainBorderStyle = (MainBorderStyle==null?defMainBorderStyle:MainBorderStyle);
	this.SubBorderStyle = (SubBorderStyle==null?defSubBorderStyle:SubBorderStyle);
	this.LstBorderStyle = (LstBorderStyle==null?defLstBorderStyle:LstBorderStyle);
		
	this.textClass = (textClass==null?defMainStyle:textClass);
	this.textOnClass = (textOnClass==null?defOnMainStyle:textOnClass);
	this.textSubClass = (textSubClass==null?defSubStyle:textSubClass);
	this.textOnSubClass = (textOnSubClass==null?defOnSubStyle:textOnSubClass);
	// Parent menu and item numbers, indexed later.
	this.parentMenu = null;
	this.parentItem = null;
	// Reference to the object's style properties (set later).
	this.ref = null;
	this.what = null;
	
	this.innerHTML = '';
	
	this.IsDrawn = false;
}

    // Item methods
    function _item_disable(){this.disabled = true;}
    function _item_enable(){this.disabled = false;}

function Item(text, href, SubMnu, length, spacing, disabled, notvisible, frame, target) {

	this.text = text;
	this.href = href;

	// Optional arguments
	this.SubMnu = (SubMnu==null?0:SubMnu);
	this.length = (length==null?defLength:length);
	this.spacing = (spacing==null?defExtSpaces:spacing);
	this.frame = (frame==null?defFrame:frame);
	this.target = target;
    this.disabled = (disabled==null?false:disabled);
	this.notvisible = (notvisible==null?false:notvisible);
	
	// Reference to the object's style properties (set later).
	this.ref = null;
    
    // Methods for class
    this.Enable = _item_enable;
    this.Disable =  _item_disable;
}
function Go ( Mnu, Itm, what ) {

	with (menu[Mnu][Itm]) {
        if( disabled ) {return};
		if (href && href.length > 0) {

			if (target) {
			    var oWin = window.open(href, target);
	            if (oWin==null || typeof(oWin)=="undefined" ||
	                oWin.document==null || typeof(oWin.document)=="undefined") {
		            alert("The application has tried to open a popup window that could not be opened.\n\n" + 
		                  "Your browser may be configured to block popup windows.");
	            }
			} else if (frame) {
				if (isExp) {
					eval('showOpeningPageDiv(' + frame + '.document)'); 
					eval(frame + '.document.body.style.cursor = "wait"');
				}
				eval(frame + '.location.replace(href)');

			} else {
				if (showOpeningPageDiv) {
					showOpeningPageDiv(document,true);
				}
				try{
					document.location=href;
				}catch(err){}	
			}
			hideAllBut(0);
		} else {
			popOver(Mnu, Itm, what, true);
		}
	}
}
function NSGo( e ) {
	Go (this.Mnu, this.Itm);
}
function writeMenus( Mnu ) {

if (!isDOM && !isIE4 && !isNS4) return;
var str = '';
var itemX = 0;
var itemY = 0;
var strOuter='';
var strLayer='';
var intStrtMnu = 0;
var M;
var I;

	if (Mnu == null) {
		Mnu = 1;
	} else {
		intStrtMnu = Mnu;
		Mnu ++;
	}

	for (M = intStrtMnu; M < Mnu; M++) {
	with (menu[M][0]) {
	
		IsDrawn = true;
		// Variable for holding HTML for items and positions of next item.
		str = '';
		if (isNS4 && M > 0) {
			itemX = 1;
			itemY = 1;
		} else { 
			itemX = 0;
			itemY = 0;
		}

		if (M == 0) {

			with(menu[0][0]) {
				if (TopMenuParent) {
					var parentObj = getRef(TopMenuParent);
					if (parentObj) {
						itemY = FindY(parentObj);
						itemX = FindX(parentObj);
						parentObj.innerHTML = spacerImg;
						y = 0;
					}				
				} else {
					itemY = y;
					itemX = x;
				}
			}
		}

		strOuter='';
		strLayer='';

		// Remember, items start from 1 in the array (0 is menu object itself, above).
		// Also use properties of each item nested in the other with() for construction.
	 	for (I = 1; I < menu[M].length; I++) {
			with (menu[M][I]) {

				var itemID = 'menu' + M + 'item' + I;
				strOuter='';
				strLayer='';
				
				// The width and height of the menu item - dependent on orientation!
				var w = (isVert ? width : length);
				var h = (isVert ? length : width);
				var imgW=(popInd?popInd[1]:0);
				var imgH=(popInd?popInd[2]:0);
				var imgTop=(h-imgH)/2;
				var imgL=(w-imgW-5);
				
				if (SubMnu > 0) {
					// Set SubMnu's parents to this menu item.
					menu[SubMnu][0].parentMenu = M;
					menu[SubMnu][0].parentItem = I;
				}
				if (isDOM || isIE4) {
					strLayer +='<div id="' + itemID + '" OnClick="Go(' + M + ',' + I + ', this);"'
					if (borderWidth>0){
            			if(M == 0 || (I + 1) == menu[M].length){
            			if(M == 0) {
							strLayer += ' class="' + MainBorderStyle + '"';  
            			} else {
							strLayer += ' class="' + LstBorderStyle + '"';
						}
						} else {
							strLayer += ' class="' + SubBorderStyle + '"';
						}
    				}
					strLayer += ' style="position: absolute; cursor: hand; left: ' + itemX + '; top: ' + itemY + '; width: ' + w + '; height: ' + h + '; visibility: ' + (notvisible?'hidden;':'inherit;');
					if (backCol) {
						strLayer += 'background: ' + (disabled?disabledCol:backCol) + ';';				
					}	
					strLayer += '" ';
					// Add mouseover handlers and finish div/layer.
					strLayer += 'onMouseOver="popOver(' + M + ',' + I + ', this)" onMouseOut="popOut(' + M + ',' + I + ', this)">';
					strLayer += spacerImg + 
						'<span id="a' + itemID + '" class="' + (disabled?disabledStyle:(M==0?textClass:textSubClass)) + '">' + text;

					if (SubMnu > 0 && popInd) {					
						strLayer += '<div style="position:absolute; top:'+imgTop+'; left:'+imgL+'; width:'+imgW+'; height:'+imgH+';visibility:inherit"><img src="'+popInd[0]+'"></div>';
					}
					strLayer += '</span>';
					strLayer += strOuter + '</div>';
				} else if (isNS4) {
					var menuwidth;
					if(M == 0){
					menuwidth = w+ ( 2 * borderWidth);
					}else{
					menuwidth = w;
					}
					strLayer += '<layer id="' + itemID +
						'" left="' + 
						(itemX) + '" top="' + (itemY) + '" width="' +  
						(menuwidth) + '" height="' + (h) + '" visibility=' + (notvisible?"hidden":"inherit");
					
					if (backCol) {
						if(M == 0){
							strLayer += ' bgcolor="'+borderColor+'" ';
						}else{
							strLayer += ' bgcolor="' + (disabled?disabledCol:backCol) + '" ';
						}		
					}
					strLayer += '>';
					strLayer += '<layer id="next' + itemID +  
						'" left="' + borderWidth + '" top="' + borderWidth + '" width="' +  
						(w) + '" height="' + (h-(2*borderWidth)) + '" clip="' + (w) + ',' + (h-(2*borderWidth)) + '" visibility="inherit"';
				
					if (backCol) {
						strLayer += ' bgcolor="' + (disabled?disabledCol:backCol) + '"';				
					}
					strLayer += ' onMouseOver="popOver(' + M + ',' + I + ', this)" onMouseOut="popOut(' + M + ',' + I + ', this)">';
					
					strOuter += '<table width="' + (w - 4) +
						'" height="' + (h-4) +    
						'" border="0" cellspacing="0" cellpadding="0">' +
						'<tr><td width="5">'+spacerImg+'</td><td width="100%">';
					strOuter += '<span class="' + (M==0?textClass:textSubClass) + '">' + text + '</span></td>';
					if (SubMnu > 0 && popInd) {
						strOuter += '<td class="' + textClass + '" align="right"><img src="' + popInd[0] + '" alt=""></td>';				
					}	
					strOuter += '</tr></table>';			
					strLayer += strOuter + '</layer></layer>';
					menu[M][I].innerHTML = strOuter;
					
					if (M > 0 && borderWidth>0) {
						if (isVert) { 
							itemY += 2 * borderWidth;
						} else {
							itemX += 2 * borderWidth;
						}
					}
				}
				str += strLayer;
				if (notvisible==false) {
					if (isVert) { 
						itemY += length + spacing;
					} else {
						itemX += length + spacing;
					}
				}
			}
		}
		
		if (isDOM) {
			// IE 5+ or NS 6+
			var newDiv = document.createElement('div');
			document.getElementsByTagName('body').item(0).appendChild(newDiv);
			newDiv.innerHTML = str;
			ref = newDiv.style;
			ref.position = 'absolute';
			ref.visibility = 'hidden';
			ref.zIndex = gzIndex++;

		} else if (isIE4) {
			// Insert a div tag to the end of the BODY with menu HTML in place for IE4.
			document.body.insertAdjacentHTML('afterBegin', '<div id="menu' + M + 'div" ' + 'style="position: absolute; visibility: hidden">' + str + '</div>');
			ref = getStyle('menu' + M + 'div');
			ref.zIndex = gzIndex++;
		} else if (isNS4) {
			// In NS4, create a reference to a new layer and write the items to it.		
			ref = new Layer((w+borderWidth));
			ref.document.write(str);
			ref.document.close();
			if (M > 0 && borderWidth>0) {
				ref.bgColor=borderColor;
				ref.resizeBy(borderWidth,borderWidth);
			}
		}

		for (I = 1; I < menu[M].length; I++) {
			itemName = 'menu' + M + 'item' + I;
			if (isDOM || isIE4) {
				 menu[M][I].ref = getStyle(itemName);
			}
			if (isNS4) {
				menu[M][I].ref = ref.document[itemName];
				ref.layers[itemName].onmouseup=NSGo;
				ref.layers[itemName].captureEvents(Event.MOUSEUP);
				ref.layers[itemName].Mnu = M;
				ref.layers[itemName].Itm = I;
			}
		}
		menu[M][0].height=isVert?itemY:itemX;
	}
	}
/*	
	if (Mnu == 1) {
		with(menu[0][0]) {
			var TopMenuTop = y;
			if (TopMenuParent) {
				var parentObj = getRef(TopMenuParent);
				if (parentObj) {
					TopMenuTop = FindY(parentObj);
					parentObj.innerHTML = "";
					alert(TopMenuTop + ' ' + Mnu);
				}				
			}	
			ref.left = x;
			ref.top = TopMenuTop;
			ref.visibility = 'visible';
		}
	}
*/	
	if (Mnu == 1) {
		with(menu[0][0]) {

			ref.left = x;
			ref.top = y;
			ref.visibility = 'visible';
		}
	}

}

// These two lines handle the window resize bug in NS4. See <body onResize="...">.
// I recommend you leave this here as otherwise when you resize NS4's width menus are hidden.
var popOldWidth = window.innerWidth;
nsResizeHandler = new Function('if (popOldWidth != window.innerWidth) location.reload()');

// This is a quick snippet that captures all clicks on the document and hides the menus
// every time you click. Use if you want.
//if (isNS4) document.captureEvents(Event.CLICK);
/*
document.onclick = clickHandle;
function clickHandle(evt)
{
// if (isNS4) document.routeEvent(evt);
 hideAllBut(0);
}
*/

