/*extern Behaviour,cssQuery,combineClassNames*/

var Menus = {
   init: function() {
      document.onmouseover = function() {
         Menus.cancelHideAllMenus = false;
         Menus.hideAllMenus(true);
      };
      document.onclick = function() {
         Menus.hideAllMenus();
      };
      
      var container = document.getElementById("menus");
      var buttons = cssQuery("li");
      
      buttons.forEach(function(b) {
         var submenus = b.getElementsByTagName("ul");
         b.menuitem = (b.parentNode && b.parentNode.parentNode != container);
         b.submenu = (submenus.length > 0)? submenus[0]: null;
         if (b.menuitem) {
            b.ownermenu = b.parentNode;
         }
         if (b.submenu) {
            b.submenu.owneritem = b;
            
            if (b.menuitem) {
               var arrow = document.createElement("img"), s = arrow.style;
               arrow.src = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAHCAYAAAA1WQxeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gwJAi8aXLHiYAAAAB10RVh0Q29tbWVudABDcmVhdGVkIHdpdGggVGhlIEdJTVDvZCVuAAAASUlEQVR42n3PsQmAQBBFwQUN1cQCDWxCsEYLEOxAroYxOhB1fekOHzYiItDFXzixoM9ArWDFkIHahvELHJjRPhd2TK/DDTTZAxceIVYF2tRCoAAAAABJRU5ErkJggg=="; //menuarrow.png
               arrow.alt = ">";
               s.position = "absolute";
               s.right = "2px";
               b.appendChild(arrow);
               b.arrow = arrow;
            }
         }
         b.onclick = function() {
            if (this.firstChild && this.firstChild.href) {
               window.location.href = this.firstChild.href;
            }
         };
         b.onmouseover = function(e) {
            if (!e) {
               e = window.event;
            }
            if (e.stopPropagation) {
               e.stopPropagation();
            }
            e.cancelBubble = true;
            Menus.cancelHideAllMenus = true;
            Menus.currentSelectedMenuItem = this;
            this.hideSiblingMenus(this.menuitem);
            this.unselectSiblings();
            if (this.submenu) {
               if (this.menuitem) {
                  Menus.beginShowingMenu(this.submenu);
               }
               else {
                  Menus.showMenu(this.submenu);
               }
            }
         };
         b.addselectedclass = function() {
            this.className = combineClassNames(this.className, "selected", "");
         };
         b.removeselectedclass = function() {
            this.className = combineClassNames(this.className, "", "selected");
         };
         b.hideSiblingMenus = function(delayed) {
            for (var i = 0; i < this.parentNode.childNodes.length; i++) {
               var node = this.parentNode.childNodes[i];
               if (node != this) {
                  if (node.submenu && node.submenu.showing) {
                     if (delayed) {
                        Menus.beginHidingMenu(node.submenu);
                     }
                     else {
                        Menus.hideMenu(node.submenu);
                     }
                  }
               }
            }
         };
         b.unselectSiblings = function() {
            for (var i = 0; i < this.parentNode.childNodes.length; i++) {
               var node = this.parentNode.childNodes[i];
               if (node != this && node.removeselectedclass) {
                  node.removeselectedclass();
               }
            }
         };
         b.getAbsolutePos = function() {
            if (this.menuitem) {
               return {x: this.offsetLeft + this.ownermenu.offsetLeft, y: this.offsetTop + this.ownermenu.offsetTop};
            }
            return document.findPos(this);
         };
      });
   },
   beginHidingMenu: function(menu) {
      if (menu) {
         window.setTimeout(function() { Menus.hideMenu(menu); }, 400);
         if (menu.owneritem) {
            menu.owneritem.addselectedclass();
         }
         menu.owneritem.unselectSiblings();
      }
   },
   beginShowingMenu: function(menu) {
      if (menu) {
         window.setTimeout(function() { Menus.showMenu(menu); }, 400);
         if (menu.owneritem) {
            menu.owneritem.addselectedclass();
            menu.owneritem.unselectSiblings();
         }
      }
   },
   hideMenu: function(menu) {
      if (menu) {
         for (var i = 0; i < menu.childNodes.length; i++) {
            if (menu.childNodes[i].submenu && menu.childNodes[i].submenu.showing) {
               Menus.hideMenu(menu.childNodes[i].submenu);
            }
         }
         menu.style.display = "none";
         menu.showing = false;
         if (menu.owneritem) {
            menu.owneritem.removeselectedclass();
         }
      }
   },
   showMenu: function(menu) {
      if (menu && Menus.currentSelectedMenuItem && Menus.currentSelectedMenuItem.submenu == menu) {
         if (menu.owneritem) {
            var pos = menu.owneritem.getAbsolutePos();
            menu.style.left = ((menu.owneritem.menuitem)? pos.x + menu.owneritem.offsetWidth + 1: pos.x) + "px";
            menu.style.top = ((menu.owneritem.menuitem)? pos.y: pos.y + menu.owneritem.offsetHeight) + "px";
            menu.owneritem.addselectedclass();
         }
         menu.style.display = "block";
         for (var i = 0; i < menu.childNodes.length; i++) {
            var item = menu.childNodes[i];
            if (item.nodeType == 1 && item.tagName.toUpperCase() == "LI" && item.arrow) {
               item.arrow.style.top = Math.floor(item.offsetTop + (item.offsetHeight - item.arrow.offsetHeight) / 2) + "px";
            }
         }
         menu.showing = true;
      }
   },
   hideAllMenus: function(delayed) {
      if (delayed) {
         window.clearTimeout(null);
         window.setTimeout(Menus.hideAllMenus, 1000);
      }
      else {
         if (!Menus.cancelHideAllMenus) {
            var menus = Menus.getAllMenus();
            for (var i = 0; i < menus.length; i++) {
               if (menus[i].id != "toplevelmenu") {
                  Menus.hideMenu(menus[i]);
               }
            }
         }
      }
   },
   getAllMenus: function() {
      return cssQuery("#menus ul ul");
   }
};

Behaviour.addLoadEvent(Menus.init);