  var getParentChainFromElem = function(elem){
      myid = getNodeAttribute(elem, 'id');
      positionstring = myid.substring(myid.indexOf('0'), myid.length);      
      position = positionstring.split('-');
      return position;
  }
  
  var hideChildren = function(parent){
    elements = getElementsByTagAndClassName('ul', 'submenu');
    for(elem in elements){
      var position = getParentChainFromElem(parent);
      var elem_pos = getParentChainFromElem(elements[elem]);
//      alert(elem_pos[1] + " ?= " + position[1]);

      if(elem_pos.length >= position.length || elem_pos[1] != position[1]){
        hideElement(elements[elem]);
      }
    }
  }
  
  var hideAllSubmenus = function(event){
    hideChildren(this);
  }

  var hideMenusLater = function(call_no){
    if(call_no == mostRecentCall && hideNow){ hideChildren($('menu0')); }
  }
  
  var toggleVisibility = function(event){
    if(this.style.display == "none"){ hideChildren(this); showElement(this);  } else { hideElement(this); hideChildren(this); }
  }

  var makeVisible = function(event){
     chain = getParentChainFromElem(this, 'id');
     position = elementPosition(chain.join("-"));
     position['y'] += 19;
     setElementPosition(this, position);
     hideChildren(this); showElement(this);
  }

  var makeInvisible = function(event){
     if(!cursorOnMenu()){ hideElement(this); hideChildren(this); }
  }

  var unhighlightAll = function(){
    elements = getElementsByTagAndClassName('li', 'highlight');
    for(elem in elements){ if(hasElementClass(elements[elem], 'highlight')){ removeElementClass(elements[elem], 'highlight'); } }
  }

  var highlightTrail = function(event){
    var position;
    var positioncopy;
    unhighlightAll();
    position = getParentChainFromElem(this);
    positioncopy = getParentChainFromElem(this);
    for(var i=0; i<(position.length - 1); i++){
      addElementClass(positioncopy.join("-"), 'highlight');
      positioncopy.pop();
    }
  }

  var mostRecentCall = 0;
  var hideNow = true;

  var falseHideNow = function(event){
    hideNow = false;
  } 

  var trueHideNow = function(event){
    hideNow = true;
  } 

  var nothing = function(event){
    if(getNodeAttribute(event.relatedTarget(), 'class')){
        index = getNodeAttribute(event.relatedTarget(), 'class').indexOf('menu')
        mostRecentCall++;
        callNoCopy = mostRecentCall;
        setTimeout("hideMenusLater(" + callNoCopy + ")", 1200)
    } else {
      mostRecentCall++;
      callNoCopy = mostRecentCall;
      setTimeout("hideMenusLater(" + callNoCopy + ")", 1200)
    }
  }
  
  loadfunc_navblock = function(){
    trueHideNow();
    hideChildren(getElement("menu0"));
    elems = getElementsByTagAndClassName('ul', 'submenu');
    for(e in elems){
      connect(elems[e], 'onmouseout', $('menu0'), nothing);
      connect(elems[e], 'onmouseout', elems[e], trueHideNow);
      connect(elems[e], 'onmouseover', elems[e], falseHideNow);
    }
    elems = getElementsByTagAndClassName('li', 'menuitem');
    for(e in elems){
      connect(elems[e], 'onmouseover', elems[e], highlightTrail);
      connect(elems[e], 'onmouseout', elems[e], unhighlightAll);
      connect(elems[e], 'onmouseout', elems[e], trueHideNow);
      connect(elems[e], 'onmouseover', elems[e], falseHideNow);
      menu_element = "menu" + getNodeAttribute(elems[e], 'id');
      if(getElement(menu_element) != null){
         connect(elems[e], 'onmouseover', $(menu_element), makeVisible); 
         connect(elems[e], 'onmouseout', $('menu0'), nothing);
      } else {
        connect(elems[e], 'onmouseover', elems[e], hideAllSubmenus);
      }
    }
  }

addLoadEvent(loadfunc_navblock);
