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(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;

    // if nested lists, add in the toggles
    //if (MenuManager.NestedListCount > 0)
    //{
    //  w = w + (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,

  // i dont think this is being used anywhere...
  //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(element);
    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);
    }

    // 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;
  }
};

Behaviour.register(MenuManager.Behaviours);

Event.onReady( function() {
  if ($$("#navigation_menu td")[0])
  {
    $$("#navigation_menu td")[0].className += " first";
  }
});