var menu_top_sub_spacing = 10;

var isDOM = (document.getElementById ? true : false); 
var isIE4 = ((document.all && !isDOM) ? true : false);
var isNS4 = (document.layers ? true : false);

function getRef(id) {
  if (isDOM) return document.getElementById(id);
  if (isIE4) return document.all[id];
  if (isNS4) return document.layers[id];
}

function getSty(id) {
  return (isNS4 ? getRef(id) : getRef(id).style);
} 

// Hide timeout.
var popTimer = 0;

// Array showing highlighted menu items.
var litNow = new Array();

function popOver(menuNum, itemNum) {
  clearTimeout(popTimer);
  hideAllBut(menuNum);
  litNow = getTree(menuNum, itemNum);
  changeCol(litNow, true);
  targetNum = menu[menuNum][itemNum].target;
  if (targetNum > 0) {
    thisX = parseInt(menu[menuNum][0].ref.left) + parseInt(menu[menuNum][itemNum].ref.left);
    thisY = parseInt(menu[menuNum][0].ref.top) + parseInt(menu[menuNum][itemNum].ref.top) + menu_top_sub_spacing;
    with (menu[targetNum][0].ref) {
      left = parseInt(thisX + menu[targetNum][0].x);
      top = parseInt(thisY + menu[targetNum][0].y);
      visibility = 'visible';
    }
  }
}

function popOut(menuNum, itemNum) {
  if ((menuNum == 0) && !menu[menuNum][itemNum].target)
    hideAllBut(0)
  else
    popTimer = setTimeout('hideAllBut(0)', 500);
}

function getTree(menuNum, itemNum) {
  // Array index is the menu number. The contents are null (if that menu is not a parent)
  // or the item number in that menu that is an ancestor (to light it up).
  itemArray = new Array(menu.length);
  while(1) {
    itemArray[menuNum] = itemNum;
    // If we've reached the top of the hierarchy, return.
    if (menuNum == 0) return itemArray;
    itemNum = menu[menuNum][0].parentItem;
    menuNum = menu[menuNum][0].parentMenu;
  }
}

// Pass an array and a boolean to specify colour change, true = over colour.
function changeCol(changeArray, isOver) {
  for (menuCount = 0; menuCount < changeArray.length; menuCount++) {
    if (changeArray[menuCount]) {
      newClass = isOver ? 'menu_class_hover' : 'menu_class';
      with (menu[menuCount][changeArray[menuCount]].ref) {
        var els = document.getElementById('menu'+menuCount+'item'+changeArray[menuCount]);
        els.className=newClass;
      }      
    }
  }
}

function hideAllBut(menuNum) {
  var keepMenus = getTree(menuNum, 1);
  for (count = 0; count < menu.length; count++)
  if (!keepMenus[count])
  menu[count][0].ref.visibility = 'hidden';
  changeCol(litNow, false);
}

// *** MENU CONSTRUCTION FUNCTIONS ***

function Menu(level) {

  if (level==0) {
    this.isVert=false;
    this.popInd='';
    this.x=document.getElementById("menu_tab").offsetLeft+10;
    this.y=document.getElementById("menu_tab").offsetTop;
    this.width=20;
    this.length=130;
    this.menuClass = 'menu_class';
    this.textClass = 'menu_text';
  }
  else {
    this.isVert=true;
    this.popInd='&#187;';
    this.width=200;
    this.length=20;
    this.menuClass = 'menu_class';
    this.textClass = 'menu_text';
    if (level==2) {
      this.x=this.width+5;
      this.y=-10;
    }
    else {
      this.x=0;
      this.y=22;
    }
  }
  this.parentMenu = null;
  this.parentItem = null;
  this.ref = null;
}

function Item(text, href, level, target, frame) {

  this.text = text;
  this.href = href;

  if (level==0) {
    this.text='&nbsp;'+this.text;
    this.length = 130;
    this.spacing = 10;
  }
  else {
    this.length = 20;
    this.spacing = 5;
  }
  if (frame) { this.frame=frame;}
  else       { this.frame='';}

  if (target) { this.target=target;}
  else        { this.target=0;}

  this.ref = null;
}

function writeMenus() {
  if (!isDOM && !isIE4 && !isNS4) return;
  for (currMenu = 0; currMenu < menu.length; currMenu++) with (menu[currMenu][0]) {
    var str = '', itemX = 0, itemY = 0;
    for (currItem = 1; currItem < menu[currMenu].length; currItem++) with (menu[currMenu][currItem]) {
      var itemID = 'menu' + currMenu + 'item' + currItem;
      var w = (isVert ? width : length);
      var h = (isVert ? length : width);

      if (isDOM || isIE4) {
        str += '<div id="' + itemID + '" style="position: absolute; left: ' + itemX + '; top: ' + itemY + '; width: ' + w + '; height: ' + h + '; visibility: inherit; ';
        str += '" ';
      }
      if (isNS4) {
        str += '<layer id="' + itemID + '" left="' + itemX + '" top="' + itemY + '" width="' +  w + '" height="' + h + '" visibility="inherit" ';
      }
      if (menuClass) str += 'class="' + menuClass + '" ';
      str += 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' + currMenu + ',' + currItem + ')">';
      str += '<table width="' + (w - 8) + '" border="0" cellspacing="0" cellpadding="' + (!isNS4 && menuClass ? 3 : 0) + '"><tr><td align="left" height="' + (h - 7) + '">' + '<a class="' + textClass + '" href="' + href + '"' + (frame ? ' target="' + frame + '">' : '>') + text + '</a></td>';
      if (target > 0) {
        menu[target][0].parentMenu = currMenu;
        menu[target][0].parentItem = currItem;
        if (popInd) str += '<td class="menu_popout" align="right">&#187;</td>';
      }
      str += '</tr></table>' + (isNS4 ? '</layer>' : '</div>');
      if (isVert) itemY += length + spacing;
      else itemX += length + spacing;
    }
    if (isDOM) {
      var newDiv = document.createElement('div');
      document.getElementsByTagName('body').item(0).appendChild(newDiv);
      newDiv.innerHTML = str;
      ref = newDiv.style;
      ref.position = 'absolute';
      ref.visibility = 'hidden';
    }

    // Insert a div tag to the end of the BODY with menu HTML in place for IE4.
    if (isIE4) {
      document.body.insertAdjacentHTML('beforeEnd', '<div id="menu' + currMenu + 'div" ' + 'style="position: absolute; visibility: hidden">' + str + '</div>');
      ref = getSty('menu' + currMenu + 'div');
    }

    // In NS4, create a reference to a new layer and write the items to it.
    if (isNS4) {
      ref = new Layer(0);
      ref.document.write(str);
      ref.document.close();
    }

    for (currItem = 1; currItem < menu[currMenu].length; currItem++) {
      itemName = 'menu' + currMenu + 'item' + currItem;
      if (isDOM || isIE4) menu[currMenu][currItem].ref = getSty(itemName);
      if (isNS4) menu[currMenu][currItem].ref = ref.document[itemName];
    }
  }

  with(menu[0][0]) {
    ref.left = x;
    ref.top = y;
    ref.visibility = 'visible';
  }
}
