/**
 * menuMatic 
 * @version 0.68.3 (beta)
 * @author Jason J. Jaeger | greengeckodesign.com
 * @copyright 2008 Jason John Jaeger
 * @license MIT-style License
 *			Permission is hereby granted, free of charge, to any person obtaining a copy
 *			of this software and associated documentation files (the "Software"), to deal
 *			in the Software without restriction, including without limitation the rights
 *			to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 *			copies of the Software, and to permit persons to whom the Software is
 *			furnished to do so, subject to the following conditions:
 *	
 *			The above copyright notice and this permission notice shall be included in
 *			all copies or substantial portions of the Software.
 *	
 *			THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 *			IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 *			FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 *			AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 *			LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 *			OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 *			THE SOFTWARE.
 **/
var MenuMatic = new Class({ Implements: Options, options: { id: "dropDownMenu", subMenusContainerId: "subMenusContainer", effect: "slide & fade", duration: 600, physics: Fx.Transitions.Pow.easeOut, hideDelay: 1000, stretchMainMenu: false, matchWidthMode: false, orientation: "horizontal", direction: { x: "right", y: "down" }, tweakInitial: { x: 0, y: 0 }, tweakSubsequent: { x: 0, y: 0 }, center: false, opacity: 95, mmbFocusedClassName: null, mmbClassName: null, killDivider: null, fixHasLayoutBug: false, 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: MenuMatic, 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) } });