/*********************************************************
* Simple custom-made drop down menu system
*
* Developed by Trevor Maggs for DOM-based web browsers ONLY. 
* Firefox, Safari and IE5+ are supported. Mac IE5, Opera 
* and Konqueror NOT tested yet.
*
* Send an email: trevor.maggs@netcall.com.au if you have any 
* feedback on this script or wish to seek permission to use 
* this script.
* 
* Modified date: 31 May 2005
*********************************************************/

function detectBrowser()
{
  var ua, s, i;

  this.isIE = false; // Internet Explorer
  this.isOP = false; // Opera
  this.isGK = false; // Netscape
  this.isSF = false; // Safari
  this.version = null;

  ua = navigator.userAgent;

  s = "Opera";
  if ((i = ua.indexOf(s)) >= 0)
  {
    this.isOP = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  s = "Netscape6/";
  if ((i = ua.indexOf(s)) >= 0)
  {
    this.isGK = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }

  // Treat any other "Gecko" browser as Netscape 6.1.

  s = "Gecko";
  if ((i = ua.indexOf(s)) >= 0)
  {
    this.isGK = true;
    this.version = 6.1;
    return;
  }
  
  s = "MSIE";
  if ((i = ua.indexOf(s)))
  {
    this.isIE = true;
    this.version = parseFloat(ua.substr(i + s.length));
    return;
  }
}

// Global variables - do not edit

var browser = new detectBrowser();
var initialised = false;
var currentButton;
var sumXborder;
var sumYborder;
var adjustedItemPos;
var screenWidth;
var delay;

if (browser.isIE) document.onmousedown=captureMouseDown;
else document.addEventListener("mousedown", captureMouseDown, false);

function initaliseMenu()
{
  var w3cMode, ref, div, i, dw, w;
  var elm = document.getElementById("menuBar").getElementsByTagName("A").item(0);

  sumYborder = sumXborder = -1;
  adjustedItemPos = 1;
  currentButton = null;  

  if (browser.isIE)
  {  
    // Fix IE hover problem by forcing an explicit width on first item of all menu containers
    div = document.getElementsByTagName("DIV");

    for (i=0; i < div.length; i++)
    {
      if (div[i].className == "menu")
      {
        ref = div[i].firstChild;

        // Fix broken box model on Windows IE5
        if (browser.version < 6) adjustedItemPos = -ref.offsetLeft + 2;

        w = ref.offsetWidth;
        ref.style.width = w + "px";
        dw = ref.offsetWidth - w;
        w = w - dw;
        ref.style.width = w + "px";
      }
    }

    // Add adjusted border widths from offsettop and offsetleft
    while (elm.offsetParent)
    {
      sumYborder += parseInt(elm.currentStyle["borderTopWidth"]);
      sumXborder += parseInt(elm.currentStyle["borderLeftWidth"]);
      elm = elm.offsetParent;
    }	
  }
  
  // Add adjusted border widths from offsettop and offsetleft for W3C
  else while (elm.offsetParent)
  {
    sumYborder += parseInt(document.defaultView.getComputedStyle(elm, null).getPropertyValue("border-top-width"));
    sumXborder += parseInt(document.defaultView.getComputedStyle(elm, null).getPropertyValue("border-left-width"));
    elm = elm.offsetParent;
  }

  w3cMode = (document.compatMode && document.compatMode == "CSS1Compat") ? true : false;

  if (browser.isIE && w3cMode) screenWidth = document.documentElement.clientWidth + document.documentElement.scrollLeft;
  else if (browser.isIE) screenWidth = document.body.clientWidth + document.body.scrollLeft;
  else screenWidth = window.innerWidth + window.pageXOffset;

  initialised=true;
}

function activateButton(event, itemID)
{
  var button;

  if (!initialised) return false;

  clearTimeout(delay);
  button = (browser.isIE) ? window.event.srcElement : event.currentTarget;

  // Unless the node is an "A" element, any contained elements must be ignored
  if (button.parentNode.id != "menuBar") return false; 

  button.blur();
		
  if (button == currentButton) return false;
  else if (currentButton) deactivateButton();  

  if (!button.menu) button.menu = document.getElementById(itemID);

  depressButton(button);
  currentButton = button;
  
  return false;
}

function depressButton(button)
{
  var x, y;

  x = getAbsoluteLeftPosition(button) + sumXborder;
  y = getAbsoluteTopPosition(button) + sumYborder + button.offsetHeight;
  
  button.onmouseout = moveMouseOut;
  button.menu.onmouseout = moveMouseOut;
  button.className = "activeButton";

  button.menu.style.left = x + "px";
  button.menu.style.top = y + "px";
  button.menu.style.visibility = "visible";  
}

function deactivateButton()
{
  currentButton.className="";
  
  if (currentButton.menu)
  {
    deactivateSubMenu(currentButton.menu);
    currentButton.menu.style.visibility = "hidden";
  }

  currentButton = null;
}

function activateSubMenu(event, itemID)
{
  var x, y, item, menu;

  clearTimeout(delay);
  
  item = (browser.isIE) ? window.event.srcElement : event.currentTarget;
  menu = findElementContainer(item, "DIV", "menu");
  
  if (menu.activeItem) deactivateSubMenu(menu);

  menu.activeItem = item;
  item.className = "selectedItem";

  if (!item.subMenu) item.subMenu = document.getElementById(itemID);
  item.subMenu.onmouseout = moveMouseOut;

  x = getAbsoluteLeftPosition(item) + item.offsetWidth + adjustedItemPos;  
  y = getAbsoluteTopPosition(item);

  // Make sure the sub menu does not pop up beyond the right edge of the browser window
  if ((x + item.subMenu.offsetWidth) > screenWidth) x = x - item.offsetWidth - item.subMenu.offsetWidth;

  item.subMenu.style.left = x + "px";
  item.subMenu.style.top = y + "px";
  item.subMenu.style.visibility = "visible";

  // Stop bubbling to menuMouseOver function
  if (browser.isIE) window.event.cancelBubble = true;
  else event.stopPropagation();
   
  return false;
}

function deactivateSubMenu(menu)
{
  if (!menu || !menu.activeItem) return;

  if (menu.activeItem.subMenu)
  {
    deactivateSubMenu(menu.activeItem.subMenu);
    menu.activeItem.subMenu.style.visibility = "hidden";
    menu.activeItem.subMenu = null;
  }	

  menu.activeItem.className = "highlightedItem";
  menu.activeItem = null;
}

function moveMouseOut(event)
{
  var elm;
		
  if (!currentButton) return false;
  
  if (browser.isIE) elm = window.event.toElement;
  else if (event.relatedTarget) elm = (event.relatedTarget.nodeType == 1) ? event.relatedTarget : event.relatedTarget.parentNode;
  
  if (!findElementContainer(elm, "DIV", "menu")) delay=setTimeout(deactivateButton, 500);

  return false;
}

function menuMouseOver(event)
{
  var menu = (browser.isIE) ? findElementContainer(window.event.srcElement, "DIV", "menu") : event.currentTarget;

  clearTimeout(delay);
  if (menu.activeItem) deactivateSubMenu(menu);

  return false;
}

function getAbsoluteLeftPosition(elm)
{
  var x=elm.offsetLeft;

  if (elm.offsetParent) x += getAbsoluteLeftPosition(elm.offsetParent);
  return x;
}

function getAbsoluteTopPosition(elm)
{
  var y=elm.offsetTop;

  if (elm.offsetParent) y += getAbsoluteTopPosition(elm.offsetParent);
  return y;
}

function findElementContainer(elm, tname, cname)
{
  // With a given node, find the nearest containing element with the specified tag name and style class
  while (elm)
  {
    if (elm.tagName && elm.tagName == tname && elm.className == cname) return elm;
    elm = elm.parentNode;
  }

  return elm;
}

function captureMouseDown(event)
{
  var elm;
  
  if (!currentButton) return false;
  else if (browser.isIE) elm=window.event.srcElement;
  else elm = (event.target.nodeType == 1) ? event.target : event.target.parentNode;  

  if (elm == currentButton) return false;

  if (!findElementContainer(elm, "DIV", "menu"))
  {
    clearTimeout(delay);  
    deactivateButton();
  }	

  return false;
}

// window.onload = initaliseMenu;
