var menu_items = new Array();
var menu_timer = new Array();
var menu_waittime = 150; // milliseconds
var menu_level1id = '';
var menu_level2id = '';

function object_position(obj) {
  var curleft = curtop = 0;
  if (obj.offsetParent) {
    curleft = obj.offsetLeft
      curtop = obj.offsetTop
      while (obj = obj.offsetParent) {
        curleft += obj.offsetLeft
        curtop += obj.offsetTop
      }
  }
  return [curleft,curtop];
}

function menu_show(id) {
  for (var i = 0; i < menu_items.length; i++) {
    if (menu_items[i] != id && menu_items[i] != menu_level1id && document.getElementById(menu_items[i]).style.display != 'none') {
      menu_hide(menu_items[i]);
    }
  }
  menu_cancel(id);
  document.getElementById(id).style.display = 'block';
}

function menu_hide(id) {
  if (menu_level2id == id) {
    menu_level1id = menu_level2id = '';
  }
  menu_cancel(id);
  document.getElementById(id).style.display = 'none';
}

function menu_blur(id) {
  if (menu_level1id == id) { return; }
  menu_cancel(id);
  menu_timer[id] = setTimeout('menu_hide(\''+id+'\');', menu_waittime);
}

function menu_cancel(id) {
  if (menu_timer[id]) {
    clearTimeout(menu_timer[id]);
    menu_timer[id] = null;
  }
}

function menu_register_children(parent, sf, bf) {
  var children = parent.childNodes;
  if (! children) { return; }
  for (var i = 0; i < children.length; i++) {
    if (children[i].nodeName.substring(0,1) != "#") {
      children[i].onmouseover = sf;
      children[i].onmouseout = bf;
    }
    menu_register_children(children[i], sf, bf);
  }
}

function menu_register(id) {
  for (var i = 0; i < menu_items.length; i++) {
    if (menu_items[i] == id) { return; }
  }
  var show_function = new Function('menu_show(\'' + id + '\');');
  var blur_function = new Function('menu_blur(\'' + id + '\');');
  var o = document.getElementById(id);
  menu_items[menu_items.length] = id;
  o.onmouseover = show_function;
  o.onmouseout = blur_function;
  menu_register_children(o, show_function, blur_function);
}

function menu_popup(popupid, sourceid, offset, parentmenuid) {
  var menudiv = document.getElementById(popupid);
  var sourcediv = document.getElementById(sourceid);
  var sourcepos = object_position(sourcediv);

  menudiv.style.top = sourcepos[1] + "px"; // div.style.top;
  menudiv.style.left = (sourcepos[0] + offset) + "px"; // sourcediv.style.left;
  menudiv.style.display = "block";
  menudiv.style.position = "absolute";
  position = sourcediv.getAttribute("menuposition");
  if (position) {
    if (position.substring(0,1) == 'b') {
      menudiv.style.top = (parseInt(menudiv.style.top) - menudiv.offsetHeight + sourcediv.offsetHeight) + "px";
    }
    if (position.substring(1,2) == 'r') {
      menudiv.style.left = (parseInt(menudiv.style.left) - menudiv.offsetWidth + sourcediv.offsetWidth) + "px";
    }
  }
  menu_register(popupid);
  if (parentmenuid) { 
    menu_level1id = parentmenuid; 
    menu_level2id = popupid; 
  }
  menu_show(popupid);
}

