MenuManager = {
  Behaviours : {
    "#navigation_menu .link" : function(element) {
      if (element.getElementsByTagName("div")[0])
      {
        MenuManager.addHTML(element, element.getElementsByTagName("div")[0]);
      }
    },
    "#__menu__ .toggle" : 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";
        }
      }
    }
  },

  NestedListCount : 0,

  MinWidth : function() {
    // work in progress... trying to make the menu resize when toggling
    MenuManager.options.width = 200;
    MenuManager.options.width = MenuManager.options.width + (20 * MenuManager.NestedListCount);
    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:200, height: null, draggable: false, 
            minimizable: false, maximizable: false, showEffect: Element.show, hideEffect: Element.hide},

  elements: null,
  showTimer: null,
  hideTimer: null,

  init: function(cssClassName, menuOptions) {
    MenuManager.options = Object.extend(MenuManager.options, menuOptions || {});

    cssClassName = MenuManager.options.cssClassName || "menu";
    MenuManager.elements = $$("." + cssClassName);
    MenuManager.elements.each(function(element) {
      element = $(element)
      var info = MenuManager._getInfo(element);
      element.menuElement = $(info.id);
      element.observe("mouseover", MenuManager._mouseOver);
      element.observe("mouseout", MenuManager._mouseOut);
    });
    Windows.addObserver(this);
  },

  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();
    MenuManager.options.maxHeight = MenuManager.MaxHeight();
    MenuManager.options.wrap = false;

    if (! this.menuWindow)
    {
      this.menuWindow = new Window("__menu__", MenuManager.options);
    }

    //this.menuWindow.hide();
    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);

    Behaviour.apply();
    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);
    MenuManager.showTimer = setTimeout(function() {MenuManager._showMenu(element)}, 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;
  }
};

Behaviour.register(MenuManager.Behaviours);

Event.onReady( function() {
  if ($$("#navigation_menu td")[0])
  {
    $$("#navigation_menu td")[0].className += " first";
  }
});