////////////////////
// Globals


var debug = false
//debug = true
var zIndex = 0
var idCounter = 0
var menuBarCounter = 1
var esMenuObject = new Array()

var statusWindow = null
var statusMessage = new Array()

var browser = ""

var isFirst = true

var linkList = new Array();


                      
/////////////////////
// Browser detetction

var agent = navigator.userAgent
//var agent = "MSIE"

if (agent.indexOf("Opera") >= 0)
  browser = "Op"
else if (agent.indexOf("Netscape") >= 0 || agent.indexOf("Gecko") >= 0)
  browser = "NS"
else if (agent.indexOf("MSIE") >= 0)
  browser = "IE"

////////////////////
// Utility functions

function trace(msg)
{
  if(!debug)
    return
    
  if(statusWindow == null)
    statusWindow = window.open("wnd.htm","","height=400, width=500, status=no, toolbar=no, menubar=no, location=no")
  
  statusMessage[statusMessage.length] = msg
  statusWindow.document.writeln("<html><body>")
  for(var i=statusMessage.length-1; i>=0; i--)
  {
    statusWindow.document.writeln(i + ". " + statusMessage[i] + "<br>")
  }
  statusWindow.document.writeln("</body></html>")
  statusWindow.document.close()
}

function generateId(obj)
{
  var elemId = "menuElem" + idCounter
  esMenuObject[elemId] = obj
	idCounter++
  return elemId
}

function getObj(id)
{
  if(typeof id == "string")
	{
	  return document.getElementById(id)
	}
	else return id
}

function getPageOffsetLeft(el)
{
  // Return the x coordinate of an element relative to the page.
  var x
  x = el.offsetLeft
  if (el.offsetParent != null)
    x += getPageOffsetLeft(el.offsetParent)
  return x
}

function getPageOffsetTop(el)
{
  // Return the x coordinate of an element relative to the page.
  var y
  y = el.offsetTop
  if (el.offsetParent != null)
    y += getPageOffsetTop(el.offsetParent)
  return y
}

function hideESMenu(menu)
{
  esMenuObject[menu].requestHide()
}

function textInList(text)
{
  for(var i = 0; i < linkList.length; i++)
  {
    if(text == linkList[i])
      return true;
  }
  return false;
}
////////////////////////////////////////////////////////////
// Common functions; execution is dependent on object's type
// (this is for simulating virtual functions)

function add(obj)
{
  if(this.type == "esMenu")
	{
	  if(obj.type == "esMenuItem")
		{
      this.docElem.appendChild(obj.docElem)
      this.childLinks[this.childLinks.length] = obj
      obj.inVerticalMenu = this.vertical
      obj.parentMenu = this
//      if(this.isMain)
//      {
//        obj.docElem.onclick = "return false;";
//      }
//      if(this.isMain && isFirst)
//      {
//        obj.docElem.style.borderLeftColor = "#0076A4";
//        isFirst = false;
//      }
		}
		else if(obj.type == "esMenu")
		{
      var linkBefore = esMenuObject[this.docElem.lastChild.id]
      linkBefore.submenu = obj
      document.getElementById("menuGoesHere").appendChild(obj.docElem)
			obj.parentLink = linkBefore
      obj.parentMenu = this
		}
	}
	else if(this.type == "esMenuItem")
	{
	  alert("What are you doing? You shouldn't add things to esMenuItems!!!")
	}
}

function getType()
{
  return this.type
}

function updateWidth(uglyNSHackValue)
{
  if(this.type == "esMenu")
  {
    var largest = 120
    //var largest
    var i
    
    // Add text (and imgs)
    for(i = 0; i < this.childLinks.length; i++)
    {
      if(this.childLinks[i].submenu)
      {
        // Add text
        if(this.vertical)
        {
          var spanElem1 = document.createElement("SPAN")
          spanElem1.appendChild(document.createTextNode(this.childLinks[i].text))
          this.childLinks[i].docElem.appendChild(spanElem1)
        }
        else
        {
          this.childLinks[i].docElem.appendChild(document.createTextNode(this.childLinks[i].text))
        }
        
        /*
        // Add image
        var img = document.createElement("IMG")
        
        if(this.vertical)
        {
          var spanElem2 = document.createElement("SPAN")
          spanElem2.appendChild(img)
          this.childLinks[i].docElem.appendChild(spanElem2)
          img.src = "arrowright.gif"
        }
        else
        {
          var img = document.createElement("IMG")
          this.childLinks[i].docElem.appendChild(img)
          img.src = "arrowdown.gif"
        }
        
        img.style.borderWidth = 0 + "px"
        */
      }
      else
      {
        if(this.vertical)
        {
          var spanElem = document.createElement("SPAN")
          spanElem.appendChild(document.createTextNode(this.childLinks[i].text))
          this.childLinks[i].docElem.appendChild(spanElem)
        }
        else
        {
          this.childLinks[i].docElem.appendChild(document.createTextNode(this.childLinks[i].text))
        }
      }
      
//      trace("offsetWidth for" + this.childLinks[i].elemId + ": " + this.childLinks[i].docElem.offsetWidth)
      if(this.childLinks[i].docElem.offsetWidth > largest)
        largest = this.childLinks[i].docElem.offsetWidth
      
      if(browser == "NS")
      {
        this.childLinks[i].docElem.style.height = uglyNSHackValue + "px"
      }
    }
    
//    if(browser != "Op")
//      largest += 0

    // Set float, update widths and call next submenu (if any)
    for(i = 0; i < this.childLinks.length; i++)
    {
      if(this.vertical)
      {
        this.childLinks[i].docElem.style.width = largest + "px"
/*        if(this.childLinks[i].submenu)
        {
          if(browser == "IE")
          {
            this.childLinks[i].docElem.firstChild.style.styleFloat = "left"
            this.childLinks[i].docElem.lastChild.style.styleFloat = "right"
          }
          else
          {
            this.childLinks[i].docElem.firstChild.style.cssFloat = "left"
            this.childLinks[i].docElem.lastChild.style.cssFloat = "right"
          }
        }
*/
      }
      if(this.childLinks[i].submenu)
        this.childLinks[i].submenu.updateWidth(uglyNSHackValue)
    }
  }
}

// Event handler when mouse is moved over the object
function onMouseOver()
{
  if(this.type == "esMenu")
	{
    this.isMouseOver = true
    clearTimeout(this.timerId)
    this.docElem.style.visibility = "visible"
    if(this.parentLink)
    {
      if(browser == "IE")
      {
        this.parentLink.docElem.setAttribute("className", "esActive")
      }
      else
      {
        this.parentLink.docElem.setAttribute("class", "esActive")
      }
      if(this.parentLink.parentMenu)
        this.parentLink.parentMenu.onMouseOver()
    }
	}
	else if(this.type == "esMenuItem")
	{
    this.parentMenu.closeSubmenus()
    if(this.submenu)
    {
      this.parentMenu.closeSubmenus()
      
      var x = getPageOffsetLeft(this.docElem)
      var y = getPageOffsetTop(this.docElem)
      if(this.inVerticalMenu)
      {
        // <HACKMODE type=ugly>
        var xOffs = 0
        var yOffs = 0
        if(this.parentMenu.isSubMenu)
        {
          xOffs = 0
          yOffs = -2
        }
        // </HACKMODE>
        this.submenu.requestShow(x + this.docElem.offsetWidth + xOffs, y + yOffs)
      }
      else
        this.submenu.requestShow(x, y + this.docElem.offsetHeight)
    }
	}
}

function requestShow(x,y) 
{
  if(this.type == "esMenu")
	{
    clearTimeout(this.timerId)
    this.docElem.style.left = x + "px"
    this.docElem.style.top = y + "px"
    this.docElem.style.visibility = "visible"
/*
    if(this.parentMenu.isSubMenu)
    {
      this.docElem.style.borderTop = 1 + "px solid #000000"
    }
*/      

    if(this.parentLink)
    {
      if(browser == "IE")
      {
        this.parentLink.docElem.setAttribute("className", "esActive")
      }
      else
      {
        this.parentLink.docElem.setAttribute("class", "esActive")
      }
    }
	}
}

// Event handler when mouse is moved off the object
function onMouseOut()
{
  if(this.type == "esMenu")
	{
    this.isMouseOver = false
    if(this.isSubMenu)
    {
      this.timerId = setTimeout("hideESMenu('" + this.docElem.id + "')", 2000)
      //this.requestHide()
      if(this.parentLink)
      {
        if(this.parentLink.parentMenu)
          this.parentLink.parentMenu.onMouseOut()
      }
    }
	}
	else if(this.type == "esMenuItem")
	{
    if(this.submenu)
    {
      this.submenu.timerId = setTimeout("hideESMenu('" + this.submenu.docElem.id + "')", 2000)
      //this.submenu.requestHide()
    }
	}
}

function requestHide() 
{
  if(this.type == "esMenu")
	{
    if(!this.isMouseOver)
    {
      if(this.parentLink)
      {
        if(browser == "IE")
        {
          if(this.parentLink.isSelected)
          {
            this.parentLink.docElem.setAttribute("className", "esSelected")
          }
          else
          {
//            trace("Setting no class on " + this.parentLink.elemId)
            this.parentLink.docElem.setAttribute("className", "")
          }
        }
        else
        {
          if(this.parentLink.isSelected)
          {
            this.parentLink.docElem.setAttribute("class", "esSelected")
          }
          else
          {
//            trace("Setting no class on " + this.parentLink.elemId)
            this.parentLink.docElem.setAttribute("class", "")
          }
        }
      }
      getObj(this.elemId).style.visibility = "hidden"
    }
	}
}

function closeSubmenus()
{
  if(this.type == "esMenu")
  {
    if(!this.isMain)
      this.docElem.style.visibility = "hidden"
      
    if(this.parentLink)
    {
      if(browser == "IE")
      {
        if(this.parentLink.isSelected)
        {
          this.parentLink.docElem.setAttribute("className", "esSelected")
        }
        else
        {
//          trace("Setting no class on " + this.parentLink.elemId)
          this.parentLink.docElem.setAttribute("className", "")
        }
      }
      else
      {
        if(this.parentLink.isSelected)
        {
          trace("Setting esSelected on parent")
          this.parentLink.docElem.setAttribute("class", "esSelected")
        }
        else
        {
//          trace("Setting no class on " + this.parentLink.elemId)
          this.parentLink.docElem.setAttribute("class", "")
        }
      }
    }

    for(var i = 0; i < this.childLinks.length; i++)
    {
      if(this.childLinks[i].submenu)
        this.childLinks[i].submenu.closeSubmenus()
    }
  }
}

/////////////////////////////////////////////////////////
/////////// Object definitions //////////////////////////

function esMenu(menuType, orientation)
{
  // Setup menu and add div tag
  this.type = "esMenu"               // Used for simulating virtual functions
	this.elemId = generateId(this)

	this.vertical = false
  this.isMain = false
	this.parentLink = null
	this.show = true
  this.isMouseOver = false
  this.isSubMenu = false
  this.childLinks = new Array()
  this.timerId = null
  
	this.docElem = document.createElement("div")
	this.docElem.id = this.elemId
  
  this.docElem.style.zIndex = zIndex
  zIndex += 1
	
	if(menuType == "main")
	{
	  if(orientation == "vertical")
    {
      if(browser == "IE")
        this.docElem.setAttribute("className", "esMenuBarVertical")
      else
        this.docElem.setAttribute("class", "esMenuBarVertical")
      this.vertical = true
    }
    else
    {
      if(browser == "IE")
        this.docElem.setAttribute("className", "esMenuBarIE")
      else
        this.docElem.setAttribute("class", "esMenuBar")
    }
    
    this.isMain = true
		var elem = document.getElementById("menuGoesHere")
		if(elem)
		  elem.appendChild(this.docElem)
		else
		  alert("Add a div with id 'menuGoesHere' where you want the menu to appear!")
	}
	else
	{
    if(browser == "IE")
      this.docElem.setAttribute("className", "esPopupMenuIE");
    else
      this.docElem.setAttribute("class", "esPopupMenu");
		this.vertical = true
  	this.show = false
    this.isSubMenu = true
	}
  
  this.docElem.onmouseover = function(){
    esMenuObject[this.id].onMouseOver()
  }
  this.docElem.onmouseout = function(){
    esMenuObject[this.id].onMouseOut()
  }

	// Member functions
	this.add = add
	this.onMouseOver = onMouseOver
	this.onMouseOut = onMouseOut
	this.requestShow = requestShow
	this.requestHide = requestHide
  this.getType = getType
  this.updateWidth = updateWidth
  this.closeSubmenus = closeSubmenus
}

function esMenuItem(text, url, selected)
{
  this.type = "esMenuItem"           // Used for simulating virtual functions
	this.elemId = generateId(this)
  this.text = text
//  this.text = text + "(" + this.elemId + ")"
  this.isSelected = false

  if(textInList(text))
  {
    this.docElem = document.createElement("span")
  }
  else
  {
    this.docElem = document.createElement("a")
    this.docElem.href = url
  }
  
	this.docElem.id = this.elemId
  
  if(selected == "1")
  {
    this.isSelected = true
	  this.docElem.setAttribute("className", "esSelected");  // for IE
	  this.docElem.setAttribute("class", "esSelected");  // for Netscape
  }

  this.docElem.onmouseover = function(){
    esMenuObject[this.id].onMouseOver()
  }
  this.docElem.onmouseout = function(){
    esMenuObject[this.id].onMouseOut()
  }

	this.submenu = null
  this.inVerticalMenu = false
	
	// Member functions
	this.add = add
	this.onMouseOver = onMouseOver
	this.onMouseOut = onMouseOut
  this.getType = getType
}

