﻿var MooTools = { version: "1.11" }; function $defined(a) { return (a != undefined) } function $type(b) { if (!$defined(b)) { return false } if (b.htmlElement) { return "element" } var a = typeof b; if (a == "object" && b.nodeName) { switch (b.nodeType) { case 1: return "element"; case 3: return (/\S/).test(b.nodeValue) ? "textnode" : "whitespace" } } if (a == "object" || a == "function") { switch (b.constructor) { case Array: return "array"; case RegExp: return "regexp"; case Class: return "class" } if (typeof b.length == "number") { if (b.item) { return "collection" } if (b.callee) { return "arguments" } } } return a } function $merge() { var c = {}; for (var b = 0; b < arguments.length; b++) { for (var f in arguments[b]) { var a = arguments[b][f]; var d = c[f]; if (d && $type(a) == "object" && $type(d) == "object") { c[f] = $merge(d, a) } else { c[f] = a } } } return c } var $extend = function() { var a = arguments; if (!a[1]) { a = [this, a[0]] } for (var b in a[1]) { a[0][b] = a[1][b] } return a[0] }; var $native = function() { for (var b = 0, a = arguments.length; b < a; b++) { arguments[b].extend = function(c) { for (var d in c) { if (!this.prototype[d]) { this.prototype[d] = c[d] } if (!this[d]) { this[d] = $native.generic(d) } } } } }; $native.generic = function(a) { return function(b) { return this.prototype[a].apply(b, Array.prototype.slice.call(arguments, 1)) } }; $native(Function, Array, String, Number); function $chk(a) { return !!(a || a === 0) } function $pick(b, a) { return $defined(b) ? b : a } function $random(b, a) { return Math.floor(Math.random() * (a - b + 1) + b) } function $time() { return new Date().getTime() } function $clear(a) { clearTimeout(a); clearInterval(a); return null } var Abstract = function(a) { a = a || {}; a.extend = $extend; return a }; var Window = new Abstract(window); var Document = new Abstract(document); document.head = document.getElementsByTagName("head")[0]; window.xpath = !!(document.evaluate); if (window.ActiveXObject) { window.ie = window[window.XMLHttpRequest ? "ie7" : "ie6"] = true } else { if (document.childNodes && !document.all && !navigator.taintEnabled) { window.webkit = window[window.xpath ? "webkit420" : "webkit419"] = true } else { if (document.getBoxObjectFor != null) { window.gecko = true } } } window.khtml = window.webkit; Object.extend = $extend; if (typeof HTMLElement == "undefined") { var HTMLElement = function() { }; if (window.webkit) { document.createElement("iframe") } HTMLElement.prototype = (window.webkit) ? window["[[DOMElement.prototype]]"] : {} } HTMLElement.prototype.htmlElement = function() { }; if (window.ie6) { try { document.execCommand("BackgroundImageCache", false, true) } catch (e) { } } var Class = function(b) { var a = function() { return (arguments[0] !== null && this.initialize && $type(this.initialize) == "function") ? this.initialize.apply(this, arguments) : this }; $extend(a, this); a.prototype = b; a.constructor = Class; return a }; Class.empty = function() { }; Class.prototype = { extend: function(b) { var c = new this(null); for (var d in b) { var a = c[d]; c[d] = Class.Merge(a, b[d]) } return new Class(c) }, implement: function() { for (var b = 0, a = arguments.length; b < a; b++) { $extend(this.prototype, arguments[b]) } } }; Class.Merge = function(c, d) { if (c && c != d) { var b = $type(d); if (b != $type(c)) { return d } switch (b) { case "function": var a = function() { this.parent = arguments.callee.parent; return d.apply(this, arguments) }; a.parent = c; return a; case "object": return $merge(c, d) } } return d }; var Chain = new Class({ chain: function(a) { this.chains = this.chains || []; this.chains.push(a); return this }, callChain: function() { if (this.chains && this.chains.length) { this.chains.shift().delay(10, this) } }, clearChain: function() { this.chains = [] } }); var Events = new Class({ addEvent: function(b, a) { if (a != Class.empty) { this.$events = this.$events || {}; this.$events[b] = this.$events[b] || []; this.$events[b].include(a) } return this }, fireEvent: function(c, b, a) { if (this.$events && this.$events[c]) { this.$events[c].each(function(d) { d.create({ bind: this, delay: a, "arguments": b })() }, this) } return this }, removeEvent: function(b, a) { if (this.$events && this.$events[b]) { this.$events[b].remove(a) } return this } }); var Options = new Class({ setOptions: function() { this.options = $merge.apply(null, [this.options].extend(arguments)); if (this.addEvent) { for (var a in this.options) { if ($type(this.options[a] == "function") && (/^on[A-Z]/).test(a)) { this.addEvent(a, this.options[a]) } } } return this } }); Array.extend({ MT_forEach: function(c, d) { for (var b = 0, a = this.length; b < a; b++) { c.call(d, this[b], b, this) } }, filter: function(d, f) { var c = []; for (var b = 0, a = this.length; b < a; b++) { if (d.call(f, this[b], b, this)) { c.push(this[b]) } } return c }, map: function(d, f) { var c = []; for (var b = 0, a = this.length; b < a; b++) { c[b] = d.call(f, this[b], b, this) } return c }, every: function(c, d) { for (var b = 0, a = this.length; b < a; b++) { if (!c.call(d, this[b], b, this)) { return false } } return true }, some: function(c, d) { for (var b = 0, a = this.length; b < a; b++) { if (c.call(d, this[b], b, this)) { return true } } return false }, indexOf: function(c, d) { var a = this.length; for (var b = (d < 0) ? Math.max(0, a + d) : d || 0; b < a; b++) { if (this[b] === c) { return b } } return -1 }, copy: function(d, c) { d = d || 0; if (d < 0) { d = this.length + d } c = c || (this.length - d); var a = []; for (var b = 0; b < c; b++) { a[b] = this[d++] } return a }, remove: function(c) { var b = 0; var a = this.length; while (b < a) { if (this[b] === c) { this.splice(b, 1); a-- } else { b++ } } return this }, contains: function(a, b) { return this.indexOf(a, b) != -1 }, associate: function(c) { var d = {}, b = Math.min(this.length, c.length); for (var a = 0; a < b; a++) { d[c[a]] = this[a] } return d }, extend: function(c) { for (var b = 0, a = c.length; b < a; b++) { this.push(c[b]) } return this }, merge: function(c) { for (var b = 0, a = c.length; b < a; b++) { this.include(c[b]) } return this }, include: function(a) { if (!this.contains(a)) { this.push(a) } return this }, getRandom: function() { return this[$random(0, this.length - 1)] || null }, getLast: function() { return this[this.length - 1] || null } }); Array.prototype.each = Array.prototype.MT_forEach; Array.each = Array.MT_forEach; function $A(a) { return Array.copy(a) } function $each(c, b, d) { if (c && typeof c.length == "number" && $type(c) != "object") { Array.MT_forEach(c, b, d) } else { for (var a in c) { b.call(d || c, c[a], a) } } } Array.prototype.test = Array.prototype.contains; String.extend({ test: function(a, b) { return (($type(a) == "string") ? new RegExp(a, b) : a).test(this) }, toInt: function() { return parseInt(this, 10) }, toFloat: function() { return parseFloat(this) }, camelCase: function() { return this.replace(/-\D/g, function(a) { return a.charAt(1).toUpperCase() }) }, hyphenate: function() { return this.replace(/\w[A-Z]/g, function(a) { return (a.charAt(0) + "-" + a.charAt(1).toLowerCase()) }) }, capitalize: function() { return this.replace(/\b[a-z]/g, function(a) { return a.toUpperCase() }) }, trim: function() { return this.replace(/^\s+|\s+$/g, "") }, clean: function() { return this.replace(/\s{2,}/g, " ").trim() }, rgbToHex: function(b) { var a = this.match(/\d{1,3}/g); return (a) ? a.rgbToHex(b) : false }, hexToRgb: function(b) { var a = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); return (a) ? a.slice(1).hexToRgb(b) : false }, contains: function(a, b) { return (b) ? (b + this + b).indexOf(b + a + b) > -1 : this.indexOf(a) > -1 }, escapeRegExp: function() { return this.replace(/([.*+?^${}()|[\]\/\\])/g, "\\$1") } }); Array.extend({ rgbToHex: function(d) { if (this.length < 3) { return false } if (this.length == 4 && this[3] == 0 && !d) { return "transparent" } var b = []; for (var a = 0; a < 3; a++) { var c = (this[a] - 0).toString(16); b.push((c.length == 1) ? "0" + c : c) } return d ? b : "#" + b.join("") }, hexToRgb: function(c) { if (this.length != 3) { return false } var a = []; for (var b = 0; b < 3; b++) { a.push(parseInt((this[b].length == 1) ? this[b] + this[b] : this[b], 16)) } return c ? a : "rgb(" + a.join(",") + ")" } }); Function.extend({ create: function(a) { var b = this; a = $merge({ bind: b, event: false, "arguments": null, delay: false, periodical: false, attempt: false }, a); if ($chk(a.arguments) && $type(a.arguments) != "array") { a.arguments = [a.arguments] } return function(f) { var c; if (a.event) { f = f || window.event; c = [(a.event === true) ? f : new a.event(f)]; if (a.arguments) { c.extend(a.arguments) } } else { c = a.arguments || arguments } var g = function() { return b.apply($pick(a.bind, b), c) }; if (a.delay) { return setTimeout(g, a.delay) } if (a.periodical) { return setInterval(g, a.periodical) } if (a.attempt) { try { return g() } catch (d) { return false } } return g() } }, pass: function(a, b) { return this.create({ "arguments": a, bind: b }) }, attempt: function(a, b) { return this.create({ "arguments": a, bind: b, attempt: true })() }, bind: function(b, a) { return this.create({ bind: b, "arguments": a }) }, bindAsEventListener: function(b, a) { return this.create({ bind: b, event: true, "arguments": a }) }, delay: function(b, c, a) { return this.create({ delay: b, bind: c, "arguments": a })() }, periodical: function(a, c, b) { return this.create({ periodical: a, bind: c, "arguments": b })() } }); Number.extend({ toInt: function() { return parseInt(this) }, toFloat: function() { return parseFloat(this) }, limit: function(b, a) { return Math.min(a, Math.max(b, this)) }, round: function(a) { a = Math.pow(10, a || 0); return Math.round(this * a) / a }, times: function(b) { for (var a = 0; a < this; a++) { b(a) } } }); var Element = new Class({ initialize: function(d, c) { if ($type(d) == "string") { if (window.ie && c && (c.name || c.type)) { var a = (c.name) ? ' name="' + c.name + '"' : ""; var b = (c.type) ? ' type="' + c.type + '"' : ""; delete c.name; delete c.type; d = "<" + d + a + b + ">" } d = document.createElement(d) } d = $(d); return (!c || !d) ? d : d.set(c) } }); var Elements = new Class({ initialize: function(a) { return (a) ? $extend(a, this) : this } }); Elements.extend = function(a) { for (var b in a) { this.prototype[b] = a[b]; this[b] = $native.generic(b) } }; function $(b) { if (!b) { return null } if (b.htmlElement) { return Garbage.collect(b) } if ([window, document].contains(b)) { return b } var a = $type(b); if (a == "string") { b = document.getElementById(b); a = (b) ? "element" : false } if (a != "element") { return null } if (b.htmlElement) { return Garbage.collect(b) } if (["object", "embed"].contains(b.tagName.toLowerCase())) { return b } $extend(b, Element.prototype); b.htmlElement = function() { }; return Garbage.collect(b) } document.getElementsBySelector = document.getElementsByTagName; function $$() { var d = []; for (var c = 0, b = arguments.length; c < b; c++) { var a = arguments[c]; switch ($type(a)) { case "element": d.push(a); case "boolean": break; case false: break; case "string": a = document.getElementsBySelector(a, true); default: d.extend(a) } } return $$.unique(d) } $$.unique = function(j) { var f = []; for (var c = 0, a = j.length; c < a; c++) { if (j[c].$included) { continue } var b = $(j[c]); if (b && !b.$included) { b.$included = true; f.push(b) } } for (var h = 0, g = f.length; h < g; h++) { f[h].$included = null } return new Elements(f) }; Elements.Multi = function(a) { return function() { var d = arguments; var b = []; var h = true; for (var f = 0, c = this.length, g; f < c; f++) { g = this[f][a].apply(this[f], d); if ($type(g) != "element") { h = false } b.push(g) } return (h) ? $$.unique(b) : b } }; Element.extend = function(a) { for (var b in a) { HTMLElement.prototype[b] = a[b]; Element.prototype[b] = a[b]; Element[b] = $native.generic(b); var c = (Array.prototype[b]) ? b + "Elements" : b; Elements.prototype[c] = Elements.Multi(b) } }; Element.extend({ set: function(a) { for (var c in a) { var b = a[c]; switch (c) { case "styles": this.setStyles(b); break; case "events": if (this.addEvents) { this.addEvents(b) } break; case "properties": this.setProperties(b); break; default: this.setProperty(c, b) } } return this }, inject: function(c, a) { c = $(c); switch (a) { case "before": c.parentNode.insertBefore(this, c); break; case "after": var b = c.getNext(); if (!b) { c.parentNode.appendChild(this) } else { c.parentNode.insertBefore(this, b) } break; case "top": var d = c.firstChild; if (d) { c.insertBefore(this, d); break } default: c.appendChild(this) } return this }, injectBefore: function(a) { return this.inject(a, "before") }, injectAfter: function(a) { return this.inject(a, "after") }, injectInside: function(a) { return this.inject(a, "bottom") }, injectTop: function(a) { return this.inject(a, "top") }, adopt: function() { var a = []; $each(arguments, function(b) { a = a.concat(b) }); $$(a).inject(this); return this }, remove: function() { return this.parentNode.removeChild(this) }, clone: function(c) { var b = $(this.cloneNode(c !== false)); if (!b.$events) { return b } b.$events = {}; for (var a in this.$events) { b.$events[a] = { keys: $A(this.$events[a].keys), values: $A(this.$events[a].values)} } return b.removeEvents() }, replaceWith: function(a) { a = $(a); this.parentNode.replaceChild(a, this); return a }, appendText: function(a) { this.appendChild(document.createTextNode(a)); return this }, hasClass: function(a) { return this.className.contains(a, " ") }, addClass: function(a) { if (!this.hasClass(a)) { this.className = (this.className + " " + a).clean() } return this }, removeClass: function(a) { this.className = this.className.replace(new RegExp("(^|\\s)" + a + "(?:\\s|$)"), "$1").clean(); return this }, toggleClass: function(a) { return this.hasClass(a) ? this.removeClass(a) : this.addClass(a) }, setStyle: function(b, a) { switch (b) { case "opacity": return this.setOpacity(parseFloat(a)); case "float": b = (window.ie) ? "styleFloat" : "cssFloat" } b = b.camelCase(); switch ($type(a)) { case "number": if (!["zIndex", "zoom"].contains(b)) { a += "px" } break; case "array": a = "rgb(" + a.join(",") + ")" } this.style[b] = a; return this }, setStyles: function(a) { switch ($type(a)) { case "object": Element.setMany(this, "setStyle", a); break; case "string": this.style.cssText = a } return this }, setOpacity: function(a) { if (a == 0) { if (this.style.visibility != "hidden") { this.style.visibility = "hidden" } } else { if (this.style.visibility != "visible") { this.style.visibility = "visible" } } if (!this.currentStyle || !this.currentStyle.hasLayout) { this.style.zoom = 1 } if (window.ie) { this.style.filter = (a == 1) ? "" : "alpha(opacity=" + a * 100 + ")" } this.style.opacity = this.$tmp.opacity = a; return this }, getStyle: function(c) { c = c.camelCase(); var a = this.style[c]; if (!$chk(a)) { if (c == "opacity") { return this.$tmp.opacity } a = []; for (var b in Element.Styles) { if (c == b) { Element.Styles[b].each(function(g) { var f = this.getStyle(g); a.push(parseInt(f) ? f : "0px") }, this); if (c == "border") { var d = a.every(function(f) { return (f == a[0]) }); return (d) ? a[0] : false } return a.join(" ") } } if (c.contains("border")) { if (Element.Styles.border.contains(c)) { return ["Width", "Style", "Color"].map(function(f) { return this.getStyle(c + f) }, this).join(" ") } else { if (Element.borderShort.contains(c)) { return ["Top", "Right", "Bottom", "Left"].map(function(f) { return this.getStyle("border" + f + c.replace("border", "")) }, this).join(" ") } } } if (document.defaultView) { a = document.defaultView.getComputedStyle(this, null).getPropertyValue(c.hyphenate()) } else { if (this.currentStyle) { a = this.currentStyle[c] } } } if (window.ie) { a = Element.fixStyle(c, a, this) } if (a && c.test(/color/i) && a.contains("rgb")) { return a.split("rgb").splice(1, 4).map(function(f) { return f.rgbToHex() }).join(" ") } return a }, getStyles: function() { return Element.getMany(this, "getStyle", arguments) }, walk: function(a, c) { a += "Sibling"; var b = (c) ? this[c] : this[a]; while (b && $type(b) != "element") { b = b[a] } return $(b) }, getPrevious: function() { return this.walk("previous") }, getNext: function() { return this.walk("next") }, getFirst: function() { return this.walk("next", "firstChild") }, getLast: function() { return this.walk("previous", "lastChild") }, getParent: function() { return $(this.parentNode) }, getChildren: function() { return $$(this.childNodes) }, hasChild: function(a) { return !!$A(this.getElementsByTagName("*")).contains(a) }, getProperty: function(d) { var b = Element.Properties[d]; if (b) { return this[b] } var a = Element.PropertiesIFlag[d] || 0; if (!window.ie || a) { return this.getAttribute(d, a) } var c = this.attributes[d]; return (c) ? c.nodeValue : null }, removeProperty: function(b) { var a = Element.Properties[b]; if (a) { this[a] = "" } else { this.removeAttribute(b) } return this }, getProperties: function() { return Element.getMany(this, "getProperty", arguments) }, setProperty: function(c, b) { var a = Element.Properties[c]; if (a) { this[a] = b } else { this.setAttribute(c, b) } return this }, setProperties: function(a) { return Element.setMany(this, "setProperty", a) }, setHTML: function() { this.innerHTML = $A(arguments).join(""); return this }, setText: function(b) { var a = this.getTag(); if (["style", "script"].contains(a)) { if (window.ie) { if (a == "style") { this.styleSheet.cssText = b } else { if (a == "script") { this.setProperty("text", b) } } return this } else { this.removeChild(this.firstChild); return this.appendText(b) } } this[$defined(this.innerText) ? "innerText" : "textContent"] = b; return this }, getText: function() { var a = this.getTag(); if (["style", "script"].contains(a)) { if (window.ie) { if (a == "style") { return this.styleSheet.cssText } else { if (a == "script") { return this.getProperty("text") } } } else { return this.innerHTML } } return ($pick(this.innerText, this.textContent)) }, getTag: function() { return this.tagName.toLowerCase() }, empty: function() { Garbage.trash(this.getElementsByTagName("*")); return this.setHTML("") } }); Element.fixStyle = function(f, a, d) { if ($chk(parseInt(a))) { return a } if (["height", "width"].contains(f)) { var b = (f == "width") ? ["left", "right"] : ["top", "bottom"]; var c = 0; b.each(function(g) { c += d.getStyle("border-" + g + "-width").toInt() + d.getStyle("padding-" + g).toInt() }); return d["offset" + f.capitalize()] - c + "px" } else { if (f.test(/border(.+)Width|margin|padding/)) { return "0px" } } return a }; Element.Styles = { border: [], padding: [], margin: [] }; ["Top", "Right", "Bottom", "Left"].each(function(b) { for (var a in Element.Styles) { Element.Styles[a].push(a + b) } }); Element.borderShort = ["borderWidth", "borderStyle", "borderColor"]; Element.getMany = function(b, d, c) { var a = {}; $each(c, function(f) { a[f] = b[d](f) }); return a }; Element.setMany = function(b, d, c) { for (var a in c) { b[d](a, c[a]) } return b }; Element.Properties = new Abstract({ "class": "className", "for": "htmlFor", colspan: "colSpan", rowspan: "rowSpan", accesskey: "accessKey", tabindex: "tabIndex", maxlength: "maxLength", readonly: "readOnly", frameborder: "frameBorder", value: "value", disabled: "disabled", checked: "checked", multiple: "multiple", selected: "selected" }); Element.PropertiesIFlag = { href: 2, src: 2 }; Element.Methods = { Listeners: { addListener: function(b, a) { if (this.addEventListener) { this.addEventListener(b, a, false) } else { this.attachEvent("on" + b, a) } return this }, removeListener: function(b, a) { if (this.removeEventListener) { this.removeEventListener(b, a, false) } else { this.detachEvent("on" + b, a) } return this } } }; window.extend(Element.Methods.Listeners); document.extend(Element.Methods.Listeners); Element.extend(Element.Methods.Listeners); var Garbage = { elements: [], collect: function(a) { if (!a.$tmp) { Garbage.elements.push(a); a.$tmp = { opacity: 1} } return a }, trash: function(f) { for (var b = 0, a = f.length, c; b < a; b++) { if (!(c = f[b]) || !c.$tmp) { continue } if (c.$events) { c.fireEvent("trash").removeEvents() } for (var g in c.$tmp) { c.$tmp[g] = null } for (var h in Element.prototype) { c[h] = null } Garbage.elements[Garbage.elements.indexOf(c)] = null; c.htmlElement = c.$tmp = c = null } Garbage.elements.remove(null) }, empty: function() { Garbage.collect(window); Garbage.collect(document); Garbage.trash(Garbage.elements) } }; window.addListener("beforeunload", function() { window.addListener("unload", Garbage.empty); if (window.ie) { window.addListener("unload", CollectGarbage) } }); var Event = new Class({ initialize: function(c) { if (c && c.$extended) { return c } this.$extended = true; c = c || window.event; this.event = c; this.type = c.type; this.target = c.target || c.srcElement; if (this.target.nodeType == 3) { this.target = this.target.parentNode } this.shift = c.shiftKey; this.control = c.ctrlKey; this.alt = c.altKey; this.meta = c.metaKey; if (["DOMMouseScroll", "mousewheel"].contains(this.type)) { this.wheel = (c.wheelDelta) ? c.wheelDelta / 120 : -(c.detail || 0) / 3 } else { if (this.type.contains("key")) { this.code = c.which || c.keyCode; for (var b in Event.keys) { if (Event.keys[b] == this.code) { this.key = b; break } } if (this.type == "keydown") { var a = this.code - 111; if (a > 0 && a < 13) { this.key = "f" + a } } this.key = this.key || String.fromCharCode(this.code).toLowerCase() } else { if (this.type.test(/(click|mouse|menu)/)) { this.page = { x: c.pageX || c.clientX + document.documentElement.scrollLeft, y: c.pageY || c.clientY + document.documentElement.scrollTop }; this.client = { x: c.pageX ? c.pageX - window.pageXOffset : c.clientX, y: c.pageY ? c.pageY - window.pageYOffset : c.clientY }; this.rightClick = (c.which == 3) || (c.button == 2); switch (this.type) { case "mouseover": this.relatedTarget = c.relatedTarget || c.fromElement; break; case "mouseout": this.relatedTarget = c.relatedTarget || c.toElement } this.fixRelatedTarget() } } } return this }, stop: function() { return this.stopPropagation().preventDefault() }, stopPropagation: function() { if (this.event.stopPropagation) { this.event.stopPropagation() } else { this.event.cancelBubble = true } return this }, preventDefault: function() { if (this.event.preventDefault) { this.event.preventDefault() } else { this.event.returnValue = false } return this } }); Event.fix = { relatedTarget: function() { if (this.relatedTarget && this.relatedTarget.nodeType == 3) { this.relatedTarget = this.relatedTarget.parentNode } }, relatedTargetGecko: function() { try { Event.fix.relatedTarget.call(this) } catch (a) { this.relatedTarget = this.target } } }; Event.prototype.fixRelatedTarget = (window.gecko) ? Event.fix.relatedTargetGecko : Event.fix.relatedTarget; Event.keys = new Abstract({ enter: 13, up: 38, down: 40, left: 37, right: 39, esc: 27, space: 32, backspace: 8, tab: 9, "delete": 46 }); Element.Methods.Events = { addEvent: function(c, b) { this.$events = this.$events || {}; this.$events[c] = this.$events[c] || { keys: [], values: [] }; if (this.$events[c].keys.contains(b)) { return this } this.$events[c].keys.push(b); var a = c; var d = Element.Events[c]; if (d) { if (d.add) { d.add.call(this, b) } if (d.map) { b = d.map } if (d.type) { a = d.type } } if (!this.addEventListener) { b = b.create({ bind: this, event: true }) } this.$events[c].values.push(b); return (Element.NativeEvents.contains(a)) ? this.addListener(a, b) : this }, removeEvent: function(c, b) { if (!this.$events || !this.$events[c]) { return this } var g = this.$events[c].keys.indexOf(b); if (g == -1) { return this } var a = this.$events[c].keys.splice(g, 1)[0]; var f = this.$events[c].values.splice(g, 1)[0]; var d = Element.Events[c]; if (d) { if (d.remove) { d.remove.call(this, b) } if (d.type) { c = d.type } } return (Element.NativeEvents.contains(c)) ? this.removeListener(c, f) : this }, addEvents: function(a) { return Element.setMany(this, "addEvent", a) }, removeEvents: function(a) { if (!this.$events) { return this } if (!a) { for (var b in this.$events) { this.removeEvents(b) } this.$events = null } else { if (this.$events[a]) { this.$events[a].keys.each(function(c) { this.removeEvent(a, c) }, this); this.$events[a] = null } } return this }, fireEvent: function(c, b, a) { if (this.$events && this.$events[c]) { this.$events[c].keys.each(function(d) { d.create({ bind: this, delay: a, "arguments": b })() }, this) } return this }, cloneEvents: function(c, a) { if (!c.$events) { return this } if (!a) { for (var b in c.$events) { this.cloneEvents(c, b) } } else { if (c.$events[a]) { c.$events[a].keys.each(function(d) { this.addEvent(a, d) }, this) } } return this } }; window.extend(Element.Methods.Events); document.extend(Element.Methods.Events); Element.extend(Element.Methods.Events); Element.Events = new Abstract({ mouseenter: { type: "mouseover", map: function(a) { a = new Event(a); if (a.relatedTarget != this && !this.hasChild(a.relatedTarget)) { this.fireEvent("mouseenter", a) } } }, mouseleave: { type: "mouseout", map: function(a) { a = new Event(a); if (a.relatedTarget != this && !this.hasChild(a.relatedTarget)) { this.fireEvent("mouseleave", a) } } }, mousewheel: { type: (window.gecko) ? "DOMMouseScroll" : "mousewheel"} }); Element.NativeEvents = ["click", "dblclick", "mouseup", "mousedown", "mousewheel", "DOMMouseScroll", "mouseover", "mouseout", "mousemove", "keydown", "keypress", "keyup", "load", "unload", "beforeunload", "resize", "move", "focus", "blur", "change", "submit", "reset", "select", "error", "abort", "contextmenu", "scroll"]; Function.extend({ bindWithEvent: function(b, a) { return this.create({ bind: b, "arguments": a, event: Event }) } }); Elements.extend({ filterByTag: function(a) { return new Elements(this.filter(function(b) { return (Element.getTag(b) == a) })) }, filterByClass: function(a, c) { var b = this.filter(function(d) { return (d.className && d.className.contains(a, " ")) }); return (c) ? b : new Elements(b) }, filterById: function(c, b) { var a = this.filter(function(d) { return (d.id == c) }); return (b) ? a : new Elements(a) }, filterByAttribute: function(b, a, d, f) { var c = this.filter(function(g) { var h = Element.getProperty(g, b); if (!h) { return false } if (!a) { return true } switch (a) { case "=": return (h == d); case "*=": return (h.contains(d)); case "^=": return (h.substr(0, d.length) == d); case "$=": return (h.substr(h.length - d.length) == d); case "!=": return (h != d); case "~=": return h.contains(d, " ") } return false }); return (f) ? c : new Elements(c) } }); function $E(a, b) { return ($(b) || document).getElement(a) } function $ES(a, b) { return ($(b) || document).getElementsBySelector(a) } $$.shared = { regexp: /^(\w*|\*)(?:#([\w-]+)|\.([\w-]+))?(?:\[(\w+)(?:([!*^$]?=)["']?([^"'\]]*)["']?)?])?$/, xpath: { getParam: function(b, d, f, c) { var a = [d.namespaceURI ? "xhtml:" : "", f[1]]; if (f[2]) { a.push('[@id="', f[2], '"]') } if (f[3]) { a.push('[contains(concat(" ", @class, " "), " ', f[3], ' ")]') } if (f[4]) { if (f[5] && f[6]) { switch (f[5]) { case "*=": a.push("[contains(@", f[4], ', "', f[6], '")]'); break; case "^=": a.push("[starts-with(@", f[4], ', "', f[6], '")]'); break; case "$=": a.push("[substring(@", f[4], ", string-length(@", f[4], ") - ", f[6].length, ' + 1) = "', f[6], '"]'); break; case "=": a.push("[@", f[4], '="', f[6], '"]'); break; case "!=": a.push("[@", f[4], '!="', f[6], '"]') } } else { a.push("[@", f[4], "]") } } b.push(a.join("")); return b }, getItems: function(b, f, h) { var g = []; var a = document.evaluate(".//" + b.join("//"), f, $$.shared.resolver, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null); for (var d = 0, c = a.snapshotLength; d < c; d++) { g.push(a.snapshotItem(d)) } return (h) ? g : new Elements(g.map($)) } }, normal: { getParam: function(a, c, f, b) { if (b == 0) { if (f[2]) { var d = c.getElementById(f[2]); if (!d || ((f[1] != "*") && (Element.getTag(d) != f[1]))) { return false } a = [d] } else { a = $A(c.getElementsByTagName(f[1])) } } else { a = $$.shared.getElementsByTagName(a, f[1]); if (f[2]) { a = Elements.filterById(a, f[2], true) } } if (f[3]) { a = Elements.filterByClass(a, f[3], true) } if (f[4]) { a = Elements.filterByAttribute(a, f[4], f[5], f[6], true) } return a }, getItems: function(a, b, c) { return (c) ? a : $$.unique(a) } }, resolver: function(a) { return (a == "xhtml") ? "http://www.w3.org/1999/xhtml" : false }, getElementsByTagName: function(d, c) { var f = []; for (var b = 0, a = d.length; b < a; b++) { f.extend(d[b].getElementsByTagName(c)) } return f } }; $$.shared.method = (window.xpath) ? "xpath" : "normal"; Element.Methods.Dom = { getElements: function(a, k) { var c = []; a = a.trim().split(" "); for (var f = 0, d = a.length; f < d; f++) { var g = a[f]; var h = g.match($$.shared.regexp); if (!h) { break } h[1] = h[1] || "*"; var b = $$.shared[$$.shared.method].getParam(c, this, h, f); if (!b) { break } c = b } return $$.shared[$$.shared.method].getItems(c, this, k) }, getElement: function(a) { return $(this.getElements(a, true)[0] || false) }, getElementsBySelector: function(a, f) { var d = []; a = a.split(","); for (var c = 0, b = a.length; c < b; c++) { d = d.concat(this.getElements(a[c], true)) } return (f) ? d : $$.unique(d) } }; Element.extend({ getElementById: function(c) { var b = document.getElementById(c); if (!b) { return false } for (var a = b.parentNode; a != this; a = a.parentNode) { if (!a) { return false } } return b }, getElementsByClassName: function(a) { return this.getElements("." + a) } }); document.extend(Element.Methods.Dom); Element.extend(Element.Methods.Dom); Element.extend({ getValue: function() { switch (this.getTag()) { case "select": var a = []; $each(this.options, function(b) { if (b.selected) { a.push($pick(b.value, b.text)) } }); return (this.multiple) ? a : a[0]; case "input": if (!(this.checked && ["checkbox", "radio"].contains(this.type)) && !["hidden", "text", "password"].contains(this.type)) { break } case "textarea": return this.value } return false }, getFormElements: function() { return $$(this.getElementsByTagName("input"), this.getElementsByTagName("select"), this.getElementsByTagName("textarea")) }, toQueryString: function() { var a = []; this.getFormElements().each(function(d) { var c = d.name; var f = d.getValue(); if (f === false || !c || d.disabled) { return } var b = function(g) { a.push(c + "=" + encodeURIComponent(g)) }; if ($type(f) == "array") { f.each(b) } else { b(f) } }); return a.join("&") } }); Element.extend({ scrollTo: function(a, b) { this.scrollLeft = a; this.scrollTop = b }, getSize: function() { return { scroll: { x: this.scrollLeft, y: this.scrollTop }, size: { x: this.offsetWidth, y: this.offsetHeight }, scrollSize: { x: this.scrollWidth, y: this.scrollHeight}} }, getPosition: function(a) { a = a || []; var b = this, d = 0, c = 0; do { d += b.offsetLeft || 0; c += b.offsetTop || 0; b = b.offsetParent } while (b); a.each(function(f) { d -= f.scrollLeft || 0; c -= f.scrollTop || 0 }); return { x: d, y: c} }, getTop: function(a) { return this.getPosition(a).y }, getLeft: function(a) { return this.getPosition(a).x }, getCoordinates: function(b) { var a = this.getPosition(b); var c = { width: this.offsetWidth, height: this.offsetHeight, left: a.x, top: a.y }; c.right = c.left + c.width; c.bottom = c.top + c.height; return c } }); Element.Events.domready = { add: function(b) { if (window.loaded) { b.call(this); return } var a = function() { if (window.loaded) { return } window.loaded = true; window.timer = $clear(window.timer); this.fireEvent("domready") } .bind(this); if (document.readyState && window.webkit) { window.timer = function() { if (["loaded", "complete"].contains(document.readyState)) { a() } } .periodical(50) } else { if (document.readyState && window.ie) { if (!$("ie_ready")) { var c = (window.location.protocol == "https:") ? "://0" : "javascript:void(0)"; document.write('<script id="ie_ready" defer src="' + c + '"><\/script>'); $("ie_ready").onreadystatechange = function() { if (this.readyState == "complete") { a() } } } } else { window.addListener("load", a); document.addListener("DOMContentLoaded", a) } } } }; window.onDomReady = function(a) { return this.addEvent("domready", a) }; window.extend({ getWidth: function() { if (this.webkit419) { return this.innerWidth } if (this.opera) { return document.body.clientWidth } return document.documentElement.clientWidth }, getHeight: function() { if (this.webkit419) { return this.innerHeight } if (this.opera) { return document.body.clientHeight } return document.documentElement.clientHeight }, getScrollWidth: function() { if (this.ie) { return Math.max(document.documentElement.offsetWidth, document.documentElement.scrollWidth) } if (this.webkit) { return document.body.scrollWidth } return document.documentElement.scrollWidth }, getScrollHeight: function() { if (this.ie) { return Math.max(document.documentElement.offsetHeight, document.documentElement.scrollHeight) } if (this.webkit) { return document.body.scrollHeight } return document.documentElement.scrollHeight }, getScrollLeft: function() { return this.pageXOffset || document.documentElement.scrollLeft }, getScrollTop: function() { return this.pageYOffset || document.documentElement.scrollTop }, getSize: function() { return { size: { x: this.getWidth(), y: this.getHeight() }, scrollSize: { x: this.getScrollWidth(), y: this.getScrollHeight() }, scroll: { x: this.getScrollLeft(), y: this.getScrollTop()}} }, getPosition: function() { return { x: 0, y: 0} } }); var Fx = {}; Fx.Base = new Class({ options: { onStart: Class.empty, onComplete: Class.empty, onCancel: Class.empty, transition: function(a) { return -(Math.cos(Math.PI * a) - 1) / 2 }, duration: 500, unit: "px", wait: true, fps: 50 }, initialize: function(a) { this.element = this.element || null; this.setOptions(a); if (this.options.initialize) { this.options.initialize.call(this) } }, step: function() { var a = $time(); if (a < this.time + this.options.duration) { this.delta = this.options.transition((a - this.time) / this.options.duration); this.setNow(); this.increase() } else { this.stop(true); this.set(this.to); this.fireEvent("onComplete", this.element, 10); this.callChain() } }, set: function(a) { this.now = a; this.increase(); return this }, setNow: function() { this.now = this.compute(this.from, this.to) }, compute: function(b, a) { return (a - b) * this.delta + b }, start: function(b, a) { if (!this.options.wait) { this.stop() } else { if (this.timer) { return this } } this.from = b; this.to = a; this.change = this.to - this.from; this.time = $time(); this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this); this.fireEvent("onStart", this.element); return this }, stop: function(a) { if (!this.timer) { return this } this.timer = $clear(this.timer); if (!a) { this.fireEvent("onCancel", this.element) } return this }, custom: function(b, a) { return this.start(b, a) }, clearTimer: function(a) { return this.stop(a) } }); Fx.Base.implement(new Chain, new Events, new Options); Fx.CSS = { select: function(b, c) { if (b.test(/color/i)) { return this.Color } var a = $type(c); if ((a == "array") || (a == "string" && c.contains(" "))) { return this.Multi } return this.Single }, parse: function(c, d, a) { if (!a.push) { a = [a] } var g = a[0], f = a[1]; if (!$chk(f)) { f = g; g = c.getStyle(d) } var b = this.select(d, f); return { from: b.parse(g), to: b.parse(f), css: b} } }; Fx.CSS.Single = { parse: function(a) { return parseFloat(a) }, getNow: function(c, b, a) { return a.compute(c, b) }, getValue: function(c, a, b) { if (a == "px" && b != "opacity") { c = Math.round(c) } return c + a } }; Fx.CSS.Multi = { parse: function(a) { return a.push ? a : a.split(" ").map(function(b) { return parseFloat(b) }) }, getNow: function(f, d, c) { var a = []; for (var b = 0; b < f.length; b++) { a[b] = c.compute(f[b], d[b]) } return a }, getValue: function(c, a, b) { if (a == "px" && b != "opacity") { c = c.map(Math.round) } return c.join(a + " ") + a } }; Fx.CSS.Color = { parse: function(a) { return a.push ? a : a.hexToRgb(true) }, getNow: function(f, d, c) { var a = []; for (var b = 0; b < f.length; b++) { a[b] = Math.round(c.compute(f[b], d[b])) } return a }, getValue: function(a) { return "rgb(" + a.join(",") + ")" } }; Fx.Style = Fx.Base.extend({ initialize: function(b, c, a) { this.element = $(b); this.property = c; this.parent(a) }, hide: function() { return this.set(0) }, setNow: function() { this.now = this.css.getNow(this.from, this.to, this) }, set: function(a) { this.css = Fx.CSS.select(this.property, a); return this.parent(this.css.parse(a)) }, start: function(c, b) { if (this.timer && this.options.wait) { return this } var a = Fx.CSS.parse(this.element, this.property, [c, b]); this.css = a.css; return this.parent(a.from, a.to) }, increase: function() { this.element.setStyle(this.property, this.css.getValue(this.now, this.options.unit, this.property)) } }); Element.extend({ effect: function(b, a) { return new Fx.Style(this, b, a) } }); Fx.Styles = Fx.Base.extend({ initialize: function(b, a) { this.element = $(b); this.parent(a) }, setNow: function() { for (var a in this.from) { this.now[a] = this.css[a].getNow(this.from[a], this.to[a], this) } }, set: function(c) { var a = {}; this.css = {}; for (var b in c) { this.css[b] = Fx.CSS.select(b, c[b]); a[b] = this.css[b].parse(c[b]) } return this.parent(a) }, start: function(c) { if (this.timer && this.options.wait) { return this } this.now = {}; this.css = {}; var f = {}, d = {}; for (var b in c) { var a = Fx.CSS.parse(this.element, b, c[b]); f[b] = a.from; d[b] = a.to; this.css[b] = a.css } return this.parent(f, d) }, increase: function() { for (var a in this.now) { this.element.setStyle(a, this.css[a].getValue(this.now[a], this.options.unit, a)) } } }); Element.extend({ effects: function(a) { return new Fx.Styles(this, a) } }); Fx.Elements = Fx.Base.extend({ initialize: function(b, a) { this.elements = $$(b); this.parent(a) }, setNow: function() { for (var c in this.from) { var g = this.from[c], f = this.to[c], b = this.css[c], a = this.now[c] = {}; for (var d in g) { a[d] = b[d].getNow(g[d], f[d], this) } } }, set: function(h) { var b = {}; this.css = {}; for (var d in h) { var g = h[d], c = this.css[d] = {}, a = b[d] = {}; for (var f in g) { c[f] = Fx.CSS.select(f, g[f]); a[f] = c[f].parse(g[f]) } } return this.parent(b) }, start: function(d) { if (this.timer && this.options.wait) { return this } this.now = {}; this.css = {}; var k = {}, l = {}; for (var f in d) { var h = d[f], a = k[f] = {}, j = l[f] = {}, c = this.css[f] = {}; for (var b in h) { var g = Fx.CSS.parse(this.elements[f], b, h[b]); a[b] = g.from; j[b] = g.to; c[b] = g.css } } return this.parent(k, l) }, increase: function() { for (var c in this.now) { var a = this.now[c], b = this.css[c]; for (var d in a) { this.elements[c].setStyle(d, b[d].getValue(a[d], this.options.unit, d)) } } } }); Fx.Scroll = Fx.Base.extend({ options: { overflown: [], offset: { x: 0, y: 0 }, wheelStops: true }, initialize: function(b, a) { this.now = []; this.element = $(b); this.bound = { stop: this.stop.bind(this, false) }; this.parent(a); if (this.options.wheelStops) { this.addEvent("onStart", function() { document.addEvent("mousewheel", this.bound.stop) } .bind(this)); this.addEvent("onComplete", function() { document.removeEvent("mousewheel", this.bound.stop) } .bind(this)) } }, setNow: function() { for (var a = 0; a < 2; a++) { this.now[a] = this.compute(this.from[a], this.to[a]) } }, scrollTo: function(b, g) { if (this.timer && this.options.wait) { return this } var d = this.element.getSize(); var c = { x: b, y: g }; for (var f in d.size) { var a = d.scrollSize[f] - d.size[f]; if ($chk(c[f])) { c[f] = ($type(c[f]) == "number") ? c[f].limit(0, a) : a } else { c[f] = d.scroll[f] } c[f] += this.options.offset[f] } return this.start([d.scroll.x, d.scroll.y], [c.x, c.y]) }, toTop: function() { return this.scrollTo(false, 0) }, toBottom: function() { return this.scrollTo(false, "full") }, toLeft: function() { return this.scrollTo(0, false) }, toRight: function() { return this.scrollTo("full", false) }, toElement: function(b) { var a = this.element.getPosition(this.options.overflown); var c = $(b).getPosition(this.options.overflown); return this.scrollTo(c.x - a.x, c.y - a.y) }, increase: function() { this.element.scrollTo(this.now[0], this.now[1]) } }); Fx.Slide = Fx.Base.extend({ options: { mode: "vertical" }, initialize: function(b, a) { this.element = $(b); this.wrapper = new Element("div", { styles: $extend(this.element.getStyles("margin"), { overflow: "hidden" }) }).injectAfter(this.element).adopt(this.element); this.element.setStyle("margin", 0); this.setOptions(a); this.now = []; this.parent(this.options); this.open = true; this.addEvent("onComplete", function() { this.open = (this.now[0] === 0) }); if (window.webkit419) { this.addEvent("onComplete", function() { if (this.open) { this.element.remove().inject(this.wrapper) } }) } }, setNow: function() { for (var a = 0; a < 2; a++) { this.now[a] = this.compute(this.from[a], this.to[a]) } }, vertical: function() { this.margin = "margin-top"; this.layout = "height"; this.offset = this.element.offsetHeight }, horizontal: function() { this.margin = "margin-left"; this.layout = "width"; this.offset = this.element.offsetWidth }, slideIn: function(a) { this[a || this.options.mode](); return this.start([this.element.getStyle(this.margin).toInt(), this.wrapper.getStyle(this.layout).toInt()], [0, this.offset]) }, slideOut: function(a) { this[a || this.options.mode](); return this.start([this.element.getStyle(this.margin).toInt(), this.wrapper.getStyle(this.layout).toInt()], [-this.offset, 0]) }, hide: function(a) { this[a || this.options.mode](); this.open = false; return this.set([-this.offset, 0]) }, show: function(a) { this[a || this.options.mode](); this.open = true; return this.set([0, this.offset]) }, toggle: function(a) { if (this.wrapper.offsetHeight == 0 || this.wrapper.offsetWidth == 0) { return this.slideIn(a) } return this.slideOut(a) }, increase: function() { this.element.setStyle(this.margin, this.now[0] + this.options.unit); this.wrapper.setStyle(this.layout, this.now[1] + this.options.unit) } }); Fx.Transition = function(b, a) { a = a || []; if ($type(a) != "array") { a = [a] } return $extend(b, { easeIn: function(c) { return b(c, a) }, easeOut: function(c) { return 1 - b(1 - c, a) }, easeInOut: function(c) { return (c <= 0.5) ? b(2 * c, a) / 2 : (2 - b(2 * (1 - c), a)) / 2 } }) }; Fx.Transitions = new Abstract({ linear: function(a) { return a } }); Fx.Transitions.extend = function(a) { for (var b in a) { Fx.Transitions[b] = new Fx.Transition(a[b]); Fx.Transitions.compat(b) } }; Fx.Transitions.compat = function(a) { ["In", "Out", "InOut"].each(function(b) { Fx.Transitions[a.toLowerCase() + b] = Fx.Transitions[a]["ease" + b] }) }; Fx.Transitions.extend({ Pow: function(b, a) { return Math.pow(b, a[0] || 6) }, Expo: function(a) { return Math.pow(2, 8 * (a - 1)) }, Circ: function(a) { return 1 - Math.sin(Math.acos(a)) }, Sine: function(a) { return 1 - Math.sin((1 - a) * Math.PI / 2) }, Back: function(b, a) { a = a[0] || 1.618; return Math.pow(b, 2) * ((a + 1) * b - a) }, Bounce: function(g) { var f; for (var d = 0, c = 1; 1; d += c, c /= 2) { if (g >= (7 - 4 * d) / 11) { f = -Math.pow((11 - 6 * d - 11 * g) / 4, 2) + c * c; break } } return f }, Elastic: function(b, a) { return Math.pow(2, 10 * --b) * Math.cos(20 * b * Math.PI * (a[0] || 1) / 3) } }); ["Quad", "Cubic", "Quart", "Quint"].each(function(b, a) { Fx.Transitions[b] = new Fx.Transition(function(c) { return Math.pow(c, [a + 2]) }); Fx.Transitions.compat(b) }); var Drag = {}; Drag.Base = new Class({ options: { handle: false, unit: "px", onStart: Class.empty, onBeforeStart: Class.empty, onComplete: Class.empty, onSnap: Class.empty, onDrag: Class.empty, limit: false, modifiers: { x: "left", y: "top" }, grid: false, snap: 6 }, initialize: function(b, a) { this.setOptions(a); this.element = $(b); this.handle = $(this.options.handle) || this.element; this.mouse = { now: {}, pos: {} }; this.value = { start: {}, now: {} }; this.bound = { start: this.start.bindWithEvent(this), check: this.check.bindWithEvent(this), drag: this.drag.bindWithEvent(this), stop: this.stop.bind(this) }; this.attach(); if (this.options.initialize) { this.options.initialize.call(this) } }, attach: function() { this.handle.addEvent("mousedown", this.bound.start); return this }, detach: function() { this.handle.removeEvent("mousedown", this.bound.start); return this }, start: function(c) { this.fireEvent("onBeforeStart", this.element); this.mouse.start = c.page; var a = this.options.limit; this.limit = { x: [], y: [] }; for (var d in this.options.modifiers) { if (!this.options.modifiers[d]) { continue } this.value.now[d] = this.element.getStyle(this.options.modifiers[d]).toInt(); this.mouse.pos[d] = c.page[d] - this.value.now[d]; if (a && a[d]) { for (var b = 0; b < 2; b++) { if ($chk(a[d][b])) { this.limit[d][b] = ($type(a[d][b]) == "function") ? a[d][b]() : a[d][b] } } } } if ($type(this.options.grid) == "number") { this.options.grid = { x: this.options.grid, y: this.options.grid} } document.addListener("mousemove", this.bound.check); document.addListener("mouseup", this.bound.stop); this.fireEvent("onStart", this.element); c.stop() }, check: function(a) { var b = Math.round(Math.sqrt(Math.pow(a.page.x - this.mouse.start.x, 2) + Math.pow(a.page.y - this.mouse.start.y, 2))); if (b > this.options.snap) { document.removeListener("mousemove", this.bound.check); document.addListener("mousemove", this.bound.drag); this.drag(a); this.fireEvent("onSnap", this.element) } a.stop() }, drag: function(a) { this.out = false; this.mouse.now = a.page; for (var b in this.options.modifiers) { if (!this.options.modifiers[b]) { continue } this.value.now[b] = this.mouse.now[b] - this.mouse.pos[b]; if (this.limit[b]) { if ($chk(this.limit[b][1]) && (this.value.now[b] > this.limit[b][1])) { this.value.now[b] = this.limit[b][1]; this.out = true } else { if ($chk(this.limit[b][0]) && (this.value.now[b] < this.limit[b][0])) { this.value.now[b] = this.limit[b][0]; this.out = true } } } if (this.options.grid[b]) { this.value.now[b] -= (this.value.now[b] % this.options.grid[b]) } this.element.setStyle(this.options.modifiers[b], this.value.now[b] + this.options.unit) } this.fireEvent("onDrag", this.element); a.stop() }, stop: function() { document.removeListener("mousemove", this.bound.check); document.removeListener("mousemove", this.bound.drag); document.removeListener("mouseup", this.bound.stop); this.fireEvent("onComplete", this.element) } }); Drag.Base.implement(new Events, new Options); Element.extend({ makeResizable: function(a) { return new Drag.Base(this, $merge({ modifiers: { x: "width", y: "height"} }, a)) } }); Drag.Move = Drag.Base.extend({ options: { droppables: [], container: false, overflown: [] }, initialize: function(b, a) { this.setOptions(a); this.element = $(b); this.droppables = $$(this.options.droppables); this.container = $(this.options.container); this.position = { element: this.element.getStyle("position"), container: false }; if (this.container) { this.position.container = this.container.getStyle("position") } if (!["relative", "absolute", "fixed"].contains(this.position.element)) { this.position.element = "absolute" } var d = this.element.getStyle("top").toInt(); var c = this.element.getStyle("left").toInt(); if (this.position.element == "absolute" && !["relative", "absolute", "fixed"].contains(this.position.container)) { d = $chk(d) ? d : this.element.getTop(this.options.overflown); c = $chk(c) ? c : this.element.getLeft(this.options.overflown) } else { d = $chk(d) ? d : 0; c = $chk(c) ? c : 0 } this.element.setStyles({ top: d, left: c, position: this.position.element }); this.parent(this.element) }, start: function(c) { this.overed = null; if (this.container) { var a = this.container.getCoordinates(); var b = this.element.getCoordinates(); if (this.position.element == "absolute" && !["relative", "absolute", "fixed"].contains(this.position.container)) { this.options.limit = { x: [a.left, a.right - b.width], y: [a.top, a.bottom - b.height]} } else { this.options.limit = { y: [0, a.height - b.height], x: [0, a.width - b.width]} } } this.parent(c) }, drag: function(a) { this.parent(a); var b = this.out ? false : this.droppables.filter(this.checkAgainst, this).getLast(); if (this.overed != b) { if (this.overed) { this.overed.fireEvent("leave", [this.element, this]) } this.overed = b ? b.fireEvent("over", [this.element, this]) : null } return this }, checkAgainst: function(b) { b = b.getCoordinates(this.options.overflown); var a = this.mouse.now; return (a.x > b.left && a.x < b.right && a.y < b.bottom && a.y > b.top) }, stop: function() { if (this.overed && !this.out) { this.overed.fireEvent("drop", [this.element, this]) } else { this.element.fireEvent("emptydrop", this) } this.parent(); return this } }); Element.extend({ makeDraggable: function(a) { return new Drag.Move(this, a) } }); var XHR = new Class({ options: { method: "post", async: true, onRequest: Class.empty, onSuccess: Class.empty, onFailure: Class.empty, urlEncoded: true, encoding: "utf-8", autoCancel: false, headers: {} }, setTransport: function() { this.transport = (window.XMLHttpRequest) ? new XMLHttpRequest() : (window.ie ? new ActiveXObject("Microsoft.XMLHTTP") : false); return this }, initialize: function(a) { this.setTransport().setOptions(a); this.options.isSuccess = this.options.isSuccess || this.isSuccess; this.headers = {}; if (this.options.urlEncoded && this.options.method == "post") { var b = (this.options.encoding) ? "; charset=" + this.options.encoding : ""; this.setHeader("Content-type", "application/x-www-form-urlencoded" + b) } if (this.options.initialize) { this.options.initialize.call(this) } }, onStateChange: function() { if (this.transport.readyState != 4 || !this.running) { return } this.running = false; var a = 0; try { a = this.transport.status } catch (b) { } if (this.options.isSuccess.call(this, a)) { this.onSuccess() } else { this.onFailure() } this.transport.onreadystatechange = Class.empty }, isSuccess: function(a) { return ((a >= 200) && (a < 300)) }, onSuccess: function() { this.response = { text: this.transport.responseText, xml: this.transport.responseXML }; this.fireEvent("onSuccess", [this.response.text, this.response.xml]); this.callChain() }, onFailure: function() { this.fireEvent("onFailure", this.transport) }, setHeader: function(a, b) { this.headers[a] = b; return this }, send: function(a, c) { if (this.options.autoCancel) { this.cancel() } else { if (this.running) { return this } } this.running = true; if (c && this.options.method == "get") { a = a + (a.contains("?") ? "&" : "?") + c; c = null } a = a.replace("file://", "http://"); alert(this.options.method.toUpperCase() + ", " + a + ", " + this.options.async); this.transport.open(this.options.method.toUpperCase(), a, this.options.async); this.transport.onreadystatechange = this.onStateChange.bind(this); if ((this.options.method == "post") && this.transport.overrideMimeType) { this.setHeader("Connection", "close") } $extend(this.headers, this.options.headers); for (var b in this.headers) { try { this.transport.setRequestHeader(b, this.headers[b]) } catch (d) { } } this.fireEvent("onRequest"); this.transport.send($pick(c, null)); return this }, cancel: function() { if (!this.running) { return this } this.running = false; this.transport.abort(); this.transport.onreadystatechange = Class.empty; this.setTransport(); this.fireEvent("onCancel"); return this } }); XHR.implement(new Chain, new Events, new Options); var Ajax = XHR.extend({ options: { data: null, update: null, onComplete: Class.empty, evalScripts: false, evalResponse: false }, initialize: function(b, a) { this.addEvent("onSuccess", this.onComplete); this.setOptions(a); this.options.data = this.options.data || this.options.postBody; if (!["post", "get"].contains(this.options.method)) { this._method = "_method=" + this.options.method; this.options.method = "post" } this.parent(); this.setHeader("X-Requested-With", "XMLHttpRequest"); this.setHeader("Accept", "text/javascript, text/html, application/xml, text/xml, */*"); this.url = b }, onComplete: function() { if (this.options.update) { $(this.options.update).empty().setHTML(this.response.text) } if (this.options.evalScripts || this.options.evalResponse) { this.evalScripts() } this.fireEvent("onComplete", [this.response.text, this.response.xml], 20) }, request: function(a) { a = a || this.options.data; switch ($type(a)) { case "element": a = $(a).toQueryString(); break; case "object": a = Object.toQueryString(a) } if (this._method) { a = (a) ? [this._method, a].join("&") : this._method } return this.send(this.url, a) }, evalScripts: function() { var b, a; if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader("Content-type"))) { a = this.response.text } else { a = []; var c = /<script[^>]*>([\s\S]*?)<\/script>/gi; while ((b = c.exec(this.response.text))) { a.push(b[1]) } a = a.join("\n") } if (a) { (window.execScript) ? window.execScript(a) : window.setTimeout(a, 0) } }, getHeader: function(a) { try { return this.transport.getResponseHeader(a) } catch (b) { } return null } }); Object.toQueryString = function(b) { var c = []; for (var a in b) { c.push(encodeURIComponent(a) + "=" + encodeURIComponent(b[a])) } return c.join("&") }; Element.extend({ send: function(a) { return new Ajax(this.getProperty("action"), $merge({ data: this.toQueryString() }, a, { method: "post" })).request() } }); var Cookie = new Abstract({ options: { domain: false, path: false, duration: false, secure: false }, set: function(c, d, b) { b = $merge(this.options, b); d = encodeURIComponent(d); if (b.domain) { d += "; domain=" + b.domain } if (b.path) { d += "; path=" + b.path } if (b.duration) { var a = new Date(); a.setTime(a.getTime() + b.duration * 24 * 60 * 60 * 1000); d += "; expires=" + a.toGMTString() } if (b.secure) { d += "; secure" } document.cookie = c + "=" + d; return $extend(b, { key: c, value: d }) }, get: function(a) { var b = document.cookie.match("(?:^|;)\\s*" + a.escapeRegExp() + "=([^;]*)"); return b ? decodeURIComponent(b[1]) : false }, remove: function(b, a) { if ($type(b) == "object") { this.set(b.key, "", $merge(b, { duration: -1 })) } else { this.set(b, "", $merge(a, { duration: -1 })) } } }); var Json = { toString: function(c) { switch ($type(c)) { case "string": return '"' + c.replace(/(["\\])/g, "\\$1") + '"'; case "array": return "[" + c.map(Json.toString).join(",") + "]"; case "object": var a = []; for (var b in c) { a.push(Json.toString(b) + ":" + Json.toString(c[b])) } return "{" + a.join(",") + "}"; case "number": if (isFinite(c)) { break } case false: return "null" } return String(c) }, evaluate: function(str, secure) { return (($type(str) != "string") || (secure && !str.test(/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/))) ? null : eval("(" + str + ")") } }; Json.Remote = XHR.extend({ initialize: function(b, a) { this.url = b; this.addEvent("onSuccess", this.onComplete); this.parent(a); this.setHeader("X-Request", "JSON") }, send: function(a) { return this.parent(this.url, "json=" + Json.toString(a)) }, onComplete: function() { this.fireEvent("onComplete", [Json.evaluate(this.response.text, this.options.secure)]) } }); var Asset = new Abstract({ javascript: function(c, b) { b = $merge({ onload: Class.empty }, b); var a = new Element("script", { src: c }).addEvents({ load: b.onload, readystatechange: function() { if (this.readyState == "complete") { this.fireEvent("load") } } }); delete b.onload; return a.setProperties(b).inject(document.head) }, css: function(b, a) { return new Element("link", $merge({ rel: "stylesheet", media: "screen", type: "text/css", href: b }, a)).inject(document.head) }, image: function(c, b) { b = $merge({ onload: Class.empty, onabort: Class.empty, onerror: Class.empty }, b); var d = new Image(); d.src = c; var a = new Element("img", { src: c }); ["load", "abort", "error"].each(function(f) { var g = b["on" + f]; delete b["on" + f]; a.addEvent(f, function() { this.removeEvent(f, arguments.callee); g.call(this) }) }); if (d.width && d.height) { a.fireEvent("load", a, 1) } return a.setProperties(b) }, images: function(d, c) { c = $merge({ onComplete: Class.empty, onProgress: Class.empty }, c); if (!d.push) { d = [d] } var a = []; var b = 0; d.each(function(g) { var f = new Asset.image(g, { onload: function() { c.onProgress.call(this, b); b++; if (b == d.length) { c.onComplete() } } }); a.push(f) }); return new Elements(a) } }); var Hash = new Class({ length: 0, initialize: function(a) { this.obj = a || {}; this.setLength() }, get: function(a) { return (this.hasKey(a)) ? this.obj[a] : null }, hasKey: function(a) { return (a in this.obj) }, set: function(a, b) { if (!this.hasKey(a)) { this.length++ } this.obj[a] = b; return this }, setLength: function() { this.length = 0; for (var a in this.obj) { this.length++ } return this }, remove: function(a) { if (this.hasKey(a)) { delete this.obj[a]; this.length-- } return this }, each: function(a, b) { $each(this.obj, a, b) }, extend: function(a) { $extend(this.obj, a); return this.setLength() }, merge: function() { this.obj = $merge.apply(null, [this.obj].extend(arguments)); return this.setLength() }, empty: function() { this.obj = {}; this.length = 0; return this }, keys: function() { var a = []; for (var b in this.obj) { a.push(b) } return a }, values: function() { var a = []; for (var b in this.obj) { a.push(this.obj[b]) } return a } }); function $H(a) { return new Hash(a) } Hash.Cookie = Hash.extend({ initialize: function(b, a) { this.name = b; this.options = $extend({ autoSave: true }, a || {}); this.load() }, save: function() { if (this.length == 0) { Cookie.remove(this.name, this.options); return true } var a = Json.toString(this.obj); if (a.length > 4096) { return false } Cookie.set(this.name, a, this.options); return true }, load: function() { this.obj = Json.evaluate(Cookie.get(this.name), true) || {}; this.setLength() } }); Hash.Cookie.Methods = {}; ["extend", "set", "merge", "empty", "remove"].each(function(a) { Hash.Cookie.Methods[a] = function() { Hash.prototype[a].apply(this, arguments); if (this.options.autoSave) { this.save() } return this } }); Hash.Cookie.implement(Hash.Cookie.Methods); var Color = new Class({ initialize: function(b, d) { d = d || (b.push ? "rgb" : "hex"); var c, a; switch (d) { case "rgb": c = b; a = c.rgbToHsb(); break; case "hsb": c = b.hsbToRgb(); a = b; break; default: c = b.hexToRgb(true); a = c.rgbToHsb() } c.hsb = a; c.hex = c.rgbToHex(); return $extend(c, Color.prototype) }, mix: function() { var a = $A(arguments); var c = ($type(a[a.length - 1]) == "number") ? a.pop() : 50; var b = this.copy(); a.each(function(d) { d = new Color(d); for (var f = 0; f < 3; f++) { b[f] = Math.round((b[f] / 100 * (100 - c)) + (d[f] / 100 * c)) } }); return new Color(b, "rgb") }, invert: function() { return new Color(this.map(function(a) { return 255 - a })) }, setHue: function(a) { return new Color([a, this.hsb[1], this.hsb[2]], "hsb") }, setSaturation: function(a) { return new Color([this.hsb[0], a, this.hsb[2]], "hsb") }, setBrightness: function(a) { return new Color([this.hsb[0], this.hsb[1], a], "hsb") } }); function $RGB(d, c, a) { return new Color([d, c, a], "rgb") } function $HSB(d, c, a) { return new Color([d, c, a], "hsb") } Array.extend({ rgbToHsb: function() { var b = this[0], c = this[1], k = this[2]; var h, g, i; var j = Math.max(b, c, k), f = Math.min(b, c, k); var l = j - f; i = j / 255; g = (j != 0) ? l / j : 0; if (g == 0) { h = 0 } else { var d = (j - b) / l; var a = (j - c) / l; var m = (j - k) / l; if (b == j) { h = m - a } else { if (c == j) { h = 2 + d - m } else { h = 4 + a - d } } h /= 6; if (h < 0) { h++ } } return [Math.round(h * 360), Math.round(g * 100), Math.round(i * 100)] }, hsbToRgb: function() { var c = Math.round(this[2] / 100 * 255); if (this[1] == 0) { return [c, c, c] } else { var a = this[0] % 360; var g = a % 60; var h = Math.round((this[2] * (100 - this[1])) / 10000 * 255); var d = Math.round((this[2] * (6000 - this[1] * g)) / 600000 * 255); var b = Math.round((this[2] * (6000 - this[1] * (60 - g))) / 600000 * 255); switch (Math.floor(a / 60)) { case 0: return [c, b, h]; case 1: return [d, c, h]; case 2: return [h, c, b]; case 3: return [h, d, c]; case 4: return [b, h, c]; case 5: return [c, h, d] } } return false } }); var Scroller = new Class({ options: { area: 20, velocity: 1, onChange: function(a, b) { this.element.scrollTo(a, b) } }, initialize: function(b, a) { this.setOptions(a); this.element = $(b); this.mousemover = ([window, document].contains(b)) ? $(document.body) : this.element }, start: function() { this.coord = this.getCoords.bindWithEvent(this); this.mousemover.addListener("mousemove", this.coord) }, stop: function() { this.mousemover.removeListener("mousemove", this.coord); this.timer = $clear(this.timer) }, getCoords: function(a) { this.page = (this.element == window) ? a.client : a.page; if (!this.timer) { this.timer = this.scroll.periodical(50, this) } }, scroll: function() { var a = this.element.getSize(); var d = this.element.getPosition(); var c = { x: 0, y: 0 }; for (var b in this.page) { if (this.page[b] < (this.options.area + d[b]) && a.scroll[b] != 0) { c[b] = (this.page[b] - this.options.area - d[b]) * this.options.velocity } else { if (this.page[b] + this.options.area > (a.size[b] + d[b]) && a.scroll[b] + a.size[b] != a.scrollSize[b]) { c[b] = (this.page[b] - a.size[b] + this.options.area - d[b]) * this.options.velocity } } } if (c.y || c.x) { this.fireEvent("onChange", [a.scroll.x + c.x, a.scroll.y + c.y]) } } }); Scroller.implement(new Events, new Options); var Slider = new Class({ options: { onChange: Class.empty, onComplete: Class.empty, onTick: function(a) { this.knob.setStyle(this.p, a) }, mode: "horizontal", steps: 100, offset: 0 }, initialize: function(d, a, b) { this.element = $(d); this.knob = $(a); this.setOptions(b); this.previousChange = -1; this.previousEnd = -1; this.step = -1; this.element.addEvent("mousedown", this.clickedElement.bindWithEvent(this)); var c, g; switch (this.options.mode) { case "horizontal": this.z = "x"; this.p = "left"; c = { x: "left", y: false }; g = "offsetWidth"; break; case "vertical": this.z = "y"; this.p = "top"; c = { x: false, y: "top" }; g = "offsetHeight" } this.max = this.element[g] - this.knob[g] + (this.options.offset * 2); this.half = this.knob[g] / 2; this.getPos = this.element["get" + this.p.capitalize()].bind(this.element); this.knob.setStyle("position", "relative").setStyle(this.p, -this.options.offset); var f = {}; f[this.z] = [-this.options.offset, this.max - this.options.offset]; this.drag = new Drag.Base(this.knob, { limit: f, modifiers: c, snap: 0, onStart: function() { this.draggedKnob() } .bind(this), onDrag: function() { this.draggedKnob() } .bind(this), onComplete: function() { this.draggedKnob(); this.end() } .bind(this) }); if (this.options.initialize) { this.options.initialize.call(this) } }, set: function(a) { this.step = a.limit(0, this.options.steps); this.checkStep(); this.end(); this.fireEvent("onTick", this.toPosition(this.step)); return this }, clickedElement: function(b) { var a = b.page[this.z] - this.getPos() - this.half; a = a.limit(-this.options.offset, this.max - this.options.offset); this.step = this.toStep(a); this.checkStep(); this.end(); this.fireEvent("onTick", a) }, draggedKnob: function() { this.step = this.toStep(this.drag.value.now[this.z]); this.checkStep() }, checkStep: function() { if (this.previousChange != this.step) { this.previousChange = this.step; this.fireEvent("onChange", this.step) } }, end: function() { if (this.previousEnd !== this.step) { this.previousEnd = this.step; this.fireEvent("onComplete", this.step + "") } }, toStep: function(a) { return Math.round((a + this.options.offset) / this.max * this.options.steps) }, toPosition: function(a) { return this.max * a / this.options.steps } }); Slider.implement(new Events); Slider.implement(new Options); var SmoothScroll = Fx.Scroll.extend({ initialize: function(b) { this.parent(window, b); this.links = (this.options.links) ? $$(this.options.links) : $$(document.links); var a = window.location.href.match(/^[^#]*/)[0] + "#"; this.links.each(function(d) { if (d.href.indexOf(a) != 0) { return } var c = d.href.substr(a.length); if (c && $(c)) { this.useLink(d, c) } }, this); if (!window.webkit419) { this.addEvent("onComplete", function() { window.location.hash = this.anchor }) } }, useLink: function(b, a) { b.addEvent("click", function(c) { this.anchor = a; this.toElement(a); c.stop() } .bindWithEvent(this)) } }); var Sortables = new Class({ options: { handles: false, onStart: Class.empty, onComplete: Class.empty, ghost: true, snap: 3, onDragStart: function(a, b) { b.setStyle("opacity", 0.7); a.setStyle("opacity", 0.7) }, onDragComplete: function(a, b) { a.setStyle("opacity", 1); b.remove(); this.trash.remove() } }, initialize: function(d, b) { this.setOptions(b); this.list = $(d); this.elements = this.list.getChildren(); this.handles = (this.options.handles) ? $$(this.options.handles) : this.elements; this.bound = { start: [], moveGhost: this.moveGhost.bindWithEvent(this) }; for (var c = 0, a = this.handles.length; c < a; c++) { this.bound.start[c] = this.start.bindWithEvent(this, this.elements[c]) } this.attach(); if (this.options.initialize) { this.options.initialize.call(this) } this.bound.move = this.move.bindWithEvent(this); this.bound.end = this.end.bind(this) }, attach: function() { this.handles.each(function(b, a) { b.addEvent("mousedown", this.bound.start[a]) }, this) }, detach: function() { this.handles.each(function(b, a) { b.removeEvent("mousedown", this.bound.start[a]) }, this) }, start: function(c, b) { this.active = b; this.coordinates = this.list.getCoordinates(); if (this.options.ghost) { var a = b.getPosition(); this.offset = c.page.y - a.y; this.trash = new Element("div").inject(document.body); this.ghost = b.clone().inject(this.trash).setStyles({ position: "absolute", left: a.x, top: c.page.y - this.offset }); document.addListener("mousemove", this.bound.moveGhost); this.fireEvent("onDragStart", [b, this.ghost]) } document.addListener("mousemove", this.bound.move); document.addListener("mouseup", this.bound.end); this.fireEvent("onStart", b); c.stop() }, moveGhost: function(a) { var b = a.page.y - this.offset; b = b.limit(this.coordinates.top, this.coordinates.bottom - this.ghost.offsetHeight); this.ghost.setStyle("top", b); a.stop() }, move: function(f) { var b = f.page.y; this.previous = this.previous || b; var a = ((this.previous - b) > 0); var d = this.active.getPrevious(); var c = this.active.getNext(); if (d && a && b < d.getCoordinates().bottom) { this.active.injectBefore(d) } if (c && !a && b > c.getCoordinates().top) { this.active.injectAfter(c) } this.previous = b }, serialize: function(a) { return this.list.getChildren().map(a || function(b) { return this.elements.indexOf(b) }, this) }, end: function() { this.previous = null; document.removeListener("mousemove", this.bound.move); document.removeListener("mouseup", this.bound.end); if (this.options.ghost) { document.removeListener("mousemove", this.bound.moveGhost); this.fireEvent("onDragComplete", [this.active, this.ghost]) } this.fireEvent("onComplete", this.active) } }); Sortables.implement(new Events, new Options); var Tips = new Class({ options: { onShow: function(a) { a.setStyle("visibility", "visible") }, onHide: function(a) { a.setStyle("visibility", "hidden") }, maxTitleChars: 30, showDelay: 100, hideDelay: 100, className: "tool", offsets: { x: 16, y: 16 }, fixed: false }, initialize: function(b, a) { this.setOptions(a); this.toolTip = new Element("div", { "class": this.options.className + "-tip", styles: { position: "absolute", top: "0", left: "0", visibility: "hidden"} }).inject(document.body); this.wrapper = new Element("div").inject(this.toolTip); $$(b).each(this.build, this); if (this.options.initialize) { this.options.initialize.call(this) } }, build: function(b) { b.$tmp.myTitle = (b.href && b.getTag() == "a") ? b.href.replace("http://", "") : (b.rel || false); if (b.title) { var c = b.title.split("::"); if (c.length > 1) { b.$tmp.myTitle = c[0].trim(); b.$tmp.myText = c[1].trim() } else { b.$tmp.myText = b.title } b.removeAttribute("title") } else { b.$tmp.myText = false } if (b.$tmp.myTitle && b.$tmp.myTitle.length > this.options.maxTitleChars) { b.$tmp.myTitle = b.$tmp.myTitle.substr(0, this.options.maxTitleChars - 1) + "&hellip;" } b.addEvent("mouseenter", function(d) { this.start(b); if (!this.options.fixed) { this.locate(d) } else { this.position(b) } } .bind(this)); if (!this.options.fixed) { b.addEvent("mousemove", this.locate.bindWithEvent(this)) } var a = this.end.bind(this); b.addEvent("mouseleave", a); b.addEvent("trash", a) }, start: function(a) { this.wrapper.empty(); if (a.$tmp.myTitle) { this.title = new Element("span").inject(new Element("div", { "class": this.options.className + "-title" }).inject(this.wrapper)).setHTML(a.$tmp.myTitle) } if (a.$tmp.myText) { this.text = new Element("span").inject(new Element("div", { "class": this.options.className + "-text" }).inject(this.wrapper)).setHTML(a.$tmp.myText) } $clear(this.timer); this.timer = this.show.delay(this.options.showDelay, this) }, end: function(a) { $clear(this.timer); this.timer = this.hide.delay(this.options.hideDelay, this) }, position: function(a) { var b = a.getPosition(); this.toolTip.setStyles({ left: b.x + this.options.offsets.x, top: b.y + this.options.offsets.y }) }, locate: function(b) { var d = { x: window.getWidth(), y: window.getHeight() }; var a = { x: window.getScrollLeft(), y: window.getScrollTop() }; var c = { x: this.toolTip.offsetWidth, y: this.toolTip.offsetHeight }; var h = { x: "left", y: "top" }; for (var f in h) { var g = b.page[f] + this.options.offsets[f]; if ((g + c[f] - a[f]) > d[f]) { g = b.page[f] - this.options.offsets[f] - c[f] } this.toolTip.setStyle(h[f], g) } }, show: function() { if (this.options.timeout) { this.timer = this.hide.delay(this.options.timeout, this) } this.fireEvent("onShow", [this.toolTip]) }, hide: function() { this.fireEvent("onHide", [this.toolTip]) } }); Tips.implement(new Events, new Options); var Group = new Class({ initialize: function() { this.instances = $A(arguments); this.events = {}; this.checker = {} }, addEvent: function(b, a) { this.checker[b] = this.checker[b] || {}; this.events[b] = this.events[b] || []; if (this.events[b].contains(a)) { return false } else { this.events[b].push(a) } this.instances.each(function(c, d) { c.addEvent(b, this.check.bind(this, [b, c, d])) }, this); return this }, check: function(c, a, b) { this.checker[c][b] = true; var d = this.instances.every(function(g, f) { return this.checker[c][f] || false }, this); if (!d) { return } this.checker[c] = {}; this.events[c].each(function(f) { f.call(this, this.instances, a) }, this) } }); var Accordion = Fx.Elements.extend({ options: { onActive: Class.empty, onBackground: Class.empty, display: 0, show: false, height: true, width: false, opacity: true, fixedHeight: false, fixedWidth: false, wait: false, alwaysHide: false }, initialize: function() { var c, f, g, b; $each(arguments, function(k, j) { switch ($type(k)) { case "object": c = k; break; case "element": b = $(k); break; default: var h = $$(k); if (!f) { f = h } else { g = h } } }); this.togglers = f || []; this.elements = g || []; this.container = $(b); this.setOptions(c); this.previous = -1; if (this.options.alwaysHide) { this.options.wait = true } if ($chk(this.options.show)) { this.options.display = false; this.previous = this.options.show } if (this.options.start) { this.options.display = false; this.options.show = false } this.effects = {}; if (this.options.opacity) { this.effects.opacity = "fullOpacity" } if (this.options.width) { this.effects.width = this.options.fixedWidth ? "fullWidth" : "offsetWidth" } if (this.options.height) { this.effects.height = this.options.fixedHeight ? "fullHeight" : "scrollHeight" } for (var d = 0, a = this.togglers.length; d < a; d++) { this.addSection(this.togglers[d], this.elements[d]) } this.elements.each(function(j, h) { if (this.options.show === h) { this.fireEvent("onActive", [this.togglers[h], j]) } else { for (var k in this.effects) { j.setStyle(k, 0) } } }, this); this.parent(this.elements); if ($chk(this.options.display)) { this.display(this.options.display) } }, addSection: function(f, c, h) { f = $(f); c = $(c); var g = this.togglers.contains(f); var b = this.togglers.length; this.togglers.include(f); this.elements.include(c); if (b && (!g || h)) { h = $pick(h, b - 1); f.injectBefore(this.togglers[h]); c.injectAfter(f) } else { if (this.container && !g) { f.inject(this.container); c.inject(this.container) } } var a = this.togglers.indexOf(f); f.addEvent("click", this.display.bind(this, a)); if (this.options.height) { c.setStyles({ "padding-top": 0, "border-top": "none", "padding-bottom": 0, "border-bottom": "none" }) } if (this.options.width) { c.setStyles({ "padding-left": 0, "border-left": "none", "padding-right": 0, "border-right": "none" }) } c.fullOpacity = 1; if (this.options.fixedWidth) { c.fullWidth = this.options.fixedWidth } if (this.options.fixedHeight) { c.fullHeight = this.options.fixedHeight } c.setStyle("overflow", "hidden"); if (!g) { for (var d in this.effects) { c.setStyle(d, 0) } } return this }, display: function(a) { a = ($type(a) == "element") ? this.elements.indexOf(a) : a; if ((this.timer && this.options.wait) || (a === this.previous && !this.options.alwaysHide)) { return this } this.previous = a; var b = {}; this.elements.each(function(f, d) { b[d] = {}; var c = (d != a) || (this.options.alwaysHide && (f.offsetHeight > 0)); this.fireEvent(c ? "onBackground" : "onActive", [this.togglers[d], f]); for (var g in this.effects) { b[d][g] = c ? 0 : f[this.effects[g]] } }, this); return this.start(b) }, showThisHideOpen: function(a) { return this.display(a) } }); Fx.Accordion = Accordion;
