var sm_ShowId;
var sm_HideId;
var sm_isInMenu = false;
var sm_lastNode = null;
var sm_offsetTop = 0;
var sm_set = false;

/**
 * SimpleMenu
 *
 * @author    Keita Ito <ki@networker.de>
 * @version   $Id$
 */
function SimpleMenu(node)
{
  this.init(node);
} // end class SimpleMenu


/**
 * Initializes SimpleMenu object.
 *
 * @param   mixed   node;
 */
SimpleMenu.prototype.init = function(node)
{
  this.node = node;
  this.menuItems = new Array();
} // end func init


/**
 * Adds menu item.
 *
 * @param   SimpleMenuItem
 * @access  public
 */
SimpleMenu.prototype.addMenuItem = function(menuItem)
{
  this.menuItems[this.menuItems.length] = menuItem;
} // end func addMenuItem


/**
 * Creates dynamic menu.
 *
 * @access  public
 */
SimpleMenu.prototype.create = function()
{
  var submenu = document.createElement('div');
  submenu.className = 'jsMenu';

  var submenuId = '_' + this.node.id;
  submenu.setAttribute('id', submenuId);
  submenu.setAttribute('parentId', this.node.id);

  submenu.style.top  = this.node.offsetTop + this.node.offsetHeight + 'px';
  submenu.style.left = this.node.offsetLeft + 'px';
  submenu.style.zIndex = 1;

  registerEvent(this.node, 'mouseover', function(){sm_showMenu(submenuId)});
  registerEvent(this.node, 'mouseout', function(){sm_setIsInMenu(false)});
  registerEvent(submenu, 'mouseover', function(){sm_setIsInMenu(true)});
  registerEvent(submenu, 'mouseout', function(){sm_setIsInMenu(false)});

  var html = '<h3 class="hidden">' + this.node.innerHTML + '</h3>';
  for (var i = 0; i < this.menuItems.length; ++i)
    html += this.menuItems[i].getLinkHtml();
  submenu.innerHTML = html;
    
  var bodyObj = document.getElementsByTagName('body')[0];
//  bodyObj.insertBefore(submenu, bodyObj.firstChild);
  if (!sm_set) {
    var head = document.createElement('h2');
    head.className = 'hidden';
    head.innerHTML = 'Site-Navigation';
    bodyObj.appendChild(head);
    sm_set = true;
  }
  bodyObj.appendChild(submenu);

  if (submenu.currentStyle) {
    submenu.iframeEl = submenu.parentNode.insertBefore(document.createElement('IFRAME'), submenu);
    submenu.iframeEl.style.display  = 'none';
    submenu.iframeEl.style.position = 'absolute';
    submenu.iframeEl.style.filter   = "alpha(opacity=0)";
  }
} // end func create


/**
 * SimpleMenuItem
 *
 * @author    Keita Ito <ki@networker.de>
 * @version   $Id$
 */
function SimpleMenuItem(value, href)
{
  this.value = (value == null) ? '' : value;
  this.href  = (href == null) ? '' : href;
} // end class SimpleMenuItem


/**
 * Gets HTML code for menu item.
 *
 * @return  string
 * @access  public
 */
SimpleMenuItem.prototype.getLinkHtml = function()
{
  if (this.value != '' && this.href != '')
    return '<a href="' + this.href + '">' + this.value + '</a><span class="hidden"><br /></span>';

  if (this.value != '')
    return '<div class="heading">' + this.value + '</div>';

  return '<div class="separator"></div>';
} // end func getLinkHtml


/**
 * Shows menu.
 *
 * @param   Node
 * @access  public
 */
function sm_showMenu(node)
{
  clearTimeout(sm_ShowId);
  if (typeof node == 'string')
    node = getNode(node);

  if (sm_lastNode != null && sm_lastNode != node) {
    sm_hideMenu(sm_lastNode);
  } else if (sm_lastNode == node) {
    sm_setIsInMenu(true);
    return;
  }

  var parentNode = getNode(node.getAttribute('parentId'));

  if (hasClassName(parentNode, 'selected')) {
    parentNode.className += ' isSelected';
  } else {
    parentNode.className += ' selected';
  }

  var menuLeft = getPageOffsetLeft(parentNode);
  var menuTop  = getPageOffsetTop(parentNode) + parentNode.offsetHeight;

  if (document.all && document.all[0].currentStyle) {
    menuLeft += parentNode.offsetParent.clientLeft;
    menuTop  += parentNode.offsetParent.clientTop;
  }

  node.style.left     = menuLeft + 'px';
  node.style.top      = menuTop + sm_offsetTop + 'px';
  node.style.display  = 'block';

  if (node.isInitialized == null)
    sm_initMenu(node);

  if (node.iframeEl != null) {
    node.iframeEl.style.left    = node.style.left;
    node.iframeEl.style.top     = node.style.top;
    node.iframeEl.style.width   = node.offsetWidth + 'px';
    node.iframeEl.style.height  = node.offsetHeight + 'px';
    node.iframeEl.style.display = '';
  }

  sm_setIsInMenu(true);
  sm_lastNode = node;
  sm_HideId = setTimeout('sm_hideMenu(sm_lastNode)', 500);
} // end func sm_showMenu


/**
 * Hides menu.
 *
 * @param   Node
 * @access  public
 */
function sm_hideMenu(node)
{
  if (node == null) {
    sm_setIsInMenu(false);
    sm_hideMenu(sm_lastNode);
    return;
  }

  if (typeof node == 'string')
    node = getNode(node);
  if (!sm_isInMenu) {
    node.style.display = 'none';
    if (node.iframeEl != null)
      node.iframeEl.style.display = 'none';

    parentNode = getNode(node.id.substring(1, node.id.length));
    if (hasClassName(parentNode, 'isSelected')) {
      removeClassName(parentNode, 'isSelected');
    } else {
      removeClassName(parentNode, 'selected');
    }

    sm_lastNode = null;
    clearTimeout(sm_HideId);
  } else {
    sm_HideId = setTimeout('sm_hideMenu(sm_lastNode)', 500);
  }
} // end func sm_hideMenu


/**
 * Toggles value of sm_isInMenu.
 *
 * @param   Node
 * @access  public
 */
function sm_setIsInMenu(value)
{
  sm_isInMenu = value;
  if (!value)
    clearTimeout(sm_ShowId);
} // end func sm_setIsInMenu


/**
 * Fix IE hover problem by setting explicit width on first item.
 *
 * @param   SimpleMenu
 * @access  public
 */
function sm_initMenu(menu)
{
  if (!(document.all && document.all[0].currentStyle))
    return;

  var itemList = menu.getElementsByTagName('A');
  if (itemList.length == 0)
    return;

  var itemWidth = itemList[0].offsetWidth;
  var w = itemList[0].offsetWidth;
  itemList[0].style.width = w + 'px';
  var dw = itemList[0].offsetWidth - w;
  w -= dw;
  itemList[0].style.width = w + 'px';

  menu.isInitialized = true;
} // end func sm_initmenu