if (!document.getElementById)
{
  document.getElementById = function()
  {
    return null;
  }
}

////////////////////////////////////////////////////////////////////////////////
//
//  Dropdown menu class
//
////////////////////////////////////////////////////////////////////////////////

/**
 * Constructor
 */
var DropdownMenu = function()
{
  this.currentMenu = null;
  this.timer = null;
  this.timerOn = false;
  this.killMenuTimeout = 100;
}

/**
 * Initialise menu item
 */
DropdownMenu.prototype.initialiseItem = function(item, root)
{
	dm = this;
  item.onmouseover = function()
  {
    var menu = this.parentNode.parentNode;
    var children = menu.getElementsByTagName('li');
    for (var x = 0; x < children.length; x++)
    {
      dm.hideChildMenus(children[x], root);
    }
  }
}

/**
 * Initialise menu
 */
DropdownMenu.prototype.initialiseMenu = function (menu, starter, root)
{
  if (menu == null || starter == null)
  {
  	return;
  }

  this.currentMenu = menu;
  dm = this;

  // Starter: mouse over
  starter.onmouseover = function()
  {
    if (dm.currentMenu)
    {
      if (this.parentNode.parentNode != dm.currentMenu)
      {
        dm.currentMenu.style.visibility = 'hidden';
        dm.hideAllMenus(dm.currentMenu, root);
      }
      if (this.parentNode.parentNode == root)
      {
        while (dm.currentMenu.parentNode.parentNode != root)
        {
          dm.currentMenu.parentNode.parentNode.style.visibility = 'hidden';
          dm.currentMenu = dm.currentMenu.parentNode.parentNode;
        }
      }
      dm.currentMenu = null;
      this.showMenu();
    }
  }

  // Starter: mouse out
  starter.onmouseout = function()
  {
  	var children = menu.getElementsByTagName('li');
    for (var x = 0; x < children.length; x++)
    {
      dm.hideChildMenus(children[x], root);
    }
    try
    {
      menu.style.visibility = 'hidden';
    } catch (e) {}
  }

  // Starter: show menu
  starter.showMenu = function()
  {
  	// All browsers (except Opera)
    if (navigator.appName.toLowerCase().indexOf('opera') == -1)
    {
    	// Level 1
      if (this.parentNode.parentNode == root)
      {
      	if (navigator.appName.toLowerCase() != 'netscape')
      	{
          menu.style.left = this.offsetLeft + 'px';
      	}
        menu.style.top = this.offsetTop + this.offsetHeight + 'px';
        if (menu.offsetWidth < this.offsetWidth)
        {
        	menu.style.width = this.offsetWidth;
        }
      }
      // All other levels
	    else
	    {
	      menu.style.left = this.offsetLeft + this.offsetWidth + 'px';
	      menu.style.top = this.offsetTop + 'px';
	    }
    }
    // Opera
    else
    {
      var rootOffset = root.offsetLeft;
      // Level 1
      if (this.parentNode.parentNode == root)
      {
        menu.style.left = this.offsetLeft - rootOffset + 'px';
        menu.style.top = this.offsetHeight + 'px';
      }
      // All other levels
      else
      {
        menu.style.left = this.offsetWidth - rootOffset + 'px';
        menu.style.top = this.offsetTop + 'px';
      }
    }
    menu.style.visibility = 'visible';
    dm.currentMenu = menu;
  }

  // Menu: mouse over
  menu.onmouseover = function()
  {
    if (dm.currentMenu)
    {
      dm.currentMenu = null;
      dm.setActiveTrail(starter);
      this.showMenu();
    }
  }

  // Menu: mouse out
  menu.onmouseout = function()
  {
  	dm.unsetActiveTrail(starter);
    this.hideMenu();
  }

  // Menu: show menu
  menu.showMenu = function()
  {
    menu.style.visibility = 'visible';
    dm.currentMenu = menu;
    dm.stopTimer();
  }

  // Menu: hide menu
  menu.hideMenu = function()
  {
    if (!dm.timerOn)
    {
      dm.timer = setInterval("dm.killMenu('" + this.id + "', '" + root.id + "');", dm.killMenuTimeout);
      dm.timerOn = true;
      var children = menu.getElementsByTagName('li');
      for (var x = 0; x < children.length; x++)
      {
        dm.hideChildMenus(children[x], root);
      }
    }
  }
}

/**
 * Kill menu
 */
DropdownMenu.prototype.killMenu = function(menu, root)
{
  var menu = document.getElementById(menu);
  var root = document.getElementById(root);
  menu.style.visibility = 'hidden';
  var children = menu.getElementsByTagName('li');
  for (var x = 0; x < children.length; x++)
  {
    this.hideChildMenus(children[x], root);
  }
  while (menu.parentNode.parentNode != root)
  {
    menu.parentNode.parentNode.style.visibility = "hidden";
    menu = menu.parentNode.parentNode;
  }
  this.stopTimer();
}


/**
 * Get menus
 */
DropdownMenu.prototype.getMenus = function(item, root)
{
	var children = item.getElementsByTagName('li');
  for (var x = 0; x < children.length; x++)
  {
  	var menus = children[x].getElementsByTagName('ul');
  	var starter = children[x].getElementsByTagName('a').item(0);
    if (menus.length > 0)
    {
    	var menu = menus.item(0);
      this.getMenus(menu, root);
      this.initialiseMenu(menu, starter, root);
    }
    else
    {
      this.initialiseItem(starter, root);
    }
  }
}

/**
 * Hide all menus
 */
DropdownMenu.prototype.hideAllMenus = function(item, root)
{
	var children = item.getElementsByTagName('li');
  for (var x = 0; x < children.length; x++)
  {
  	var menus = children[x].getElementsByTagName('ul');
    if (menus.length > 0)
    {
      menus.item(0).style.visibility = 'hidden';
      this.hideAllMenus(menus.item(0), root);
    }
  }
}

/**
 * Hide child menus
 */
DropdownMenu.prototype.hideChildMenus = function(item, root)
{
  var menus = item.getElementsByTagName('ul');
	if (menus.length > 0)
	{
	  try
	  {
	    item = menus.item(0);
	    item.style.visibility = 'hidden';
	  } catch(e) {}
	}
}

/**
 * Stop timer
 */
DropdownMenu.prototype.stopTimer = function()
{
  if (this.timer)
  {
    clearInterval(this.timer);
    this.timer = null;
    this.timerOn = false;
	}
}

DropdownMenu.prototype.setActiveTrail = function(item)
{
	try
	{
		if (item.className.toLowerCase().indexOf('menu-starter') == -1)
		{
			item.className = 'starter starter-active';
		}
		else
		{
			item.className = 'menu-starter menu-starter-active';
		}
    //console.log(item.className);
	} catch(e) {}
}

DropdownMenu.prototype.unsetActiveTrail = function(item)
{
  try
  {
    if (item.className.toLowerCase().indexOf('menu-starter') == -1)
    {
      item.className = 'starter';
    }
    else
    {
      item.className = 'menu-starter';
    }
    //console.log(item.className);
  } catch(e) {}
}