//cascade menu constructor
function cascadeMenu(node) {
 var obj = this;
 if (typeof(node) == "string") {
  node = document.getElementById(node);
 } else if (typeof(node) != "object") {
  return(false);
 }
 obj.container = node;
 obj.menuItems = new Array();
 obj.default_flow = "right";
 obj.default_style = "menuItem";
 obj.default_width = 150;
 obj.mainMenu = { children: new Array(), isMenu: false, flow: obj.default_flow }
 obj.pointer = null;
 /* Menu-item creation function */
 /*=============================*/
 obj.Add = function Add(name, parentName, href, flow, style, content) {
  for (var x=1;x<arguments.length;x++) {
   if (typeof(arguments[x]) != "string") {
    alert("Invalid parameter!");
    return(false);
   }
  }
  var menuItem = new Object();
  menuItem.isMenu = true;
  menuItem.visible = false;
  menuItem.children = new Array();
  menuItem.menu = obj;
  menuItem.name = name;
  menuItem.href = href;
  menuItem.content = content;
  if (!obj.Find(parentName)) {
   menuItem.parent = obj.mainMenu;
  } else {
   menuItem.parent = obj.menuItems[obj.Find(parentName)];
  }
  menuItem.parent.children.push(menuItem);
  if (flow != undefined) {
   menuItem.flow = flow;
  } else if (menuItem.parent.isMenu === true) {
   menuItem.flow = menuItem.parent.flow;
  } else {
   menuItem.flow = obj.default_flow;
  }
  if (style != undefined) {
   menuItem.style = style;
  } else {
   menuItem.style = obj.default_style;
  }
  if (menuItem.parent.isMenu === true) {
   menuItem.parent.style = menuItem.parent.style.replace(/(_expand|_right|_down)+$/, "")+"_expand_"+menuItem.parent.flow;
  }
  menu.menuItems.push(menuItem);
 }
 /* Menu rendering function */
 /*=========================*/
 obj.Render = function(menu) {
  if (menu != undefined) {
   if (typeof(menu) == "string" && !obj.Find(menu) !== false) {
    menu = obj.menuItems[obj.Find(menu)];
   } else if (typeof(menu) != "object" || menu.isMenu !== true) {
    return(false);
   }
  } else {
   menu = obj.mainMenu;
  }
  if (!menu.DOM) {
   var pos = new Array(0,0,obj.default_width);
  } else if (menu.flow == "right") {
   var pos = new Array(menu.DOM.offsetLeft+menu.DOM.offsetWidth,menu.DOM.offsetTop,obj.default_width);
  } else if (menu.flow == "down") {
   var pos = new Array(menu.DOM.offsetLeft,menu.DOM.offsetTop+menu.DOM.offsetHeight,menu.DOM.offsetWidth);
  }
  for (var x in menu.children) {
   var menuItem = menu.children[x];
   if (menuItem.isMenu === true) {
    if (!menuItem.DOM) {
     menuItem.DOM = document.createElement('div');
    }
    menuItem.DOM.className = menuItem.style;
    menuItem.DOM.innerHTML = "<nobr>"+menuItem.content+"</nobr>";
    obj.container.appendChild(menuItem.DOM);

    menuItem.DOM.style.left = pos[0]+"px";
    menuItem.DOM.style.top = pos[1]+"px";
/*
    menuItem.DOM.style.width = pos[2]+"px";
    var width = menuItem.DOM.offsetWidth;
    if (width != pos[2]) {
     menuItem.DOM.style.width = pos[2]-(width-pos[2]);
    }
*/
    if (menuItem.visible === true) {
     menuItem.DOM.style.visibility = 'hidden';
    } else {
     menuItem.DOM.style.visibility = 'visible';
    }

    if (menuItem.flow == "right") {
     pos[0] = menuItem.DOM.offsetLeft;
     pos[1] += menuItem.DOM.offsetHeight;
     //pos[2] = obj.default_width;
    } else if (menuItem.flow == "down") {
     pos[0] += menuItem.DOM.offsetWidth;
     pos[1] = menuItem.DOM.offsetTop;
     //pos[2] = menuItem.DOM.offsetwidth;
    }

    function AddEvents(menuItem) {
     menuItem.DOM.onclick = function() { obj.Navigate(menuItem); }
     menuItem.DOM.onmouseover = function() { obj.Expand(menuItem); }
     menuItem.DOM.onmouseout = function() { obj.Collapse(obj.mainMenu); obj.Expand(obj.mainMenu); }
    }

    AddEvents(menuItem);

    if (menuItem.children.length > 0) {
     obj.Render(menuItem);
    }
   }
  }
  obj.Collapse(obj.mainMenu);
  obj.Expand(obj.mainMenu);
 }
 /* Menu toggle visibility function */
 /*=================================*/
 obj.Collapse = function(menuItem) {
  if (typeof(menuItem) != "object") {
   return(false);
  }
  for (var x in menuItem.children) {
   menuItem.children[x].visible = false;
   if (menuItem.children[x].DOM) {
    menuItem.children[x].DOM.style.visibility = 'hidden';
   }
   obj.Collapse(menuItem.children[x]);
   obj.Hover(menuItem.children[x], false);
  }
 }
 /* Menu toggle visibility function */
 /*=================================*/
 obj.Expand = function(menuItem) {
  if (typeof(menuItem) != "object") {
   return(false);
  }
  if (menuItem.parent) {
   obj.Expand(menuItem.parent);
  }
  obj.Hover(menuItem, true);
  for (var x in menuItem.children) {
   menuItem.children[x].visible = true;
   if (menuItem.children[x].DOM) {
    menuItem.children[x].DOM.style.visibility = 'visible';
   }
  }
  obj.pointer = menuItem;
 }
 /* Menu hovering function */
 /*========================*/
 obj.Hover = function(menuItem, hover) {
  if (typeof(menuItem) != "object" || menuItem.isMenu !== true) {
   return(false);
  }
  if (menuItem.DOM) {
   if (!hover) {
    menuItem.DOM.className = menuItem.DOM.className.replace(/(_hover)+/, "");
   } else {
    menuItem.DOM.className = menuItem.DOM.className.replace(/(_hover)+/, "")+"_hover";
   }
  }
 }
 /* Menu onclick function */
 /*=======================*/
 obj.Navigate = function(menuItem) {
  if (typeof(menuItem) != "object" || menuItem.isMenu !== true) {
   return(false);
  }
  window.location = menuItem.href;
 }
 /* Menu-item finding function */
 /*============================*/
 obj.Find = function(name) {
  for (var x in obj.menuItems) {
   if (obj.menuItems[x].name == name) {
    return(x);
   }
  }
  return(false);
 }
}
