/*
 * param domObj : Liste UL à dynamiser. ex : document.getElementById('ID_ul')
 * param eventOn : événement qui déclenche l'ouverture du sous-menu. Valeur possible : onmouseover,onmouseout,ondblclick,onclick. Par défaut : onclick
 * param eventOff : événement qui déclenche la fermeture du sous-menu. Valeur possible : onmouseover,onmouseout,ondblclick,onclick. Par défaut : onclick
 * param collapseOtherItem : si true, lors de l'ouverture d'un sous-menu, les autres sous-menus du même niveau se ferment
 * param persistent : si true, l'état ouvert/fermé est sauvegardé dans un cookie pour les réaffecter quand on revient sur la page
 *
 *	depends : window, Cookie, XML
 */

function Menu(domObj, eventOn, eventOff, collapseOtherItem, persistent, floatPosition) {
   this.domObj = domObj;
   this.eventOn =(eventOn ? eventOn : "onclick");
   this.eventOff =(eventOff ? eventOff : "onclick");
   this.collapseOtherItem =(collapseOtherItem == true);
   this.persistent =(persistent ? true : false);
   this.cookie = null;
   this.floatPosition =(floatPosition == true);
   if(this.persistent) {
      this.cookie = new Cookie(this.domObj.id);
   }
   this.blockTagName = "ul";
   this.itemTagName = "li";
   this.initMenu = function() {
      var items = this.domObj.getElementsByTagName(this.itemTagName);
      var fctMenuON = fctMenuOFF = elmnt = null;
      for(var i = 0; i < items.length; i++) {
         elmnt = items[i];
         if(elmnt.getElementsByTagName(this.itemTagName).length > 0) {
            elmnt.domObj = this;
            if(this.eventOn == this.eventOff) {
               fctMenuON = fctMenuOFF = function(e) {
                  if(this.expanded) {
                     Menu.collapse(this, this.domObj.blockTagName, this.domObj.persistent);
                  }
                  else {
                     if(this.domObj.collapseOtherItem) {
                        this.domObj.collapseLevel(this);
                     }
                     Menu.expand(this, this.domObj.blockTagName, this.domObj.persistent);
                  }
                  window.stopAction(e);
                  
                // return false;
               };
            }
            else {
               fctMenuON = function(e) {
                  if(this.domObj.collapseOtherItem) {
                     this.domObj.collapseLevel(this);
                  }
                  Menu.expand(this, this.domObj.blockTagName, this.domObj.persistent);
                  window.stopAction(e);
               };
               fctMenuOFF = function(e) {
                  Menu.collapse(this, this.domObj.blockTagName, this.domObj.persistent);
                  window.stopAction(e);
               };
            }
            if(this.eventOn == 'onmouseover') {
               elmnt.onmouseover = fctMenuON;
            }
            else if(this.eventOn == 'onmouseout') {
               elmnt.onmouseout = fctMenuON;
            }
            else if(this.eventOn == 'ondblclick') {
               elmnt.ondblclick = fctMenuON;
            }
            else {
               elmnt.onclick = fctMenuON;
            }
            if(this.eventOff == 'onmouseover') {
               elmnt.onmouseover = fctMenuOFF;
            }
            else if(this.eventOff == 'onmouseout' && !this.collapseOtherItem) {
               elmnt.onmouseout = fctMenuOFF;
            }
            else if(this.eventOff == 'ondblclick') {
               elmnt.ondblclick = fctMenuOFF;
            }
            else {
               elmnt.onclick = fctMenuOFF;
            }
            if(Menu.isSelected(elmnt, this.persistent)) {
               Menu.expand(elmnt, this.blockTagName);
            }
            else {
               Menu.collapse(elmnt, this.blockTagName);
            }
         }
         else {
            if(this.eventOn == 'onmouseover') {
               elmnt.onmouseover = window.stopAction;
            }
            else if(this.eventOn == 'onmouseout') {
               elmnt.onmouseout = window.stopAction;
            }
            else if(this.eventOn == 'ondblclick') {
               elmnt.ondblclick = window.stopAction;
            }
            else {
               elmnt.onclick = window.stopAction;
            }
            if(this.eventOff == 'onmouseover') {
               elmnt.onmouseover = window.stopAction;
            }
            else if(this.eventOff == 'onmouseout' && !this.collapseOtherItem) {
               elmnt.onmouseout = window.stopAction;
            }
            else if(this.eventOff == 'ondblclick') {
               elmnt.ondblclick = window.stopAction;
            }
            else {
               elmnt.onclick = window.stopAction;
            }
         }
      }
   };
   this.collapseLevel = function(obj) {
      obj = XML.getParentByTagName(obj, this.itemTagName);
      var items = obj.parentNode.childNodes;
      for(var i = 0; i < items.length; i++) {
         if(items[i].getElementsByTagName) {
            if(items[i].getElementsByTagName(this.itemTagName).length > 0) {
               Menu.collapse(items[i], this.blockTagName);
            }
         }
      }
      return false;
   };
   if(this.domObj) {
      this.initMenu();
   }
}
Menu.isSelected = function(obj, persistent) {
   if(obj.getAttribute("selected") == "true") {
         obj.className+=" focused";
      return true;
   }
   else if(obj.className.indexOf("selected")>=0) {
          obj.className+=" focused";
     return true;
   }
   else if(persistent && obj.id) {
      var cookie = new Cookie(obj.id);
      if(cookie.getValue() == "true") {
         obj.className+=" focused";
         return true;
      }
   }
   var items = obj.getElementsByTagName(obj.tagName);
   for(var i = 0; i < items.length; i++) {
      if(Menu.isSelected(items[i])) {
         obj.className+=" focused";
         return true;
      }
   }
   return false;
};
Menu.collapse = function(obj, blockTagName, persistent) {
   obj.className=obj.className.replace(" expanded","").replace(" collapsed","") + " collapsed";
   var subMenu = XML.getFirstChildByTagName(obj, blockTagName);
   if(subMenu && subMenu.style) {
      subMenu.style.display = 'none';
   }
   obj.expanded = false;
   if(persistent) {
      var cookie = new Cookie(obj.id);
      cookie.remove();
   }
   return false;
};
Menu.expand = function(obj, blockTagName, persistent) {
   obj.className=obj.className.replace(" expanded","").replace(" collapsed","") + " expanded";
   var subMenu = XML.getFirstChildByTagName(obj, blockTagName);
   if(obj.domObj.floatPosition) {
      subMenu.style.position = "absolute";
      subMenu.style.top = HtmlObject.getAbsoluteTopPosition(obj) + obj.offsetHeight;
      subMenu.style.left = HtmlObject.getAbsoluteLeftPosition(obj);
   }
   if(subMenu && subMenu.style) {
      subMenu.style.display = 'block';
   }
   obj.expanded = true;
   if(persistent) {
      var cookie = new Cookie(obj.id);
      cookie.setValue("true");
   }
   return false;
};
// vérification des dépendance
Menu.dependances = new Array("window", "Cookie", "XML");
Menu.verifyDependances = function() {
   var libError = "";
   for(var i = 0; i < Menu.dependances.length; i++) {
      if(!eval(Menu.dependances[i])) {
         libError += "- " + Menu.dependances[i] + "\n";
      }
   }
   if(libError.length > 0) {
      alert("Librairie(s) manquante(s) :\n" + libError);
   }
};
