// Global variables
var openMenus = new MenuItem('Root');
var timeout = 500;

function showMenu(id, level, refElem) {
  doReset(level);
  
  var menu = openMenus.getChild();
  while (menu != null) {
    stopClosing(menu.getId());
    menu = menu.getChild();
  }
  var elem = document.getElementById(id);
  if (elem) {
     if (level > 0) {
         moveElement(elem, refElem.offsetTop, refElem.offsetLeft + refElem.offsetWidth);
     }	
     elem.style.visibility = 'visible';
     var newMenu = new MenuItem(id);
     openMenus.push(newMenu);
  }
}

function moveElement(elem, y, x) {
  elem.style.top = y - 2 + 'px';
  elem.style.left = x + 7 + 'px';  	
}

function closeMenu(id) {
  var menu = null;
  var elem = null;
  do { 
     menu = openMenus.pop();
     elem = document.getElementById(id);
     elem.style.visibility = 'hidden';     
  } while (menu.getId() != id);     
}

function startClosing(id) {
   var menu = openMenus.getMenu(id);
   if (menu == null) return;
   var timer = window.setTimeout('doReset(0)', timeout);
   menu.setTimer(timer);
   
}

function stopClosing(id) {
  var menu = openMenus.getMenu(id); 
  if (menu.getTimer() != null) {
     window.clearTimeout(menu.getTimer());
     menu.setTimer(null);
  }
}

function doReset(level) {
  var menu = openMenus.pop();
  if (menu == null) {
    return; 
  }

  while (menu != null && menu.getLevel() > level) {
    if (menu.getTimer() != null) {
      window.clearTimeout(menu.getTimer());
    }
    var elem = document.getElementById(menu.getId());
    elem.style.visibility = 'hidden';
    menu = openMenus.pop();
  }
  if (menu != null) {
    openMenus.push(menu);
  }

  while (menu != null) {
    if (menu.getTimer() != null) {
      window.clearTimeout(menu.getTimer());
    }
    menu = menu.getParent();
  }

}

function doFullReset() {
  doReset(0);
}

window.onclick=doFullReset;

//*******************************************
// MenuItem class
//*******************************************

function MenuItem(id) {
  this.id = id;
  this.level = 0;
}

MenuItem.prototype.id;
MenuItem.prototype.level;
MenuItem.prototype.parent;
MenuItem.prototype.child;
MenuItem.prototype.timer;

function setId(id) {
  this.id = id;
  this.level = 0;
}
MenuItem.prototype.setId = setId;

function getId() {
  return this.id;
}
MenuItem.prototype.getId = getId;

function setLevel(level) {
  this.level = level;
}
MenuItem.prototype.setLevel = setLevel;

function getLevel() {
  return this.level;
}
MenuItem.prototype.getLevel = getLevel;

function setParent(parent) {
  this.parent = parent;
}
MenuItem.prototype.setParent = setParent;

function getParent() {
  return this.parent;
}
MenuItem.prototype.getParent = getParent;

function setChild(child) {
  this.child = child;
}
MenuItem.prototype.setChild = setChild;

function getChild() {
  return this.child;
}
MenuItem.prototype.getChild = getChild;

function setTimer(timer) {
  this.timer = timer;
}
MenuItem.prototype.setTimer = setTimer;

function getTimer() {
  return this.timer;
}
MenuItem.prototype.getTimer = getTimer;

function getMenu(id) {
  var menu = this.getChild();
  while (menu != null)  {
    if (menu.getId() == id) { 
      return menu; 
    }
    menu = menu.getChild();
  }
  return null;
}
MenuItem.prototype.getMenu = getMenu;

function push(newMenu) {
  var menu = this;
  while (menu.getChild() != null) {
    menu = menu.getChild();
  }
  menu.setChild(newMenu);
  var lev = menu.getLevel();
  lev++;
  newMenu.setLevel(lev);
  newMenu.setParent(menu);
}
MenuItem.prototype.push = push;

function pop() {
  var menu = this;
  while (menu.getChild() != null) {
    menu = menu.getChild();
  }
  if (menu == this) {
    return null;
  }
  if (menu.getParent() != null) {
    menu.getParent().setChild(null);
  }
  return menu;
}
MenuItem.prototype.pop = pop;

function canBeClosed() {	
  if (this.getChild() == null) {
    return true;
  }
  return false;
}
MenuItem.prototype.canBeClosed = canBeClosed;

function dump() {
  var menu = this;
  while (menu != null) {
    alert('Menu item: ' + menu.getId());
    menu = menu.getChild();
  }
}



MenuItem.prototype.dump = dump;

//*******************************************

