/* *
 * TopMenu
 */
var TopMenu = new Class(
{
   Implements : Options, options :
   {
      id : "nav", subMenusContainerId : "subMenusContainer", effect : "slide & fade", duration : 900/* speed of menu */ , physics : Fx.Transitions.Pow.easeOut, hideDelay : 1000, stretchMainMenu : false, matchWidthMode : true, orientation : "horizontal", direction :
      {
         x : "right", y : "down"
      }
      , tweakInitial :
      {
         x : 3, y : 3
      }
      /* position of first level submenu */ , tweakSubsequent :
      {
         x : 0, y : 0
      }
      /* position of sub - subMenu */ , center : false, opacity : 85, mmbFocusedClassName : null, mmbClassName : null, killDivider : null, fixHasLayoutBug : true, onHideAllSubMenusNow_begin : (function()
      {
      }
      ), onHideAllSubMenusNow_complete : (function()
      {
      }
      ), onInit_begin : (function()
      {
      }
      ), onInit_complete : (function()
      {
      }
      )
   }
   , hideAllMenusTimeout : null, allSubMenus : [], subMenuZindex : 1, initialize : function(B)
   {
      this.setOptions(B);
      this.options.onInit_begin();
      if(this.options.opacity > 99)
      {
         this.options.opacity = 99.9
      }
      this.options.opacity = this.options.opacity / 100;
      Element.implement(
      {
         getId : function()
         {
            if( ! this.id)
            {
               var E = this.get("tag") + "-" + $time();
               while($(E))
               {
                  E = this.get("tag") + "-" + $time()
               }
               this.id = E
            }
            return this.id
         }
      }
      );
      this.options.direction.x = this.options.direction.x.toLowerCase();
      this.options.direction.y = this.options.direction.y.toLowerCase();
      if(this.options.direction.x === "right")
      {
         this.options.direction.xInverse = "left"
      }
      else
      {
         if(this.options.direction.x === "left")
         {
            this.options.direction.xInverse = "right"
         }
      }
      if(this.options.direction.y === "up")
      {
         this.options.direction.yInverse = "down"
      }
      else
      {
         if(this.options.direction.y === "down")
         {
            this.options.direction.yInverse = "up"
         }
      }
      var A = $(this.options.id).getElements("a");
      A.each(function(F, E)
      {
         F.store("parentLinks", F.getParent().getParents("li").getFirst("a"));
         F.store("parentLinks", F.retrieve("parentLinks").erase(F.retrieve("parentLinks").getFirst()));
         F.store("childMenu", F.getNext("ul") || F.getNext("ol"));
         theSubMenuType = "subsequent";
         if($(F.getParent("ul") || F.getParent("ol")).id === this.options.id)
         {
            theSubMenuType = "initial"
         }
         F.store("subMenuType", theSubMenuType);
         if(theSubMenuType === "initial" && $(F.getNext("ul") || F.getNext("ol")))
         {
            F.addClass("mainMenuParentBtn")
         }
         else
         {
            if($(F.getNext("ul") || F.getNext("ol")))
            {
               F.addClass("subMenuParentBtn")
            }
         }
      }
      .bind(this));
      var D = new Element("div",
      {
         id : this.options.subMenusContainerId
      }
      ).inject($(document.body), "bottom");
      $(this.options.id).getElements("ul, ol").each(function(F, E)
      {
         new Element("div",
         {
            "class" : "smOW"
         }
         ).inject(D).grab(F)
      }
      .bind(this));
      D.getElements("a").set("tabindex", "-1");
      A.each(function(G, E)
      {
         if( ! G.retrieve("childMenu"))
         {
            return
         }
         G.store("childMenu", G.retrieve("childMenu").getParent("div"));
         this.allSubMenus.include(G.retrieve("childMenu"));
         G.store("parentSubMenus", G.retrieve("parentLinks").retrieve("childMenu"));
         var F = new MenuMaticSubMenu(this.options, this, G)
      }
      .bind(this));
      var C = $(this.options.id).getElements("a").filter(function(F, E)
      {
         return ! F.retrieve("childMenu")
      }
      );
      C.each(function(F, E)
      {
         F.addEvents(
         {
            mouseenter : function(G)
            {
               this.hideAllSubMenusNow();
               if(this.options.mmbClassName && this.options.mmbFocusedClassName)
               {
                  $(F).retrieve("btnMorph", new Fx.Morph(F,
                  {
                     duration : (this.options.duration / 2), transition : this.options.physics, link : "cancel"
                  }
                  )).start(this.options.mmbFocusedClassName)
               }
            }
            .bind(this), focus : function(G)
            {
               this.hideAllSubMenusNow();
               if(this.options.mmbClassName && this.options.mmbFocusedClassName)
               {
                  $(F).retrieve("btnMorph", new Fx.Morph(F,
                  {
                     duration : (this.options.duration / 2), transition : this.options.physics, link : "cancel"
                  }
                  )).start(this.options.mmbFocusedClassName)
               }
            }
            .bind(this), mouseleave : function(G)
            {
               if(this.options.mmbClassName && this.options.mmbFocusedClassName)
               {
                  $(F).retrieve("btnMorph", new Fx.Morph(F,
                  {
                     duration : (this.options.duration * 5), transition : this.options.physics, link : "cancel"
                  }
                  )).start(this.options.mmbClassName)
               }
            }
            .bind(this), blur : function(G)
            {
               if(this.options.mmbClassName && this.options.mmbFocusedClassName)
               {
                  $(F).retrieve("btnMorph", new Fx.Morph(F,
                  {
                     duration : (this.options.duration * 5), transition : this.options.physics, link : "cancel"
                  }
                  )).start(this.options.mmbClassName)
               }
            }
            .bind(this), keydown : function(H)
            {
               var G = new Event(H);
               if(H.key === "up" || H.key === "down" || H.key === "left" || H.key === "right")
               {
                  H.stop()
               }
               if(H.key === "left" && this.options.orientation === "horizontal" || H.key === "up" && this.options.orientation === "vertical")
               {
                  if(F.getParent("li").getPrevious("li"))
                  {
                     F.getParent("li").getPrevious("li").getFirst("a").focus()
                  }
                  else
                  {
                     F.getParent("li").getParent().getLast("li").getFirst("a").focus()
                  }
               }
               else
               {
                  if(H.key === "right" && this.options.orientation === "horizontal" || H.key === "down" && this.options.orientation === "vertical")
                  {
                     if(F.getParent("li").getNext("li"))
                     {
                        F.getParent("li").getNext("li").getFirst("a").focus()
                     }
                     else
                     {
                        F.getParent("li").getParent().getFirst("li").getFirst("a").focus()
                     }
                  }
               }
            }
            .bind(this)
         }
         )
      }
      , this);
      this.stretch();
      this.killDivider();
      this.center();
      this.fixHasLayoutBug();
      this.options.onInit_complete()
   }
   , fixHasLayoutBug : function()
   {
      if(Browser.Engine.trident && this.options.fixHasLayoutBug)
      {
         $(this.options.id).getParents().setStyle("zoom", 1);
         $(this.options.id).setStyle("zoom", 1);
         $(this.options.id).getChildren().setStyle("zoom", 1);
         $(this.options.subMenusContainerId).setStyle("zoom", 1);
         $(this.options.subMenusContainerId).getChildren().setStyle("zoom", 1)
      }
   }
   , center : function()
   {
      if( ! this.options.center)
      {
         return
      }
      $(this.options.id).setStyles(
      {
         left : "50%", "margin-left" : - ($(this.options.id).getSize().x / 2)
      }
      )
   }
   , stretch : function()
   {
      if(this.options.stretchMainMenu && this.options.orientation === "horizontal")
      {
         var C = parseFloat($(this.options.id).getCoordinates().width);
         var D = 0;
         var B = $(this.options.id).getElements("a");
         B.setStyles(
         {
            "padding-left" : 0, "padding-right" : 0
         }
         );
         B.each(function(F, E)
         {
            D += F.getSize().x
         }
         .bind(this));
         if(C < D)
         {
            return
         }
         var A = (C - D) / B.length;
         B.each(function(F, E)
         {
            F.setStyle("width", F.getSize().x + A)
         }
         .bind(this));
         B.getLast().setStyle("width", B.getLast().getSize().x - 1)
      }
   }
   , killDivider : function()
   {
      if(this.options.killDivider && this.options.killDivider.toLowerCase() === "first")
      {
         $($(this.options.id).getElements("li")[0]).setStyles(
         {
            background : "none"
         }
         )
      }
      else
      {
         if(this.options.killDivider && this.options.killDivider.toLowerCase() === "last")
         {
            $($(this.options.id).getElements("li").getLast()).setStyles(
            {
               background : "none"
            }
            )
         }
      }
   }
   , hideAllSubMenusNow : function()
   {
      this.options.onHideAllSubMenusNow_begin();
      $clear(this.hideAllMenusTimeout);
      $$(this.allSubMenus).fireEvent("hide");
      this.options.onHideAllSubMenusNow_complete()
   }
}
);
var MenuMaticSubMenu = new Class(
{
   Implements : Options, Extends : TopMenu, options :
   {
      onSubMenuInit_begin : (function(A)
      {
      }
      ), onSubMenuInit_complete : (function(A)
      {
      }
      ), onMatchWidth_begin : (function(A)
      {
      }
      ), onMatchWidth_complete : (function(A)
      {
      }
      ), onHideSubMenu_begin : (function(A)
      {
      }
      ), onHideSubMenu_complete : (function(A)
      {
      }
      ), onHideOtherSubMenus_begin : (function(A)
      {
      }
      ), onHideOtherSubMenus_complete : (function(A)
      {
      }
      ), onHideAllSubMenus_begin : (function(A)
      {
      }
      ), onHideAllSubMenus_complete : (function(A)
      {
      }
      ), onPositionSubMenu_begin : (function(A)
      {
      }
      ), onPositionSubMenu_complete : (function(A)
      {
      }
      ), onShowSubMenu_begin : (function(A)
      {
      }
      ), onShowSubMenu_complete : (function(A)
      {
      }
      )
   }
   , root : null, btn : null, hidden : true, myEffect : null, initialize : function(B, A, C)
   {
      this.setOptions(B);
      this.root = A;
      this.btn = C;
      this.childMenu = this.btn.retrieve("childMenu");
      this.subMenuType = this.btn.retrieve("subMenuType");
      this.childMenu = this.btn.retrieve("childMenu");
      this.parentSubMenus = $$(this.btn.retrieve("parentSubMenus"));
      this.parentLinks = $$(this.btn.retrieve("parentLinks"));
      this.parentSubMenu = $(this.parentSubMenus[0]);
      if(this.parentSubMenu)
      {
         this.parentSubMenu = this.parentSubMenu.retrieve("class")
      }
      this.childMenu.store("class", this);
      this.btn.store("class", this);
      this.childMenu.store("status", "closed");
      this.options.onSubMenuInit_begin(this);
      this.childMenu.addEvent("hide", function()
      {
         this.hideSubMenu()
      }
      .bind(this));
      this.childMenu.addEvent("show", function()
      {
         this.showSubMenu()
      }
      .bind(this));
      if(this.options.effect)
      {
         this.myEffect = new Fx.Morph($(this.childMenu).getFirst(),
         {
            duration : this.options.duration, transition : this.options.physics, link : "cancel"
         }
         )
      }
      if(this.options.effect === "slide" || this.options.effect === "slide & fade")
      {
         if(this.subMenuType == "initial" && this.options.orientation === "horizontal")
         {
            this.childMenu.getFirst().setStyle("margin-top", "0")
         }
         else
         {
            this.childMenu.getFirst().setStyle("margin-left", "0")
         }
      }
      else
      {
         if(this.options.effect === "fade" || this.options.effect === "slide & fade")
         {
            this.childMenu.getFirst().setStyle("opacity", 0)
         }
      }
      if(this.options.effect != "fade" && this.options.effect != "slide & fade")
      {
         this.childMenu.getFirst().setStyle("opacity", this.options.opacity)
      }
      var D = $(this.childMenu).getElements("a").filter(function(F, E)
      {
         return ! F.retrieve("childMenu")
      }
      );
      D.each(function(F, E)
      {
         $(F).addClass("subMenuBtn");
         F.addEvents(
         {
            mouseenter : function(G)
            {
               this.childMenu.fireEvent("show");
               this.cancellHideAllSubMenus();
               this.hideOtherSubMenus()
            }
            .bind(this), focus : function(G)
            {
               this.childMenu.fireEvent("show");
               this.cancellHideAllSubMenus();
               this.hideOtherSubMenus()
            }
            .bind(this), mouseleave : function(G)
            {
               this.cancellHideAllSubMenus();
               this.hideAllSubMenus()
            }
            .bind(this), blur : function(G)
            {
               this.cancellHideAllSubMenus();
               this.hideAllSubMenus()
            }
            .bind(this), keydown : function(H)
            {
               var G = new Event(H);
               if(H.key === "up" || H.key === "down" || H.key === "left" || H.key === "right" || H.key === "tab")
               {
                  H.stop()
               }
               if(H.key === "up")
               {
                  if(F.getParent("li").getPrevious("li"))
                  {
                     F.getParent("li").getPrevious("li").getFirst("a").focus()
                  }
                  else
                  {
                     if(this.options.direction.y === "down")
                     {
                        this.btn.focus()
                     }
                     else
                     {
                        if(this.options.direction.y === "up")
                        {
                           F.getParent("li").getParent().getLast("li").getFirst("a").focus()
                        }
                     }
                  }
               }
               else
               {
                  if(H.key === "down")
                  {
                     if(F.getParent("li").getNext("li"))
                     {
                        F.getParent("li").getNext("li").getFirst("a").focus()
                     }
                     else
                     {
                        if(this.options.direction.y === "down")
                        {
                           F.getParent("li").getParent().getFirst("li").getFirst("a").focus()
                        }
                        else
                        {
                           if(this.options.direction.y === "up")
                           {
                              this.btn.focus()
                           }
                        }
                     }
                  }
                  else
                  {
                     if(H.key === this.options.direction.xInverse)
                     {
                        this.btn.focus()
                     }
                  }
               }
            }
            .bind(this)
         }
         )
      }
      , this);
      $(this.btn).removeClass("subMenuBtn");
      if(this.subMenuType == "initial")
      {
         this.btn.addClass("mainParentBtn")
      }
      else
      {
         this.btn.addClass("subParentBtn")
      }
      $(this.btn).addEvents(
      {
         mouseenter : function(E)
         {
            this.cancellHideAllSubMenus();
            this.hideOtherSubMenus();
            this.showSubMenu();
            if(this.subMenuType === "initial" && this.options.mmbClassName && this.options.mmbFocusedClassName)
            {
               $(this.btn).retrieve("btnMorph", new Fx.Morph($(this.btn),
               {
                  duration : (this.options.duration / 2), transition : this.options.physics, link : "cancel"
               }
               )).start(this.options.mmbFocusedClassName)
            }
         }
         .bind(this), focus : function(E)
         {
            this.cancellHideAllSubMenus();
            this.hideOtherSubMenus();
            this.showSubMenu();
            if(this.subMenuType === "initial" && this.options.mmbClassName && this.options.mmbFocusedClassName)
            {
               $(this.btn).retrieve("btnMorph", new Fx.Morph($(this.btn),
               {
                  duration : (this.options.duration / 2), transition : this.options.physics, link : "cancel"
               }
               )).start(this.options.mmbFocusedClassName)
            }
         }
         .bind(this), mouseleave : function(E)
         {
            this.cancellHideAllSubMenus();
            this.hideAllSubMenus()
         }
         .bind(this), blur : function(E)
         {
            this.cancellHideAllSubMenus();
            this.hideAllSubMenus()
         }
         .bind(this), keydown : function(E)
         {
            E = new Event(E);
            if(E.key === "up" || E.key === "down" || E.key === "left" || E.key === "right")
            {
               E.stop()
            }
            if( ! this.parentSubMenu)
            {
               if(this.options.orientation === "horizontal" && E.key === this.options.direction.y || this.options.orientation === "vertical" && E.key === this.options.direction.x)
               {
                  if(this.options.direction.y === "down")
                  {
                     this.childMenu.getFirst().getFirst("li").getFirst("a").focus()
                  }
                  else
                  {
                     if(this.options.direction.y === "up")
                     {
                        this.childMenu.getFirst().getLast("li").getFirst("a").focus()
                     }
                  }
               }
               else
               {
                  if(this.options.orientation === "horizontal" && E.key === "left" || this.options.orientation === "vertical" && E.key === this.options.direction.yInverse)
                  {
                     if(this.btn.getParent().getPrevious())
                     {
                        this.btn.getParent().getPrevious().getFirst().focus()
                     }
                     else
                     {
                        this.btn.getParent().getParent().getLast().getFirst().focus()
                     }
                  }
                  else
                  {
                     if(this.options.orientation === "horizontal" && E.key === "right" || this.options.orientation === "vertical" && E.key === this.options.direction.y)
                     {
                        if(this.btn.getParent().getNext())
                        {
                           this.btn.getParent().getNext().getFirst().focus()
                        }
                        else
                        {
                           this.btn.getParent().getParent().getFirst().getFirst().focus()
                        }
                     }
                  }
               }
            }
            else
            {
               if(E.key === "tab")
               {
                  E.stop()
               }
               if(E.key === "up")
               {
                  if(this.btn.getParent("li").getPrevious("li"))
                  {
                     this.btn.getParent("li").getPrevious("li").getFirst("a").focus()
                  }
                  else
                  {
                     if(this.options.direction.y === "down")
                     {
                        this.parentSubMenu.btn.focus()
                     }
                     else
                     {
                        if(this.options.direction.y === "up")
                        {
                           this.btn.getParent("li").getParent().getLast("li").getFirst("a").focus()
                        }
                     }
                  }
               }
               else
               {
                  if(E.key === "down")
                  {
                     if(this.btn.getParent("li").getNext("li"))
                     {
                        this.btn.getParent("li").getNext("li").getFirst("a").focus()
                     }
                     else
                     {
                        if(this.options.direction.y === "down")
                        {
                           this.btn.getParent("li").getParent().getFirst("li").getFirst("a").focus()
                        }
                        else
                        {
                           if(this.options.direction.y === "up")
                           {
                              this.parentSubMenu.btn.focus()
                           }
                        }
                     }
                  }
                  else
                  {
                     if(E.key === this.options.direction.xInverse)
                     {
                        this.parentSubMenu.btn.focus()
                     }
                     else
                     {
                        if(E.key === this.options.direction.x)
                        {
                           if(this.options.direction.y === "down")
                           {
                              this.childMenu.getFirst().getFirst("li").getFirst("a").focus()
                           }
                           else
                           {
                              if(this.options.direction.y === "up")
                              {
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
         .bind(this)
      }
      );
      this.options.onSubMenuInit_complete(this)
   }
   , matchWidth : function()
   {
      if(this.widthMatched || ! this.options.matchWidthMode || this.subMenuType === "subsequent")
      {
         return
      }
      this.options.onMatchWidth_begin(this);
      var A = this.btn.getCoordinates().width;
      $(this.childMenu).getElements("a").each(function(E, D)
      {
         var C = parseFloat($(this.childMenu).getFirst().getStyle("border-left-width")) + parseFloat($(this.childMenu).getFirst().getStyle("border-right-width"));
         var B = parseFloat(E.getStyle("padding-left")) + parseFloat(E.getStyle("padding-right"));
         var F = C + B;
         if(A > E.getCoordinates().width)
         {
            E.setStyle("width", A - F);
            E.setStyle("margin-right", - C)
         }
      }
      .bind(this));
      this.width = this.childMenu.getFirst().getCoordinates().width;
      this.widthMatched = true;
      this.options.onMatchWidth_complete(this)
   }
   , hideSubMenu : function()
   {
      if(this.childMenu.retrieve("status") === "closed")
      {
         return
      }
      this.options.onHideSubMenu_begin(this);
      if(this.subMenuType == "initial")
      {
         if(this.options.mmbClassName && this.options.mmbFocusedClassName)
         {
            $(this.btn).retrieve("btnMorph", new Fx.Morph($(this.btn),
            {
               duration : (this.options.duration), transition : this.options.physics, link : "cancel"
            }
            )).start(this.options.mmbClassName).chain(function()
            {
               $(this.btn).removeClass("mainMenuParentBtnFocused");
               $(this.btn).addClass("mainMenuParentBtn")
            }
            .bind(this))
         }
         else
         {
            $(this.btn).removeClass("mainMenuParentBtnFocused");
            $(this.btn).addClass("mainMenuParentBtn")
         }
      }
      else
      {
         $(this.btn).removeClass("subMenuParentBtnFocused");
         $(this.btn).addClass("subMenuParentBtn")
      }
      this.childMenu.setStyle("z-index", 1);
      if(this.options.effect && this.options.effect.toLowerCase() === "slide")
      {
         if(this.subMenuType == "initial" && this.options.orientation === "horizontal" && this.options.direction.y === "down")
         {
            this.myEffect.start(
            {
               "margin-top" : - this.height
            }
            ).chain(function()
            {
               this.childMenu.style.display = "none"
            }
            .bind(this))
         }
         else
         {
            if(this.subMenuType == "initial" && this.options.orientation === "horizontal" && this.options.direction.y === "up")
            {
               this.myEffect.start(
               {
                  "margin-top" : this.height
               }
               ).chain(function()
               {
                  this.childMenu.style.display = "none"
               }
               .bind(this))
            }
            else
            {
               if(this.options.direction.x === "right")
               {
                  this.myEffect.start(
                  {
                     "margin-left" : - this.width
                  }
                  ).chain(function()
                  {
                     this.childMenu.style.display = "none"
                  }
                  .bind(this))
               }
               else
               {
                  if(this.options.direction.x === "left")
                  {
                     this.myEffect.start(
                     {
                        "margin-left" : this.width
                     }
                     ).chain(function()
                     {
                        this.childMenu.style.display = "none"
                     }
                     .bind(this))
                  }
               }
            }
         }
      }
      else
      {
         if(this.options.effect == "fade")
         {
            this.myEffect.start(
            {
               opacity : 0
            }
            ).chain(function()
            {
               this.childMenu.style.display = "none"
            }
            .bind(this))
         }
         else
         {
            if(this.options.effect == "slide & fade")
            {
               if(this.subMenuType == "initial" && this.options.orientation === "horizontal" && this.options.direction.y === "down")
               {
                  this.myEffect.start(
                  {
                     "margin-top" : - this.height, opacity : 0
                  }
                  ).chain(function()
                  {
                     this.childMenu.style.display = "none"
                  }
                  .bind(this))
               }
               else
               {
                  if(this.subMenuType == "initial" && this.options.orientation === "horizontal" && this.options.direction.y === "up")
                  {
                     this.myEffect.start(
                     {
                        "margin-top" : this.height, opacity : 0
                     }
                     ).chain(function()
                     {
                        this.childMenu.style.display = "none"
                     }
                     .bind(this))
                  }
                  else
                  {
                     if(this.options.direction.x === "right")
                     {
                        this.myEffect.start(
                        {
                           "margin-left" : - this.width, opacity : 0
                        }
                        ).chain(function()
                        {
                           this.childMenu.style.display = "none"
                        }
                        .bind(this))
                     }
                     else
                     {
                        if(this.options.direction.x === "left")
                        {
                           this.myEffect.start(
                           {
                              "margin-left" : this.width, opacity : 0
                           }
                           ).chain(function()
                           {
                              this.childMenu.style.display = "none"
                           }
                           .bind(this))
                        }
                     }
                  }
               }
            }
            else
            {
               this.childMenu.style.display = "none"
            }
         }
      }
      this.childMenu.store("status", "closed");
      this.options.onHideSubMenu_complete(this)
   }
   , hideOtherSubMenus : function()
   {
      this.options.onHideOtherSubMenus_begin(this);
      if( ! this.btn.retrieve("otherSubMenus"))
      {
         this.btn.store("otherSubMenus", $$(this.root.allSubMenus.filter(function(A)
         {
            return ! this.btn.retrieve("parentSubMenus").contains(A) && A != this.childMenu
         }
         .bind(this))))
      }
      this.parentSubMenus.fireEvent("show");
      this.btn.retrieve("otherSubMenus").fireEvent("hide");
      this.options.onHideOtherSubMenus_complete(this)
   }
   , hideAllSubMenus : function()
   {
      this.options.onHideAllSubMenus_begin(this);
      $clear(this.root.hideAllMenusTimeout);
      this.root.hideAllMenusTimeout = (function()
      {
         $clear(this.hideAllMenusTimeout);
         $$(this.root.allSubMenus).fireEvent("hide")
      }
      ).bind(this).delay(this.options.hideDelay);
      this.options.onHideAllSubMenus_complete(this)
   }
   , cancellHideAllSubMenus : function()
   {
      $clear(this.root.hideAllMenusTimeout)
   }
   , showSubMenu : function(A)
   {
      if(this.childMenu.retrieve("status") === "open")
      {
         return
      }
      this.options.onShowSubMenu_begin(this);
      if(this.subMenuType == "initial")
      {
         $(this.btn).removeClass("mainMenuParentBtn");
         $(this.btn).addClass("mainMenuParentBtnFocused")
      }
      else
      {
         $(this.btn).removeClass("subMenuParentBtn");
         $(this.btn).addClass("subMenuParentBtnFocused")
      }
      this.root.subMenuZindex ++ ;
      this.childMenu.setStyles(
      {
         display : "block", visibility : "hidden", "z-index" : this.root.subMenuZindex
      }
      );
      if( ! this.width || ! this.height)
      {
         this.width = this.childMenu.getFirst().getCoordinates().width;
         this.height = this.childMenu.getFirst().getCoordinates().height;
         this.childMenu.setStyle("height", this.height, "border");
         if(this.options.effect === "slide" || this.options.effect === "slide & fade")
         {
            if(this.subMenuType == "initial" && this.options.orientation === "horizontal")
            {
               this.childMenu.getFirst().setStyle("margin-top", "0");
               if(this.options.direction.y === "down")
               {
                  this.myEffect.set(
                  {
                     "margin-top" : - this.height
                  }
                  )
               }
               else
               {
                  if(this.options.direction.y === "up")
                  {
                     this.myEffect.set(
                     {
                        "margin-top" : this.height
                     }
                     )
                  }
               }
            }
            else
            {
               if(this.options.direction.x === "left")
               {
                  this.myEffect.set(
                  {
                     "margin-left" : this.width
                  }
                  )
               }
               else
               {
                  this.myEffect.set(
                  {
                     "margin-left" : - this.width
                  }
                  )
               }
            }
         }
      }
      this.matchWidth();
      this.positionSubMenu();
      if(this.options.effect === "slide")
      {
         this.childMenu.setStyles(
         {
            display : "block", visibility : "visible"
         }
         );
         if(this.subMenuType === "initial" && this.options.orientation === "horizontal")
         {
            if(A)
            {
               this.myEffect.set(
               {
                  "margin-top" : 0
               }
               ).chain(function()
               {
                  this.showSubMenuComplete()
               }
               .bind(this))
            }
            else
            {
               this.myEffect.start(
               {
                  "margin-top" : 0
               }
               ).chain(function()
               {
                  this.showSubMenuComplete()
               }
               .bind(this))
            }
         }
         else
         {
            if(A)
            {
               this.myEffect.set(
               {
                  "margin-left" : 0
               }
               ).chain(function()
               {
                  this.showSubMenuComplete()
               }
               .bind(this))
            }
            else
            {
               this.myEffect.start(
               {
                  "margin-left" : 0
               }
               ).chain(function()
               {
                  this.showSubMenuComplete()
               }
               .bind(this))
            }
         }
      }
      else
      {
         if(this.options.effect === "fade")
         {
            if(A)
            {
               this.myEffect.set(
               {
                  opacity : this.options.opacity
               }
               ).chain(function()
               {
                  this.showSubMenuComplete()
               }
               .bind(this))
            }
            else
            {
               this.myEffect.start(
               {
                  opacity : this.options.opacity
               }
               ).chain(function()
               {
                  this.showSubMenuComplete()
               }
               .bind(this))
            }
         }
         else
         {
            if(this.options.effect == "slide & fade")
            {
               this.childMenu.setStyles(
               {
                  display : "block", visibility : "visible"
               }
               );
               this.childMenu.getFirst().setStyles(
               {
                  left : 0
               }
               );
               if(this.subMenuType === "initial" && this.options.orientation === "horizontal")
               {
                  if(A)
                  {
                     this.myEffect.set(
                     {
                        "margin-top" : 0, opacity : this.options.opacity
                     }
                     ).chain(function()
                     {
                        this.showSubMenuComplete()
                     }
                     .bind(this))
                  }
                  else
                  {
                     this.myEffect.start(
                     {
                        "margin-top" : 0, opacity : this.options.opacity
                     }
                     ).chain(function()
                     {
                        this.showSubMenuComplete()
                     }
                     .bind(this))
                  }
               }
               else
               {
                  if(A)
                  {
                     if(this.options.direction.x === "right")
                     {
                        this.myEffect.set(
                        {
                           "margin-left" : 0, opacity : this.options.opacity
                        }
                        ).chain(function()
                        {
                           this.showSubMenuComplete()
                        }
                        .bind(this))
                     }
                     else
                     {
                        if(this.options.direction.x === "left")
                        {
                           this.myEffect.set(
                           {
                              "margin-left" : 0, opacity : this.options.opacity
                           }
                           ).chain(function()
                           {
                              this.showSubMenuComplete()
                           }
                           .bind(this))
                        }
                     }
                  }
                  else
                  {
                     if(this.options.direction.x === "right")
                     {
                        this.myEffect.set(
                        {
                           "margin-left" : - this.width, opacity : this.options.opacity
                        }
                        );
                        this.myEffect.start(
                        {
                           "margin-left" : 0, opacity : this.options.opacity
                        }
                        ).chain(function()
                        {
                           this.showSubMenuComplete()
                        }
                        .bind(this))
                     }
                     else
                     {
                        if(this.options.direction.x === "left")
                        {
                           this.myEffect.start(
                           {
                              "margin-left" : 0, opacity : this.options.opacity
                           }
                           ).chain(function()
                           {
                              this.showSubMenuComplete()
                           }
                           .bind(this))
                        }
                     }
                  }
               }
            }
            else
            {
               this.childMenu.setStyles(
               {
                  display : "block", visibility : "visible"
               }
               ).chain(function()
               {
                  this.showSubMenuComplete(this)
               }
               .bind(this))
            }
         }
      }
      this.childMenu.store("status", "open")
   }
   , showSubMenuComplete : function()
   {
      this.options.onShowSubMenu_complete(this)
   }
   , positionSubMenu : function()
   {
      this.options.onPositionSubMenu_begin(this);
      this.childMenu.setStyle("width", this.width);
      this.childMenu.getFirst().setStyle("width", this.width);
      if(this.subMenuType === "subsequent")
      {
         if(this.parentSubMenu && this.options.direction.x != this.parentSubMenu.options.direction.x)
         {
            if(this.parentSubMenu.options.direction.x === "left" && this.options.effect && this.options.effect.contains("slide"))
            {
               this.myEffect.set(
               {
                  "margin-left" : this.width
               }
               )
            }
         }
         this.options.direction.x = this.parentSubMenu.options.direction.x;
         this.options.direction.xInverse = this.parentSubMenu.options.direction.xInverse;
         this.options.direction.y = this.parentSubMenu.options.direction.y;
         this.options.direction.yInverse = this.parentSubMenu.options.direction.yInverse
      }
      var C;
      var A;
      if(this.subMenuType == "initial")
      {
         if(this.options.direction.y === "up")
         {
            if(this.options.orientation === "vertical")
            {
               C = this.btn.getCoordinates().bottom - this.height + this.options.tweakInitial.y
            }
            else
            {
               C = this.btn.getCoordinates().top - this.height + this.options.tweakInitial.y
            }
            this.childMenu.style.top = C + "px"
         }
         else
         {
            if(this.options.orientation == "horizontal")
            {
               this.childMenu.style.top = this.btn.getCoordinates().bottom + this.options.tweakInitial.y + "px"
            }
            else
            {
               if(this.options.orientation == "vertical")
               {
                  C = this.btn.getPosition().y + this.options.tweakInitial.y;
                  if((C + this.childMenu.getSize().y) >= $(document.body).getScrollSize().y)
                  {
                     A = (C + this.childMenu.getSize().y) - $(document.body).getScrollSize().y;
                     C = C - A - 20
                  }
                  this.childMenu.style.top = C + "px"
               }
            }
         }
         if(this.options.orientation == "horizontal")
         {
            this.childMenu.style.left = this.btn.getPosition().x + this.options.tweakInitial.x + "px"
         }
         else
         {
            if(this.options.direction.x == "left")
            {
               this.childMenu.style.left = this.btn.getPosition().x - this.childMenu.getCoordinates().width + this.options.tweakInitial.x + "px"
            }
            else
            {
               if(this.options.direction.x == "right")
               {
                  this.childMenu.style.left = this.btn.getCoordinates().right + this.options.tweakInitial.x + "px"
               }
            }
         }
      }
      else
      {
         if(this.subMenuType == "subsequent")
         {
            if(this.options.direction.y === "down")
            {
               if((this.btn.getCoordinates().top + this.options.tweakSubsequent.y + this.childMenu.getSize().y) >= $(document.body).getScrollSize().y)
               {
                  A = (this.btn.getCoordinates().top + this.options.tweakSubsequent.y + this.childMenu.getSize().y) - $(document.body).getScrollSize().y;
                  this.childMenu.style.top = (this.btn.getCoordinates().top + this.options.tweakSubsequent.y) - A - 20 + "px"
               }
               else
               {
                  this.childMenu.style.top = this.btn.getCoordinates().top + this.options.tweakSubsequent.y + "px"
               }
            }
            else
            {
               if(this.options.direction.y === "up")
               {
                  if((this.btn.getCoordinates().bottom - this.height + this.options.tweakSubsequent.y) < 1)
                  {
                     this.options.direction.y = "down";
                     this.options.direction.yInverse = "up";
                     this.childMenu.style.top = this.btn.getCoordinates().top + this.options.tweakSubsequent.y + "px"
                  }
                  else
                  {
                     this.childMenu.style.top = this.btn.getCoordinates().bottom - this.height + this.options.tweakSubsequent.y + "px"
                  }
               }
            }
            if(this.options.direction.x == "left")
            {
               this.childMenu.style.left = this.btn.getCoordinates().left - this.childMenu.getCoordinates().width + this.options.tweakSubsequent.x + "px";
               if(this.childMenu.getPosition().x < 0)
               {
                  this.options.direction.x = "right";
                  this.options.direction.xInverse = "left";
                  this.childMenu.style.left = this.btn.getPosition().x + this.btn.getCoordinates().width + this.options.tweakSubsequent.x + "px";
                  if(this.options.effect === "slide" || this.options.effect === "slide & fade")
                  {
                     this.myEffect.set(
                     {
                        "margin-left" : - this.width, opacity : this.options.opacity
                     }
                     )
                  }
               }
            }
            else
            {
               if(this.options.direction.x == "right")
               {
                  this.childMenu.style.left = this.btn.getCoordinates().right + this.options.tweakSubsequent.x + "px";
                  var D = this.childMenu.getCoordinates().right;
                  var B = document.getCoordinates().width + window.getScroll().x;
                  if(D > B)
                  {
                     this.options.direction.x = "left";
                     this.options.direction.xInverse = "right";
                     this.childMenu.style.left = this.btn.getCoordinates().left - this.childMenu.getCoordinates().width + this.options.tweakSubsequent.x + "px";
                     if(this.options.effect === "slide" || this.options.effect === "slide & fade")
                     {
                        this.myEffect.set(
                        {
                           "margin-left" : this.width, opacity : this.options.opacity
                        }
                        )
                     }
                  }
               }
            }
         }
      }
      this.options.onPositionSubMenu_complete(this)
   }
}
);
