var menu = ""
var menulink = ""
var menulinkobj
var process
var visibleMenus = new Array()
var DELAY = 250
var ACTIVE = "white"
var INACTIVE = "#15156d"

/* Enter a menu */
function enterMenu(sender) {
	clear()
	menu = sender.id
	scheduleProcess()
}

/* Leave a menu */
function leaveMenu(sender) {
	clear()
	menu = ""
	scheduleProcess()
}

/* Enter a link */
function enterLink() {
}

/* Enter a menu link */
function enterMenuLink(sender, id) {
	clear()
	menulinkobj = sender
	menulink = id
	sender.style.backgroundColor = ACTIVE
	scheduleProcess()
}

/* Leave a menu link */
function leaveMenuLink() {
	clear()
	menulink = ""
	menulinkobj.style.backgroundColor = INACTIVE
	menulinkobj = null
	scheduleProcess()
}

/* Clear the process time out */
function clear() {
	window.clearTimeout(process)
}

/* Run process on a timeout */
function scheduleProcess() {
	process = window.setTimeout("proc()", DELAY)
}

/* Process it */
/* The menu & menulink hold the details that should now be displayed */
function proc() {
	
	//No menu link and no menu then close everything
	if (menulink == "" && menu == "") {
		closeAll(menu)
	}
	
	//Menu but no menu link then close higher than menu
	if (menu != "" && menulink == "") {
		closeHigher(menu)
	}

	//Close paths if a path change
	if (menulink != "") {
		closeByPath(menulink)
	}
		
	//Should be cleared down & ready to receive menulink
	if (menulink != "") {
		var m = document.getElementById(menulink)
		enableMenu(m, true)
	}
}

/* Close all visible menus */
function closeAll() {
	for(i=visibleMenus.length-1; i>= 0; i--) {
		var m = document.getElementById(visibleMenus[i])
		enableMenu(m, false)
	}
}

/*
 Close any visible menus that are at a higher level
 than the menu to be shown
*/
function closeHigher(id) {
	var newLevel = id.split(".").length
	for(i=visibleMenus.length-1; i>= 0; i--) {
		var level = visibleMenus[i].split(".").length
		if (level > newLevel) {
			var m = document.getElementById(visibleMenus[i])
			enableMenu(m, false)
		}
	}
}

/*
 Close any visible menus that are on a different path to the id passed
*/
function closeByPath(id) {
	var newPath = id.split(".")
	for(i=visibleMenus.length-1; i>= 0; i--) {
		var path = visibleMenus[i].split(".")
		for (j=path.length-1; j>=0; j--) {
			if (newPath[j] != path[j]) {
				var m = document.getElementById(visibleMenus[i])
				enableMenu(m, false)
			} 
		}
	}
}

/* Enable a menu */
function enableMenu(menu, enable) {
try {
	if (enable) {
		setPos(menu)
		if (menu.style.visibility != "visible") {
			menu.style.visibility = "visible"
			visibleMenus.push(menu.id)
		}
	} else {
		if (menu.style.visibility == "visible") {
				menu.style.visibility = "hidden"
				visibleMenus.pop()
		}
	}
} catch(err) {
}
}

/* Set menu display position */
function setPos(menu) {
	var x = findPosX(menulinkobj)
	var y = findPosY(menulinkobj)
	var w = menulinkobj.offsetWidth
	var h = menulinkobj.offsetHeight
	if (this.menu == "menu") {
		menu.style.left = x + "px"
		menu.style.top = (y + h) + "px"
	} else {
		menu.style.left = (x + w) + "px"
		menu.style.top = y + "px"
	}
}

/* Find x posistion */
function findPosX(obj)
{
  var curleft = 0;
  if(obj.offsetParent)
      while(1) 
      {
        curleft += obj.offsetLeft;
        if(!obj.offsetParent)
          break;
        obj = obj.offsetParent;
      }
  else if(obj.x)
      curleft += obj.x;
  return curleft;
}

/* Find y posistion */
function findPosY(obj)
{
  var curtop = 0;
  if(obj.offsetParent)
      while(1)
      {
        curtop += obj.offsetTop;
        if(!obj.offsetParent)
          break;
        obj = obj.offsetParent;
      }
  else if(obj.y)
      curtop += obj.y;
  return curtop;
}