var MooTools = { version: "1.2.4", build: "0d9113241a90b9cd5643b926795852a2026710d4" }; var Native = function (l) { l = l || {}; var v = l.name; var n = l.legacy; var u = l.protect; var t = l.implement; var o = l.generics; var q = l.initialize; var p = l.afterImplement || function () { }; var s = q || n; o = o !== false; s.constructor = Native; s.$family = { name: "native" }; if (n && q) { s.prototype = n.prototype } s.prototype.constructor = s; if (v) { var r = v.toLowerCase(); s.prototype.$family = { name: r }; Native.typize(s, r) } var m = function (d, b, c, a) { if (!u || a || !d.prototype[b]) { d.prototype[b] = c } if (o) { Native.genericize(d, b, u) } p.call(d, b, c); return d }; s.alias = function (e, b, c) { if (typeof e == "string") { var d = this.prototype[e]; if ((e = d)) { return m(this, b, e, c) } } for (var a in e) { this.alias(a, e[a], b) } return this }; s.implement = function (a, b, c) { if (typeof a == "string") { return m(this, a, b, c) } for (var d in a) { m(this, d, a[d], b) } return this }; if (t) { s.implement(t) } return s }; Native.genericize = function (d, f, e) { if ((!e || !d[f]) && typeof d.prototype[f] == "function") { d[f] = function () { var a = Array.prototype.slice.call(arguments); return d.prototype[f].apply(a.shift(), a) } } }; Native.implement = function (g, h) { for (var e = 0, f = g.length; e < f; e++) { g[e].implement(h) } }; Native.typize = function (d, c) { if (!d.type) { d.type = function (a) { return ($type(a) === c) } } }; (function () { var i = { Array: Array, Date: Date, Function: Function, Number: Number, RegExp: RegExp, String: String }; for (var j in i) { new Native({ name: j, initialize: i[j], protect: true }) } var m = { "boolean": Boolean, "native": Native, object: Object }; for (var n in m) { Native.typize(m[n], n) } var k = { Array: ["concat", "indexOf", "join", "lastIndexOf", "pop", "push", "reverse", "shift", "slice", "sort", "splice", "toString", "unshift", "valueOf"], String: ["charAt", "charCodeAt", "concat", "indexOf", "lastIndexOf", "match", "replace", "search", "slice", "split", "substr", "substring", "toLowerCase", "toUpperCase", "valueOf"] }; for (var l in k) { for (var g = k[l].length; g--; ) { Native.genericize(i[l], k[l][g], true) } } })(); var Hash = new Native({ name: "Hash", initialize: function (d) { if ($type(d) == "hash") { d = $unlink(d.getClean()) } for (var c in d) { this[c] = d[c] } return this } }); Hash.implement({ forEach: function (d, f) { for (var e in this) { if (this.hasOwnProperty(e)) { d.call(f, this[e], e, this) } } }, getClean: function () { var c = {}; for (var d in this) { if (this.hasOwnProperty(d)) { c[d] = this[d] } } return c }, getLength: function () { var c = 0; for (var d in this) { if (this.hasOwnProperty(d)) { c++ } } return c } }); Hash.alias("forEach", "each"); Array.implement({ forEach: function (h, g) { for (var e = 0, f = this.length; e < f; e++) { h.call(g, this[e], e, this) } } }); Array.alias("forEach", "each"); function $A(d) { if (d.item) { var e = d.length, f = new Array(e); while (e--) { f[e] = d[e] } return f } return Array.prototype.slice.call(d) } function $arguments(b) { return function () { return arguments[b] } } function $chk(b) { return !!(b || b === 0) } function $clear(b) { clearTimeout(b); clearInterval(b); return null } function $defined(b) { return (b != undefined) } function $each(h, e, g) { var f = $type(h); ((f == "arguments" || f == "collection" || f == "array") ? Array : Hash).each(h, e, g) } function $empty() { } function $extend(f, e) { for (var d in (e || {})) { f[d] = e[d] } return f } function $H(b) { return new Hash(b) } function $lambda(b) { return ($type(b) == "function") ? b : function () { return b } } function $merge() { var b = Array.slice(arguments); b.unshift({}); return $mixin.apply(null, b) } function $mixin(l) { for (var m = 1, i = arguments.length; m < i; m++) { var h = arguments[m]; if ($type(h) != "object") { continue } for (var n in h) { var j = h[n], k = l[n]; l[n] = (k && $type(j) == "object" && $type(k) == "object") ? $mixin(k, j) : $unlink(j) } } return l } function $pick() { for (var c = 0, d = arguments.length; c < d; c++) { if (arguments[c] != undefined) { return arguments[c] } } return null } function $random(c, d) { return Math.floor(Math.random() * (d - c + 1) + c) } function $splat(c) { var d = $type(c); return (d) ? ((d != "array" && d != "arguments") ? [c] : c) : [] } var $time = Date.now || function () { return +new Date }; function $try() { for (var d = 0, e = arguments.length; d < e; d++) { try { return arguments[d]() } catch (f) { } } return null } function $type(b) { if (b == undefined) { return false } if (b.$family) { return (b.$family.name == "number" && !isFinite(b)) ? false : b.$family.name } if (b.nodeName) { switch (b.nodeType) { case 1: return "element"; case 3: return (/\S/).test(b.nodeValue) ? "textnode" : "whitespace" } } else { if (typeof b.length == "number") { if (b.callee) { return "arguments" } else { if (b.item) { return "collection" } } } } return typeof b } function $unlink(j) { var f; switch ($type(j)) { case "object": f = {}; for (var h in j) { f[h] = $unlink(j[h]) } break; case "hash": f = new Hash(j); break; case "array": f = []; for (var i = 0, g = j.length; i < g; i++) { f[i] = $unlink(j[i]) } break; default: return j } return f } var Browser = $merge({ Engine: { name: "unknown", version: 0 }, Platform: { name: (window.orientation != undefined) ? "ipod" : (navigator.platform.match(/mac|win|linux/i) || ["other"])[0].toLowerCase() }, Features: { xpath: !!(document.evaluate), air: !!(window.runtime), query: !!(document.querySelector) }, Plugins: {}, Engines: { presto: function () { return (!window.opera) ? false : ((arguments.callee.caller) ? 960 : ((document.getElementsByClassName) ? 950 : 925)) }, trident: function () { return (!window.ActiveXObject) ? false : ((window.XMLHttpRequest) ? ((document.querySelectorAll) ? 6 : 5) : 4) }, webkit: function () { return (navigator.taintEnabled) ? false : ((Browser.Features.xpath) ? ((Browser.Features.query) ? 525 : 420) : 419) }, gecko: function () { return (!document.getBoxObjectFor && window.mozInnerScreenX == null) ? false : ((document.getElementsByClassName) ? 19 : 18) } } }, Browser || {}); Browser.Platform[Browser.Platform.name] = true; Browser.detect = function () { for (var c in this.Engines) { var d = this.Engines[c](); if (d) { this.Engine = { name: c, version: d }; this.Engine[c] = this.Engine[c + d] = true; break } } return { name: c, version: d} }; Browser.detect(); Browser.Request = function () { return $try(function () { return new XMLHttpRequest() }, function () { return new ActiveXObject("MSXML2.XMLHTTP") }, function () { return new ActiveXObject("Microsoft.XMLHTTP") }) }; Browser.Features.xhr = !!(Browser.Request()); Browser.Plugins.Flash = (function () { var b = ($try(function () { return navigator.plugins["Shockwave Flash"].description }, function () { return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version") }) || "0 r0").match(/\d+/g); return { version: parseInt(b[0] || 0 + "." + b[1], 10) || 0, build: parseInt(b[2], 10) || 0} })(); function $exec(c) { if (!c) { return c } if (window.execScript) { window.execScript(c) } else { var d = document.createElement("script"); d.setAttribute("type", "text/javascript"); d[(Browser.Engine.webkit && Browser.Engine.version < 420) ? "innerText" : "text"] = c; document.head.appendChild(d); document.head.removeChild(d) } return c } Native.UID = 1; var $uid = (Browser.Engine.trident) ? function (b) { return (b.uid || (b.uid = [Native.UID++]))[0] } : function (b) { return b.uid || (b.uid = Native.UID++) }; var Window = new Native({ name: "Window", legacy: (Browser.Engine.trident) ? null : window.Window, initialize: function (b) { $uid(b); if (!b.Element) { b.Element = $empty; if (Browser.Engine.webkit) { b.document.createElement("iframe") } b.Element.prototype = (Browser.Engine.webkit) ? window["[[DOMElement.prototype]]"] : {} } b.document.window = b; return $extend(b, Window.Prototype) }, afterImplement: function (c, d) { window[c] = Window.Prototype[c] = d } }); Window.Prototype = { $family: { name: "window"} }; new Window(window); var Document = new Native({ name: "Document", legacy: (Browser.Engine.trident) ? null : window.Document, initialize: function (b) { $uid(b); b.head = b.getElementsByTagName("head")[0]; b.html = b.getElementsByTagName("html")[0]; if (Browser.Engine.trident && Browser.Engine.version <= 4) { $try(function () { b.execCommand("BackgroundImageCache", false, true) }) } if (Browser.Engine.trident) { b.window.attachEvent("onunload", function () { b.window.detachEvent("onunload", arguments.callee); b.head = b.html = b.window = null }) } return $extend(b, Document.Prototype) }, afterImplement: function (c, d) { document[c] = Document.Prototype[c] = d } }); Document.Prototype = { $family: { name: "document"} }; new Document(document); Array.implement({ every: function (h, g) { for (var e = 0, f = this.length; e < f; e++) { if (!h.call(g, this[e], e, this)) { return false } } return true }, filter: function (i, h) { var j = []; for (var f = 0, g = this.length; f < g; f++) { if (i.call(h, this[f], f, this)) { j.push(this[f]) } } return j }, clean: function () { return this.filter($defined) }, indexOf: function (h, g) { var f = this.length; for (var e = (g < 0) ? Math.max(0, f + g) : g || 0; e < f; e++) { if (this[e] === h) { return e } } return -1 }, map: function (i, h) { var j = []; for (var f = 0, g = this.length; f < g; f++) { j[f] = i.call(h, this[f], f, this) } return j }, some: function (h, g) { for (var e = 0, f = this.length; e < f; e++) { if (h.call(g, this[e], e, this)) { return true } } return false }, associate: function (h) { var g = {}, e = Math.min(this.length, h.length); for (var f = 0; f < e; f++) { g[h[f]] = this[f] } return g }, link: function (j) { var g = {}; for (var h = 0, f = this.length; h < f; h++) { for (var i in j) { if (j[i](this[h])) { g[i] = this[h]; delete j[i]; break } } } return g }, contains: function (d, c) { return this.indexOf(d, c) != -1 }, extend: function (f) { for (var d = 0, e = f.length; d < e; d++) { this.push(f[d]) } 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 (b) { if (!this.contains(b)) { this.push(b) } return this }, combine: function (f) { for (var d = 0, e = f.length; d < e; d++) { this.include(f[d]) } return this }, erase: function (c) { for (var d = this.length; d--; d) { if (this[d] === c) { this.splice(d, 1) } } return this }, empty: function () { this.length = 0; return this }, flatten: function () { var g = []; for (var e = 0, f = this.length; e < f; e++) { var h = $type(this[e]); if (!h) { continue } g = g.concat((h == "array" || h == "collection" || h == "arguments") ? Array.flatten(this[e]) : this[e]) } return g }, hexToRgb: function (c) { if (this.length != 3) { return null } var d = this.map(function (a) { if (a.length == 1) { a += a } return a.toInt(16) }); return (c) ? d : "rgb(" + d + ")" }, rgbToHex: function (g) { if (this.length < 3) { return null } if (this.length == 4 && this[3] == 0 && !g) { return "transparent" } var e = []; for (var f = 0; f < 3; f++) { var h = (this[f] - 0).toString(16); e.push((h.length == 1) ? "0" + h : h) } return (g) ? e : "#" + e.join("") } }); Function.implement({ extend: function (d) { for (var c in d) { this[c] = d[c] } return this }, create: function (c) { var d = this; c = c || {}; return function (b) { var f = c.arguments; f = (f != undefined) ? $splat(f) : Array.slice(arguments, (c.event) ? 1 : 0); if (c.event) { f = [b || window.event].extend(f) } var a = function () { return d.apply(c.bind || null, f) }; if (c.delay) { return setTimeout(a, c.delay) } if (c.periodical) { return setInterval(a, c.periodical) } if (c.attempt) { return $try(a) } return a() } }, run: function (d, c) { return this.apply(c, $splat(d)) }, pass: function (d, c) { return this.create({ bind: c, arguments: d }) }, bind: function (c, d) { return this.create({ bind: c, arguments: d }) }, bindWithEvent: function (c, d) { return this.create({ bind: c, arguments: d, event: true }) }, attempt: function (d, c) { return this.create({ bind: c, arguments: d, attempt: true })() }, delay: function (d, f, e) { return this.create({ bind: f, arguments: e, delay: d })() }, periodical: function (f, d, e) { return this.create({ bind: d, arguments: e, periodical: f })() } }); Number.implement({ limit: function (c, d) { return Math.min(d, Math.max(c, this)) }, round: function (b) { b = Math.pow(10, b || 0); return Math.round(this * b) / b }, times: function (d, f) { for (var e = 0; e < this; e++) { d.call(f, e, this) } }, toFloat: function () { return parseFloat(this) }, toInt: function (b) { return parseInt(this, b || 10) } }); Number.alias("times", "each"); (function (c) { var d = {}; c.each(function (a) { if (!Number[a]) { d[a] = function () { return Math[a].apply(null, [this].concat($A(arguments))) } } }); Number.implement(d) })(["abs", "acos", "asin", "atan", "atan2", "ceil", "cos", "exp", "floor", "log", "max", "min", "pow", "sin", "sqrt", "tan"]); String.implement({ test: function (d, c) { return ((typeof d == "string") ? new RegExp(d, c) : d).test(this) }, contains: function (d, c) { return (c) ? (c + this + c).indexOf(c + d + c) > -1 : this.indexOf(d) > -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 (b) { return b.charAt(1).toUpperCase() }) }, hyphenate: function () { return this.replace(/[A-Z]/g, function (b) { return ("-" + b.charAt(0).toLowerCase()) }) }, capitalize: function () { return this.replace(/\b[a-z]/g, function (b) { return b.toUpperCase() }) }, escapeRegExp: function () { return this.replace(/([-.*+?^${}()|[\]\/\\])/g, "\\$1") }, toInt: function (b) { return parseInt(this, b || 10) }, toFloat: function () { return parseFloat(this) }, hexToRgb: function (c) { var d = this.match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/); return (d) ? d.slice(1).hexToRgb(c) : null }, rgbToHex: function (c) { var d = this.match(/\d{1,3}/g); return (d) ? d.rgbToHex(c) : null }, stripScripts: function (d) { var e = ""; var f = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function () { e += arguments[1] + "\n"; return "" }); if (d === true) { $exec(e) } else { if ($type(d) == "function") { d(e, f) } } return f }, substitute: function (d, c) { return this.replace(c || (/\\?\{([^{}]+)\}/g), function (a, b) { if (a.charAt(0) == "\\") { return a.slice(1) } return (d[b] != undefined) ? d[b] : "" }) } }); Hash.implement({ has: Object.prototype.hasOwnProperty, keyOf: function (c) { for (var d in this) { if (this.hasOwnProperty(d) && this[d] === c) { return d } } return null }, hasValue: function (b) { return (Hash.keyOf(this, b) !== null) }, extend: function (b) { Hash.each(b || {}, function (d, a) { Hash.set(this, a, d) }, this); return this }, combine: function (b) { Hash.each(b || {}, function (d, a) { Hash.include(this, a, d) }, this); return this }, erase: function (b) { if (this.hasOwnProperty(b)) { delete this[b] } return this }, get: function (b) { return (this.hasOwnProperty(b)) ? this[b] : null }, set: function (d, c) { if (!this[d] || this.hasOwnProperty(d)) { this[d] = c } return this }, empty: function () { Hash.each(this, function (c, d) { delete this[d] }, this); return this }, include: function (d, c) { if (this[d] == undefined) { this[d] = c } return this }, map: function (d, f) { var e = new Hash; Hash.each(this, function (a, b) { e.set(b, d.call(f, a, b, this)) }, this); return e }, filter: function (d, f) { var e = new Hash; Hash.each(this, function (a, b) { if (d.call(f, a, b, this)) { e.set(b, a) } }, this); return e }, every: function (d, f) { for (var e in this) { if (this.hasOwnProperty(e) && !d.call(f, this[e], e)) { return false } } return true }, some: function (d, f) { for (var e in this) { if (this.hasOwnProperty(e) && d.call(f, this[e], e)) { return true } } return false }, getKeys: function () { var b = []; Hash.each(this, function (d, a) { b.push(a) }); return b }, getValues: function () { var b = []; Hash.each(this, function (a) { b.push(a) }); return b }, toQueryString: function (d) { var c = []; Hash.each(this, function (a, b) { if (d) { b = d + "[" + b + "]" } var g; switch ($type(a)) { case "object": g = Hash.toQueryString(a, b); break; case "array": var h = {}; a.each(function (e, f) { h[f] = e }); g = Hash.toQueryString(h, b); break; default: g = b + "=" + encodeURIComponent(a) } if (a != undefined) { c.push(g) } }); return c.join("&") } }); Hash.alias({ keyOf: "indexOf", hasValue: "contains" }); var Event = new Native({ name: "Event", initialize: function (z, u) { u = u || window; var p = u.document; z = z || u.event; if (z.$extended) { return z } this.$extended = true; var q = z.type; var t = z.target || z.srcElement; while (t && t.nodeType == 3) { t = t.parentNode } if (q.test(/key/)) { var y = z.which || z.keyCode; var n = Event.Keys.keyOf(y); if (q == "keydown") { var w = y - 111; if (w > 0 && w < 13) { n = "f" + w } } n = n || String.fromCharCode(y).toLowerCase() } else { if (q.match(/(click|mouse|menu)/i)) { p = (!p.compatMode || p.compatMode == "CSS1Compat") ? p.html : p.body; var r = { x: z.pageX || z.clientX + p.scrollLeft, y: z.pageY || z.clientY + p.scrollTop }; var x = { x: (z.pageX) ? z.pageX - u.pageXOffset : z.clientX, y: (z.pageY) ? z.pageY - u.pageYOffset : z.clientY }; if (q.match(/DOMMouseScroll|mousewheel/)) { var s = (z.wheelDelta) ? z.wheelDelta / 120 : -(z.detail || 0) / 3 } var v = (z.which == 3) || (z.button == 2); var o = null; if (q.match(/over|out/)) { switch (q) { case "mouseover": o = z.relatedTarget || z.fromElement; break; case "mouseout": o = z.relatedTarget || z.toElement } if (!(function () { while (o && o.nodeType == 3) { o = o.parentNode } return true }).create({ attempt: Browser.Engine.gecko })()) { o = false } } } } return $extend(this, { event: z, type: q, page: r, client: x, rightClick: v, wheel: s, relatedTarget: o, target: t, code: y, key: n, shift: z.shiftKey, control: z.ctrlKey, alt: z.altKey, meta: z.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 } }); function Class(c) { if (c instanceof Function) { c = { initialize: c} } var d = function () { Object.reset(this); if (d._prototyping) { return this } this._current = $empty; var a = (this.initialize) ? this.initialize.apply(this, arguments) : this; delete this._current; delete this.caller; return a } .extend(this); d.implement(c); d.constructor = Class; d.prototype.constructor = d; return d } Function.prototype.protect = function () { this._protected = true; return this }; Object.reset = function (g, j) { if (j == null) { for (var h in g) { Object.reset(g, h) } return g } delete g[j]; switch ($type(g[j])) { case "object": var i = function () { }; i.prototype = g[j]; var f = new i; g[j] = Object.reset(f); break; case "array": g[j] = $unlink(g[j]); break } return g }; new Native({ name: "Class", initialize: Class }).extend({ instantiate: function (c) { c._prototyping = true; var d = new c; delete c._prototyping; return d }, wrap: function (e, d, f) { if (f._origin) { f = f._origin } return function () { if (f._protected && this._current == null) { throw new Error('The method "' + d + '" cannot be called.') } var b = this.caller, a = this._current; this.caller = a; this._current = arguments.callee; var c = f.apply(this, arguments); this._current = a; this.caller = b; return c } .extend({ _owner: e, _origin: f, _name: d }) } }); Class.implement({ implement: function (h, k) { if ($type(h) == "object") { for (var j in h) { this.implement(j, h[j]) } return this } var i = Class.Mutators[h]; if (i) { k = i.call(this, k); if (k == null) { return this } } var l = this.prototype; switch ($type(k)) { case "function": if (k._hidden) { return this } l[h] = Class.wrap(this, h, k); break; case "object": var g = l[h]; if ($type(g) == "object") { $mixin(g, k) } else { l[h] = $unlink(k) } break; case "array": l[h] = $unlink(k); break; default: l[h] = k } return this } }); Class.Mutators = { Extends: function (b) { this.parent = b; this.prototype = Class.instantiate(b); this.implement("parent", function () { var a = this.caller._name, d = this.caller._owner.parent.prototype[a]; if (!d) { throw new Error('The method "' + a + '" has no parent.') } return d.apply(this, arguments) } .protect()) }, Implements: function (b) { $splat(b).each(function (a) { if (a instanceof Function) { a = Class.instantiate(a) } this.implement(a) }, this) } }; var Chain = new Class({ $chain: [], chain: function () { this.$chain.extend(Array.flatten(arguments)); return this }, callChain: function () { return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false }, clearChain: function () { this.$chain.empty(); return this } }); var Events = new Class({ $events: {}, addEvent: function (f, d, e) { f = Events.removeOn(f); if (d != $empty) { this.$events[f] = this.$events[f] || []; this.$events[f].include(d); if (e) { d.internal = true } } return this }, addEvents: function (d) { for (var c in d) { this.addEvent(c, d[c]) } return this }, fireEvent: function (f, d, e) { f = Events.removeOn(f); if (!this.$events || !this.$events[f]) { return this } this.$events[f].each(function (a) { a.create({ bind: this, delay: e, "arguments": d })() }, this); return this }, removeEvent: function (c, d) { c = Events.removeOn(c); if (!this.$events[c]) { return this } if (!d.internal) { this.$events[c].erase(d) } return this }, removeEvents: function (h) { var g; if ($type(h) == "object") { for (g in h) { this.removeEvent(g, h[g]) } return this } if (h) { h = Events.removeOn(h) } for (g in this.$events) { if (h && h != g) { continue } var e = this.$events[g]; for (var f = e.length; f--; f) { this.removeEvent(g, e[f]) } } return this } }); Events.removeOn = function (b) { return b.replace(/^on([A-Z])/, function (a, d) { return d.toLowerCase() }) }; var Options = new Class({ setOptions: function () { this.options = $merge.run([this.options].extend(arguments)); if (!this.addEvent) { return this } for (var b in this.options) { if ($type(this.options[b]) != "function" || !(/^on[A-Z]/).test(b)) { continue } this.addEvent(b, this.options[b]); delete this.options[b] } return this } }); var Element = new Native({ name: "Element", legacy: window.Element, initialize: function (e, d) { var f = Element.Constructors.get(e); if (f) { return f(d) } if (typeof e == "string") { return document.newElement(e, d) } return document.id(e).set(d) }, afterImplement: function (d, c) { Element.Prototype[d] = c; if (Array[d]) { return } Elements.implement(d, function () { var j = [], a = true; for (var h = 0, i = this.length; h < i; h++) { var b = this[h][d].apply(this[h], arguments); j.push(b); if (a) { a = ($type(b) == "element") } } return (a) ? new Elements(j) : j }) } }); Element.Prototype = { $family: { name: "element"} }; Element.Constructors = new Hash; var IFrame = new Native({ name: "IFrame", generics: false, initialize: function () { var i = Array.link(arguments, { properties: Object.type, iframe: $defined }); var k = i.properties || {}; var l = document.id(i.iframe); var j = k.onload || $empty; delete k.onload; k.id = k.name = $pick(k.id, k.name, l ? (l.id || l.name) : "IFrame_" + $time()); l = new Element(l || "iframe", k); var g = function () { var b = $try(function () { return l.contentWindow.location.host }); if (!b || b == window.location.host) { var a = new Window(l.contentWindow); new Document(l.contentWindow.document); $extend(a.Element.prototype, Element.Prototype) } j.call(l.contentWindow, l.contentWindow.document) }; var h = $try(function () { return l.contentWindow }); ((h && h.document.body) || window.frames[k.id]) ? g() : l.addListener("load", g); return l } }); var Elements = new Native({ initialize: function (k, h) { h = $extend({ ddup: true, cash: true }, h); k = k || []; if (h.ddup || h.cash) { var j = {}, l = []; for (var n = 0, i = k.length; n < i; n++) { var m = document.id(k[n], !h.cash); if (h.ddup) { if (j[m.uid]) { continue } j[m.uid] = true } if (m) { l.push(m) } } k = l } return (h.cash) ? $extend(k, this) : k } }); Elements.implement({ filter: function (d, c) { if (!d) { return this } return new Elements(Array.filter(this, (typeof d == "string") ? function (a) { return a.match(d) } : d, c)) } }); Document.implement({ newElement: function (d, c) { if (Browser.Engine.trident && c) { ["name", "type", "checked"].each(function (a) { if (!c[a]) { return } d += " " + a + '="' + c[a] + '"'; if (a != "checked") { delete c[a] } }); d = "<" + d + ">" } return document.id(this.createElement(d)).set(c) }, newTextNode: function (b) { return this.createTextNode(b) }, getDocument: function () { return this }, getWindow: function () { return this.window }, id: (function () { var b = { string: function (e, f, a) { e = a.getElementById(e); return (e) ? b.element(e, f) : null }, element: function (a, f) { $uid(a); if (!f && !a.$family && !(/^object|embed$/i).test(a.tagName)) { var h = Element.Prototype; for (var g in h) { a[g] = h[g] } } return a }, object: function (f, e, a) { if (f.toElement) { return b.element(f.toElement(a), e) } return null } }; b.textnode = b.whitespace = b.window = b.document = $arguments(0); return function (h, f, g) { if (h && h.$family && h.uid) { return h } var a = $type(h); return (b[a]) ? b[a](h, f, g || document) : null } })() }); if (window.$ == null) { Window.implement({ $: function (d, c) { return document.id(d, c, this.document) } }) } Window.implement({ $$: function (h) { if (arguments.length == 1 && typeof h == "string") { return this.document.getElements(h) } var i = []; var l = Array.flatten(arguments); for (var k = 0, g = l.length; k < g; k++) { var j = l[k]; switch ($type(j)) { case "element": i.push(j); break; case "string": i.extend(this.document.getElements(j, true)) } } return new Elements(i) }, getDocument: function () { return this.document }, getWindow: function () { return this } }); Native.implement([Element, Document], { getElement: function (d, c) { return document.id(this.getElements(d, true)[0] || null, c) }, getElements: function (f, g) { f = f.split(","); var h = []; var e = (f.length > 1); f.each(function (b) { var a = this.getElementsByTagName(b.trim()); (e) ? h.extend(a) : h = a }, this); return new Elements(h, { ddup: e, cash: !g }) } }); (function () { var o = {}, q = {}; var n = { input: "checked", option: "selected", textarea: (Browser.Engine.webkit && Browser.Engine.version < 420) ? "innerHTML" : "value" }; var t = function (a) { return (q[a] || (q[a] = {})) }; var p = function (e, b) { if (!e) { return } var a = e.uid; if (Browser.Engine.trident) { if (e.clearAttributes) { var c = b && e.cloneNode(false); e.clearAttributes(); if (c) { e.mergeAttributes(c) } } else { if (e.removeEvents) { e.removeEvents() } } if ((/object/i).test(e.tagName)) { for (var d in e) { if (typeof e[d] == "function") { e[d] = $empty } } Element.dispose(e) } } if (!a) { return } o[a] = q[a] = null }; var s = function () { Hash.each(o, p); if (Browser.Engine.trident) { $A(document.getElementsByTagName("object")).each(p) } if (window.CollectGarbage) { CollectGarbage() } o = q = null }; var m = function (h, b, c, a, f, d) { var g = h[c || b]; var e = []; while (g) { if (g.nodeType == 1 && (!a || Element.match(g, a))) { if (!f) { return document.id(g, d) } e.push(g) } g = g[b] } return (f) ? new Elements(e, { ddup: false, cash: !d }) : null }; var r = { html: "innerHTML", "class": "className", "for": "htmlFor", defaultValue: "defaultValue", text: (Browser.Engine.trident || (Browser.Engine.webkit && Browser.Engine.version < 420)) ? "innerText" : "textContent" }; var u = ["compact", "nowrap", "ismap", "declare", "noshade", "checked", "disabled", "readonly", "multiple", "selected", "noresize", "defer"]; var l = ["value", "type", "defaultValue", "accessKey", "cellPadding", "cellSpacing", "colSpan", "frameBorder", "maxLength", "readOnly", "rowSpan", "tabIndex", "useMap"]; u = u.associate(u); Hash.extend(r, u); Hash.extend(r, l.associate(l.map(String.toLowerCase))); var v = { before: function (a, b) { if (b.parentNode) { b.parentNode.insertBefore(a, b) } }, after: function (a, b) { if (!b.parentNode) { return } var c = b.nextSibling; (c) ? b.parentNode.insertBefore(a, c) : b.parentNode.appendChild(a) }, bottom: function (a, b) { b.appendChild(a) }, top: function (a, b) { var c = b.firstChild; (c) ? b.insertBefore(a, c) : b.appendChild(a) } }; v.inside = v.bottom; Hash.each(v, function (b, a) { a = a.capitalize(); Element.implement("inject" + a, function (c) { b(this, document.id(c, true)); return this }); Element.implement("grab" + a, function (c) { b(document.id(c, true), this); return this }) }); Element.implement({ set: function (c, a) { switch ($type(c)) { case "object": for (var d in c) { this.set(d, c[d]) } break; case "string": var b = Element.Properties.get(c); (b && b.set) ? b.set.apply(this, Array.slice(arguments, 1)) : this.setProperty(c, a) } return this }, get: function (a) { var b = Element.Properties.get(a); return (b && b.get) ? b.get.apply(this, Array.slice(arguments, 1)) : this.getProperty(a) }, erase: function (a) { var b = Element.Properties.get(a); (b && b.erase) ? b.erase.apply(this) : this.removeProperty(a); return this }, setProperty: function (a, c) { var b = r[a]; if (c == undefined) { return this.removeProperty(a) } if (b && u[a]) { c = !!c } (b) ? this[b] = c : this.setAttribute(a, "" + c); return this }, setProperties: function (b) { for (var a in b) { this.setProperty(a, b[a]) } return this }, getProperty: function (a) { var b = r[a]; var c = (b) ? this[b] : this.getAttribute(a, 2); return (u[a]) ? !!c : (b) ? c : c || null }, getProperties: function () { var a = $A(arguments); return a.map(this.getProperty, this).associate(a) }, removeProperty: function (a) { var b = r[a]; (b) ? this[b] = (b && u[a]) ? false : "" : this.removeAttribute(a); return this }, removeProperties: function () { Array.each(arguments, this.removeProperty, this); 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"); return this }, toggleClass: function (a) { return this.hasClass(a) ? this.removeClass(a) : this.addClass(a) }, adopt: function () { Array.flatten(arguments).each(function (a) { a = document.id(a, true); if (a) { this.appendChild(a) } }, this); return this }, appendText: function (a, b) { return this.grab(this.getDocument().newTextNode(a), b) }, grab: function (a, b) { v[b || "bottom"](document.id(a, true), this); return this }, inject: function (a, b) { v[b || "bottom"](this, document.id(a, true)); return this }, replaces: function (a) { a = document.id(a, true); a.parentNode.replaceChild(this, a); return this }, wraps: function (a, b) { a = document.id(a, true); return this.replaces(a).grab(a, b) }, getPrevious: function (b, a) { return m(this, "previousSibling", null, b, false, a) }, getAllPrevious: function (b, a) { return m(this, "previousSibling", null, b, true, a) }, getNext: function (b, a) { return m(this, "nextSibling", null, b, false, a) }, getAllNext: function (b, a) { return m(this, "nextSibling", null, b, true, a) }, getFirst: function (b, a) { return m(this, "nextSibling", "firstChild", b, false, a) }, getLast: function (b, a) { return m(this, "previousSibling", "lastChild", b, false, a) }, getParent: function (b, a) { return m(this, "parentNode", null, b, false, a) }, getParents: function (b, a) { return m(this, "parentNode", null, b, true, a) }, getSiblings: function (b, a) { return this.getParent().getChildren(b, a).erase(this) }, getChildren: function (b, a) { return m(this, "nextSibling", "firstChild", b, true, a) }, getWindow: function () { return this.ownerDocument.window }, getDocument: function () { return this.ownerDocument }, getElementById: function (c, d) { var a = this.ownerDocument.getElementById(c); if (!a) { return null } for (var b = a.parentNode; b != this; b = b.parentNode) { if (!b) { return null } } return document.id(a, d) }, getSelected: function () { return new Elements($A(this.options).filter(function (a) { return a.selected })) }, getComputedStyle: function (a) { if (this.currentStyle) { return this.currentStyle[a.camelCase()] } var b = this.getDocument().defaultView.getComputedStyle(this, null); return (b) ? b.getPropertyValue([a.hyphenate()]) : null }, toQueryString: function () { var a = []; this.getElements("input, select, textarea", true).each(function (b) { if (!b.name || b.disabled || b.type == "submit" || b.type == "reset" || b.type == "file") { 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 (typeof d != "undefined") { a.push(b.name + "=" + encodeURIComponent(d)) } }) }); return a.join("&") }, clone: function (f, b) { f = f !== false; var c = this.cloneNode(f); var g = function (j, k) { if (!b) { j.removeAttribute("id") } if (Browser.Engine.trident) { j.clearAttributes(); j.mergeAttributes(k); j.removeAttribute("uid"); if (j.options) { var i = j.options, z = k.options; for (var y = i.length; y--; ) { i[y].selected = z[y].selected } } } var h = n[k.tagName.toLowerCase()]; if (h && k[h]) { j[h] = k[h] } }; if (f) { var e = c.getElementsByTagName("*"), d = this.getElementsByTagName("*"); for (var a = e.length; a--; ) { g(e[a], d[a]) } } g(c, this); return document.id(c) }, destroy: function () { Element.empty(this); Element.dispose(this); p(this, true); return null }, empty: function () { $A(this.childNodes).each(function (a) { Element.destroy(a) }); return this }, dispose: function () { return (this.parentNode) ? this.parentNode.removeChild(this) : this }, hasChild: function (a) { a = document.id(a, true); if (!a) { return false } if (Browser.Engine.webkit && Browser.Engine.version < 420) { return $A(this.getElementsByTagName(a.tagName)).contains(a) } return (this.contains) ? (this != a && this.contains(a)) : !!(this.compareDocumentPosition(a) & 16) }, match: function (a) { return (!a || (a == this) || (Element.get(this, "tag") == a)) } }); Native.implement([Element, Window, Document], { addListener: function (c, d) { if (c == "unload") { var b = d, a = this; d = function () { a.removeListener("unload", d); b() } } else { o[this.uid] = this } if (this.addEventListener) { this.addEventListener(c, d, false) } else { this.attachEvent("on" + c, d) } return this }, removeListener: function (a, b) { if (this.removeEventListener) { this.removeEventListener(a, b, false) } else { this.detachEvent("on" + a, b) } return this }, retrieve: function (a, b) { var c = t(this.uid), d = c[a]; if (b != undefined && d == undefined) { d = c[a] = b } return $pick(d) }, store: function (a, b) { var c = t(this.uid); c[a] = b; return this }, eliminate: function (b) { var a = t(this.uid); delete a[b]; return this } }); window.addListener("unload", s) })(); Element.Properties = new Hash; Element.Properties.style = { set: function (b) { this.style.cssText = b }, get: function () { return this.style.cssText }, erase: function () { this.style.cssText = "" } }; Element.Properties.tag = { get: function () { return this.tagName.toLowerCase() } }; Element.Properties.html = (function () { var f = document.createElement("div"); var e = { table: [1, "<table>", "</table>"], select: [1, "<select>", "</select>"], tbody: [2, "<table><tbody>", "</tbody></table>"], tr: [3, "<table><tbody><tr>", "</tr></tbody></table>"] }; e.thead = e.tfoot = e.tbody; var d = { set: function () { var c = Array.flatten(arguments).join(""); var b = Browser.Engine.trident && e[this.get("tag")]; if (b) { var a = f; a.innerHTML = b[1] + c + b[2]; for (var h = b[0]; h--; ) { a = a.firstChild } this.empty().adopt(a.childNodes) } else { this.innerHTML = c } } }; d.erase = d.set; return d })(); if (Browser.Engine.webkit && Browser.Engine.version < 420) { Element.Properties.text = { get: function () { if (this.innerText) { return this.innerText } var d = this.ownerDocument.newElement("div", { html: this.innerHTML }).inject(this.ownerDocument.body); var c = d.innerText; d.destroy(); return c } } } Element.Properties.events = { set: function (b) { this.addEvents(b) } }; Native.implement([Element, Window, Document], { addEvent: function (n, l) { var k = this.retrieve("events", {}); k[n] = k[n] || { keys: [], values: [] }; if (k[n].keys.contains(l)) { return this } k[n].keys.push(l); var m = n, r = Element.Events.get(n), p = l, j = this; if (r) { if (r.onAdd) { r.onAdd.call(this, l) } if (r.condition) { p = function (a) { if (r.condition.call(this, a)) { return l.call(this, a) } return true } } m = r.base || m } var o = function () { return l.call(j) }; var q = Element.NativeEvents[m]; if (q) { if (q == 2) { o = function (a) { a = new Event(a, j.getWindow()); if (p.call(j, a) === false) { a.stop() } } } this.addListener(m, o) } k[n].values.push(o); return this }, removeEvent: function (l, g) { var h = this.retrieve("events"); if (!h || !h[l]) { return this } var i = h[l].keys.indexOf(g); if (i == -1) { return this } h[l].keys.splice(i, 1); var j = h[l].values.splice(i, 1)[0]; var k = Element.Events.get(l); if (k) { if (k.onRemove) { k.onRemove.call(this, g) } l = k.base || l } return (Element.NativeEvents[l]) ? this.removeListener(l, j) : this }, addEvents: function (d) { for (var c in d) { this.addEvent(c, d[c]) } return this }, removeEvents: function (e) { var f; if ($type(e) == "object") { for (f in e) { this.removeEvent(f, e[f]) } return this } var d = this.retrieve("events"); if (!d) { return this } if (!e) { for (f in d) { this.removeEvents(f) } this.eliminate("events") } else { if (d[e]) { while (d[e].keys[0]) { this.removeEvent(e, d[e].keys[0]) } d[e] = null } } return this }, fireEvent: function (g, e, f) { var h = this.retrieve("events"); if (!h || !h[g]) { return this } h[g].keys.each(function (a) { a.create({ bind: this, delay: f, "arguments": e })() }, this); return this }, cloneEvents: function (g, f) { g = document.id(g); var h = g.retrieve("events"); if (!h) { return this } if (!f) { for (var e in h) { this.cloneEvents(g, e) } } else { if (h[f]) { h[f].keys.each(function (a) { this.addEvent(f, a) }, 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 b = function (a) { var d = a.relatedTarget; if (d == undefined) { return true } if (d === false) { return false } return ($type(this) != "document" && d != this && d.prefix != "xul" && !this.hasChild(d)) }; Element.Events = new Hash({ mouseenter: { base: "mouseover", condition: b }, mouseleave: { base: "mouseout", condition: b }, mousewheel: { base: (Browser.Engine.gecko) ? "DOMMouseScroll" : "mousewheel"} }) })(); Element.Properties.styles = { set: function (b) { this.setStyles(b) } }; Element.Properties.opacity = { set: function (d, c) { if (!c) { if (d == 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 = (d == 1) ? "" : "alpha(opacity=" + d * 100 + ")" } this.style.opacity = d; this.store("opacity", d) }, get: function () { return this.retrieve("opacity", 1) } }; Element.implement({ setOpacity: function (b) { return this.set("opacity", b, true) }, getOpacity: function () { return this.get("opacity") }, setStyle: function (d, e) { switch (d) { case "opacity": return this.set("opacity", parseFloat(e)); case "float": d = (Browser.Engine.trident) ? "styleFloat" : "cssFloat" } d = d.camelCase(); if ($type(e) != "string") { var f = (Element.Styles.get(d) || "@").split(" "); e = $splat(e).map(function (a, b) { if (!f[b]) { return "" } return ($type(a) == "number") ? f[b].replace("@", Math.round(a)) : a }).join(" ") } else { if (e == String(Number(e))) { e = Math.round(e) } } this.style[d] = e; return this }, getStyle: function (j) { switch (j) { case "opacity": return this.get("opacity"); case "float": j = (Browser.Engine.trident) ? "styleFloat" : "cssFloat" } j = j.camelCase(); var i = this.style[j]; if (!$chk(i)) { i = []; for (var k in Element.ShortStyles) { if (j != k) { continue } for (var l in Element.ShortStyles[k]) { i.push(this.getStyle(l)) } return i.join(" ") } i = this.getComputedStyle(j) } if (i) { i = String(i); var n = i.match(/rgba?\([\d\s,]+\)/); if (n) { i = i.replace(n[0], n[0].rgbToHex()) } } if (Browser.Engine.presto || (Browser.Engine.trident && !$chk(parseInt(i, 10)))) { if (j.test(/^(height|width)$/)) { var h = (j == "width") ? ["left", "right"] : ["top", "bottom"], m = 0; h.each(function (a) { m += this.getStyle("border-" + a + "-width").toInt() + this.getStyle("padding-" + a).toInt() }, this); return this["offset" + j.capitalize()] - m + "px" } if ((Browser.Engine.presto) && String(i).test("px")) { return i } if (j.test(/(border(.+)Width|margin|padding)/)) { return "0px" } } return i }, setStyles: function (c) { for (var d in c) { this.setStyle(d, c[d]) } return this }, getStyles: function () { var b = {}; Array.flatten(arguments).each(function (a) { b[a] = this.getStyle(a) }, this); return b } }); 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 (j) { var k = Element.ShortStyles; var h = Element.Styles; ["margin", "padding"].each(function (b) { var a = b + j; k[b][a] = h[a] = "@px" }); var l = "border" + j; k.border[l] = h[l] = "@px @ rgb(@, @, @)"; var m = l + "Width", i = l + "Style", n = l + "Color"; k[l] = {}; k.borderWidth[m] = k[l][m] = h[m] = "@px"; k.borderStyle[i] = k[l][i] = h[i] = "@"; k.borderColor[n] = k[l][n] = h[n] = "rgb(@, @, @)" }); (function () { Element.implement({ scrollTo: function (b, a) { if (h(this)) { this.getWindow().scrollTo(b, a) } else { this.scrollLeft = b; this.scrollTop = a } return this }, getSize: function () { if (h(this)) { return this.getWindow().getSize() } return { x: this.offsetWidth, y: this.offsetHeight} }, getScrollSize: function () { if (h(this)) { return this.getWindow().getScrollSize() } return { x: this.scrollWidth, y: this.scrollHeight} }, getScroll: function () { if (h(this)) { return this.getWindow().getScroll() } return { x: this.scrollLeft, y: this.scrollTop} }, getScrolls: function () { var a = this, b = { x: 0, y: 0 }; while (a && !h(a)) { b.x += a.scrollLeft; b.y += a.scrollTop; a = a.parentNode } return b }, getOffsetParent: function () { var a = this; if (h(a)) { return null } if (!Browser.Engine.trident) { return a.offsetParent } while ((a = a.parentNode) && !h(a)) { if (m(a, "position") != "static") { return a } } return null }, getOffsets: function () { if (this.getBoundingClientRect) { var g = this.getBoundingClientRect(), d = document.id(this.getDocument().documentElement), a = d.getScroll(), f = this.getScrolls(), q = this.getScroll(), r = (m(this, "position") == "fixed"); return { x: g.left.toInt() + f.x - q.x + ((r) ? 0 : a.x) - d.clientLeft, y: g.top.toInt() + f.y - q.y + ((r) ? 0 : a.y) - d.clientTop} } var e = this, c = { x: 0, y: 0 }; if (h(this)) { return c } while (e && !h(e)) { c.x += e.offsetLeft; c.y += e.offsetTop; if (Browser.Engine.gecko) { if (!k(e)) { c.x += n(e); c.y += j(e) } var b = e.parentNode; if (b && m(b, "overflow") != "visible") { c.x += n(b); c.y += j(b) } } else { if (e != this && Browser.Engine.webkit) { c.x += n(e); c.y += j(e) } } e = e.offsetParent } if (Browser.Engine.gecko && !k(this)) { c.x -= n(this); c.y -= j(this) } return c }, getPosition: function (b) { if (h(this)) { return { x: 0, y: 0} } var a = this.getOffsets(), d = this.getScrolls(); var e = { x: a.x - d.x, y: a.y - d.y }; var c = (b && (b = document.id(b))) ? b.getPosition() : { x: 0, y: 0 }; return { x: e.x - c.x, y: e.y - c.y} }, getCoordinates: function (b) { if (h(this)) { return this.getWindow().getCoordinates() } var d = this.getPosition(b), c = this.getSize(); var a = { left: d.x, top: d.y, width: c.x, height: c.y }; a.right = a.left + a.width; a.bottom = a.top + a.height; return a }, computePosition: function (a) { return { left: a.x - l(this, "margin-left"), top: a.y - l(this, "margin-top")} }, setPosition: function (a) { return this.setStyles(this.computePosition(a)) } }); Native.implement([Document, Window], { getSize: function () { if (Browser.Engine.presto || Browser.Engine.webkit) { var a = this.getWindow(); return { x: a.innerWidth, y: a.innerHeight} } var b = i(this); return { x: b.clientWidth, y: b.clientHeight} }, getScroll: function () { var a = this.getWindow(), b = i(this); return { x: a.pageXOffset || b.scrollLeft, y: a.pageYOffset || b.scrollTop} }, getScrollSize: function () { var a = i(this), b = this.getSize(); return { x: Math.max(a.scrollWidth, b.x), y: Math.max(a.scrollHeight, b.y)} }, getPosition: function () { return { x: 0, y: 0} }, getCoordinates: function () { var a = this.getSize(); return { top: 0, left: 0, bottom: a.y, right: a.x, height: a.y, width: a.x} } }); var m = Element.getComputedStyle; function l(b, a) { return m(b, a).toInt() || 0 } function k(a) { return m(a, "-moz-box-sizing") == "border-box" } function j(a) { return l(a, "border-top-width") } function n(a) { return l(a, "border-left-width") } function h(a) { return (/^(?:body|html)$/i).test(a.tagName) } function i(b) { var a = b.getDocument(); return (!a.compatMode || a.compatMode == "CSS1Compat") ? a.html : a.body } })(); Element.alias("setPosition", "position"); Native.implement([Window, Document, Element], { getHeight: function () { return this.getSize().y }, getWidth: function () { return this.getSize().x }, getScrollTop: function () { return this.getScroll().y }, getScrollLeft: function () { return this.getScroll().x }, getScrollHeight: function () { return this.getScrollSize().y }, getScrollWidth: function () { return this.getScrollSize().x }, getTop: function () { return this.getPosition().y }, getLeft: function () { return this.getPosition().x } }); Native.implement([Document, Element], { getElements: function (k, l) { k = k.split(","); var p, n = {}; for (var o = 0, i = k.length; o < i; o++) { var j = k[o], m = Selectors.Utils.search(this, j, n); if (o != 0 && m.item) { m = $A(m) } p = (o == 0) ? m : (p.item) ? $A(p).concat(m) : p.concat(m) } return new Elements(p, { ddup: (k.length > 1), cash: !l }) } }); Element.implement({ match: function (f) { if (!f || (f == this)) { return true } var i = Selectors.Utils.parseTagAndID(f); var g = i[0], h = i[1]; if (!Selectors.Filters.byID(this, h) || !Selectors.Filters.byTag(this, g)) { return false } var j = Selectors.Utils.parseSelector(f); return (j) ? Selectors.Utils.filter(this, j, {}) : true } }); var Selectors = { Cache: { nth: {}, parsed: {}} }; Selectors.RegExps = { id: (/#([\w-]+)/), tag: (/^(\w+|\*)/), quick: (/^(\w+|\*)$/), splitter: (/\s*([+>~\s])\s*([a-zA-Z#.*:\[])/g), combined: (/\.([\w-]+)|\[(\w+)(?:([!*^$~|]?=)(["']?)([^\4]*?)\4)?\]|:([\w-]+)(?:\(["']?(.*?)?["']?\)|$)/g) }; Selectors.Utils = { chk: function (d, f) { if (!f) { return true } var e = $uid(d); if (!f[e]) { return f[e] = true } return false }, parseNthArgument: function (a) { if (Selectors.Cache.nth[a]) { return Selectors.Cache.nth[a] } var j = a.match(/^([+-]?\d*)?([a-z]+)?([+-]?\d*)?$/); if (!j) { return false } var b = parseInt(j[1], 10); var k = (b || b === 0) ? b : 1; var i = j[2] || false; var l = parseInt(j[3], 10) || 0; if (k != 0) { l--; while (l < 1) { l += k } while (l >= k) { l -= k } } else { k = l; i = "index" } switch (i) { case "n": j = { a: k, b: l, special: "n" }; break; case "odd": j = { a: 2, b: 0, special: "n" }; break; case "even": j = { a: 2, b: 1, special: "n" }; break; case "first": j = { a: 0, special: "index" }; break; case "last": j = { special: "last-child" }; break; case "only": j = { special: "only-child" }; break; default: j = { a: (k - 1), special: "index"} } return Selectors.Cache.nth[a] = j }, parseSelector: function (p) { if (Selectors.Cache.parsed[p]) { return Selectors.Cache.parsed[p] } var q, m = { classes: [], pseudos: [], attributes: [] }; while ((q = Selectors.RegExps.combined.exec(p))) { var l = q[1], n = q[2], o = q[3], s = q[5], r = q[6], k = q[7]; if (l) { m.classes.push(l) } else { if (r) { var t = Selectors.Pseudo.get(r); if (t) { m.pseudos.push({ parser: t, argument: k }) } else { m.attributes.push({ name: r, operator: "=", value: k }) } } else { if (n) { m.attributes.push({ name: n, operator: o, value: s }) } } } } if (!m.classes.length) { delete m.classes } if (!m.attributes.length) { delete m.attributes } if (!m.pseudos.length) { delete m.pseudos } if (!m.classes && !m.attributes && !m.pseudos) { m = null } return Selectors.Cache.parsed[p] = m }, parseTagAndID: function (d) { var e = d.match(Selectors.RegExps.tag); var f = d.match(Selectors.RegExps.id); return [(e) ? e[1] : "*", (f) ? f[1] : false] }, filter: function (k, n, l) { var m; if (n.classes) { for (m = n.classes.length; m--; m) { var j = n.classes[m]; if (!Selectors.Filters.byClass(k, j)) { return false } } } if (n.attributes) { for (m = n.attributes.length; m--; m) { var h = n.attributes[m]; if (!Selectors.Filters.byAttribute(k, h.name, h.operator, h.value)) { return false } } } if (n.pseudos) { for (m = n.pseudos.length; m--; m) { var i = n.pseudos[m]; if (!Selectors.Filters.byPseudo(k, i.parser, i.argument, l)) { return false } } } return true }, getByTagAndID: function (e, f, g) { if (g) { var h = (e.getElementById) ? e.getElementById(g, true) : Element.getElementById(e, g, true); return (h && Selectors.Filters.byTag(h, f)) ? [h] : [] } else { return e.getElementsByTagName(f) } }, search: function (J, K, C) { var Q = []; var P = K.trim().replace(Selectors.RegExps.splitter, function (a, b, c) { Q.push(b); return ":)" + c }).split(":)"); var I, N, H; for (var i = 0, m = P.length; i < m; i++) { var j = P[i]; if (i == 0 && Selectors.RegExps.quick.test(j)) { I = J.getElementsByTagName(j); continue } var R = Q[i - 1]; var G = Selectors.Utils.parseTagAndID(j); var F = G[0], E = G[1]; if (i == 0) { I = Selectors.Utils.getByTagAndID(J, F, E) } else { var O = {}, L = []; for (var k = 0, l = I.length; k < l; k++) { L = Selectors.Getters[R](L, I[k], F, E, O) } I = L } var M = Selectors.Utils.parseSelector(j); if (M) { N = []; for (var n = 0, D = I.length; n < D; n++) { H = I[n]; if (Selectors.Utils.filter(H, M, C)) { N.push(H) } } I = N } } return I } }; Selectors.Getters = { " ": function (k, l, i, r, n) { var o = Selectors.Utils.getByTagAndID(l, i, r); for (var p = 0, q = o.length; p < q; p++) { var m = o[p]; if (Selectors.Utils.chk(m, n)) { k.push(m) } } return k }, ">": function (k, l, i, r, m) { var p = Selectors.Utils.getByTagAndID(l, i, r); for (var n = 0, o = p.length; n < o; n++) { var q = p[n]; if (q.parentNode == l && Selectors.Utils.chk(q, m)) { k.push(q) } } return k }, "+": function (j, f, g, h, i) { while ((f = f.nextSibling)) { if (f.nodeType == 1) { if (Selectors.Utils.chk(f, i) && Selectors.Filters.byTag(f, g) && Selectors.Filters.byID(f, h)) { j.push(f) } break } } return j }, "~": function (j, f, g, h, i) { while ((f = f.nextSibling)) { if (f.nodeType == 1) { if (!Selectors.Utils.chk(f, i)) { break } if (Selectors.Filters.byTag(f, g) && Selectors.Filters.byID(f, h)) { j.push(f) } } } return j } }; Selectors.Filters = { byTag: function (c, d) { return (d == "*" || (c.tagName && c.tagName.toLowerCase() == d)) }, byID: function (d, c) { return (!c || (d.id && d.id == c)) }, byClass: function (c, d) { return (c.className && c.className.contains && c.className.contains(d, " ")) }, byPseudo: function (f, g, h, e) { return g.call(f, h, e) }, byAttribute: function (j, i, f, h) { var g = Element.prototype.getProperty.call(j, i); if (!g) { return (f == "!=") } if (!f || h == undefined) { return true } switch (f) { case "=": return (g == h); case "*=": return (g.contains(h)); case "^=": return (g.substr(0, h.length) == h); case "$=": return (g.substr(g.length - h.length) == h); case "!=": return (g != h); case "~=": return g.contains(h, " "); case "|=": return g.contains(h, "-") } return false } }; Selectors.Pseudo = new Hash({ checked: function () { return this.checked }, empty: function () { return !(this.innerText || this.textContent || "").length }, not: function (b) { return !Element.match(this, b) }, contains: function (b) { return (this.innerText || this.textContent || "").contains(b) }, "first-child": function () { return Selectors.Pseudo.index.call(this, 0) }, "last-child": function () { var b = this; while ((b = b.nextSibling)) { if (b.nodeType == 1) { return false } } return true }, "only-child": function () { var c = this; while ((c = c.previousSibling)) { if (c.nodeType == 1) { return false } } var d = this; while ((d = d.nextSibling)) { if (d.nodeType == 1) { return false } } return true }, "nth-child": function (j, l) { j = (j == undefined) ? "n" : j; var n = Selectors.Utils.parseNthArgument(j); if (n.special != "n") { return Selectors.Pseudo[n.special].call(this, n.a, l) } var k = 0; l.positions = l.positions || {}; var m = $uid(this); if (!l.positions[m]) { var h = this; while ((h = h.previousSibling)) { if (h.nodeType != 1) { continue } k++; var i = l.positions[$uid(h)]; if (i != undefined) { k = i + k; break } } l.positions[m] = k } return (l.positions[m] % n.a == n.b) }, index: function (e) { var d = this, f = 0; while ((d = d.previousSibling)) { if (d.nodeType == 1 && ++f > e) { return false } } return (f == e) }, even: function (c, d) { return Selectors.Pseudo["nth-child"].call(this, "2n+1", d) }, odd: function (c, d) { return Selectors.Pseudo["nth-child"].call(this, "2n", d) }, selected: function () { return this.selected }, enabled: function () { return (this.disabled === false) } }); Element.Events.domready = { onAdd: function (b) { if (Browser.loaded) { b.call(this) } } }; (function () { var c = function () { if (Browser.loaded) { return } Browser.loaded = true; window.fireEvent("domready"); document.fireEvent("domready") }; window.addEvent("load", c); if (Browser.Engine.trident) { var d = document.createElement("div"); (function () { ($try(function () { d.doScroll(); return document.id(d).inject(document.body).set("html", "temp").dispose() })) ? c() : arguments.callee.delay(50) })() } else { if (Browser.Engine.webkit && Browser.Engine.version < 525) { (function () { (["loaded", "complete"].contains(document.readyState)) ? c() : arguments.callee.delay(50) })() } else { document.addEvent("DOMContentLoaded", c) } } })(); var JSON = new Hash(this.JSON && { stringify: JSON.stringify, parse: JSON.parse }).extend({ $specialChars: { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", '"': '\\"', "\\": "\\\\" }, $replaceChars: function (b) { return JSON.$specialChars[b] || "\\u00" + Math.floor(b.charCodeAt() / 16).toString(16) + (b.charCodeAt() % 16).toString(16) }, encode: function (c) { switch ($type(c)) { case "string": return '"' + c.replace(/[\x00-\x1f\\"]/g, JSON.$replaceChars) + '"'; case "array": return "[" + String(c.map(JSON.encode).clean()) + "]"; case "object": case "hash": var d = []; Hash.each(c, function (a, b) { var f = JSON.encode(a); if (f) { d.push(JSON.encode(b) + ":" + f) } }); return "{" + d + "}"; case "number": case "boolean": return String(c); case false: return "null" } return null }, decode: function (string, secure) { if ($type(string) != "string" || !string.length) { return null } if (secure && !(/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(string.replace(/\\./g, "@").replace(/"[^"\\\n\r]*"/g, ""))) { return null } return eval("(" + string + ")") } }); Native.implement([Hash, Array, String, Number], { toJSON: function () { return JSON.encode(this) } }); var Cookie = new Class({ Implements: Options, options: { path: false, domain: false, duration: false, secure: false, document: document }, initialize: function (c, d) { this.key = c; this.setOptions(d) }, write: function (c) { c = encodeURIComponent(c); if (this.options.domain) { c += "; domain=" + this.options.domain } if (this.options.path) { c += "; path=" + this.options.path } if (this.options.duration) { var d = new Date(); d.setTime(d.getTime() + this.options.duration * 24 * 60 * 60 * 1000); c += "; expires=" + d.toGMTString() } if (this.options.secure) { c += "; secure" } this.options.document.cookie = this.key + "=" + c; return this }, read: function () { var b = this.options.document.cookie.match("(?:^|;)\\s*" + this.key.escapeRegExp() + "=([^;]*)"); return (b) ? decodeURIComponent(b[1]) : null }, dispose: function () { new Cookie(this.key, $merge(this.options, { duration: -1 })).write(""); return this } }); Cookie.write = function (d, f, e) { return new Cookie(d, e).write(f) }; Cookie.read = function (b) { return new Cookie(b).read() }; Cookie.dispose = function (c, d) { return new Cookie(c, d).dispose() }; var Swiff = new Class({ Implements: [Options], options: { id: null, height: 1, width: 1, container: null, properties: {}, params: { quality: "high", allowScriptAccess: "always", wMode: "transparent", swLiveConnect: true }, callBacks: {}, vars: {} }, toElement: function () { return this.object }, initialize: function (o, n) { this.instance = "Swiff_" + $time(); this.setOptions(n); n = this.options; var y = this.id = n.id || this.instance; var z = document.id(n.container); Swiff.CallBacks[this.instance] = {}; var v = n.params, t = n.vars, u = n.callBacks; var s = $extend({ height: n.height, width: n.width }, n.properties); var p = this; for (var w in u) { Swiff.CallBacks[this.instance][w] = (function (a) { return function () { return a.apply(p.object, arguments) } })(u[w]); t[w] = "Swiff.CallBacks." + this.instance + "." + w } v.flashVars = Hash.toQueryString(t); if (Browser.Engine.trident) { s.classid = "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"; v.movie = o } else { s.type = "application/x-shockwave-flash"; s.data = o } var q = '<object id="' + y + '"'; for (var r in s) { q += " " + r + '="' + s[r] + '"' } q += ">"; for (var x in v) { if (v[x]) { q += '<param name="' + x + '" value="' + v[x] + '" />' } } q += "</object>"; this.object = ((z) ? z.empty() : new Element("div")).set("html", q).firstChild }, replaces: function (b) { b = document.id(b, true); b.parentNode.replaceChild(this.toElement(), b); return this }, inject: function (b) { document.id(b, true).appendChild(this.toElement()); return this }, remote: function () { return Swiff.remote.apply(Swiff, [this.toElement()].extend(arguments)) } }); Swiff.CallBacks = {}; Swiff.remote = function (obj, fn) { var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + "</invoke>"); return eval(rs) }; var Fx = new Class({ Implements: [Chain, Events, Options], options: { fps: 50, unit: false, duration: 500, link: "ignore" }, initialize: function (d) { this.subject = this.subject || this; this.setOptions(d); this.options.duration = Fx.Durations[this.options.duration] || this.options.duration.toInt(); var c = this.options.wait; if (c === false) { this.options.link = "cancel" } }, getTransition: function () { return function (b) { return -(Math.cos(Math.PI * b) - 1) / 2 } }, step: function () { var d = $time(); if (d < this.time + this.options.duration) { var c = this.transition((d - this.time) / this.options.duration); this.set(this.compute(this.from, this.to, c)) } else { this.set(this.compute(this.from, this.to, 1)); this.complete() } }, set: function (b) { return b }, compute: function (f, d, e) { return Fx.compute(f, d, e) }, check: function () { if (!this.timer) { return true } switch (this.options.link) { case "cancel": this.cancel(); return true; case "chain": this.chain(this.caller.bind(this, arguments)); return false } return false }, start: function (c, d) { if (!this.check(c, d)) { return this } this.from = c; this.to = d; this.time = 0; this.transition = this.getTransition(); this.startTimer(); this.onStart(); return this }, complete: function () { if (this.stopTimer()) { this.onComplete() } return this }, cancel: function () { if (this.stopTimer()) { this.onCancel() } return this }, onStart: function () { this.fireEvent("start", this.subject) }, onComplete: function () { this.fireEvent("complete", this.subject); if (!this.callChain()) { this.fireEvent("chainComplete", this.subject) } }, onCancel: function () { this.fireEvent("cancel", this.subject).clearChain() }, pause: function () { this.stopTimer(); return this }, resume: function () { this.startTimer(); return this }, stopTimer: function () { if (!this.timer) { return false } this.time = $time() - this.time; this.timer = $clear(this.timer); return true }, startTimer: function () { if (this.timer) { return false } this.time = $time() - this.time; this.timer = this.step.periodical(Math.round(1000 / this.options.fps), this); return true } }); Fx.compute = function (f, d, e) { return (d - f) * e + f }; Fx.Durations = { "short": 250, normal: 500, "long": 1000 }; Fx.CSS = new Class({ Extends: Fx, prepare: function (i, h, f) { f = $splat(f); var j = f[1]; if (!$chk(j)) { f[1] = f[0]; f[0] = i.getStyle(h) } var g = f.map(this.parse); return { from: g[0], to: g[1]} }, parse: function (b) { b = $lambda(b)(); b = (typeof b == "string") ? b.split(" ") : $splat(b); return b.map(function (d) { d = String(d); var a = false; Fx.CSS.Parsers.each(function (c, g) { if (a) { return } var h = c.parse(d); if ($chk(h)) { a = { value: h, parser: c} } }); a = a || { value: d, parser: Fx.CSS.Parsers.String }; return a }) }, compute: function (g, h, e) { var f = []; (Math.min(g.length, h.length)).times(function (a) { f.push({ value: g[a].parser.compute(g[a].value, h[a].value, e), parser: g[a].parser }) }); f.$family = { name: "fx:css:value" }; return f }, serve: function (f, d) { if ($type(f) != "fx:css:value") { f = this.parse(f) } var e = []; f.each(function (a) { e = e.concat(a.parser.serve(a.value, d)) }); return e }, render: function (f, g, h, e) { f.setStyle(g, this.serve(h, e)) }, search: function (d) { if (Fx.CSS.Cache[d]) { return Fx.CSS.Cache[d] } var c = {}; Array.each(document.styleSheets, function (b, g) { var h = b.href; if (h && h.contains("://") && !h.contains(document.domain)) { return } var a = b.rules || b.cssRules; Array.each(a, function (e, i) { if (!e.style) { return } var f = (e.selectorText) ? e.selectorText.replace(/^\w+/, function (j) { return j.toLowerCase() }) : null; if (!f || !f.test("^" + d + "$")) { return } Element.Styles.each(function (j, l) { if (!e.style[l] || Element.ShortStyles[l]) { return } j = String(e.style[l]); c[l] = (j.test(/^rgb/)) ? j.rgbToHex() : j }) }) }); return Fx.CSS.Cache[d] = c } }); Fx.CSS.Cache = {}; Fx.CSS.Parsers = new Hash({ Color: { parse: function (b) { if (b.match(/^#[0-9a-f]{3,6}$/i)) { return b.hexToRgb(true) } return ((b = b.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [b[1], b[2], b[3]] : false }, compute: function (f, d, e) { return f.map(function (a, b) { return Math.round(Fx.compute(f[b], d[b], e)) }) }, serve: function (b) { return b.map(Number) } }, Number: { parse: parseFloat, compute: Fx.compute, serve: function (c, d) { return (d) ? c + d : c } }, String: { parse: $lambda(false), compute: $arguments(1), serve: $arguments(0)} }); Fx.Tween = new Class({ Extends: Fx.CSS, initialize: function (c, d) { this.element = this.subject = document.id(c); this.parent(d) }, set: function (c, d) { if (arguments.length == 1) { d = c; c = this.property || this.options.property } this.render(this.element, c, d, this.options.unit); return this }, start: function (j, h, i) { if (!this.check(j, h, i)) { return this } var f = Array.flatten(arguments); this.property = this.options.property || f.shift(); var g = this.prepare(this.element, this.property, f); return this.parent(g.from, g.to) } }); Element.Properties.tween = { set: function (d) { var c = this.retrieve("tween"); if (c) { c.cancel() } return this.eliminate("tween").store("tween:options", $extend({ link: "cancel" }, d)) }, get: function (b) { if (b || !this.retrieve("tween")) { if (b || !this.retrieve("tween:options")) { this.set("tween", b) } this.store("tween", new Fx.Tween(this, this.retrieve("tween:options"))) } return this.retrieve("tween") } }; Element.implement({ tween: function (e, f, d) { this.get("tween").start(arguments); return this }, fade: function (j) { var h = this.get("tween"), i = "opacity", g; j = $pick(j, "toggle"); switch (j) { case "in": h.start(i, 1); break; case "out": h.start(i, 0); break; case "show": h.set(i, 1); break; case "hide": h.set(i, 0); break; case "toggle": var f = this.retrieve("fade:flag", this.get("opacity") == 1); h.start(i, (f) ? 0 : 1); this.store("fade:flag", !f); g = true; break; default: h.start(i, arguments) } if (!g) { this.eliminate("fade:flag") } return this }, highlight: function (f, e) { if (!e) { e = this.retrieve("highlight:original", this.getStyle("background-color")); e = (e == "transparent") ? "#fff" : e } var d = this.get("tween"); d.start("background-color", f || "#ffff88", e).chain(function () { this.setStyle("background-color", this.retrieve("highlight:original")); d.callChain() } .bind(this)); return this } }); Fx.Morph = new Class({ Extends: Fx.CSS, initialize: function (c, d) { this.element = this.subject = document.id(c); this.parent(d) }, set: function (d) { if (typeof d == "string") { d = this.search(d) } for (var c in d) { this.render(this.element, c, d[c], this.options.unit) } return this }, compute: function (h, i, j) { var g = {}; for (var f in h) { g[f] = this.parent(h[f], i[f], j) } return g }, start: function (f) { if (!this.check(f)) { return this } if (typeof f == "string") { f = this.search(f) } var h = {}, i = {}; for (var j in f) { var g = this.prepare(this.element, j, f[j]); h[j] = g.from; i[j] = g.to } return this.parent(h, i) } }); Element.Properties.morph = { set: function (d) { var c = this.retrieve("morph"); if (c) { c.cancel() } return this.eliminate("morph").store("morph:options", $extend({ link: "cancel" }, d)) }, get: function (b) { if (b || !this.retrieve("morph")) { if (b || !this.retrieve("morph:options")) { this.set("morph", b) } this.store("morph", new Fx.Morph(this, this.retrieve("morph:options"))) } return this.retrieve("morph") } }; Element.implement({ morph: function (b) { this.get("morph").start(b); return this } }); Fx.implement({ getTransition: function () { var d = this.options.transition || Fx.Transitions.Sine.easeInOut; if (typeof d == "string") { var c = d.split(":"); d = Fx.Transitions; d = d[c[0]] || d[c[0].capitalize()]; if (c[1]) { d = d["ease" + c[1].capitalize() + (c[2] ? c[2].capitalize() : "")] } } return d } }); Fx.Transition = function (c, d) { d = $splat(d); return $extend(c, { easeIn: function (a) { return c(a, d) }, easeOut: function (a) { return 1 - c(1 - a, d) }, easeInOut: function (a) { return (a <= 0.5) ? c(2 * a, d) / 2 : (2 - c(2 * (1 - a), d)) / 2 } }) }; Fx.Transitions = new Hash({ linear: $arguments(0) }); Fx.Transitions.extend = function (d) { for (var c in d) { Fx.Transitions[c] = new Fx.Transition(d[c]) } }; Fx.Transitions.extend({ Pow: function (c, d) { return Math.pow(c, d[0] || 6) }, Expo: function (b) { return Math.pow(2, 8 * (b - 1)) }, Circ: function (b) { return 1 - Math.sin(Math.acos(b)) }, Sine: function (b) { return 1 - Math.sin((1 - b) * Math.PI / 2) }, Back: function (c, d) { d = d[0] || 1.618; return Math.pow(c, 2) * ((d + 1) * c - d) }, Bounce: function (a) { var b; for (var g = 0, h = 1; 1; g += h, h /= 2) { if (a >= (7 - 4 * g) / 11) { b = h * h - Math.pow((11 - 6 * g - 11 * a) / 4, 2); break } } return b }, Elastic: function (c, d) { return Math.pow(2, 10 * --c) * Math.cos(20 * c * Math.PI * (d[0] || 1) / 3) } }); ["Quad", "Cubic", "Quart", "Quint"].each(function (c, d) { Fx.Transitions[c] = new Fx.Transition(function (a) { return Math.pow(a, [d + 2]) }) }); var Request = new Class({ Implements: [Chain, Events, Options], options: { url: "", data: "", headers: { "X-Requested-With": "XMLHttpRequest", Accept: "text/javascript, text/html, application/xml, text/xml, */*" }, async: true, format: false, method: "post", link: "ignore", isSuccess: null, emulation: true, urlEncoded: true, encoding: "utf-8", evalScripts: false, evalResponse: false, noCache: false }, initialize: function (b) { this.xhr = new Browser.Request(); this.setOptions(b); this.options.isSuccess = this.options.isSuccess || this.isSuccess; this.headers = new Hash(this.options.headers) }, onStateChange: function () { if (this.xhr.readyState != 4 || !this.running) { return } this.running = false; this.status = 0; $try(function () { this.status = this.xhr.status } .bind(this)); this.xhr.onreadystatechange = $empty; if (this.options.isSuccess.call(this, this.status)) { this.response = { text: this.xhr.responseText, xml: this.xhr.responseXML }; this.success(this.response.text, this.response.xml) } else { this.response = { text: null, xml: null }; this.failure() } }, isSuccess: function () { return ((this.status >= 200) && (this.status < 300)) }, processScripts: function (b) { if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader("Content-type"))) { return $exec(b) } return b.stripScripts(this.options.evalScripts) }, success: function (c, d) { this.onSuccess(this.processScripts(c), d) }, onSuccess: function () { this.fireEvent("complete", arguments).fireEvent("success", arguments).callChain() }, failure: function () { this.onFailure() }, onFailure: function () { this.fireEvent("complete").fireEvent("failure", this.xhr) }, setHeader: function (d, c) { this.headers.set(d, c); return this }, getHeader: function (b) { return $try(function () { return this.xhr.getResponseHeader(b) } .bind(this)) }, check: function () { if (!this.running) { return true } switch (this.options.link) { case "cancel": this.cancel(); return true; case "chain": this.chain(this.caller.bind(this, arguments)); return false } return false }, send: function (l) { if (!this.check(l)) { return this } this.running = true; var n = $type(l); if (n == "string" || n == "element") { l = { data: l} } var s = this.options; l = $extend({ data: s.data, url: s.url, method: s.method }, l); var p = l.data, u = String(l.url), v = l.method.toLowerCase(); switch ($type(p)) { case "element": p = document.id(p).toQueryString(); break; case "object": case "hash": p = Hash.toQueryString(p) } if (this.options.format) { var m = "format=" + this.options.format; p = (p) ? m + "&" + p : m } if (this.options.emulation && !["get", "post"].contains(v)) { var o = "_method=" + v; p = (p) ? o + "&" + p : o; v = "post" } if (this.options.urlEncoded && v == "post") { var t = (this.options.encoding) ? "; charset=" + this.options.encoding : ""; this.headers.set("Content-type", "application/x-www-form-urlencoded" + t) } if (this.options.noCache) { var q = "noCache=" + new Date().getTime(); p = (p) ? q + "&" + p : q } var r = u.lastIndexOf("/"); if (r > -1 && (r = u.indexOf("#")) > -1) { u = u.substr(0, r) } if (p && v == "get") { u = u + (u.contains("?") ? "&" : "?") + p; p = null } this.xhr.open(v.toUpperCase(), u, this.options.async); this.xhr.onreadystatechange = this.onStateChange.bind(this); this.headers.each(function (a, b) { try { this.xhr.setRequestHeader(b, a) } catch (c) { this.fireEvent("exception", [b, a]) } }, this); this.fireEvent("request"); this.xhr.send(p); if (!this.options.async) { this.onStateChange() } return this }, cancel: function () { if (!this.running) { return this } this.running = false; this.xhr.abort(); this.xhr.onreadystatechange = $empty; this.xhr = new Browser.Request(); this.fireEvent("cancel"); return this } }); (function () { var b = {}; ["get", "post", "put", "delete", "GET", "POST", "PUT", "DELETE"].each(function (a) { b[a] = function () { var d = Array.link(arguments, { url: String.type, data: $defined }); return this.send($extend(d, { method: a })) } }); Request.implement(b) })(); Element.Properties.send = { set: function (d) { var c = this.retrieve("send"); if (c) { c.cancel() } return this.eliminate("send").store("send:options", $extend({ data: this, link: "cancel", method: this.get("method") || "post", url: this.get("action") }, d)) }, get: function (b) { if (b || !this.retrieve("send")) { if (b || !this.retrieve("send:options")) { this.set("send", b) } this.store("send", new Request(this.retrieve("send:options"))) } return this.retrieve("send") } }; Element.implement({ send: function (d) { var c = this.get("send"); c.send({ data: this, url: d || c.options.url }); return this } }); Request.HTML = new Class({ Extends: Request, options: { update: false, append: false, evalScripts: true, filter: false }, processHTML: function (f) { var d = f.match(/<body[^>]*>([\s\S]*?)<\/body>/i); f = (d) ? d[1] : f; var e = new Element("div"); return $try(function () { var j = "<root>" + f + "</root>", b; if (Browser.Engine.trident) { b = new ActiveXObject("Microsoft.XMLDOM"); b.async = false; b.loadXML(j) } else { b = new DOMParser().parseFromString(j, "text/xml") } j = b.getElementsByTagName("root")[0]; if (!j) { return null } for (var c = 0, i = j.childNodes.length; c < i; c++) { var a = Element.clone(j.childNodes[c], true, true); if (a) { e.grab(a) } } return e }) || e.set("html", f) }, success: function (g) { var h = this.options, e = this.response; e.html = g.stripScripts(function (a) { e.javascript = a }); var f = this.processHTML(e.html); e.tree = f.childNodes; e.elements = f.getElements("*"); if (h.filter) { e.tree = e.elements.filter(h.filter) } if (h.update) { document.id(h.update).empty().set("html", e.html) } else { if (h.append) { document.id(h.append).adopt(f.getChildren()) } } if (h.evalScripts) { $exec(e.javascript) } this.onSuccess(e.tree, e.elements, e.html, e.javascript) } }); Element.Properties.load = { set: function (d) { var c = this.retrieve("load"); if (c) { c.cancel() } return this.eliminate("load").store("load:options", $extend({ data: this, link: "cancel", update: this, method: "get" }, d)) }, get: function (b) { if (b || !this.retrieve("load")) { if (b || !this.retrieve("load:options")) { this.set("load", b) } this.store("load", new Request.HTML(this.retrieve("load:options"))) } return this.retrieve("load") } }; Element.implement({ load: function () { this.get("load").send(Array.link(arguments, { data: Object.type, url: String.type })); return this } }); Request.JSON = new Class({ Extends: Request, options: { secure: true }, initialize: function (b) { this.parent(b); this.headers.extend({ Accept: "application/json", "X-Request": "JSON" }) }, success: function (b) { this.response.json = JSON.decode(b, this.options.secure); this.onSuccess(this.response.json, b) } });
