MenuManager = {
  init: function() {
    $$("#navigation_menu .link").each(function(element) {
      if (element.getElementsByTagName("div")[0]) {
        MenuManager.addHTML(element, element.getElementsByTagName("div")[0]);
      }
    });
    // set toggle actions (do we even use this?);
    $$("#__menu__ .toggle").each(function(element) {
      var nestedList = element.parentNode.getElementsByTagName("td")[1].getElementsByTagName("div")[0];
      if (nestedList) {
        //MenuManager.NestedListCount++;
        var visible = $("navigation_menu").className.match("expanded") ? true : false;
        element.className = visible ? "toggle expanded" : "toggle collapsed";
        nestedList.style.display = visible ? "" : "none";
        element.onclick = function() {
          visible = nestedList.style.display == "" ? true : false;
          nestedList.style.display = visible ? "none" : "";
          element.className = visible ? "toggle collapsed" : "toggle expanded";
        }
      }
    });
    // add "first" classname to first td of menu
    if ($$("#navigation_menu td")[0]) {
      $$("#navigation_menu td")[0].className += " first";
    }
  },
  MinWidth: function(element) {
    var w = 160
    element.select("td.link a").each(function(e) {
      var W = e.innerHTML.length * 8; // char length * approximate average character width
      w = W > w ? W : w; // keep the largest value
    });
    MenuManager.options.width = w;
    return navigator.appVersion.match("MSIE") ? MenuManager.options.width : null;
  },
  MaxHeight: function() {
    var menuTop = $("navigation_menu").cumulativeOffset()[1] + $("navigation_menu").getHeight();
    return document.viewport.getHeight() - (menuTop + 10); // 10px of space below menu
  },
  options: { cssClassName: 'menu', delayOver: 1, delayOut: 400, shiftX: 0, shiftY: 0,
    className: 'alphamenu', width: null /*200*/, height: null, draggable: false,
    minimizable: false, maximizable: false, showEffect: Element.show, hideEffect: Element.hide
  },
  elements: null,
  showTimer: null,
  hideTimer: null,
  addHTML: function(element, menuElement) {
    element = $(element);
    menuElement = $(menuElement);
    element.menuElement = menuElement;
    element.observe("mouseover", MenuManager._mouseOver);
    element.observe("mouseout", MenuManager._mouseOut);
  },
  _showMenu: function(element) {
    if (this.element == element)
      return;
    // Get original element
    while (element && (!element.menuElement)) {
      element = element.parentNode;
    }
    this.element = element;
    MenuManager.showTimer = null;
    if (MenuManager.hideTimer) {
      clearTimeout(MenuManager.hideTimer);
    }
    var position = Position.cumulativeOffset(element);
    var dimension = element.getDimensions();
    // Keep IE from freaking out when there is no width specified
    MenuManager.options.width = MenuManager.MinWidth(element);
    MenuManager.options.maxHeight = MenuManager.MaxHeight();
    MenuManager.options.wrap = false;
    if (!this.menuWindow) {
      this.menuWindow = new Window("__menu__", MenuManager.options);
    }
    this.menuWindow.setLocation(position[1] + dimension.height + MenuManager.options.shiftY, position[0] + MenuManager.options.shiftX);
    Event.observe(this.menuWindow.element, "mouseover", function(event) { MenuManager._menuOver(event, element) });
    Event.observe(this.menuWindow.element, "mouseout", function(event) { MenuManager._menuOut(event, element) });
    // Reset width/height for computation
    this.menuWindow.height = MenuManager.options.height;
    this.menuWindow.width = MenuManager.options.width;
    // HTML content
    this.menuWindow.setHTMLContent(element.menuElement.innerHTML);
    this.menuWindow.show();
    this.menuWindow.toFront();
    var countNestedElements = false;
    $$(".alphamenu_content .link").each(function(element) {
      if (element.getElementsByTagName("div")[0]) {
        countNestedElements = true;
      }
    });
    if (!countNestedElements) {
      $$(".alphamenu_content .toggle").each(function(element) {
        element.style.display = "none";
      });
    }
  },
  _hideMenu: function(element) {
    if (this.menuWindow) {
      this.menuWindow.hide();
      this.element = null;
    }
  },
  _mouseOver: function(event) {
    var element = Event.element(event);
    if (MenuManager.showTimer) {
      clearTimeout(MenuManager.showTimer);
    }
    // set timeouts are doubled up
    // i don't like this, but it seemed the only way
    // to get rid of the scrollbars on the auto div
    MenuManager.showTimer = setTimeout(function() { MenuManager._showMenu(element); setTimeout(function() { MenuManager._showMenu(element); }, MenuManager.options.delayOver) }, MenuManager.options.delayOver);
  },
  _mouseOut: function(event) {
    var element = Event.element(event);
    if (MenuManager.showTimer) {
      clearTimeout(MenuManager.showTimer);
      MenuManager.showTimer = null;
      return;
    }
    if (MenuManager.menuWindow)
      MenuManager.hideTimer = setTimeout(function() { MenuManager._hideMenu(element) }, MenuManager.options.delayOut)
  },
  _menuOver: function(event, element) {
    if (MenuManager.hideTimer) {
      clearTimeout(MenuManager.hideTimer);
      MenuManager.hideTimer = null;
    }
  },
  _menuOut: function(event, element) {
    if (MenuManager.hideTimer == null)
      MenuManager.hideTimer = setTimeout(function() { MenuManager._hideMenu(element) }, MenuManager.options.delayOut)
  },
  _getInfo: function(element) {
    // Find html_ for static content
    var id = element.className.split(' ').detect(function(name) { return name.indexOf("html_") == 0 });
    id = id.substr(id.indexOf('_') + 1, id.length)
    return id;
  }
};

Event.onReady(function() {
  MenuManager.init();
});
