var ie4;
var ns4;
var ie5;
var ns6, ns62,ns7,mac;
var eventTop=0,eventLeft=0;
var MenuStack = new Array();
var currentObject,timer;
var firingObject;
var currentMenu;
var menuWait = 190;
var menuAlive = 15000 + menuWait;
var zIndexMin = 5;
var zIndexCount = zIndexMin;
var agt=navigator.userAgent.toLowerCase();

var objectArray = new Array();

if (window.captureEvents) {
       window.captureEvents(Event.MOUSEMOVE|Event.MOUSEUP);
    	window.onmousemove = this.mouseMove;
		window.onmouseup = this.mouseUp;
	}
else{
	document.onmousemove = this.mouseMove;
	document.onmouseup = this.mouseUp;
	
}

function newMenu(element,parent,child,x_offset,y_offset){
	objectArray[objectArray.length] = new Menu(element,parent,child,x_offset,y_offset);
	setTimeout("delayMouseOver()",menuWait);
}

function Menu(element,parent,child,x_offset,y_offset){
	this.element = element;
	this.parent = null;
	this.child = null;
	this.x_offset = 0;
	this.y_offset = 0;
	if(parent)	
		this.parent = returnObject(parent);
	if(child)	
		this.child = returnObject(child);
	if(x_offset)
		this.x_offset = parseInt(x_offset);
	if(y_offset)
		this.y_offset = parseInt(y_offset);
	
	currentMenu = this;
	if(! this.element.onmouseout)
		this.element.onmouseout = function anonymous(){eval(1);}
	this.storeMouseOut = this.element.onmouseout;
	this.element.onmouseout = mouseOut;
	return this;
}




function delayMouseOver(){
	menuObject = objectArray[0];
	objectArray= spliceArray(objectArray,0,1);
	
	if(menuObject == currentMenu && menuObject != null){
		menuObject.element.onmouseout = mouseOut;
		push(menuObject);
	}
	else{
		menuObject.element.onmouseout = menuObject.storeMouseOut;
		menuObject.storeMouseOut();
	}
}



function push(menuObject){
	var stackCount;
	var found = -1;
	if(menuObject.parent != null){
		for(var i = MenuStack.length-1; i >= 0; i--){
			if(MenuStack[i].parent != null && MenuStack[i].parent.id == menuObject.parent.id){
				stackCount = i;
				break;
			}
			else{
				stackCount = MenuStack.length;
			}
		}
	}
	else{
		
		for(var i = MenuStack.length-1; i >= 0; i--){
			if(MenuStack[i].element == menuObject.element)
				found = i;
		}
		stackCount = 0;
	}
	for(var i=stackCount; i < MenuStack.length; i++){
		if(MenuStack[i].child != null)
			hide(MenuStack[i].child);
		if(found != i)
			MenuStack[i].storeMouseOut();
		MenuStack[i] = null;
	}
	MenuStack[stackCount] = menuObject;
	MenuStack.length = stackCount + 1;
	
	initMenu();
	//setTimeout("initMenu()",menuWait);
}


function initMenu(){
	var menuObject;
	if(MenuStack.length > 0)
		menuObject = MenuStack[MenuStack.length - 1];
	if(menuObject == currentMenu && menuObject != null){
		if(timer){
			clearTimeout(timer);
		}
		if(menuObject.child != null){
			showMenu(menuObject.child,menuObject.element,menuObject.x_offset,menuObject.y_offset);
			currentObject = menuObject.child;
			timer= setTimeout("flush()",menuAlive);
		}
		else if(menuObject.parent != null){
			currentObject = menuObject.parent;
			timer= setTimeout("flush()",menuAlive);
		}
	}
}

function flush(){
	if(currentMenu == null){
		for(var i=0; i < MenuStack.length; i++){
			if(MenuStack[i].child != null)
				hide(MenuStack[i].child);
			MenuStack[i].storeMouseOut();
			MenuStack[i] = null;
		}
		MenuStack.length =0;
		zIndexCount = zIndexMin;
	}
	else{
		timer= setTimeout("flush()",menuAlive);
	}
}

function mouseMove(e){
	if (ns4){
		if(e){
			eventLeft = parseInt(e.pageX - e.layerX);
			eventTop = parseInt(e.pageY - e.layerY);
			
			targetLeft = parseInt(e.target.x);
			targetTop = parseInt(e.target.y);
			//eventLeft = parseInt(e.target.x);
			//eventTop = parseInt(e.target.y);
		}
	}
}


function mouseUp(e){
	if(currentMenu == null)
		flush();
	else
		currentMenu.element.onmouseover();
}


function mouseOut(){
	if(currentMenu){
		currentMenu.element.onmouseout = currentMenu.storeMouseOut;
		currentMenu = null;
	}
}

function showMenu(object,element,x_offset,y_offset){
	var top = eventTop;
	var left = eventLeft;
	var menu = object;
	var root = element;
	
	left = FindPosX(element);
	top =  FindPosY(element);
	
	if(ns4){
		left = FindPosX(element);
		top =  FindPosY(element);
		if(root.parentLayer){
			while(root.parentLayer){
				if(root.parentLayer.left > 0)
					left += parseInt(root.parentLayer.left);
				if(root.parentLayer.top > 0)
					top += parseInt(root.parentLayer.top);
				root = root.parentLayer;
			}
		}
	}
	
	var menuObject = menu;
	
	
	if(! ns4)
		menu = menu.style;
	
	if(x_offset)
		left += x_offset;
	if(y_offset)
		top += y_offset;
	
	menu.top = top;
	menu.left = left;
	
	show(menuObject);
	
}


function show(element){
		var showMe = element;
		if(ie4){
			showMe = showMe.style;
			showMe.visibility="visible";
		}
		
		else if(!ns4){
			showMe = showMe.style;
			showMe.visibility="visible";
			
		}
		
		else{
			showMe.visibility = "visible";
		}
		//bring to front	
		showMe.zIndex = zIndexCount;
		zIndexCount++;
	}

function hide(element_string){
		var hideMe;
		if(typeof element_string == "string")
			hideMe = returnObject(element_string);
		else
			hideMe = element_string;
		if(ie4){
			hideMe = hideMe.style;
			hideMe.visibility="hidden";
		}
		else if(! ns4){
			hideMe = hideMe.style;
			hideMe.visibility="hidden";
		}
		else{
			hideMe.visibility = "hide";
		}
		
		
}

function browserSniffer() {
		if(document.all && !document.getElementById){
			ie4 = true;
		}
  		else if(document.layers){		
			ns4 = true;
		}
  		else if(document.all && document.getElementById){
			ie5 = true;
		}
  		else if(document.getElementById && !document.all){
			var start = -1;
			if(navigator.userAgent.indexOf("Netscape 6/") != -1)
				start = navigator.userAgent.indexOf("Netscape 6/") + "Netscape 6/".length;
			else if(navigator.userAgent.indexOf("Netscape/") != -1)
				start = navigator.userAgent.indexOf("Netscape/") + "Netscape/".length;
			var end = navigator.userAgent.length;
			if(start >= 0){
				var version = navigator.userAgent.substring(start,end);
				if(parseFloat(version) >= 6.2){
					ns7 = true;
				}
				else if(parseFloat(version) >= 6.2){
					ns62 = true;
				}
				else{
					ns6 = true;
				}
			}
		}
		mac = (agt.indexOf("mac")!=-1);
    }


function spliceArray(array,index,length){
	var tempArray = new Array();
	for(var i=0; i < array.length; i++){
		if(i >= index && i < (index + length))
			continue;
		tempArray[tempArray.length] = array[i];
		
	}
	return tempArray;
}

function returnObject(element_string){
	var objectReference = null;
	if(document.layers) {
			objectReference = this.returnObjectNS(document.layers,element_string);
	}
	else {
		if(document.all && ! document.getElementById)
		{
			objectReference = eval("document.all." + element_string);
			
		}
		else
		{
			objectReference = document.getElementById(element_string);
		}
	}
	return objectReference;
}

function returnObjectNS(object,elementString){
	//loop through layers and find object
	for(var i=0;i < object.length;i++){
		if(object[i].id == elementString){
				objectReference = object[i];
				return objectReference;
				break;
		}
		else if(object[i].length)
			this.returnObjectNS(object[i],elementString);
		
	}
	return true;
}


function FindPosX (obj){
	var curleft = 0;
	if(! obj)
		return 0;
	
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}
function FindPosY (obj){
	if(! obj)
		return 0;
	
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent)
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}


