//MooTools, <http://mootools.net>, My Object Oriented (JavaScript) Tools. Copyright (c) 2006-2008 Valerio Proietti, <http://mad4milk.net>, MIT Style License.

var MooTools = { version: "1.2dev", build: "" }; var Native = function(J) { J = J || {}; var F = J.afterImplement || function() { }; var G = J.generics; G = (G !== false); var H = J.legacy; var E = J.initialize; var B = J.protect; var A = J.name; var C = E || H; C.constructor = Native; C.$family = { name: "native" }; if (H && E) { C.prototype = H.prototype } C.prototype.constructor = C; if (A) { var D = A.toLowerCase(); C.prototype.$family = { name: D }; Native.typize(C, D) } var I = function(M, K, N, L) { if (!B || L || !M.prototype[K]) { M.prototype[K] = N } if (G) { Native.genericize(M, K, B) } F.call(M, K, N); return M }; C.implement = function(L, K, N) { if (typeof L == "string") { return I(this, L, K, N) } for (var M in L) { I(this, M, L[M], K) } return this }; C.alias = function(M, K, N) { if (typeof M == "string") { M = this.prototype[M]; if (M) { I(this, K, M, N) } } else { for (var L in M) { this.alias(L, M[L], K) } } return this }; return C }; Native.implement = function(D, C) { for (var B = 0, A = D.length; B < A; B++) { D[B].implement(C) } }; Native.genericize = function(B, C, A) { if ((!A || !B[C]) && typeof B.prototype[C] == "function") { B[C] = function() { var D = Array.prototype.slice.call(arguments); return B.prototype[C].apply(D.shift(), D) } } }; Native.typize = function(A, B) { if (!A.type) { A.type = function(C) { return ($type(C) === B) } } }; Native.alias = function(E, B, A, F) { for (var D = 0, C = E.length; D < C; D++) { E[D].alias(B, A, F) } }; (function(B) { for (var A in B) { Native.typize(B[A], A) } })({ "boolean": Boolean, "native": Native, object: Object }); (function(B) { for (var A in B) { new Native({ name: A, initialize: B[A], protect: true }) } })({ String: String, Function: Function, Number: Number, Array: Array, RegExp: RegExp, Date: Date }); (function(B, A) { for (var C = A.length; C--; C) { Native.genericize(B, A[C], true) } return arguments.callee })(Array, ["pop", "push", "reverse", "shift", "sort", "splice", "unshift", "concat", "join", "slice", "toString", "valueOf", "indexOf", "lastIndexOf"])(String, ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"]); function $chk(A) { return !!(A || A === 0) } function $clear(A) { clearTimeout(A); clearInterval(A); return null } function $defined(A) { return (A != undefined) } function $empty() { } function $arguments(A) { return function() { return arguments[A] } } function $lambda(A) { return (typeof A == "function") ? A : function() { return A } } function $extend(C, A) { for (var B in (A || {})) { C[B] = A[B] } return C } function $unlink(C) { var B; switch ($type(C)) { case "object": B = {}; for (var E in C) { B[E] = $unlink(C[E]) } break; case "hash": B = $unlink(C.getClean()); break; case "array": B = []; for (var D = 0, A = C.length; D < A; D++) { B[D] = $unlink(C[D]) } break; default: return C } return B } function $merge() { var E = {}; for (var D = 0, A = arguments.length; D < A; D++) { var B = arguments[D]; if ($type(B) != "object") { continue } for (var C in B) { var G = B[C], F = E[C]; E[C] = (F && $type(G) == "object" && $type(F) == "object") ? $merge(F, G) : $unlink(G) } } return E } function $pick() { for (var B = 0, A = arguments.length; B < A; B++) { if (arguments[B] != undefined) { return arguments[B] } } return null } function $random(B, A) { return Math.floor(Math.random() * (A - B + 1) + B) } function $splat(B) { var A = $type(B); return (A) ? ((A != "array" && A != "arguments") ? [B] : B) : [] } var $time = Date.now || function() { return new Date().getTime() }; function $try() { for (var B = 0, A = arguments.length; B < A; B++) { try { return arguments[B]() } catch (C) { } } return null } function $type(A) { if (A == undefined) { return false } if (A.$family) { return (A.$family.name == "number" && !isFinite(A)) ? false : A.$family.name } if (A.nodeName) { switch (A.nodeType) { case 1: return "element"; case 3: return (/\S/).test(A.nodeValue) ? "textnode" : "whitespace" } } else { if (typeof A.length == "number") { if (A.callee) { return "arguments" } else { if (A.item) { return "collection" } } } } return typeof A } var Hash = new Native({ name: "Hash", initialize: function(A) { if ($type(A) == "hash") { A = $unlink(A.getClean()) } for (var B in A) { this[B] = A[B] } return this } }); Hash.implement({ getLength: function() { var B = 0; for (var A in this) { if (this.hasOwnProperty(A)) { B++ } } return B }, forEach: function(B, C) { for (var A in this) { if (this.hasOwnProperty(A)) { B.call(C, this[A], A, this) } } }, getClean: function() { var B = {}; for (var A in this) { if (this.hasOwnProperty(A)) { B[A] = this[A] } } return B } }); Hash.alias("forEach", "each"); function $H(A) { return new Hash(A) } Array.implement({ forEach: function(C, D) { for (var B = 0, A = this.length; B < A; B++) { C.call(D, this[B], B, this) } } }); Array.alias("forEach", "each"); function $A(C) { if (C.item) { var D = []; for (var B = 0, A = C.length; B < A; B++) { D[B] = C[B] } return D } return Array.prototype.slice.call(C) } function $each(C, B, D) { var A = $type(C); ((A == "arguments" || A == "collection" || A == "array") ? Array : Hash).each(C, B, D) } var Browser = new Hash({ Engine: { name: "unknown", version: "" }, Platform: { name: (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase() }, Features: { xpath: !!(document.evaluate), air: !!(window.runtime) }, Plugins: {} }); if (window.opera) { Browser.Engine = { name: "presto", version: (document.getElementsByClassName) ? 950 : 925} } else { if (window.ActiveXObject) { Browser.Engine = { name: "trident", version: (window.XMLHttpRequest) ? 5 : 4} } else { if (!navigator.taintEnabled) { Browser.Engine = { name: "webkit", version: (Browser.Features.xpath) ? 420 : 419} } else { if (document.getBoxObjectFor != null) { Browser.Engine = { name: "gecko", version: (document.getElementsByClassName) ? 19 : 18} } } } } Browser.Engine[Browser.Engine.name] = Browser.Engine[Browser.Engine.name + Browser.Engine.version] = true; if (window.orientation != undefined) { Browser.Platform.name = "ipod" } Browser.Platform[Browser.Platform.name] = true; Browser.Request = function() { return $try(function() { return new XMLHttpRequest() }, function() { return new ActiveXObject("MSXML2.XMLHTTP") }) }; Browser.Features.xhr = !!(Browser.Request()); Browser.Plugins.Flash = (function() { var A = ($try(function() { return navigator.plugins["Shockwave Flash"].description }, function() { return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version") }) || "0 r0").match(/\d+/g); return { version: parseInt(A[0] || 0 + "." + A[1] || 0), build: parseInt(A[2] || 0)} })(); function $exec(B) { if (!B) { return B } if (window.execScript) { window.execScript(B) } else { var A = document.createElement("script"); A.setAttribute("type", "text/javascript"); A.text = B; document.head.appendChild(A); document.head.removeChild(A) } return B } Native.UID = 1; var $uid = (Browser.Engine.trident) ? function(A) { return (A.uid || (A.uid = [Native.UID++]))[0] } : function(A) { return A.uid || (A.uid = Native.UID++) }; var Window = new Native({ name: "Window", legacy: (Browser.Engine.trident) ? null : window.Window, initialize: function(A) { $uid(A); if (!A.Element) { A.Element = $empty; if (Browser.Engine.webkit) { A.document.createElement("iframe") } A.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {} } return $extend(A, Window.Prototype) }, afterImplement: function(B, A) { window[B] = Window.Prototype[B] = A } }); Window.Prototype = { $family: { name: "window"} }; new Window(window); var Document = new Native({ name: "Document", legacy: (Browser.Engine.trident) ? null : window.Document, initialize: function(A) { $uid(A); A.head = A.getElementsByTagName("head")[0]; A.html = A.getElementsByTagName("html")[0]; A.window = A.defaultView || A.parentWindow; if (Browser.Engine.trident4) { $try(function() { A.execCommand("BackgroundImageCache", false, true) }) } return $extend(A, Document.Prototype) }, afterImplement: function(B, A) { document[B] = Document.Prototype[B] = A } }); Document.Prototype = { $family: { name: "document"} }; new Document(document); Array.implement({ 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 }, filter: function(D, E) { var C = []; for (var B = 0, A = this.length; B < A; B++) { if (D.call(E, this[B], B, this)) { C.push(this[B]) } } return C }, clean: function() { return this.filter($defined) }, 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 }, map: function(D, E) { var C = []; for (var B = 0, A = this.length; B < A; B++) { C[B] = D.call(E, this[B], B, this) } return C }, 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 }, 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 }, link: function(C) { var A = {}; for (var E = 0, B = this.length; E < B; E++) { for (var D in C) { if (C[D](this[E])) { A[D] = this[E]; delete C[D]; break } } } return A }, contains: function(A, B) { return this.indexOf(A, B) != -1 }, extend: function(C) { for (var B = 0, A = C.length; B < A; B++) { this.push(C[B]) } return this }, getLast: function() { return (this.length) ? this[this.length - 1] : null }, getRandom: function() { return (this.length) ? this[$random(0, this.length - 1)] : null }, include: function(A) { if (!this.contains(A)) { this.push(A) } return this }, combine: function(C) { for (var B = 0, A = C.length; B < A; B++) { this.include(C[B]) } return this }, erase: function(B) { for (var A = this.length; A--; A) { if (this[A] === B) { this.splice(A, 1) } } return this }, empty: function() { this.length = 0; return this }, flatten: function() { var D = []; for (var B = 0, A = this.length; B < A; B++) { var C = $type(this[B]); if (!C) { continue } D = D.concat((C == "array" || C == "collection" || C == "arguments") ? Array.flatten(this[B]) : this[B]) } return D }, hexToRgb: function(B) { if (this.length != 3) { return null } var A = this.map(function(C) { if (C.length == 1) { C += C } return C.toInt(16) }); return (B) ? A : "rgb(" + A + ")" }, rgbToHex: function(D) { if (this.length < 3) { return null } 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("") } }); Function.implement({ extend: function(A) { for (var B in A) { this[B] = A[B] } return this }, create: function(B) { var A = this; B = B || {}; return function(D) { var C = B.arguments; C = (C != undefined) ? $splat(C) : Array.slice(arguments, (B.event) ? 1 : 0); if (B.event) { C = [D || window.event].extend(C) } var E = function() { return A.apply(B.bind || null, C) }; if (B.delay) { return setTimeout(E, B.delay) } if (B.periodical) { return setInterval(E, B.periodical) } if (B.attempt) { return $try(E) } return E() } }, 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 }) }, bindWithEvent: 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 })() }, run: function(A, B) { return this.apply(B, $splat(A)) } }); Number.implement({ 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, C) { for (var A = 0; A < this; A++) { B.call(C, A, this) } }, toFloat: function() { return parseFloat(this) }, toInt: function(A) { return parseInt(this, A || 10) } }); Number.alias("times", "each"); (function(B) { var A = {}; B.each(function(C) { if (!Number[C]) { A[C] = function() { return Math[C].apply(null, [this].concat($A(arguments))) } } }); Number.implement(A) })(["abs", "acos", "asin", "atan", "atan2", "ceil", "cos", "exp", "floor", "log", "max", "min", "pow", "sin", "sqrt", "tan"]); String.implement({ test: function(A, B) { return ((typeof A == "string") ? new RegExp(A, B) : A).test(this) }, contains: function(A, B) { return (B) ? (B + this + B).indexOf(B + A + B) > -1 : this.indexOf(A) > -1 }, trim: function() { return this.replace(/^\s+|\s+$/g, "") }, clean: function() { return this.replace(/\s+/g, " ").trim() }, camelCase: function() { return this.replace(/-\D/g, function(A) { return A.charAt(1).toUpperCase() }) }, hyphenate: function() { return this.replace(/[A-Z]/g, function(A) { return ("-" + A.charAt(0).toLowerCase()) }) }, capitalize: function() { return this.replace(/\b[a-z]/g, function(A) { return A.toUpperCase() }) }, escapeRegExp: function() { return this.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1") }, toInt: function(A) { return parseInt(this, A || 10) }, toFloat: function() { return parseFloat(this) }, hexToRgb: function(B) { var A = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); return (A) ? A.slice(1).hexToRgb(B) : null }, rgbToHex: function(B) { var A = this.match(/\d{1,3}/g); return (A) ? A.rgbToHex(B) : null }, stripScripts: function(B) { var A = ""; var C = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function() { A += arguments[1] + "\n"; return "" }); if (B === true) { $exec(A) } else { if ($type(B) == "function") { B(A, C) } } return C }, substitute: function(A, B) { return this.replace(B || (/\\?\{([^}]+)\}/g), function(D, C) { if (D.charAt(0) == "\\") { return D.slice(1) } return (A[C] != undefined) ? A[C] : "" }) } }); Hash.implement({ has: Object.prototype.hasOwnProperty, keyOf: function(B) { for (var A in this) { if (this.hasOwnProperty(A) && this[A] === B) { return A } } return null }, hasValue: function(A) { return (Hash.keyOf(this, A) !== null) }, extend: function(A) { Hash.each(A, function(C, B) { Hash.set(this, B, C) }, this); return this }, combine: function(A) { Hash.each(A, function(C, B) { Hash.include(this, B, C) }, this); return this }, erase: function(A) { if (this.hasOwnProperty(A)) { delete this[A] } return this }, get: function(A) { return (this.hasOwnProperty(A)) ? this[A] : null }, set: function(A, B) { if (!this[A] || this.hasOwnProperty(A)) { this[A] = B } return this }, empty: function() { Hash.each(this, function(B, A) { delete this[A] }, this); return this }, include: function(B, C) { var A = this[B]; if (A == undefined) { this[B] = C } return this }, map: function(B, C) { var A = new Hash; Hash.each(this, function(E, D) { A.set(D, B.call(C, E, D, this)) }, this); return A }, filter: function(B, C) { var A = new Hash; Hash.each(this, function(E, D) { if (B.call(C, E, D, this)) { A.set(D, E) } }, this); return A }, every: function(B, C) { for (var A in this) { if (this.hasOwnProperty(A) && !B.call(C, this[A], A)) { return false } } return true }, some: function(B, C) { for (var A in this) { if (this.hasOwnProperty(A) && B.call(C, this[A], A)) { return true } } return false }, getKeys: function() { var A = []; Hash.each(this, function(C, B) { A.push(B) }); return A }, getValues: function() { var A = []; Hash.each(this, function(B) { A.push(B) }); return A }, toQueryString: function(A) { var B = []; Hash.each(this, function(F, E) { if (A) { E = A + "[" + E + "]" } var D; switch ($type(F)) { case "object": D = Hash.toQueryString(F, E); break; case "array": var C = {}; F.each(function(H, G) { C[G] = H }); D = Hash.toQueryString(C, E); break; default: D = E + "=" + encodeURIComponent(F) } if (F != undefined) { B.push(D) } }); return B.join("&") } }); Hash.alias({ keyOf: "indexOf", hasValue: "contains" }); var Event = new Native({ name: "Event", initialize: function(A, F) { F = F || window; var K = F.document; A = A || F.event; if (A.$extended) { return A } this.$extended = true; var J = A.type; var G = A.target || A.srcElement; while (G && G.nodeType == 3) { G = G.parentNode } if (J.test(/key/)) { var B = A.which || A.keyCode; var M = Event.Keys.keyOf(B); if (J == "keydown") { var D = B - 111; if (D > 0 && D < 13) { M = "f" + D } } M = M || String.fromCharCode(B).toLowerCase() } else { if (J.match(/(click|mouse|menu)/i)) { K = (!K.compatMode || K.compatMode == "CSS1Compat") ? K.html : K.body; var I = { x: A.pageX || A.clientX + K.scrollLeft, y: A.pageY || A.clientY + K.scrollTop }; var C = { x: (A.pageX) ? A.pageX - F.pageXOffset : A.clientX, y: (A.pageY) ? A.pageY - F.pageYOffset : A.clientY }; if (J.match(/DOMMouseScroll|mousewheel/)) { var H = (A.wheelDelta) ? A.wheelDelta / 120 : -(A.detail || 0) / 3 } var E = (A.which == 3) || (A.button == 2); var L = null; if (J.match(/over|out/)) { switch (J) { case "mouseover": L = A.relatedTarget || A.fromElement; break; case "mouseout": L = A.relatedTarget || A.toElement } if (!(function() { while (L && L.nodeType == 3) { L = L.parentNode } return true }).create({ attempt: Browser.Engine.gecko })()) { L = false } } } } return $extend(this, { event: A, type: J, page: I, client: C, rightClick: E, wheel: H, relatedTarget: L, target: G, code: B, key: M, shift: A.shiftKey, control: A.ctrlKey, alt: A.altKey, meta: A.metaKey }) } }); Event.Keys = new Hash({ enter: 13, up: 38, down: 40, left: 37, right: 39, esc: 27, space: 32, backspace: 8, tab: 9, "delete": 46 }); Event.implement({ 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 } }); var Class = new Native({ name: "Class", initialize: function(B) { B = B || {}; var A = function(E) { for (var D in this) { this[D] = $unlink(this[D]) } for (var F in Class.Mutators) { if (!this[F]) { continue } Class.Mutators[F](this, this[F]); delete this[F] } this.constructor = A; if (E === $empty) { return this } var C = (this.initialize) ? this.initialize.apply(this, arguments) : this; if (this.options && this.options.initialize) { this.options.initialize.call(this) } return C }; $extend(A, this); A.constructor = Class; A.prototype = B; return A } }); Class.implement({ implement: function() { Class.Mutators.Implements(this.prototype, Array.slice(arguments)); return this } }); Class.Mutators = { Implements: function(A, B) { $splat(B).each(function(C) { $extend(A, ($type(C) == "class") ? new C($empty) : C) }) }, Extends: function(self, klass) { var instance = new klass($empty); delete instance.parent; delete instance.parentOf; for (var key in instance) { var current = self[key], previous = instance[key]; if (current == undefined) { self[key] = previous; continue } var ctype = $type(current), ptype = $type(previous); if (ctype != ptype) { continue } switch (ctype) { case "function": if (!arguments.callee.caller) { self[key] = eval("(" + String(current).replace(/\bthis\.parent\(\s*(\))?/g, function(full, close) { return "arguments.callee._parent_.call(this" + (close || ", ") }) + ")") } self[key]._parent_ = previous; break; case "object": self[key] = $merge(previous, current) } } self.parent = function() { return arguments.callee.caller._parent_.apply(this, arguments) }; self.parentOf = function(descendant) { return descendant._parent_.apply(this, Array.slice(arguments, 1)) } } }; var Chain = new Class({ chain: function() { this.$chain = (this.$chain || []).extend(arguments); return this }, callChain: function() { return (this.$chain && this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false }, clearChain: function() { if (this.$chain) { this.$chain.empty() } return this } }); var Events = new Class({ addEvent: function(C, B, A) { C = Events.removeOn(C); if (B != $empty) { this.$events = this.$events || {}; this.$events[C] = this.$events[C] || []; this.$events[C].include(B); if (A) { B.internal = true } } return this }, addEvents: function(A) { for (var B in A) { this.addEvent(B, A[B]) } return this }, fireEvent: function(C, B, A) { C = Events.removeOn(C); if (!this.$events || !this.$events[C]) { return this } this.$events[C].each(function(D) { D.create({ bind: this, delay: A, "arguments": B })() }, this); return this }, removeEvent: function(B, A) { B = Events.removeOn(B); if (!this.$events || !this.$events[B]) { return this } if (!A.internal) { this.$events[B].erase(A) } return this }, removeEvents: function(C) { for (var D in this.$events) { if (C && C != D) { continue } var B = this.$events[D]; for (var A = B.length; A--; A) { this.removeEvent(D, B[A]) } } return this } }); Events.removeOn = function(A) { return A.replace(/^on([A-Z])/, function(B, C) { return C.toLowerCase() }) }; var Options = new Class({ setOptions: function() { this.options = $merge.run([this.options].extend(arguments)); if (!this.addEvent) { return this } for (var A in this.options) { if ($type(this.options[A]) != "function" || !(/^on[A-Z]/).test(A)) { continue } this.addEvent(A, this.options[A]); delete this.options[A] } return this } }); Document.implement({ newElement: function(A, B) { if (Browser.Engine.trident && B) { ["name", "type", "checked"].each(function(C) { if (!B[C]) { return } A += " " + C + '="' + B[C] + '"'; if (C != "checked") { delete B[C] } }); A = "<" + A + ">" } return $.element(this.createElement(A)).set(B) }, newTextNode: function(A) { return this.createTextNode(A) }, getDocument: function() { return this }, getWindow: function() { return this.defaultView || this.parentWindow }, purge: function() { var C = this.getElementsByTagName("*"); for (var B = 0, A = C.length; B < A; B++) { Browser.freeMem(C[B]) } } }); var Element = new Native({ name: "Element", legacy: window.Element, initialize: function(A, B) { var C = Element.Constructors.get(A); if (C) { return C(B) } if (typeof A == "string") { return document.newElement(A, B) } return $(A).set(B) }, afterImplement: function(A, B) { if (!Array[A]) { Elements.implement(A, Elements.multi(A)) } Element.Prototype[A] = B } }); Element.Prototype = { $family: { name: "element"} }; Element.Constructors = new Hash; var IFrame = new Native({ name: "IFrame", generics: false, initialize: function() { var E = Array.link(arguments, { properties: Object.type, iframe: $defined }); var C = E.properties || {}; var B = $(E.iframe) || false; var D = C.onload || $empty; delete C.onload; C.id = C.name = $pick(C.id, C.name, B.id, B.name, "IFrame_" + $time()); B = new Element(B || "iframe", C); var A = function() { var F = $try(function() { return B.contentWindow.location.host }); if (F && F == window.location.host) { var H = new Window(B.contentWindow); var G = new Document(B.contentWindow.document); $extend(H.Element.prototype, Element.Prototype) } D.call(B.contentWindow, B.contentWindow.document) }; (!window.frames[C.id]) ? B.addListener("load", A) : A(); return B } }); var Elements = new Native({ initialize: function(F, B) { B = $extend({ ddup: true, cash: true }, B); F = F || []; if (B.ddup || B.cash) { var G = {}, E = []; for (var C = 0, A = F.length; C < A; C++) { var D = $.element(F[C], !B.cash); if (B.ddup) { if (G[D.uid]) { continue } G[D.uid] = true } E.push(D) } F = E } return (B.cash) ? $extend(F, this) : F } }); Elements.implement({ filter: function(A, B) { if (!A) { return this } return new Elements(Array.filter(this, (typeof A == "string") ? function(C) { return C.match(A) } : A, B)) } }); Elements.multi = function(A) { return function() { var B = []; var F = true; for (var D = 0, C = this.length; D < C; D++) { var E = this[D][A].apply(this[D], arguments); B.push(E); if (F) { F = ($type(E) == "element") } } return (F) ? new Elements(B) : B } }; Window.implement({ $: function(B, C) { if (B && B.$family && B.uid) { return B } var A = $type(B); return ($[A]) ? $[A](B, C, this.document) : null }, $$: function(A) { if (arguments.length == 1 && typeof A == "string") { return this.document.getElements(A) } var F = []; var C = Array.flatten(arguments); for (var D = 0, B = C.length; D < B; D++) { var E = C[D]; switch ($type(E)) { case "element": E = [E]; break; case "string": E = this.document.getElements(E, true); break; default: E = false } if (E) { F.extend(E) } } return new Elements(F) }, getDocument: function() { return this.document }, getWindow: function() { return this } }); $.string = function(C, B, A) { C = A.getElementById(C); return (C) ? $.element(C, B) : null }; $.element = function(A, D) { $uid(A); if (!D && !A.$family && !(/^object|embed$/i).test(A.tagName)) { var B = Element.Prototype; for (var C in B) { A[C] = B[C] } } return A }; $.object = function(B, C, A) { if (B.toElement) { return $.element(B.toElement(A), C) } return null }; $.textnode = $.whitespace = $.window = $.document = $arguments(0); Native.implement([Element, Document], { getElement: function(A, B) { return $(this.getElements(A, true)[0] || null, B) }, getElements: function(A, D) { A = A.split(","); var C = []; var B = (A.length > 1); A.each(function(E) { var F = this.getElementsByTagName(E.trim()); (B) ? C.extend(F) : C = F }, this); return new Elements(C, { ddup: B, cash: !D }) } }); Element.Storage = { get: function(A) { return (this[A] || (this[A] = {})) } }; Element.Inserters = new Hash({ before: function(B, A) { if (A.parentNode) { A.parentNode.insertBefore(B, A) } }, after: function(B, A) { if (!A.parentNode) { return } var C = A.nextSibling; (C) ? A.parentNode.insertBefore(B, C) : A.parentNode.appendChild(B) }, bottom: function(B, A) { A.appendChild(B) }, top: function(B, A) { var C = A.firstChild; (C) ? A.insertBefore(B, C) : A.appendChild(B) } }); Element.Inserters.inside = Element.Inserters.bottom; Element.Inserters.each(function(C, B) { var A = B.capitalize(); Element.implement("inject" + A, function(D) { C(this, $(D, true)); return this }); Element.implement("grab" + A, function(D) { C($(D, true), this); return this }) }); Element.implement({ getDocument: function() { return this.ownerDocument }, getWindow: function() { return this.ownerDocument.getWindow() }, getElementById: function(D, C) { var B = this.ownerDocument.getElementById(D); if (!B) { return null } for (var A = B.parentNode; A != this; A = A.parentNode) { if (!A) { return null } } return $.element(B, C) }, set: function(D, B) { switch ($type(D)) { case "object": for (var C in D) { this.set(C, D[C]) } break; case "string": var A = Element.Properties.get(D); (A && A.set) ? A.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(D, B) } return this }, get: function(B) { var A = Element.Properties.get(B); return (A && A.get) ? A.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(B) }, erase: function(B) { var A = Element.Properties.get(B); (A && A.erase) ? A.erase.apply(this, Array.slice(arguments, 1)) : this.removeProperty(B); return this }, match: function(A) { return (!A || Element.get(this, "tag") == A) }, inject: function(B, A) { Element.Inserters.get(A || "bottom")(this, $(B, true)); return this }, wraps: function(B, A) { B = $(B, true); return this.replaces(B).grab(B, A) }, grab: function(B, A) { Element.Inserters.get(A || "bottom")($(B, true), this); return this }, appendText: function(B, A) { return this.grab(this.getDocument().newTextNode(B), A) }, adopt: function() { Array.flatten(arguments).each(function(A) { A = $(A, true); if (A) { this.appendChild(A) } }, this); return this }, dispose: function() { return (this.parentNode) ? this.parentNode.removeChild(this) : this }, clone: function(D, C) { switch ($type(this)) { case "element": var H = {}; for (var G = 0, E = this.attributes.length; G < E; G++) { var B = this.attributes[G], L = B.nodeName.toLowerCase(); if (Browser.Engine.trident && (/input/i).test(this.tagName) && (/width|height/).test(L)) { continue } var K = (L == "style" && this.style) ? this.style.cssText : B.nodeValue; if (!$chk(K) || L == "uid" || (L == "id" && !C)) { continue } if (K != "inherit" && ["string", "number"].contains($type(K))) { H[L] = K } } var J = new Element(this.nodeName.toLowerCase(), H); if (D !== false) { for (var I = 0, F = this.childNodes.length; I < F; I++) { var A = Element.clone(this.childNodes[I], true, C); if (A) { J.grab(A) } } } return J; case "textnode": return document.newTextNode(this.nodeValue) } return null }, replaces: function(A) { A = $(A, true); A.parentNode.replaceChild(this, 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) }, getComputedStyle: function(B) { if (this.currentStyle) { return this.currentStyle[B.camelCase()] } var A = this.getWindow().getComputedStyle(this, null); return (A) ? A.getPropertyValue([B.hyphenate()]) : null }, empty: function() { $A(this.childNodes).each(function(A) { Browser.freeMem(A); Element.empty(A); Element.dispose(A) }, this); return this }, destroy: function() { Browser.freeMem(this.empty().dispose()); return null }, getSelected: function() { return new Elements($A(this.options).filter(function(A) { return A.selected })) }, toQueryString: function() { var A = []; this.getElements("input, select, textarea").each(function(B) { if (!B.name || B.disabled) { return } var C = (B.tagName.toLowerCase() == "select") ? Element.getSelected(B).map(function(D) { return D.value }) : ((B.type == "radio" || B.type == "checkbox") && !B.checked) ? null : B.value; $splat(C).each(function(D) { if (D) { A.push(B.name + "=" + encodeURIComponent(D)) } }) }); return A.join("&") }, getProperty: function(C) { var B = Element.Attributes, A = B.Props[C]; var D = (A) ? this[A] : this.getAttribute(C, 2); return (B.Bools[C]) ? !!D : (A) ? D : D || null }, getProperties: function() { var A = $A(arguments); return A.map(function(B) { return this.getProperty(B) }, this).associate(A) }, setProperty: function(D, E) { var C = Element.Attributes, B = C.Props[D], A = $defined(E); if (B && C.Bools[D]) { E = (E || !A) ? true : false } else { if (!A) { return this.removeProperty(D) } } (B) ? this[B] = E : this.setAttribute(D, E); return this }, setProperties: function(A) { for (var B in A) { this.setProperty(B, A[B]) } return this }, removeProperty: function(D) { var C = Element.Attributes, B = C.Props[D], A = (B && C.Bools[D]); (B) ? this[B] = (A) ? false : "" : this.removeAttribute(D); return this }, removeProperties: function() { Array.each(arguments, this.removeProperty, this); return this } }); (function() { var A = function(D, B, I, C, F, H) { var E = D[I || B]; var G = []; while (E) { if (E.nodeType == 1 && (!C || Element.match(E, C))) { G.push(E); if (!F) { break } } E = E[B] } return (F) ? new Elements(G, { ddup: false, cash: !H }) : $(G[0], H) }; Element.implement({ getPrevious: function(B, C) { return A(this, "previousSibling", null, B, false, C) }, getAllPrevious: function(B, C) { return A(this, "previousSibling", null, B, true, C) }, getNext: function(B, C) { return A(this, "nextSibling", null, B, false, C) }, getAllNext: function(B, C) { return A(this, "nextSibling", null, B, true, C) }, getFirst: function(B, C) { return A(this, "nextSibling", "firstChild", B, false, C) }, getLast: function(B, C) { return A(this, "previousSibling", "lastChild", B, false, C) }, getParent: function(B, C) { return A(this, "parentNode", null, B, false, C) }, getParents: function(B, C) { return A(this, "parentNode", null, B, true, C) }, getChildren: function(B, C) { return A(this, "nextSibling", "firstChild", B, true, C) }, hasChild: function(B) { B = $(B, true); return (!!B && $A(this.getElementsByTagName(B.tagName)).contains(B)) } }) })(); Element.Properties = new Hash; Element.Properties.style = { set: function(A) { this.style.cssText = A }, get: function() { return this.style.cssText }, erase: function() { this.style.cssText = "" } }; Element.Properties.tag = { get: function() { return this.tagName.toLowerCase() } }; Element.Properties.href = { get: function() { return (!this.href) ? null : this.href.replace(new RegExp("^" + document.location.protocol + "//" + document.location.host), "") } }; Element.Properties.html = { set: function() { return this.innerHTML = Array.flatten(arguments).join("") } }; Native.implement([Element, Window, Document], { 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 }, retrieve: function(B, A) { var D = Element.Storage.get(this.uid); var C = D[B]; if ($defined(A) && !$defined(C)) { C = D[B] = A } return $pick(C) }, store: function(B, A) { var C = Element.Storage.get(this.uid); C[B] = A; return this }, eliminate: function(A) { var B = Element.Storage.get(this.uid); delete B[A]; return this } }); Element.Attributes = new Hash({ Props: { html: "innerHTML", "class": "className", "for": "htmlFor", text: (Browser.Engine.trident) ? "innerText" : "textContent" }, Bools: ["compact", "nowrap", "ismap", "declare", "noshade", "checked", "disabled", "readonly", "multiple", "selected", "noresize", "defer"], Camels: ["value", "accessKey", "cellPadding", "cellSpacing", "colSpan", "frameBorder", "maxLength", "readOnly", "rowSpan", "tabIndex", "useMap"] }); Browser.freeMem = function(A) { if (!A) { return } if (Browser.Engine.trident && (/object/i).test(A.tagName)) { for (var B in A) { if (typeof A[B] == "function") { A[B] = $empty } } Element.dispose(A) } if (A.uid && A.removeEvents) { A.removeEvents() } }; (function(B) { var C = B.Bools, A = B.Camels; B.Bools = C = C.associate(C); Hash.extend(Hash.combine(B.Props, C), A.associate(A.map(function(D) { return D.toLowerCase() }))); B.erase("Camels") })(Element.Attributes); window.addListener("unload", function() { window.removeListener("unload", arguments.callee); document.purge(); if (Browser.Engine.trident) { CollectGarbage() } }); Element.Properties.events = { set: function(A) { this.addEvents(A) } }; Native.implement([Element, Window, Document], { addEvent: function(E, G) { var H = this.retrieve("events", {}); H[E] = H[E] || { keys: [], values: [] }; if (H[E].keys.contains(G)) { return this } H[E].keys.push(G); var F = E, A = Element.Events.get(E), C = G, I = this; if (A) { if (A.onAdd) { A.onAdd.call(this, G) } if (A.condition) { C = function(J) { if (A.condition.call(this, J)) { return G.call(this, J) } return false } } F = A.base || F } var D = function() { return G.call(I) }; var B = Element.NativeEvents[F] || 0; if (B) { if (B == 2) { D = function(J) { J = new Event(J, I.getWindow()); if (C.call(I, J) === false) { J.stop() } } } this.addListener(F, D) } H[E].values.push(D); return this }, removeEvent: function(D, C) { var B = this.retrieve("events"); if (!B || !B[D]) { return this } var G = B[D].keys.indexOf(C); if (G == -1) { return this } var A = B[D].keys.splice(G, 1)[0]; var F = B[D].values.splice(G, 1)[0]; var E = Element.Events.get(D); if (E) { if (E.onRemove) { E.onRemove.call(this, C) } D = E.base || D } return (Element.NativeEvents[D]) ? this.removeListener(D, F) : this }, addEvents: function(A) { for (var B in A) { this.addEvent(B, A[B]) } return this }, removeEvents: function(B) { var A = this.retrieve("events"); if (!A) { return this } if (!B) { for (var C in A) { this.removeEvents(C) } A = null } else { if (A[B]) { while (A[B].keys[0]) { this.removeEvent(B, A[B].keys[0]) } A[B] = null } } return this }, fireEvent: function(D, B, A) { var C = this.retrieve("events"); if (!C || !C[D]) { return this } C[D].keys.each(function(E) { E.create({ bind: this, delay: A, "arguments": B })() }, this); return this }, cloneEvents: function(D, A) { D = $(D); var C = D.retrieve("events"); if (!C) { return this } if (!A) { for (var B in C) { this.cloneEvents(D, B) } } else { if (C[A]) { C[A].keys.each(function(E) { this.addEvent(A, E) }, this) } } return this } }); Element.NativeEvents = { click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, mousewheel: 2, DOMMouseScroll: 2, mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, keydown: 2, keypress: 2, keyup: 2, focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, load: 1, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, error: 1, abort: 1, scroll: 1 }; (function() { var A = function(B) { var C = B.relatedTarget; if (C == undefined) { return true } if (C === false) { return false } return ($type(this) != "document" && C != this && C.prefix != "xul" && !this.hasChild(C)) }; Element.Events = new Hash({ mouseenter: { base: "mouseover", condition: A }, mouseleave: { base: "mouseout", condition: A }, mousewheel: { base: (Browser.Engine.gecko) ? "DOMMouseScroll" : "mousewheel"} }) })(); Element.Properties.styles = { set: function(A) { this.setStyles(A) } }; Element.Properties.opacity = { set: function(A, B) { if (!B) { 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 (Browser.Engine.trident) { this.style.filter = (A == 1) ? "" : "alpha(opacity=" + A * 100 + ")" } this.style.opacity = A; this.store("opacity", A) }, get: function() { return this.retrieve("opacity", 1) } }; Element.implement({ setOpacity: function(A) { return this.set("opacity", A, true) }, getOpacity: function() { return this.get("opacity") }, setStyle: function(B, A) { switch (B) { case "opacity": return this.set("opacity", parseFloat(A)); case "float": B = (Browser.Engine.trident) ? "styleFloat" : "cssFloat" } B = B.camelCase(); if ($type(A) != "string") { var C = (Element.Styles.get(B) || "@").split(" "); A = $splat(A).map(function(E, D) { if (!C[D]) { return "" } return ($type(E) == "number") ? C[D].replace("@", Math.round(E)) : E }).join(" ") } else { if (A == String(Number(A))) { A = Math.round(A) } } this.style[B] = A; return this }, getStyle: function(G) { switch (G) { case "opacity": return this.get("opacity"); case "float": G = (Browser.Engine.trident) ? "styleFloat" : "cssFloat" } G = G.camelCase(); var A = this.style[G]; if (!$chk(A)) { A = []; for (var F in Element.ShortStyles) { if (G != F) { continue } for (var E in Element.ShortStyles[F]) { A.push(this.getStyle(E)) } return A.join(" ") } A = this.getComputedStyle(G) } if (A) { A = String(A); var C = A.match(/rgba?\([\d\s,]+\)/); if (C) { A = A.replace(C[0], C[0].rgbToHex()) } } if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(A)))) { if (G.test(/^(height|width)$/)) { var B = (G == "width") ? ["left", "right"] : ["top", "bottom"], D = 0; B.each(function(H) { D += this.getStyle("border-" + H + "-width").toInt() + this.getStyle("padding-" + H).toInt() }, this); return this["offset" + G.capitalize()] - D + "px" } if (Browser.Engine.presto && String(A).test("px")) { return A } if (G.test(/(border(.+)Width|margin|padding)/)) { return "0px" } } return A }, setStyles: function(B) { for (var A in B) { this.setStyle(A, B[A]) } return this }, getStyles: function() { var A = {}; Array.each(arguments, function(B) { A[B] = this.getStyle(B) }, this); return A } }); Element.Styles = new Hash({ left: "@px", top: "@px", bottom: "@px", right: "@px", width: "@px", height: "@px", maxWidth: "@px", maxHeight: "@px", minWidth: "@px", minHeight: "@px", backgroundColor: "rgb(@, @, @)", backgroundPosition: "@px @px", color: "rgb(@, @, @)", fontSize: "@px", letterSpacing: "@px", lineHeight: "@px", clip: "rect(@px @px @px @px)", margin: "@px @px @px @px", padding: "@px @px @px @px", border: "@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)", borderWidth: "@px @px @px @px", borderStyle: "@ @ @ @", borderColor: "rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)", zIndex: "@", zoom: "@", fontWeight: "@", textIndent: "@px", opacity: "@" }); Element.ShortStyles = { margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {} }; ["Top", "Right", "Bottom", "Left"].each(function(G) { var F = Element.ShortStyles; var B = Element.Styles; ["margin", "padding"].each(function(H) { var I = H + G; F[H][I] = B[I] = "@px" }); var E = "border" + G; F.border[E] = B[E] = "@px @ rgb(@, @, @)"; var D = E + "Width", A = E + "Style", C = E + "Color"; F[E] = {}; F.borderWidth[D] = F[E][D] = B[D] = "@px"; F.borderStyle[A] = F[E][A] = B[A] = "@"; F.borderColor[C] = F[E][C] = B[C] = "rgb(@, @, @)" }); Element.Events.domready = { onAdd: function(A) { if (Browser.loaded) { A.call(this) } } }; (function() { var B = function() { if (Browser.loaded) { return } Browser.loaded = true; window.fireEvent("domready"); document.fireEvent("domready") }; switch (Browser.Engine.name) { case "webkit": (function() { (["loaded", "complete"].contains(document.readyState)) ? B() : arguments.callee.delay(50) })(); break; case "trident": var A = document.createElement("div"); (function() { ($try(function() { A.doScroll("left"); return $(A).inject(document.body).set("html", "temp").dispose() })) ? B() : arguments.callee.delay(50) })(); break; default: window.addEvent("load", B); document.addEvent("DOMContentLoaded", B) } })();