  /*
   * menus.js: This code implements a simple horizontal menu system.
   * (c) 2009 Bear Peak Software LLC
   *
   * This version hides the program viewer toolbar before showing a menu
   * and restores the toolbar when hiding a menu.
   */
  
  /* global vars */
  
  var menubar, mainmenu, submenuBox;
  var curSubmenu = null;
  var curMenuitem = null;
  
  // register onload listener
  registerEvent(window, "load", init);

  /* init */
  
  function init() {
    //log("init");
    
    // get the important menu elements
    menubar = document.getElementById("menubar");
    mainmenu = document.getElementById("mainmenu");
    submenuBox = document.getElementById("submenuBox");

    // init menubar behavior: add listeners to menuitems (IMG elements)
    var imgs = mainmenu.getElementsByTagName("img");
    for (var i = 0; i < imgs.length; i++) {
      var img = imgs[i];
      //log("img " + i + ": overimg=" + getOverimg(img) + " submenu=" + getSubmenu(img));
      registerEvent(img, "mouseover", doMenuitemMouseover);
      registerEvent(img, "mouseout", doMenuitemMouseout);
    }
    
    registerEvent(menubar, "click", resetMenubar);
    registerEvent(menubar, "mouseout", doMenubarMouseout);
  }
  
  /* utility functions */
  
  function eid(element) {
    var result = "null element";
    if (element)
      result = element.id ? element.id : "no id";
    return result;
  }
  
  function getOverimg(menuitem) {
    return menuitem.getAttribute("overimg");
  }
  
  function getSubmenu(menuitem) {
    var submenu = null;
    var subID = menuitem.getAttribute("submenu");
    if (subID)
      submenu = document.getElementById(subID);
    return submenu;
  }
  
  function highlightMI(menuitem) {
    curMenuitem = menuitem;
    menuitem.origSrc = menuitem.src;
    menuitem.src = getOverimg(menuitem);
  }

  function unHighlightMI() {
    if (curMenuitem) {
      curMenuitem.src = curMenuitem.origSrc;
      curMenuitem = null;
    }
  }
  
  function showSubmenu(submenu) {
    //log("showSubmenu: submenu=" + submenu + eid(submenu));
    curSubmenu = submenu;
    submenu.style.visibility = "visible";
    if (toolbar) {
      toolbar.style.visibility = "hidden";
    }
  }
  
  function hideSubmenu() {
    if (curSubmenu)
      curSubmenu.style.visibility = "hidden";
    curSubmenu = null;
    if (toolbar) {
      toolbar.style.visibility = "visible";
    }
  }
  
  function elementInSubmenuBox(element) {
    return (element && (element == submenuBox || element == curSubmenu || 
      element.parentNode == curSubmenu));
  }
  
  function resetMenubar() {
    hideSubmenu();
    unHighlightMI();
  }
  
  /* event listeners */
  
  function doMenuitemMouseover(e) {
    var target = e.target || e.srcElement;
    var submenu = getSubmenu(target);
    //log("doMenuitemMouseover: target=" + target + eid(target) + " submenu=" + submenu);
      
    highlightMI(target);
    
    if (submenu)
      showSubmenu(submenu);
  }

  function doMenuitemMouseout(e) {
    var target = e.target || e.srcElement;
    var to = e.relatedTarget || e.toElement;
    //log("doMenuitemMouseout: target=" + target + eid(target) + " to=" + to + eid(to));

    if (getSubmenu(target) == null || elementInSubmenuBox(to) == false)
      unHighlightMI();
  }

  function doMenubarMouseout(e) {
    var target = e.target || e.srcElement;
    var to = e.relatedTarget || e.toElement;
    //log("doMenubarMouseout: target=" + target + eid(target) + " to=" + to + eid(to));
      
    if (curSubmenu && elementInSubmenuBox(to) == false)
      resetMenubar();      
  }
  

