var NumOpenMenus = 0;
var OpenMenus = new Array();
var TopMenu = 0;

window.onload = init;

// initialization function
function init()
{
  if (document.getElementById) // && document.childNodes && document.createElement)
  {
    // turn on debugging output
    //showDebug();

    TopMenu = document.getElementById("dmenu");
    if (!TopMenu)
        return;
    add_arrows(TopMenu);
    set_mouse_events(TopMenu);
    
    //TopMenu.onmouseout = close_all;
    document.body.onmouseover = close_all;
  }
}

// close all open menus passed a certain index
function close_from_index(index)
{
  if (NumOpenMenus)
    for (var i = NumOpenMenus - 1; i >= index; --i)
    {
      var li = OpenMenus[i];
      li.style.backgroundColor = "#e0e0e0";
      li.onclick = null;
      li.style.cursor = "default";
      li.style.textDecoration = "none";
  
      // hide submenu if any
      var submenu = get_subelement(li, "UL");  
      if (submenu)
      {
        //alert("hiding " + submenu.innerHTML);
        submenu.style.display = "none";
      
        // set arrow to down arrow
        get_subelement(li, "IMG").setAttribute("src", "down_arrow.gif");
      }
    }
  NumOpenMenus = index;
}

// close all submenus that need closing
function close_all(event)
{
  // if element that triggered event is part of the dynamic menu don't do anything
  event = event || window.event;
  var node = (window.event) ? event.srcElement : event.target;
  for (; node; node = node.parentNode)
    if (node == TopMenu)
      return false;
      
  // close all the dynamic menus
  close_from_index(0);
  return false;
}

// display a menu
function show_menu(li)
{ 
  // display submenu if any
  var submenu = get_subelement(li, "UL");
  if (submenu)
  {
    var img = get_subelement(li, "IMG");
    var img_pos = get_position(img);
    
    //set arrow to left arrow
    img.setAttribute("src", "arrow.gif");

    // display submenu
    submenu.style.display = "block";
    submenu.style.position = "absolute";
    submenu.style.left = (img.offsetLeft - 30) + "px";
    submenu.style.top = (img.offsetTop - 3) + "px";
  }
    
  // add to open menus
  OpenMenus[NumOpenMenus++] = li;
  
  // change background
  li.style.backgroundColor = "#fbbbb9";
  
  // set on click event for menu
  li.onclick = jump_to_link;
  li.style.cursor = "pointer";
  li.style.textDecoration = "underline";
  li.style.color = "#990033";
}

// display a submenu
function display_submenu(event)
{
  // retrieve list item that triggered event
  event = event || window.event;
  var li = (window.event) ? event.srcElement : event.target;
  while (li.nodeName != 'LI')
    li = li.parentNode;

  // if menu already displayed don't do anything
  for (var i = 0; i < NumOpenMenus; ++i)
    if (OpenMenus[i] == li)
    {
      close_from_index(i + 1);
      return false;
    }
      
  // close all menus
  close_from_index(0);
  
  // display current menu and its parents
  recursive_show(li);
  
  return false;
}

function recursive_show(node)
{
  if (!node || node == TopMenu)
    return;
  recursive_show(node.parentNode);
  if (node.nodeName == "LI")
    show_menu(node);
}

// set mouse over and mouse focus events for all elements in a menu
function set_mouse_events(menu)
{
  var menu_elements = menu.getElementsByTagName("LI");
  for (var i = 0; i < menu_elements.length; ++i)
  {
    menu_elements[i].onmouseover = display_submenu;
    menu_elements[i].onmousefocus = display_submenu;
  }
}

// hide all submenus in a menu
function hide_submenus(menu)
{
  var menu_elements = menu.getElementsByTagName("LI");
  for (var i = 0; i < menu_elements.length; ++i)
  {
    var submenu = get_subelement(menu_elements[i], "UL");
    if (submenu)
      submenu.style.display = "none";
  }
}

// jump to a link from the whole element containing the <a href>
function jump_to_link(event)
{
  // retrieve list item that triggered event
  event = event || window.event;
  var li = (window.event) ? event.srcElement : event.target;
  while (li.nodeName != 'LI')
    li = li.parentNode;

  // get handle on the anchor element
  var anchor = get_subelement(li, "A");
  if (anchor)
  {
    // extract url
    open(anchor.href, '_self');
  }
}

// add arrows at the end of each menu element that has a submenu (recursively)
function add_arrows(menu)
{
  for (var i = 0; i < menu.childNodes.length; ++i)
  {
    if (menu.childNodes[i].nodeName == "LI")
    {
      var sub_menu = get_subelement(menu.childNodes[i], "UL");
      if (sub_menu)
      {
        image = document.createElement("img");
        image.setAttribute("src", "down_arrow.gif");
        image.style.position = "absolute";
        image.style.right = "5px";
        menu.childNodes[i].appendChild(image);

        add_arrows(sub_menu);
      }
    }
  }
}

// get first subelement of an element that has tag name
function get_subelement(element, tag)
{
  var subelement = 0;
  
  // get children and look for submenu
  for (var i = 0; i < element.childNodes.length; ++i)
  {
    if (!subelement && element.childNodes[i].nodeName == tag)
      subelement = element.childNodes[i];
  }
  return subelement;
}

// get actual position of an element on a page [left, top]
function get_position(element)
{
  var position = {left: 0, top: 0};
  if (element.offsetParent)
    for (; element && element != document.body; element = element.offsetParent)
    {
      position.left += element.offsetLeft;
      position.top  += element.offsetTop;
    }
  return position;
}

// Show the debug window
function showDebug() {
  window.top.debugWindow =
      window.open("",
                  "Debug",
                  "left=0,top=0,width=300,height=700,scrollbars=yes,"
                  +"status=yes,resizable=yes");
  window.top.debugWindow.opener = self;
  // open the document for writing
  window.top.debugWindow.document.open();
  window.top.debugWindow.document.write(
      "<html><head><title>Debug Window</title></head><body><span id=\"debug\"></span></body></html>");
}

// If the debug window exists, then write to it
var debugCounter = 0;
function debug(msg) {
  if (window.top.debugWindow && ! window.top.debugWindow.closed) {
    debugCounter++;
    var debug_document = window.top.debugWindow.document;
    var t = debug_document.createTextNode("\n" + debugCounter + ": " + msg);
    var br = debug_document.createElement("br");
    var debug = debug_document.getElementById("debug");
    debug.appendChild(t);
    debug.appendChild(br);
  }
}

// If the debug window exists, then close it
function hideDebug() {
  if (window.top.debugWindow && ! window.top.debugWindow.closed) {
    window.top.debugWindow.close();
    window.top.debugWindow = null;
  }
}
