

  Array.prototype.findObj = function(obj)
  {
    var len = this.length;
    for (var i = 0; i < len; i++)
      if (this[i] == obj)
        return this[i];
    return null;
  }

  Array.prototype.removeObj = function(obj)
  {
    var len = this.length;
    var startDeleting = false;
    for (var i = 0; i < len; i++)
    {
      if (this[i] == obj)
        startDeleting = true;

      if (startDeleting && i < (len - 1))
        this[i] = this[i + 1];
      else if (startDeleting)
        this.pop();
    }
  }

  var menuFadeActive = new Array();



  function buildMenus()
  {
    var divElms = document.getElementsByTagName('DIV');
    var di = divElms.length;
    var toBuild = [];

    for (var i = 0; i < di; i++)
    {
      var divElm = divElms[i];
      if (/(^|\s)menubar($|\s)/.test(divElm.className))
      {
        var aElms = divElm.getElementsByTagName('A');
        var ai = aElms.length;
        for (var j = 0; j < ai; j++)
          toBuild.push(aElms[j]);
      }
    }

    var bi = toBuild.length;
    for (var i = 0; i < bi; i++)
      buildMenu(toBuild[i]);
  }

  function buildMenu(aElm)
  {
    // Find the structure definition
    var subStruct = null;
    var mi = menuStruct.length;
    for (var i = 0; i < mi; i++)
    {
      if (menuStruct[i].attachId == aElm.id)
      {
        subStruct = menuStruct[i];
        break;
      }
    }

    if (subStruct != null)
      appendDropDown(aElm, subStruct);
  }

  function appendDropDown(wrapAround, subStruct)
  {
    // Wrap an <ul><li> around the hyperlink
    var ulElmMain = document.createElement('UL');
    var liElmMain = document.createElement('LI');

    wrapAround.parentNode.replaceChild(ulElmMain, wrapAround);
    liElmMain.appendChild(wrapAround);
    ulElmMain.appendChild(liElmMain);

    // Create container for the sub items
    var ulElm = document.createElement('UL');

    // Append sub items according to subStruct
    var mi = subStruct.items.length;
    for (var i = 0; i < mi; i++)
      ulElm.appendChild(createSubItem(subStruct.items[i]));

    liElmMain.appendChild(ulElm);
    trapDropDownEvents(liElmMain);

    // Create a fix for the float mess :]
    fixElm = document.createElement('DIV');
    fixElm.style.clear = 'both';
    ulElmMain.parentNode.appendChild(fixElm);
  }

  function createSubItem(item)
  {
    var liElm = document.createElement('LI');
    var aElm = document.createElement('A');
    var txtNode = document.createTextNode(item.text);
    aElm.appendChild(txtNode);
    aElm.href = item.url;
    liElm.appendChild(aElm);
    trapSubEvents(liElm);
    return liElm;
  }

  function trapSubEvents(elm)
  {
    elm.onmouseover = function() { this.className = 'hover'; }
    elm.onmouseout = function() { this.className = ''; }
  }

  function trapDropDownEvents(elm)
  {
    elm.onmouseover = function()
    {
      if (menuDDactive == this)
      {
        clearTimeout(menuTimer);
        menuTimer = null;
        return;
      }

      if (menuDDactive != null)
        closeDropDown();

      this.className = 'hover';

      var fadeObj = this.firstChild.nextSibling;
      var existing = menuFadeActive.findObj(fadeObj);
      if (existing != null)
        fadeObj = existing;
      else
      {
        fadeObj.perc = 0;
        menuFadeActive.push(fadeObj);
      }

      fadeObj.step = menuFadeInStep;
      fadeObj.timing = menuFadeInTiming;
      fadeObj.callbackDone = function(elm)
      {
        menuFadeActive.removeObj(elm);
      }

      if (existing == null)
        setOpacity(fadeObj);

      menuDDactive = this;
    }

    elm.onmouseout = function()
    {
	  menuTimer = setTimeout(closeDropDown, menuTimeout);  
      document.onclick = closeDropDown;
    }
  }

  function closeDropDown()
  {
    if (menuTimer != null)
    {
      clearTimeout(menuTimer);
      menuTimer = null;
    }

    var fadeObj = menuDDactive.firstChild.nextSibling;
    var existing = menuFadeActive.findObj(fadeObj);
    if (existing != null)
      fadeObj = existing;
    else
    {
      menuFadeActive.push(fadeObj);
      fadeObj.perc = opaPercent;
    }

    fadeObj.step = -menuFadeOutStep;
    fadeObj.timing = menuFadeOutTiming;
    fadeObj.callbackDone = function(elm)
    {
      elm.parentNode.className = '';
      menuFadeActive.removeObj(elm);
    }

    if (existing == null)
      setOpacity(fadeObj);

    menuDDactive = null;
    document.onclick = null;
  }

  function setOpacity(elm)
  {
    var pr = elm.perc / 100;
    with (elm.style)
    {
        opacity = pr;
        MozOpacity = pr;
        KhtmlOpacity = pr;
        filter = 'alpha(opacity=' + elm.perc + ')';
    }

    if ((elm.step > 0 && elm.perc < opaPercent) || (elm.step < 0 && elm.perc > 0))
    {
     elm.perc += elm.step;
     setTimeout(function(elm) { return function() { setOpacity(elm); }}(elm), elm.timing);
    }
    else
      elm.callbackDone(elm);
  }
  
  //////////////////////////////////////////////////////////////////