var Prototype, Abstract, Try, Class, PeriodicalExecuter, Template, $break, Enumerable, Hash, ObjectRange, Ajax, Node, Selector, Form, Field, $F, Toggle, Insertion, $continue, Position, Scriptaculous, Builder, Effect, Autocompleter, Droppables, Draggables, Draggable, SortableObserver, Sortable, Control; Prototype = { Version: "1.6.1", Browser: (function() { var b, a; b = navigator.userAgent; a = Object.prototype.toString.call(window.opera) == "[object Opera]"; return { IE: !!window.attachEvent && !a, Opera: a, WebKit: b.indexOf("AppleWebKit/") > -1, Gecko: b.indexOf("Gecko") > -1 && b.indexOf("KHTML") === -1, MobileSafari: /Apple.*Mobile.*Safari/.test(b)} })(), BrowserFeatures: { XPath: !!document.evaluate, SelectorsAPI: !!document.querySelector, ElementExtensions: (function() { var a = window.Element || window.HTMLElement; return !!(a && a.prototype) })(), SpecificElementExtensions: (function() { if (typeof window.HTMLDivElement !== "undefined") { return true } var c, b, a; c = document.createElement("div"); b = document.createElement("form"); a = false; if (c.__proto__ && (c.__proto__ !== b.__proto__)) { a = true } c = b = null; return a })() }, ScriptFragment: "<script[^>]*>([\\S\\s]*?)<\/script>", JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, emptyFunction: function() { }, K: function(a) { return a } }; if (Prototype.Browser.MobileSafari) { Prototype.BrowserFeatures.SpecificElementExtensions = false } Abstract = {}; Try = { these: function() { var b, d, a, c; for (b = 0, d = arguments.length; b < d; b++) { a = arguments[b]; try { c = a(); break } catch (f) { } } return c } }; Class = (function() { function a() { } function b() { var g, f, e; g = null; f = $A(arguments); if (Object.isFunction(f[0])) { g = f.shift() } function d() { this.initialize.apply(this, arguments) } Object.extend(d, Class.Methods); d.superclass = g; d.subclasses = []; if (g) { a.prototype = g.prototype; d.prototype = new a; g.subclasses.push(d) } for (e = 0; e < f.length; e++) { d.addMethods(f[e]) } if (!d.prototype.initialize) { d.prototype.initialize = Prototype.emptyFunction } d.prototype.constructor = d; return d } function c(j) { var f, e, d, g, h, k; f = this.superclass && this.superclass.prototype; e = Object.keys(j); if (!Object.keys({ toString: true }).length) { if (j.toString != Object.prototype.toString) { e.push("toString") } if (j.valueOf != Object.prototype.valueOf) { e.push("valueOf") } } for (d = 0, g = e.length; d < g; d++) { h = e[d], value = j[h]; if (f && Object.isFunction(value) && value.argumentNames().first() == "$super") { k = value; value = (function(i) { return function() { return f[i].apply(this, arguments) } })(h).wrap(k); value.valueOf = k.valueOf.bind(k); value.toString = k.toString.bind(k) } this.prototype[h] = value } return this } return { create: b, Methods: { addMethods: c}} })(); (function() { var d = Object.prototype.toString; function i(q, s) { for (var r in s) { q[r] = s[r] } return q } function l(q) { try { if (e(q)) { return "undefined" } if (q === null) { return "null" } return q.inspect ? q.inspect() : String(q) } catch (r) { if (r instanceof RangeError) { return "..." } throw r } } function k(q) { var s, r, u, t; s = typeof q; switch (s) { case "undefined": case "function": case "unknown": return; case "boolean": return q.toString() } if (q === null) { return "null" } if (q.toJSON) { return q.toJSON() } if (h(q)) { return } r = []; for (u in q) { t = k(q[u]); if (!e(t)) { r.push(u.toJSON() + ": " + t) } } return "{" + r.join(", ") + "}" } function c(q) { return $H(q).toQueryString() } function f(q) { return q && q.toHTML ? q.toHTML() : String.interpret(q) } function o(q) { var r, s; r = []; for (s in q) { r.push(s) } return r } function m(q) { var r, s; r = []; for (s in q) { r.push(q[s]) } return r } function j(q) { return i({}, q) } function h(q) { return !!(q && q.nodeType == 1) } function g(q) { return d.call(q) == "[object Array]" } function p(q) { return q instanceof Hash } function b(q) { return typeof q === "function" } function a(q) { return d.call(q) == "[object String]" } function n(q) { return d.call(q) == "[object Number]" } function e(q) { return typeof q === "undefined" } i(Object, { extend: i, inspect: l, toJSON: k, toQueryString: c, toHTML: f, keys: o, values: m, clone: j, isElement: h, isArray: g, isHash: p, isFunction: b, isString: a, isNumber: n, isUndefined: e }) })(); Object.extend(Function.prototype, (function() { var k = Array.prototype.slice; function d(o, l) { var n = o.length, m = l.length; while (m--) { o[n + m] = l[m] } return o } function i(m, l) { m = k.call(m, 0); return d(m, l) } function g() { var l = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1].replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, "").replace(/\s+/g, "").split(","); return l.length == 1 && !l[0] ? [] : l } function h(n) { if (arguments.length < 2 && Object.isUndefined(arguments[0])) { return this } var l = this, m = k.call(arguments, 1); return function() { var o = i(m, arguments); return l.apply(n, o) } } function f(n) { var l = this, m = k.call(arguments, 1); return function(p) { var o = d([p || window.event], m); return l.apply(n, o) } } function j() { if (!arguments.length) { return this } var l = this, m = k.call(arguments, 0); return function() { var n = i(m, arguments); return l.apply(this, n) } } function e(n) { var l = this, m = k.call(arguments, 1); n = n * 1000; return window.setTimeout(function() { return l.apply(l, m) }, n) } function a() { var l = d([0.01], arguments); return this.delay.apply(this, l) } function c(m) { var l = this; return function() { var n = d([l.bind(this)], arguments); return m.apply(this, n) } } function b() { if (this._methodized) { return this._methodized } var l = this; return this._methodized = function() { var m = d([this], arguments); return l.apply(null, m) } } return { argumentNames: g, bind: h, bindAsEventListener: f, curry: j, delay: e, defer: a, wrap: c, methodize: b} })()); Date.prototype.toJSON = function() { return '"' + this.getUTCFullYear() + "-" + (this.getUTCMonth() + 1).toPaddedString(2) + "-" + this.getUTCDate().toPaddedString(2) + "T" + this.getUTCHours().toPaddedString(2) + ":" + this.getUTCMinutes().toPaddedString(2) + ":" + this.getUTCSeconds().toPaddedString(2) + 'Z"' }; RegExp.prototype.match = RegExp.prototype.test; RegExp.escape = function(a) { return String(a).replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1") }; PeriodicalExecuter = Class.create({ initialize: function(b, a) { this.callback = b; this.frequency = a; this.currentlyExecuting = false; this.registerCallback() }, registerCallback: function() { this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000) }, execute: function() { this.callback(this) }, stop: function() { if (!this.timer) { return } clearInterval(this.timer); this.timer = null }, onTimerEvent: function() { if (!this.currentlyExecuting) { try { this.currentlyExecuting = true; this.execute(); this.currentlyExecuting = false } catch (a) { this.currentlyExecuting = false; throw a } } } }); Object.extend(String, { interpret: function(a) { return a == null ? "" : String(a) }, specialChar: { "\b": "\\b", "\t": "\\t", "\n": "\\n", "\f": "\\f", "\r": "\\r", "\\": "\\\\"} }); Object.extend(String.prototype, (function() { function prepareReplacement(replacement) { if (Object.isFunction(replacement)) { return replacement } var template = new Template(replacement); return function(match) { return template.evaluate(match) } } function gsub(pattern, replacement) { var result = "", source = this, match; replacement = prepareReplacement(replacement); if (Object.isString(pattern)) { pattern = RegExp.escape(pattern) } if (!(pattern.length || pattern.source)) { replacement = replacement(""); return replacement + source.split("").join(replacement) + replacement } while (source.length > 0) { if (match = source.match(pattern)) { result += source.slice(0, match.index); result += String.interpret(replacement(match)); source = source.slice(match.index + match[0].length) } else { result += source, source = "" } } return result } function sub(pattern, replacement, count) { replacement = prepareReplacement(replacement); count = Object.isUndefined(count) ? 1 : count; return this.gsub(pattern, function(match) { if (--count < 0) { return match[0] } return replacement(match) }) } function scan(pattern, iterator) { this.gsub(pattern, iterator); return String(this) } function truncate(length, truncation) { length = length || 30; truncation = Object.isUndefined(truncation) ? "..." : truncation; return this.length > length ? this.slice(0, length - truncation.length) + truncation : String(this) } function strip() { return this.replace(/^\s+/, "").replace(/\s+$/, "") } function stripTags() { return this.replace(/<\w+(\s+("[^"]*"|'[^']*'|[^>])+)?>|<\/\w+>/gi, "") } function stripScripts() { return this.replace(new RegExp(Prototype.ScriptFragment, "img"), "") } function extractScripts() { var matchAll, matchOne; matchAll = new RegExp(Prototype.ScriptFragment, "img"); matchOne = new RegExp(Prototype.ScriptFragment, "im"); return (this.match(matchAll) || []).map(function(scriptTag) { return (scriptTag.match(matchOne) || ["", ""])[1] }) } function evalScripts() { return this.extractScripts().map(function(script) { return eval(script) }) } function escapeHTML() { return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;") } function unescapeHTML() { return this.stripTags().replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&amp;/g, "&") } function toQueryParams(separator) { var match = this.strip().match(/([^?#]*)(#.*)?$/); if (!match) { return {} } return match[1].split(separator || "&").inject({}, function(hash, pair) { if ((pair = pair.split("="))[0]) { var key, value; key = decodeURIComponent(pair.shift()); value = pair.length > 1 ? pair.join("=") : pair[0]; if (value != undefined) { value = decodeURIComponent(value) } if (key in hash) { if (!Object.isArray(hash[key])) { hash[key] = [hash[key]] } hash[key].push(value) } else { hash[key] = value } } return hash }) } function toArray() { return this.split("") } function succ() { return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1) } function times(count) { return count < 1 ? "" : new Array(count + 1).join(this) } function camelize() { var parts, len, camelized, i; parts = this.split("-"); len = parts.length; if (len == 1) { return parts[0] } camelized = this.charAt(0) == "-" ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) : parts[0]; for (i = 1; i < len; i++) { camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1) } return camelized } function capitalize() { return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase() } function underscore() { return this.replace(/::/g, "/").replace(/([A-Z]+)([A-Z][a-z])/g, "$1_$2").replace(/([a-z\d])([A-Z])/g, "$1_$2").replace(/-/g, "_").toLowerCase() } function dasherize() { return this.replace(/_/g, "-") } function inspect(useDoubleQuotes) { var escapedString = this.replace(/[\x00-\x1f\\]/g, function(character) { if (character in String.specialChar) { return String.specialChar[character] } return "\\u00" + character.charCodeAt().toPaddedString(2, 16) }); if (useDoubleQuotes) { return '"' + escapedString.replace(/"/g, '\\"') + '"' } return "'" + escapedString.replace(/'/g, "\\'") + "'" } function toJSON() { return this.inspect(true) } function unfilterJSON(filter) { return this.replace(filter || Prototype.JSONFilter, "$1") } function isJSON() { var str = this; if (str.blank()) { return false } str = this.replace(/\\./g, "@").replace(/"[^"\\\n\r]*"/g, ""); return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str) } function evalJSON(sanitize) { var json = this.unfilterJSON(); try { if (!sanitize || json.isJSON()) { return eval("(" + json + ")") } } catch (e) { } throw new SyntaxError("Badly formed JSON string: " + this.inspect()) } function include(pattern) { return this.indexOf(pattern) > -1 } function startsWith(pattern) { return this.indexOf(pattern) === 0 } function endsWith(pattern) { var d = this.length - pattern.length; return d >= 0 && this.lastIndexOf(pattern) === d } function empty() { return this == "" } function blank() { return /^\s*$/.test(this) } function interpolate(object, pattern) { return new Template(this, pattern).evaluate(object) } return { gsub: gsub, sub: sub, scan: scan, truncate: truncate, strip: String.prototype.trim ? String.prototype.trim : strip, stripTags: stripTags, stripScripts: stripScripts, extractScripts: extractScripts, evalScripts: evalScripts, escapeHTML: escapeHTML, unescapeHTML: unescapeHTML, toQueryParams: toQueryParams, parseQuery: toQueryParams, toArray: toArray, succ: succ, times: times, camelize: camelize, capitalize: capitalize, underscore: underscore, dasherize: dasherize, inspect: inspect, toJSON: toJSON, unfilterJSON: unfilterJSON, isJSON: isJSON, evalJSON: evalJSON, include: include, startsWith: startsWith, endsWith: endsWith, empty: empty, blank: blank, interpolate: interpolate} })()); Template = Class.create({ initialize: function(a, b) { this.template = a.toString(); this.pattern = b || Template.Pattern }, evaluate: function(a) { if (a && Object.isFunction(a.toTemplateReplacements)) { a = a.toTemplateReplacements() } return this.template.gsub(this.pattern, function(d) { if (a == null) { return (d[1] + "") } var f, b, e, c; f = d[1] || ""; if (f == "\\") { return d[2] } b = a, expr = d[3]; e = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; d = e.exec(expr); if (d == null) { return f } while (d != null) { c = d[1].startsWith("[") ? d[2].replace(/\\\\]/g, "]") : d[1]; b = b[c]; if (null == b || "" == d[3]) { break } expr = expr.substring("[" == d[3] ? d[1].length : d[0].length); d = e.exec(expr) } return f + String.interpret(b) }) } }); Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; $break = {}; Enumerable = (function() { function c(y, x) { var w = 0; try { this._each(function(A) { y.call(x, A, w++) }) } catch (z) { if (z != $break) { throw z } } return this } function r(z, y, x) { var w = -z, A = [], B = this.toArray(); if (z < 1) { return B } while ((w += z) < B.length) { A.push(B.slice(w, w + z)) } return A.collect(y, x) } function b(y, x) { y = y || Prototype.K; var w = true; this.each(function(A, z) { w = w && !!y.call(x, A, z); if (!w) { throw $break } }); return w } function i(y, x) { y = y || Prototype.K; var w = false; this.each(function(A, z) { if (w = !!y.call(x, A, z)) { throw $break } }); return w } function j(y, x) { y = y || Prototype.K; var w = []; this.each(function(A, z) { w.push(y.call(x, A, z)) }); return w } function t(y, x) { var w; this.each(function(A, z) { if (y.call(x, A, z)) { w = A; throw $break } }); return w } function h(y, x) { var w = []; this.each(function(A, z) { if (y.call(x, A, z)) { w.push(A) } }); return w } function g(z, y, x) { y = y || Prototype.K; var w = []; if (Object.isString(z)) { z = new RegExp(RegExp.escape(z)) } this.each(function(B, A) { if (z.match(B)) { w.push(y.call(x, B, A)) } }); return w } function a(w) { if (Object.isFunction(this.indexOf)) { if (this.indexOf(w) != -1) { return true } } var x = false; this.each(function(y) { if (y == w) { x = true; throw $break } }); return x } function q(x, w) { w = Object.isUndefined(w) ? null : w; return this.eachSlice(x, function(y) { while (y.length < x) { y.push(w) } return y }) } function l(w, y, x) { this.each(function(A, z) { w = y.call(x, w, A, z) }); return w } function v(x) { var w = $A(arguments).slice(1); return this.map(function(y) { return y[x].apply(y, w) }) } function p(y, x) { y = y || Prototype.K; var w; this.each(function(A, z) { A = y.call(x, A, z); if (w == null || A >= w) { w = A } }); return w } function n(y, x) { y = y || Prototype.K; var w; this.each(function(A, z) { A = y.call(x, A, z); if (w == null || A < w) { w = A } }); return w } function e(z, x) { z = z || Prototype.K; var y = [], w = []; this.each(function(B, A) { (z.call(x, B, A) ? y : w).push(B) }); return [y, w] } function f(x) { var w = []; this.each(function(y) { w.push(y[x]) }); return w } function d(y, x) { var w = []; this.each(function(A, z) { if (!y.call(x, A, z)) { w.push(A) } }); return w } function m(x, w) { return this.map(function(z, y) { return { value: z, criteria: x.call(w, z, y)} }).sort(function(B, A) { var z = B.criteria, y = A.criteria; return z < y ? -1 : z > y ? 1 : 0 }).pluck("value") } function o() { return this.map() } function s() { var x, w, y; x = Prototype.K; w = $A(arguments); if (Object.isFunction(w.last())) { x = w.pop() } y = [this].concat(w).map($A); return this.map(function(A, z) { return x(y.pluck(z)) }) } function k() { return this.toArray().length } function u() { return "#<Enumerable:" + this.toArray().inspect() + ">" } return { each: c, eachSlice: r, all: b, every: b, any: i, some: i, collect: j, map: j, detect: t, findAll: h, select: h, filter: h, grep: g, include: a, member: a, inGroupsOf: q, inject: l, invoke: v, max: p, min: n, partition: e, pluck: f, reject: d, sortBy: m, toArray: o, entries: o, zip: s, size: k, inspect: u, find: t} })(); function $A(c) { if (!c) { return [] } if ("toArray" in Object(c)) { return c.toArray() } var b = c.length || 0, a = new Array(b); while (b--) { a[b] = c[b] } return a } function $w(a) { if (!Object.isString(a)) { return [] } a = a.strip(); return a ? a.split(/\s+/) : [] } Array.from = $A; (function() { var r, l, n; r = Array.prototype; l = r.slice; n = r.forEach; function b(v) { for (var u = 0, w = this.length; u < w; u++) { v(this[u]) } } if (!n) { n = b } function k() { this.length = 0; return this } function d() { return this[0] } function f() { return this[this.length - 1] } function h() { return this.select(function(u) { return u != null }) } function t() { return this.inject([], function(v, u) { if (Object.isArray(u)) { return v.concat(u.flatten()) } v.push(u); return v }) } function g() { var u = l.call(arguments, 0); return this.select(function(v) { return !u.include(v) }) } function e(u) { return (u !== false ? this : this.toArray())._reverse() } function j(u) { return this.inject([], function(x, w, v) { if (0 == v || (u ? x.last() != w : !x.include(w))) { x.push(w) } return x }) } function o(u) { return this.uniq().findAll(function(v) { return u.detect(function(w) { return v === w }) }) } function p() { return l.call(this, 0) } function i() { return this.length } function s() { return "[" + this.map(Object.inspect).join(", ") + "]" } function q() { var u, v; u = []; this.each(function(w) { v = Object.toJSON(w); if (!Object.isUndefined(v)) { u.push(v) } }); return "[" + u.join(", ") + "]" } function a(w, u) { u || (u = 0); var v = this.length; if (u < 0) { u = v + u } for (; u < v; u++) { if (this[u] === w) { return u } } return -1 } function m(v, u) { u = isNaN(u) ? this.length : (u < 0 ? this.length + u : u) + 1; var w = this.slice(0, u).reverse().indexOf(v); return (w < 0) ? w : u - w - 1 } function c() { var x, v, w, u; x = l.call(this, 0); for (v = 0, length = arguments.length; v < length; v++) { w = arguments[v]; if (Object.isArray(w) && !("callee" in w)) { for (u = 0, arrayLength = w.length; u < arrayLength; u++) { x.push(w[u]) } } else { x.push(w) } } return x } Object.extend(r, Enumerable); if (!r._reverse) { r._reverse = r.reverse } Object.extend(r, { _each: n, clear: k, first: d, last: f, compact: h, flatten: t, without: g, reverse: e, uniq: j, intersect: o, clone: p, toArray: p, size: i, inspect: s, toJSON: q }); CONCAT_ARGUMENTS_BUGGY = (function() { return [].concat(arguments)[0][0] !== 1 })(1, 2); if (CONCAT_ARGUMENTS_BUGGY) { r.concat = c } if (!r.indexOf) { r.indexOf = a } if (!r.lastIndexOf) { r.lastIndexOf = m } })(); function $H(a) { return new Hash(a) } Hash = Class.create(Enumerable, (function() { function e(q) { this._object = Object.isHash(q) ? q.toObject() : Object.clone(q) } function f(r) { var q, s, t; for (q in this._object) { s = this._object[q]; t = [q, s]; t.key = q; t.value = s; r(t) } } function k(q, r) { return this._object[q] = r } function c(q) { if (this._object[q] !== Object.prototype[q]) { return this._object[q] } } function n(q) { var r = this._object[q]; delete this._object[q]; return r } function p() { return Object.clone(this._object) } function o() { return this.pluck("key") } function m() { return this.pluck("value") } function g(r) { var q = this.detect(function(s) { return s.value === r }); return q && q.key } function i(q) { return this.clone().update(q) } function d(q) { return new Hash(q).inject(this, function(r, s) { r.set(s.key, s.value); return r }) } function b(q, r) { if (Object.isUndefined(r)) { return q } return q + "=" + encodeURIComponent(String.interpret(r)) } function a() { return this.inject([], function(s, t) { var r = encodeURIComponent(t.key), q = t.value; if (q && typeof q == "object") { if (Object.isArray(q)) { return s.concat(q.map(b.curry(r))) } } else { s.push(b(r, q)) } return s }).join("&") } function l() { return "#<Hash:{" + this.map(function(q) { return q.map(Object.inspect).join(": ") }).join(", ") + "}>" } function j() { return Object.toJSON(this.toObject()) } function h() { return new Hash(this) } return { initialize: e, _each: f, set: k, get: c, unset: n, toObject: p, toTemplateReplacements: p, keys: o, values: m, index: g, merge: i, update: d, toQueryString: a, inspect: l, toJSON: j, clone: h} })()); Hash.from = $H; Object.extend(Number.prototype, (function() { function d() { return this.toPaddedString(2, 16) } function e() { return this + 1 } function a(k, j) { $R(0, this, true).each(k, j); return this } function b(l, k) { var j = this.toString(k || 10); return "0".times(l - j.length) + j } function f() { return isFinite(this) ? this.toString() : "null" } function i() { return Math.abs(this) } function h() { return Math.round(this) } function g() { return Math.ceil(this) } function c() { return Math.floor(this) } return { toColorPart: d, succ: e, times: a, toPaddedString: b, toJSON: f, abs: i, round: h, ceil: g, floor: c} })()); function $R(c, a, b) { return new ObjectRange(c, a, b) } ObjectRange = Class.create(Enumerable, (function() { function b(f, d, e) { this.start = f; this.end = d; this.exclusive = e } function c(d) { var e = this.start; while (this.include(e)) { d(e); e = e.succ() } } function a(d) { if (d < this.start) { return false } if (this.exclusive) { return d < this.end } return d <= this.end } return { initialize: b, _each: c, include: a} })()); Ajax = { getTransport: function() { return Try.these(function() { return new XMLHttpRequest() }, function() { return new ActiveXObject("Msxml2.XMLHTTP") }, function() { return new ActiveXObject("Microsoft.XMLHTTP") }) || false }, activeRequestCount: 0 }; Ajax.Responders = { responders: [], _each: function(a) { this.responders._each(a) }, register: function(a) { if (!this.include(a)) { this.responders.push(a) } }, unregister: function(a) { this.responders = this.responders.without(a) }, dispatch: function(d, b, c, a) { this.each(function(f) { if (Object.isFunction(f[d])) { try { f[d].apply(f, [b, c, a]) } catch (g) { } } }) } }; Object.extend(Ajax.Responders, Enumerable); Ajax.Responders.register({ onCreate: function() { Ajax.activeRequestCount++ }, onComplete: function() { Ajax.activeRequestCount-- } }); Ajax.Base = Class.create({ initialize: function(a) { this.options = { method: "post", asynchronous: true, contentType: "application/x-www-form-urlencoded", encoding: "UTF-8", parameters: "", evalJSON: true, evalJS: true }; Object.extend(this.options, a || {}); this.options.method = this.options.method.toLowerCase(); if (Object.isString(this.options.parameters)) { this.options.parameters = this.options.parameters.toQueryParams() } else { if (Object.isHash(this.options.parameters)) { this.options.parameters = this.options.parameters.toObject() } } } }); Ajax.Request = Class.create(Ajax.Base, { _complete: false, initialize: function($super, b, a) { $super(a); this.transport = Ajax.getTransport(); this.request(b) }, request: function(b) { this.url = b; this.method = this.options.method; var d, a; d = Object.clone(this.options.parameters); if (!["get", "post"].include(this.method)) { d._method = this.method; this.method = "post" } this.parameters = d; if (d = Object.toQueryString(d)) { if (this.method == "get") { this.url += (this.url.include("?") ? "&" : "?") + d } else { if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { d += "&_=" } } } try { a = new Ajax.Response(this); if (this.options.onCreate) { this.options.onCreate(a) } Ajax.Responders.dispatch("onCreate", this, a); this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous); if (this.options.asynchronous) { this.respondToReadyState.bind(this).defer(1) } this.transport.onreadystatechange = this.onStateChange.bind(this); this.setRequestHeaders(); this.body = this.method == "post" ? (this.options.postBody || d) : null; this.transport.send(this.body); if (!this.options.asynchronous && this.transport.overrideMimeType) { this.onStateChange() } } catch (c) { this.dispatchException(c) } }, onStateChange: function() { var a = this.transport.readyState; if (a > 1 && !((a == 4) && this._complete)) { this.respondToReadyState(this.transport.readyState) } }, setRequestHeaders: function() { var d, c, b, a; d = { "X-Requested-With": "XMLHttpRequest", "X-Prototype-Version": Prototype.Version, Accept: "text/javascript, text/html, application/xml, text/xml, */*" }; if (this.method == "post") { d["Content-type"] = this.options.contentType + (this.options.encoding ? "; charset=" + this.options.encoding : ""); if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0, 2005])[1] < 2005) { d.Connection = "close" } } if (typeof this.options.requestHeaders == "object") { c = this.options.requestHeaders; if (Object.isFunction(c.push)) { for (b = 0, length = c.length; b < length; b += 2) { d[c[b]] = c[b + 1] } } else { $H(c).each(function(e) { d[e.key] = e.value }) } } for (a in d) { this.transport.setRequestHeader(a, d[a]) } }, success: function() { var a = this.getStatus(); return !a || (a >= 200 && a < 300) }, getStatus: function() { try { return this.transport.status || 0 } catch (a) { return 0 } }, respondToReadyState: function(a) { var c, b, f; c = Ajax.Request.Events[a]; b = new Ajax.Response(this); if (c == "Complete") { try { this._complete = true; (this.options["on" + b.status] || this.options["on" + (this.success() ? "Success" : "Failure")] || Prototype.emptyFunction)(b, b.headerJSON) } catch (d) { this.dispatchException(d) } f = b.getHeader("Content-type"); if (this.options.evalJS == "force" || (this.options.evalJS && this.isSameOrigin() && f && f.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) { this.evalResponse() } } try { (this.options["on" + c] || Prototype.emptyFunction)(b, b.headerJSON); Ajax.Responders.dispatch("on" + c, this, b, b.headerJSON) } catch (d) { this.dispatchException(d) } if (c == "Complete") { this.transport.onreadystatechange = Prototype.emptyFunction } }, isSameOrigin: function() { var a = this.url.match(/^\s*https?:\/\/[^\/]*/); return !a || (a[0] == "#{protocol}//#{domain}#{port}".interpolate({ protocol: location.protocol, domain: document.domain, port: location.port ? ":" + location.port : "" })) }, getHeader: function(a) { try { return this.transport.getResponseHeader(a) || null } catch (b) { return null } }, evalResponse: function() { try { return eval((this.transport.responseText || "").unfilterJSON()) } catch (e) { this.dispatchException(e) } }, dispatchException: function(a) { (this.options.onException || Prototype.emptyFunction)(this, a); Ajax.Responders.dispatch("onException", this, a) } }); Ajax.Request.Events = ["Uninitialized", "Loading", "Loaded", "Interactive", "Complete"]; Ajax.Response = Class.create({ initialize: function(c) { this.request = c; var d, a, b; d = this.transport = c.transport; a = this.readyState = d.readyState; if ((a > 2 && !Prototype.Browser.IE) || a == 4) { this.status = this.getStatus(); this.statusText = this.getStatusText(); this.responseText = String.interpret(d.responseText); this.headerJSON = this._getHeaderJSON() } if (a == 4) { b = d.responseXML; this.responseXML = Object.isUndefined(b) ? null : b; this.responseJSON = this._getResponseJSON() } }, status: 0, statusText: "", getStatus: Ajax.Request.prototype.getStatus, getStatusText: function() { try { return this.transport.statusText || "" } catch (a) { return "" } }, getHeader: Ajax.Request.prototype.getHeader, getAllHeaders: function() { try { return this.getAllResponseHeaders() } catch (a) { return null } }, getResponseHeader: function(a) { return this.transport.getResponseHeader(a) }, getAllResponseHeaders: function() { return this.transport.getAllResponseHeaders() }, _getHeaderJSON: function() { var a = this.getHeader("X-JSON"); if (!a) { return null } a = decodeURIComponent(escape(a)); try { return a.evalJSON(this.request.options.sanitizeJSON || !this.request.isSameOrigin()) } catch (b) { this.request.dispatchException(b) } }, _getResponseJSON: function() { var a = this.request.options; if (!a.evalJSON || (a.evalJSON != "force" && !(this.getHeader("Content-type") || "").include("application/json")) || this.responseText.blank()) { return null } try { return this.responseText.evalJSON(a.sanitizeJSON || !this.request.isSameOrigin()) } catch (b) { this.request.dispatchException(b) } } }); Ajax.Updater = Class.create(Ajax.Request, { initialize: function($super, a, c, b) { this.container = { success: (a.success || a), failure: (a.failure || (a.success ? null : a)) }; b = Object.clone(b); var d = b.onComplete; b.onComplete = (function(e, f) { this.updateContent(e.responseText); if (Object.isFunction(d)) { d(e, f) } }).bind(this); $super(c, b) }, updateContent: function(d) { var c, a, b; c = this.container[this.success() ? "success" : "failure"]; a = this.options; if (!a.evalScripts) { d = d.stripScripts() } if (c = $(c)) { if (a.insertion) { if (Object.isString(a.insertion)) { b = {}; b[a.insertion] = d; c.insert(b) } else { a.insertion(c, d) } } else { c.update(d) } } } }); Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { initialize: function($super, a, c, b) { $super(b); this.onComplete = this.options.onComplete; this.frequency = (this.options.frequency || 2); this.decay = (this.options.decay || 1); this.updater = {}; this.container = a; this.url = c; this.start() }, start: function() { this.options.onComplete = this.updateComplete.bind(this); this.onTimerEvent() }, stop: function() { this.updater.options.onComplete = undefined; clearTimeout(this.timer); (this.onComplete || Prototype.emptyFunction).apply(this, arguments) }, updateComplete: function(a) { if (this.options.decay) { this.decay = (a.responseText == this.lastText ? this.decay * this.options.decay : 1); this.lastText = a.responseText } this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency) }, onTimerEvent: function() { this.updater = new Ajax.Updater(this.container, this.url, this.options) } }); function $(b) { if (arguments.length > 1) { for (var a = 0, d = [], c = arguments.length; a < c; a++) { d.push($(arguments[a])) } return d } if (Object.isString(b)) { b = document.getElementById(b) } return Element.extend(b) } if (Prototype.BrowserFeatures.XPath) { document._getElementsByXPath = function(e, a) { var c, d, b; c = []; d = document.evaluate(e, $(a) || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); for (b = 0, length = d.snapshotLength; b < length; b++) { c.push(Element.extend(d.snapshotItem(b))) } return c } } if (!window.Node) { Node = {} } if (!Node.ELEMENT_NODE) { Object.extend(Node, { ELEMENT_NODE: 1, ATTRIBUTE_NODE: 2, TEXT_NODE: 3, CDATA_SECTION_NODE: 4, ENTITY_REFERENCE_NODE: 5, ENTITY_NODE: 6, PROCESSING_INSTRUCTION_NODE: 7, COMMENT_NODE: 8, DOCUMENT_NODE: 9, DOCUMENT_TYPE_NODE: 10, DOCUMENT_FRAGMENT_NODE: 11, NOTATION_NODE: 12 }) } (function(c) { var b, a; b = (function() { var f, e, d, g; f = document.createElement("form"); e = document.createElement("input"); d = document.documentElement; e.setAttribute("name", "test"); f.appendChild(e); d.appendChild(f); g = f.elements ? (typeof f.elements.test == "undefined") : null; d.removeChild(f); f = e = null; return g })(); a = c.Element; c.Element = function(f, e) { e = e || {}; f = f.toLowerCase(); var d = Element.cache; if (b && e.name) { f = "<" + f + ' name="' + e.name + '">'; delete e.name; return Element.writeAttribute(document.createElement(f), e) } if (!d[f]) { d[f] = Element.extend(document.createElement(f)) } return Element.writeAttribute(d[f].cloneNode(false), e) }; Object.extend(c.Element, a || {}); if (a) { c.Element.prototype = a.prototype } })(this); Element.cache = {}; Element.idCounter = 1; Element.Methods = { visible: function(a) { return $(a).style.display != "none" }, toggle: function(a) { a = $(a); Element[Element.visible(a) ? "hide" : "show"](a); return a }, hide: function(a) { a = $(a); a.style.display = "none"; return a }, show: function(a) { a = $(a); a.style.display = ""; return a }, remove: function(a) { a = $(a); a.parentNode.removeChild(a); return a }, update: (function() { var b, a, d; b = (function() { var e = document.createElement("select"), f = true; e.innerHTML = '<option value="test">test</option>'; if (e.options && e.options[0]) { f = e.options[0].nodeName.toUpperCase() !== "OPTION" } e = null; return f })(); a = (function() { try { var f, h; f = document.createElement("table"); if (f && f.tBodies) { f.innerHTML = "<tbody><tr><td>test</td></tr></tbody>"; h = typeof f.tBodies[0] == "undefined"; f = null; return h } } catch (g) { return true } })(); d = (function() { var f = document.createElement("script"), h = false; try { f.appendChild(document.createTextNode("")); h = !f.firstChild || f.firstChild && f.firstChild.nodeType !== 3 } catch (g) { h = true } f = null; return h })(); function c(f, g) { f = $(f); if (g && g.toElement) { g = g.toElement() } if (Object.isElement(g)) { return f.update().insert(g) } g = Object.toHTML(g); var e = f.tagName.toUpperCase(); if (e === "SCRIPT" && d) { f.text = g; return f } if (b || a) { if (e in Element._insertionTranslations.tags) { while (f.firstChild) { f.removeChild(f.firstChild) } Element._getContentFromAnonymousElement(e, g.stripScripts()).each(function(h) { f.appendChild(h) }) } else { f.innerHTML = g.stripScripts() } } else { f.innerHTML = g.stripScripts() } g.evalScripts.bind(g).defer(); return f } return c })(), replace: function(b, c) { b = $(b); if (c && c.toElement) { c = c.toElement() } else { if (!Object.isElement(c)) { c = Object.toHTML(c); var a = b.ownerDocument.createRange(); a.selectNode(b); c.evalScripts.bind(c).defer(); c = a.createContextualFragment(c.stripScripts()) } } b.parentNode.replaceChild(c, b); return b }, insert: function(c, e) { c = $(c); if (Object.isString(e) || Object.isNumber(e) || Object.isElement(e) || (e && (e.toElement || e.toHTML))) { e = { bottom: e} } var a, d, f, b, g; for (a in e) { d = e[a]; a = a.toLowerCase(); f = Element._insertionTranslations[a]; if (d && d.toElement) { d = d.toElement() } if (Object.isElement(d)) { f(c, d); continue } d = Object.toHTML(d); b = ((a == "before" || a == "after") ? c.parentNode : c).tagName.toUpperCase(); g = Element._getContentFromAnonymousElement(b, d.stripScripts()); if (a == "top" || a == "after") { g.reverse() } g.each(f.curry(c)); d.evalScripts.bind(d).defer() } return c }, wrap: function(b, c, a) { b = $(b); if (Object.isElement(c)) { $(c).writeAttribute(a || {}) } else { if (Object.isString(c)) { c = new Element(c, a) } else { c = new Element("div", c) } } if (b.parentNode) { b.parentNode.replaceChild(c, b) } c.appendChild(b); return c }, inspect: function(b) { b = $(b); var a = "<" + b.tagName.toLowerCase(); $H({ id: "id", className: "class" }).each(function(e) { var d, c; d = e.first(), attribute = e.last(); c = (b[d] || "").toString(); if (c) { a += " " + attribute + "=" + c.inspect(true) } }); return a + ">" }, recursivelyCollect: function(a, c) { a = $(a); var b = []; while (a = a[c]) { if (a.nodeType == 1) { b.push(Element.extend(a)) } } return b }, ancestors: function(a) { return Element.recursivelyCollect(a, "parentNode") }, descendants: function(a) { return Element.select(a, "*") }, firstDescendant: function(a) { a = $(a).firstChild; while (a && a.nodeType != 1) { a = a.nextSibling } return $(a) }, immediateDescendants: function(a) { if (!(a = $(a).firstChild)) { return [] } while (a && a.nodeType != 1) { a = a.nextSibling } if (a) { return [a].concat($(a).nextSiblings()) } return [] }, previousSiblings: function(a) { return Element.recursivelyCollect(a, "previousSibling") }, nextSiblings: function(a) { return Element.recursivelyCollect(a, "nextSibling") }, siblings: function(a) { a = $(a); return Element.previousSiblings(a).reverse().concat(Element.nextSiblings(a)) }, match: function(b, a) { if (Object.isString(a)) { a = new Selector(a) } return a.match($(b)) }, up: function(b, d, a) { b = $(b); if (arguments.length == 1) { return $(b.parentNode) } var c = Element.ancestors(b); return Object.isNumber(d) ? c[d] : Selector.findElement(c, d, a) }, down: function(b, c, a) { b = $(b); if (arguments.length == 1) { return Element.firstDescendant(b) } return Object.isNumber(c) ? Element.descendants(b)[c] : Element.select(b, c)[a || 0] }, previous: function(b, d, a) { b = $(b); if (arguments.length == 1) { return $(Selector.handlers.previousElementSibling(b)) } var c = Element.previousSiblings(b); return Object.isNumber(d) ? c[d] : Selector.findElement(c, d, a) }, next: function(c, d, b) { c = $(c); if (arguments.length == 1) { return $(Selector.handlers.nextElementSibling(c)) } var a = Element.nextSiblings(c); return Object.isNumber(d) ? a[d] : Selector.findElement(a, d, b) }, select: function(b) { var a = Array.prototype.slice.call(arguments, 1); return Selector.findChildElements(b, a) }, adjacent: function(b) { var a = Array.prototype.slice.call(arguments, 1); return Selector.findChildElements(b.parentNode, a).without(b) }, identify: function(a) { a = $(a); var b = Element.readAttribute(a, "id"); if (b) { return b } do { b = "anonymous_element_" + Element.idCounter++ } while ($(b)); Element.writeAttribute(a, "id", b); return b }, readAttribute: function(c, a) { c = $(c); if (Prototype.Browser.IE) { var b = Element._attributeTranslations.read; if (b.values[a]) { return b.values[a](c, a) } if (b.names[a]) { a = b.names[a] } if (a.include(":")) { return (!c.attributes || !c.attributes[a]) ? null : c.attributes[a].value } } return c.getAttribute(a) }, writeAttribute: function(e, c, f) { e = $(e); var b, d, a; b = {}; d = Element._attributeTranslations.write; if (typeof c == "object") { b = c } else { b[c] = Object.isUndefined(f) ? true : f } for (a in b) { c = d.names[a] || a; f = b[a]; if (d.values[a]) { c = d.values[a](e, f) } if (f === false || f === null) { e.removeAttribute(c) } else { if (f === true) { e.setAttribute(c, c) } else { e.setAttribute(c, f) } } } return e }, getHeight: function(a) { return Element.getDimensions(a).height }, getWidth: function(a) { return Element.getDimensions(a).width }, classNames: function(a) { return new Element.ClassNames(a) }, hasClassName: function(a, b) { if (!(a = $(a))) { return } var c = a.className; return (c.length > 0 && (c == b || new RegExp("(^|\\s)" + b + "(\\s|$)").test(c))) }, addClassName: function(a, b) { if (!(a = $(a))) { return } if (!Element.hasClassName(a, b)) { a.className += (a.className ? " " : "") + b } return a }, removeClassName: function(a, b) { if (!(a = $(a))) { return } a.className = a.className.replace(new RegExp("(^|\\s+)" + b + "(\\s+|$)"), " ").strip(); return a }, toggleClassName: function(a, b) { if (!(a = $(a))) { return } return Element[Element.hasClassName(a, b) ? "removeClassName" : "addClassName"](a, b) }, cleanWhitespace: function(b) { b = $(b); var c, a; c = b.firstChild; while (c) { a = c.nextSibling; if (c.nodeType == 3 && !/\S/.test(c.nodeValue)) { b.removeChild(c) } c = a } return b }, empty: function(a) { return $(a).innerHTML.blank() }, descendantOf: function(b, a) { b = $(b), a = $(a); if (b.compareDocumentPosition) { return (b.compareDocumentPosition(a) & 8) === 8 } if (a.contains) { return a.contains(b) && a !== b } while (b = b.parentNode) { if (b == a) { return true } } return false }, scrollTo: function(a) { a = $(a); var b = Element.cumulativeOffset(a); window.scrollTo(b[0], b[1]); return a }, getStyle: function(b, c) { b = $(b); c = c == "float" ? "cssFloat" : c.camelize(); var d, a; d = b.style[c]; if (!d || d == "auto") { a = document.defaultView.getComputedStyle(b, null); d = a ? a[c] : null } if (c == "opacity") { return d ? parseFloat(d) : 1 } return d == "auto" ? null : d }, getOpacity: function(a) { return $(a).getStyle("opacity") }, setStyle: function(a, b) { a = $(a); var d, c; d = a.style; if (Object.isString(b)) { a.style.cssText += ";" + b; return b.include("opacity") ? a.setOpacity(b.match(/opacity:\s*(\d?\.?\d*)/)[1]) : a } for (c in b) { if (c == "opacity") { a.setOpacity(b[c]) } else { d[(c == "float" || c == "cssFloat") ? (Object.isUndefined(d.styleFloat) ? "cssFloat" : "styleFloat") : c] = b[c] } } return a }, setOpacity: function(a, b) { a = $(a); a.style.opacity = (b == 1 || b === "") ? "" : (b < 0.00001) ? 0 : b; return a }, getDimensions: function(c) { c = $(c); var g, b, f, d, a, h, e; g = Element.getStyle(c, "display"); if (g != "none" && g != null) { return { width: c.offsetWidth, height: c.offsetHeight} } b = c.style; f = b.visibility; d = b.position; a = b.display; b.visibility = "hidden"; if (d != "fixed") { b.position = "absolute" } b.display = "block"; h = c.clientWidth; e = c.clientHeight; b.display = a; b.position = d; b.visibility = f; return { width: h, height: e} }, makePositioned: function(a) { a = $(a); var b = Element.getStyle(a, "position"); if (b == "static" || !b) { a._madePositioned = true; a.style.position = "relative"; if (Prototype.Browser.Opera) { a.style.top = 0; a.style.left = 0 } } return a }, undoPositioned: function(a) { a = $(a); if (a._madePositioned) { a._madePositioned = undefined; a.style.position = a.style.top = a.style.left = a.style.bottom = a.style.right = "" } return a }, makeClipping: function(a) { a = $(a); if (a._overflow) { return a } a._overflow = Element.getStyle(a, "overflow") || "auto"; if (a._overflow !== "hidden") { a.style.overflow = "hidden" } return a }, undoClipping: function(a) { a = $(a); if (!a._overflow) { return a } a.style.overflow = a._overflow == "auto" ? "" : a._overflow; a._overflow = null; return a }, cumulativeOffset: function(b) { var a = 0, c = 0; do { a += b.offsetTop || 0; c += b.offsetLeft || 0; b = b.offsetParent } while (b); return Element._returnOffset(c, a) }, positionedOffset: function(b) { var a, d, c; a = 0; d = 0; do { a += b.offsetTop || 0; d += b.offsetLeft || 0; b = b.offsetParent; if (b) { if (b.tagName.toUpperCase() == "BODY") { break } c = Element.getStyle(b, "position"); if (c !== "static") { break } } } while (b); return Element._returnOffset(d, a) }, absolutize: function(b) { b = $(b); if (Element.getStyle(b, "position") == "absolute") { return b } var d, f, e, c, a; d = Element.positionedOffset(b); f = d[1]; e = d[0]; c = b.clientWidth; a = b.clientHeight; b._originalLeft = e - parseFloat(b.style.left || 0); b._originalTop = f - parseFloat(b.style.top || 0); b._originalWidth = b.style.width; b._originalHeight = b.style.height; b.style.position = "absolute"; b.style.top = f + "px"; b.style.left = e + "px"; b.style.width = c + "px"; b.style.height = a + "px"; return b }, relativize: function(a) { a = $(a); if (Element.getStyle(a, "position") == "relative") { return a } a.style.position = "relative"; var c, b; c = parseFloat(a.style.top || 0) - (a._originalTop || 0); b = parseFloat(a.style.left || 0) - (a._originalLeft || 0); a.style.top = c + "px"; a.style.left = b + "px"; a.style.height = a._originalHeight; a.style.width = a._originalWidth; return a }, cumulativeScrollOffset: function(b) { var a = 0, c = 0; do { a += b.scrollTop || 0; c += b.scrollLeft || 0; b = b.parentNode } while (b); return Element._returnOffset(c, a) }, getOffsetParent: function(a) { if (a.offsetParent) { return $(a.offsetParent) } if (a == document.body) { return $(a) } while ((a = a.parentNode) && a != document.body) { if (Element.getStyle(a, "position") != "static") { return $(a) } } return $(document.body) }, viewportOffset: function(d) { var a, c, b; a = 0; c = 0; b = d; do { a += b.offsetTop || 0; c += b.offsetLeft || 0; if (b.offsetParent == document.body && Element.getStyle(b, "position") == "absolute") { break } } while (b = b.offsetParent); b = d; do { if (!Prototype.Browser.Opera || (b.tagName && (b.tagName.toUpperCase() == "BODY"))) { a -= b.scrollTop || 0; c -= b.scrollLeft || 0 } } while (b = b.parentNode); return Element._returnOffset(c, a) }, clonePosition: function(b, d) { var a, e, f, c; a = Object.extend({ setLeft: true, setTop: true, setWidth: true, setHeight: true, offsetTop: 0, offsetLeft: 0 }, arguments[2] || {}); d = $(d); e = Element.viewportOffset(d); b = $(b); f = [0, 0]; c = null; if (Element.getStyle(b, "position") == "absolute") { c = Element.getOffsetParent(b); f = Element.viewportOffset(c) } if (c == document.body) { f[0] -= document.body.offsetLeft; f[1] -= document.body.offsetTop } if (a.setLeft) { b.style.left = (e[0] - f[0] + a.offsetLeft) + "px" } if (a.setTop) { b.style.top = (e[1] - f[1] + a.offsetTop) + "px" } if (a.setWidth) { b.style.width = d.offsetWidth + "px" } if (a.setHeight) { b.style.height = d.offsetHeight + "px" } return b } }; Object.extend(Element.Methods, { getElementsBySelector: Element.Methods.select, childElements: Element.Methods.immediateDescendants }); Element._attributeTranslations = { write: { names: { className: "class", htmlFor: "for" }, values: {}} }; if (Prototype.Browser.Opera) { Element.Methods.getStyle = Element.Methods.getStyle.wrap(function(d, b, c) { switch (c) { case "left": case "top": case "right": case "bottom": if (d(b, "position") === "static") { return null } case "height": case "width": if (!Element.visible(b)) { return null } var e, a; e = parseInt(d(b, c), 10); if (e !== b["offset" + c.capitalize()]) { return e + "px" } if (c === "height") { a = ["border-top-width", "padding-top", "padding-bottom", "border-bottom-width"] } else { a = ["border-left-width", "padding-left", "padding-right", "border-right-width"] } return a.inject(e, function(f, g) { var h = d(b, g); return h === null ? f : f - parseInt(h, 10) }) + "px"; default: return d(b, c) } }); Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(function(c, a, b) { if (b === "title") { return a.title } return c(a, b) }) } else { if (Prototype.Browser.IE) { Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(function(c, b) { b = $(b); try { b.offsetParent } catch (f) { return $(document.body) } var a, d; a = b.getStyle("position"); if (a !== "static") { return c(b) } b.setStyle({ position: "relative" }); d = c(b); b.setStyle({ position: a }); return d }); $w("positionedOffset viewportOffset").each(function(a) { Element.Methods[a] = Element.Methods[a].wrap(function(f, c) { c = $(c); try { c.offsetParent } catch (h) { return Element._returnOffset(0, 0) } var b, d, g; b = c.getStyle("position"); if (b !== "static") { return f(c) } d = c.getOffsetParent(); if (d && d.getStyle("position") === "fixed") { d.setStyle({ zoom: 1 }) } c.setStyle({ position: "relative" }); g = f(c); c.setStyle({ position: b }); return g }) }); Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap(function(b, a) { try { a.offsetParent } catch (c) { return Element._returnOffset(0, 0) } return b(a) }); Element.Methods.getStyle = function(a, b) { a = $(a); b = (b == "float" || b == "cssFloat") ? "styleFloat" : b.camelize(); var c = a.style[b]; if (!c && a.currentStyle) { c = a.currentStyle[b] } if (b == "opacity") { if (c = (a.getStyle("filter") || "").match(/alpha\(opacity=(.*)\)/)) { if (c[1]) { return parseFloat(c[1]) / 100 } } return 1 } if (c == "auto") { if ((b == "width" || b == "height") && (a.getStyle("display") != "none")) { return a["offset" + b.capitalize()] + "px" } return null } return c }; Element.Methods.setOpacity = function(b, e) { function f(g) { return g.replace(/alpha\([^\)]*\)/gi, "") } b = $(b); var a, d, c; a = b.currentStyle; if ((a && !a.hasLayout) || (!a && b.style.zoom == "normal")) { b.style.zoom = 1 } d = b.getStyle("filter"); c = b.style; if (e == 1 || e === "") { (d = f(d)) ? c.filter = d : c.removeAttribute("filter"); return b } else { if (e < 0.00001) { e = 0 } } c.filter = f(d) + "alpha(opacity=" + (e * 100) + ")"; return b }; Element._attributeTranslations = (function() { var b, a, c; b = "className"; a = "for"; c = document.createElement("div"); c.setAttribute(b, "x"); if (c.className !== "x") { c.setAttribute("class", "x"); if (c.className === "x") { b = "class" } } c = null; c = document.createElement("label"); c.setAttribute(a, "x"); if (c.htmlFor !== "x") { c.setAttribute("htmlFor", "x"); if (c.htmlFor === "x") { a = "htmlFor" } } c = null; return { read: { names: { "class": b, className: b, "for": a, htmlFor: a }, values: { _getAttr: function(d, e) { return d.getAttribute(e) }, _getAttr2: function(d, e) { return d.getAttribute(e, 2) }, _getAttrNode: function(d, f) { var e = d.getAttributeNode(f); return e ? e.value : "" }, _getEv: (function() { var d, g, e; d = document.createElement("div"); d.onclick = Prototype.emptyFunction; g = d.getAttribute("onclick"); if (String(g).indexOf("{") > -1) { e = function(f, h) { h = f.getAttribute(h); if (!h) { return null } h = h.toString(); h = h.split("{")[1]; h = h.split("}")[0]; return h.strip() } } else { if (g === "") { e = function(f, h) { h = f.getAttribute(h); if (!h) { return null } return h.strip() } } } d = null; return e })(), _flag: function(d, e) { return $(d).hasAttribute(e) ? e : null }, style: function(d) { return d.style.cssText.toLowerCase() }, title: function(d) { return d.title } }}} })(); Element._attributeTranslations.write = { names: Object.extend({ cellpadding: "cellPadding", cellspacing: "cellSpacing" }, Element._attributeTranslations.read.names), values: { checked: function(a, b) { a.checked = !!b }, style: function(a, b) { a.style.cssText = b ? b : "" } } }; Element._attributeTranslations.has = {}; $w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc frameBorder").each(function(a) { Element._attributeTranslations.write.names[a.toLowerCase()] = a; Element._attributeTranslations.has[a.toLowerCase()] = a }); (function(a) { Object.extend(a, { href: a._getAttr2, src: a._getAttr2, type: a._getAttr, action: a._getAttrNode, disabled: a._flag, checked: a._flag, readonly: a._flag, multiple: a._flag, onload: a._getEv, onunload: a._getEv, onclick: a._getEv, ondblclick: a._getEv, onmousedown: a._getEv, onmouseup: a._getEv, onmouseover: a._getEv, onmousemove: a._getEv, onmouseout: a._getEv, onfocus: a._getEv, onblur: a._getEv, onkeypress: a._getEv, onkeydown: a._getEv, onkeyup: a._getEv, onsubmit: a._getEv, onreset: a._getEv, onselect: a._getEv, onchange: a._getEv }) })(Element._attributeTranslations.read.values); if (Prototype.BrowserFeatures.ElementExtensions) { (function() { function a(e) { var b, d, c; b = e.getElementsByTagName("*"); d = []; for (c = 0, node; node = b[c]; c++) { if (node.tagName !== "!") { d.push(node) } } return d } Element.Methods.down = function(c, d, b) { c = $(c); if (arguments.length == 1) { return c.firstDescendant() } return Object.isNumber(d) ? a(c)[d] : Element.select(c, d)[b || 0] } })() } } else { if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { Element.Methods.setOpacity = function(a, b) { a = $(a); a.style.opacity = (b == 1) ? 0.999999 : (b === "") ? "" : (b < 0.00001) ? 0 : b; return a } } else { if (Prototype.Browser.WebKit) { Element.Methods.setOpacity = function(a, b) { a = $(a); a.style.opacity = (b == 1 || b === "") ? "" : (b < 0.00001) ? 0 : b; if (b == 1) { if (a.tagName.toUpperCase() == "IMG" && a.width) { a.width++; a.width-- } else { try { var d = document.createTextNode(" "); a.appendChild(d); a.removeChild(d) } catch (c) { } } } return a }; Element.Methods.cumulativeOffset = function(b) { var a = 0, c = 0; do { a += b.offsetTop || 0; c += b.offsetLeft || 0; if (b.offsetParent == document.body) { if (Element.getStyle(b, "position") == "absolute") { break } } b = b.offsetParent } while (b); return Element._returnOffset(c, a) } } } } } if ("outerHTML" in document.documentElement) { Element.Methods.replace = function(c, e) { c = $(c); if (e && e.toElement) { e = e.toElement() } if (Object.isElement(e)) { c.parentNode.replaceChild(e, c); return c } e = Object.toHTML(e); var d, b, f, a; d = c.parentNode; b = d.tagName.toUpperCase(); if (Element._insertionTranslations.tags[b]) { f = c.next(); a = Element._getContentFromAnonymousElement(b, e.stripScripts()); d.removeChild(c); if (f) { a.each(function(g) { d.insertBefore(g, f) }) } else { a.each(function(g) { d.appendChild(g) }) } } else { c.outerHTML = e.stripScripts() } e.evalScripts.bind(e).defer(); return c } } Element._returnOffset = function(b, c) { var a = [b, c]; a.left = b; a.top = c; return a }; Element._getContentFromAnonymousElement = function(c, b) { var d = new Element("div"), a = Element._insertionTranslations.tags[c]; if (a) { d.innerHTML = a[0] + b + a[1]; a[2].times(function() { d = d.firstChild }) } else { d.innerHTML = b } return $A(d.childNodes) }; Element._insertionTranslations = { before: function(a, b) { a.parentNode.insertBefore(b, a) }, top: function(a, b) { a.insertBefore(b, a.firstChild) }, bottom: function(a, b) { a.appendChild(b) }, after: function(a, b) { a.parentNode.insertBefore(b, a.nextSibling) }, tags: { TABLE: ["<table>", "</table>", 1], TBODY: ["<table><tbody>", "</tbody></table>", 2], TR: ["<table><tbody><tr>", "</tr></tbody></table>", 3], TD: ["<table><tbody><tr><td>", "</td></tr></tbody></table>", 4], SELECT: ["<select>", "</select>", 1]} }; (function() { var a = Element._insertionTranslations.tags; Object.extend(a, { THEAD: a.TBODY, TFOOT: a.TBODY, TH: a.TD }) })(); Element.Methods.Simulated = { hasAttribute: function(a, c) { c = Element._attributeTranslations.has[c] || c; var b = $(a).getAttributeNode(c); return !!(b && b.specified) } }; Element.Methods.ByTag = {}; Object.extend(Element, Element.Methods); (function(a) { if (!Prototype.BrowserFeatures.ElementExtensions && a.__proto__) { window.HTMLElement = {}; window.HTMLElement.prototype = a.__proto__; Prototype.BrowserFeatures.ElementExtensions = true } a = null })(document.createElement("div")); Element.extend = (function() { function c(g) { if (typeof window.Element != "undefined") { var i, k, h, j; i = window.Element.prototype; if (i) { k = "_" + (Math.random() + "").slice(2); h = document.createElement(g); i[k] = "x"; j = (h[k] !== "x"); delete i[k]; h = null; return j } } return false } function b(h, g) { var j, i; for (j in g) { i = g[j]; if (Object.isFunction(i) && !(j in h)) { h[j] = i.methodize() } } } var d, a, e, f; d = c("object"); if (Prototype.BrowserFeatures.SpecificElementExtensions) { if (d) { return function(h) { if (h && typeof h._extendedByPrototype == "undefined") { var g = h.tagName; if (g && (/^(?:object|applet|embed)$/i.test(g))) { b(h, Element.Methods); b(h, Element.Methods.Simulated); b(h, Element.Methods.ByTag[g.toUpperCase()]) } } return h } } return Prototype.K } a = {}; e = Element.Methods.ByTag; f = Object.extend(function(i) { if (!i || typeof i._extendedByPrototype != "undefined" || i.nodeType != 1 || i == window) { return i } var g = Object.clone(a), h = i.tagName.toUpperCase(); if (e[h]) { Object.extend(g, e[h]) } b(i, g); i._extendedByPrototype = Prototype.emptyFunction; return i }, { refresh: function() { if (!Prototype.BrowserFeatures.ElementExtensions) { Object.extend(a, Element.Methods); Object.extend(a, Element.Methods.Simulated) } } }); f.refresh(); return f })(); Element.hasAttribute = function(a, b) { if (a.hasAttribute) { return a.hasAttribute(b) } return Element.Methods.Simulated.hasAttribute(a, b) }; Element.addMethods = function(c) { var h, d, b, g, i; h = Prototype.BrowserFeatures; d = Element.Methods.ByTag; if (!c) { Object.extend(Form, Form.Methods); Object.extend(Form.Element, Form.Element.Methods); Object.extend(Element.Methods.ByTag, { FORM: Object.clone(Form.Methods), INPUT: Object.clone(Form.Element.Methods), SELECT: Object.clone(Form.Element.Methods), TEXTAREA: Object.clone(Form.Element.Methods) }) } if (arguments.length == 2) { b = c; c = arguments[1] } if (!b) { Object.extend(Element.Methods, c || {}) } else { if (Object.isArray(b)) { b.each(f) } else { f(b) } } function f(j) { j = j.toUpperCase(); if (!Element.Methods.ByTag[j]) { Element.Methods.ByTag[j] = {} } Object.extend(Element.Methods.ByTag[j], c) } function a(l, k, j) { j = j || false; var n, m; for (n in l) { m = l[n]; if (!Object.isFunction(m)) { continue } if (!j || !(n in k)) { k[n] = m.methodize() } } } function e(m) { var j, l, k, n; l = { OPTGROUP: "OptGroup", TEXTAREA: "TextArea", P: "Paragraph", FIELDSET: "FieldSet", UL: "UList", OL: "OList", DL: "DList", DIR: "Directory", H1: "Heading", H2: "Heading", H3: "Heading", H4: "Heading", H5: "Heading", H6: "Heading", Q: "Quote", INS: "Mod", DEL: "Mod", A: "Anchor", IMG: "Image", CAPTION: "TableCaption", COL: "TableCol", COLGROUP: "TableCol", THEAD: "TableSection", TFOOT: "TableSection", TBODY: "TableSection", TR: "TableRow", TH: "TableCell", TD: "TableCell", FRAMESET: "FrameSet", IFRAME: "IFrame" }; if (l[m]) { j = "HTML" + l[m] + "Element" } if (window[j]) { return window[j] } j = "HTML" + m + "Element"; if (window[j]) { return window[j] } j = "HTML" + m.capitalize() + "Element"; if (window[j]) { return window[j] } k = document.createElement(m); n = k.__proto__ || k.constructor.prototype; k = null; return n } g = window.HTMLElement ? HTMLElement.prototype : Element.prototype; if (h.ElementExtensions) { a(Element.Methods, g); a(Element.Methods.Simulated, g, true) } if (h.SpecificElementExtensions) { for (i in Element.Methods.ByTag) { klass = e(i); if (Object.isUndefined(klass)) { continue } a(d[i], klass.prototype) } } Object.extend(Element, Element.Methods); delete Element.ByTag; if (Element.extend.refresh) { Element.extend.refresh() } Element.cache = {} }; document.viewport = { getDimensions: function() { return { width: this.getWidth(), height: this.getHeight()} }, getScrollOffsets: function() { return Element._returnOffset(window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop) } }; (function(b) { var g = Prototype.Browser, e = document, c, d = {}; function a() { if (g.WebKit && !e.evaluate) { return document } if (g.Opera && window.parseFloat(window.opera.version()) < 9.5) { return document.body } return document.documentElement } function f(h) { if (!c) { c = a() } d[h] = "client" + h; b["get" + h] = function() { return c[d[h]] }; return b["get" + h]() } b.getWidth = f.curry("Width"); b.getHeight = f.curry("Height") })(document.viewport); Element.Storage = { UID: 1 }; Element.addMethods({ getStorage: function(b) { if (!(b = $(b))) { return } var a; if (b === window) { a = 0 } else { if (typeof b._prototypeUID === "undefined") { b._prototypeUID = [Element.Storage.UID++] } a = b._prototypeUID[0] } if (!Element.Storage[a]) { Element.Storage[a] = $H() } return Element.Storage[a] }, store: function(b, a, c) { if (!(b = $(b))) { return } if (arguments.length === 2) { Element.getStorage(b).update(a) } else { Element.getStorage(b).set(a, c) } return b }, retrieve: function(c, b, a) { if (!(c = $(c))) { return } var e = Element.getStorage(c), d = e.get(b); if (Object.isUndefined(d)) { e.set(b, a); d = a } return d }, clone: function(c, a) { if (!(c = $(c))) { return } var e, d, b; e = c.cloneNode(a); e._prototypeUID = void 0; if (a) { d = Element.select(e, "*"); b = d.length; while (b--) { d[b]._prototypeUID = void 0 } } return Element.extend(e) } }); Selector = Class.create({ initialize: function(a) { this.expression = a.strip(); if (this.shouldUseSelectorsAPI()) { this.mode = "selectorsAPI" } else { if (this.shouldUseXPath()) { this.mode = "xpath"; this.compileXPathMatcher() } else { this.mode = "normal"; this.compileMatcher() } } }, shouldUseXPath: (function() { var a = (function() { var e, d, c, b; e = false; if (document.evaluate && window.XPathResult) { d = document.createElement("div"); d.innerHTML = "<ul><li></li></ul><div><ul><li></li></ul></div>"; c = ".//*[local-name()='ul' or local-name()='UL']//*[local-name()='li' or local-name()='LI']"; b = document.evaluate(c, d, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); e = (b.snapshotLength !== 2); d = null } return e })(); return function() { if (!Prototype.BrowserFeatures.XPath) { return false } var b = this.expression; if (Prototype.Browser.WebKit && (b.include("-of-type") || b.include(":empty"))) { return false } if ((/(\[[\w-]*?:|:checked)/).test(b)) { return false } if (a) { return false } return true } })(), shouldUseSelectorsAPI: function() { if (!Prototype.BrowserFeatures.SelectorsAPI) { return false } if (Selector.CASE_INSENSITIVE_CLASS_NAMES) { return false } if (!Selector._div) { Selector._div = new Element("div") } try { Selector._div.querySelector(this.expression) } catch (a) { return false } return true }, compileMatcher: function() { var e, ps, h, c, len, le, i, p, m, name; e = this.expression; ps = Selector.patterns; h = Selector.handlers; c = Selector.criteria; len = ps.length; if (Selector._cache[e]) { this.matcher = Selector._cache[e]; return } this.matcher = ["this.matcher = function(root) {", "var r = root, h = Selector.handlers, c = false, n;"]; while (e && le != e && (/\S/).test(e)) { le = e; for (i = 0; i < len; i++) { p = ps[i].re; name = ps[i].name; if (m = e.match(p)) { this.matcher.push(Object.isFunction(c[name]) ? c[name](m) : new Template(c[name]).evaluate(m)); e = e.replace(m[0], ""); break } } } this.matcher.push("return h.unique(n);\n}"); eval(this.matcher.join("\n")); Selector._cache[this.expression] = this.matcher }, compileXPathMatcher: function() { var h, j, c, b, g, f, d, a; h = this.expression; j = Selector.patterns; c = Selector.xpath; b = j.length; if (Selector._cache[h]) { this.xpath = Selector._cache[h]; return } this.matcher = [".//*"]; while (h && g != h && (/\S/).test(h)) { g = h; for (f = 0; f < b; f++) { d = j[f].name; if (a = h.match(j[f].re)) { this.matcher.push(Object.isFunction(c[d]) ? c[d](a) : new Template(c[d]).evaluate(a)); h = h.replace(a[0], ""); break } } } this.xpath = this.matcher.join(""); Selector._cache[this.expression] = this.xpath }, findElements: function(a) { a = a || document; var c, d, f, b; c = this.expression; switch (this.mode) { case "selectorsAPI": if (a !== document) { d = a.id; f = $(a).identify(); f = f.replace(/([\.:])/g, "\\$1"); c = "#" + f + " " + c } b = $A(a.querySelectorAll(c)).map(Element.extend); a.id = d; return b; case "xpath": return document._getElementsByXPath(this.xpath, a); default: return this.matcher(a) } }, match: function(h) { this.tokens = []; var o, a, g, n, b, j, d, c, f, l, k; o = this.expression; a = Selector.patterns; g = Selector.assertions; n = a.length; while (o && b !== o && (/\S/).test(o)) { b = o; for (j = 0; j < n; j++) { d = a[j].re; c = a[j].name; if (f = o.match(d)) { if (g[c]) { this.tokens.push([c, Object.clone(f)]); o = o.replace(f[0], "") } else { return this.findElements(document).include(h) } } } } k = true; for (j = 0, token; token = this.tokens[j]; j++) { c = token[0]; l = token[1]; if (!Selector.assertions[c](h, l)) { k = false; break } } return k }, toString: function() { return this.expression }, inspect: function() { return "#<Selector:" + this.expression.inspect() + ">" } }); if (Prototype.BrowserFeatures.SelectorsAPI && document.compatMode === "BackCompat") { Selector.CASE_INSENSITIVE_CLASS_NAMES = (function() { var c, a, b; c = document.createElement("div"); a = document.createElement("span"); c.id = "prototype_test_id"; a.className = "Test"; c.appendChild(a); b = (c.querySelector("#prototype_test_id .test") !== null); c = a = null; return b })() } Object.extend(Selector, { _cache: {}, xpath: { descendant: "//*", child: "/*", adjacent: "/following-sibling::*[1]", laterSibling: "/following-sibling::*", tagName: function(a) { if (a[1] == "*") { return "" } return "[local-name()='" + a[1].toLowerCase() + "' or local-name()='" + a[1].toUpperCase() + "']" }, className: "[contains(concat(' ', @class, ' '), ' #{1} ')]", id: "[@id='#{1}']", attrPresence: function(a) { a[1] = a[1].toLowerCase(); return new Template("[@#{1}]").evaluate(a) }, attr: function(a) { a[1] = a[1].toLowerCase(); a[3] = a[5] || a[6]; return new Template(Selector.xpath.operators[a[2]]).evaluate(a) }, pseudo: function(a) { var b = Selector.xpath.pseudos[a[1]]; if (!b) { return "" } if (Object.isFunction(b)) { return b(a) } return new Template(Selector.xpath.pseudos[a[1]]).evaluate(a) }, operators: { "=": "[@#{1}='#{3}']", "!=": "[@#{1}!='#{3}']", "^=": "[starts-with(@#{1}, '#{3}')]", "$=": "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']", "*=": "[contains(@#{1}, '#{3}')]", "~=": "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]", "|=": "[contains(concat('-', @#{1}, '-'), '-#{3}-')]" }, pseudos: { "first-child": "[not(preceding-sibling::*)]", "last-child": "[not(following-sibling::*)]", "only-child": "[not(preceding-sibling::* or following-sibling::*)]", empty: "[count(*) = 0 and (count(text()) = 0)]", checked: "[@checked]", disabled: "[(@disabled) and (@type!='hidden')]", enabled: "[not(@disabled) and (@type!='hidden')]", not: function(f) { var j, c, k, h, d, a, g, l, b; j = f[6]; c = Selector.patterns; k = Selector.xpath; h = c.length; d = []; while (j && a != j && (/\S/).test(j)) { a = j; for (g = 0; g < h; g++) { b = c[g].name; if (f = j.match(c[g].re)) { l = Object.isFunction(k[b]) ? k[b](f) : new Template(k[b]).evaluate(f); d.push("(" + l.substring(1, l.length - 1) + ")"); j = j.replace(f[0], ""); break } } } return "[not(" + d.join(" and ") + ")]" }, "nth-child": function(a) { return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", a) }, "nth-last-child": function(a) { return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", a) }, "nth-of-type": function(a) { return Selector.xpath.pseudos.nth("position() ", a) }, "nth-last-of-type": function(a) { return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", a) }, "first-of-type": function(a) { a[6] = "1"; return Selector.xpath.pseudos["nth-of-type"](a) }, "last-of-type": function(a) { a[6] = "1"; return Selector.xpath.pseudos["nth-last-of-type"](a) }, "only-of-type": function(a) { var b = Selector.xpath.pseudos; return b["first-of-type"](a) + b["last-of-type"](a) }, nth: function(g, e) { var i, h, f, d, c; i = e[6]; if (i == "even") { i = "2n+0" } if (i == "odd") { i = "2n+1" } if (h = i.match(/^(\d+)$/)) { return "[" + g + "= " + h[1] + "]" } if (h = i.match(/^(-?\d*)?n(([+-])(\d+))?/)) { if (h[1] == "-") { h[1] = -1 } f = h[1] ? Number(h[1]) : 1; d = h[2] ? Number(h[2]) : 0; c = "[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]"; return new Template(c).evaluate({ fragment: g, a: f, b: d }) } } } }, criteria: { tagName: 'n = h.tagName(n, r, "#{1}", c);      c = false;', className: 'n = h.className(n, r, "#{1}", c);    c = false;', id: 'n = h.id(n, r, "#{1}", c);           c = false;', attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;', attr: function(a) { a[3] = (a[5] || a[6]); return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(a) }, pseudo: function(a) { if (a[6]) { a[6] = a[6].replace(/"/g, '\\"') } return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(a) }, descendant: 'c = "descendant";', child: 'c = "child";', adjacent: 'c = "adjacent";', laterSibling: 'c = "laterSibling";' }, patterns: [{ name: "laterSibling", re: /^\s*~\s*/ }, { name: "child", re: /^\s*>\s*/ }, { name: "adjacent", re: /^\s*\+\s*/ }, { name: "descendant", re: /^\s/ }, { name: "tagName", re: /^\s*(\*|[\w\-]+)(\b|$)?/ }, { name: "id", re: /^#([\w\-\*]+)(\b|$)/ }, { name: "className", re: /^\.([\w\-\*]+)(\b|$)/ }, { name: "pseudo", re: /^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/ }, { name: "attrPresence", re: /^\[((?:[\w-]+:)?[\w-]+)\]/ }, { name: "attr", re: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/}], assertions: { tagName: function(a, b) { return b[1].toUpperCase() == a.tagName.toUpperCase() }, className: function(a, b) { return Element.hasClassName(a, b[1]) }, id: function(a, b) { return a.id === b[1] }, attrPresence: function(a, b) { return Element.hasAttribute(a, b[1]) }, attr: function(b, c) { var a = Element.readAttribute(b, c[1]); return a && Selector.operators[c[2]](a, c[5] || c[6]) } }, handlers: { concat: function(d, c) { for (var e = 0, f; f = c[e]; e++) { d.push(f) } return d }, mark: function(a) { var c, b; c = Prototype.emptyFunction; for (b = 0, node; node = a[b]; b++) { node._countedByPrototype = c } return a }, unmark: (function() { var a = (function() { var b = document.createElement("div"), e = false, d = "_countedByPrototype", c = "x"; b[d] = c; e = (b.getAttribute(d) === c); b = null; return e })(); return a ? function(b) { for (var c = 0, d; d = b[c]; c++) { d.removeAttribute("_countedByPrototype") } return b } : function(b) { for (var c = 0, d; d = b[c]; c++) { d._countedByPrototype = void 0 } return b } })(), index: function(a, d, g) { var b, e, c, f; a._countedByPrototype = Prototype.emptyFunction; if (d) { for (b = a.childNodes, e = b.length - 1, c = 1; e >= 0; e--) { f = b[e]; if (f.nodeType == 1 && (!g || f._countedByPrototype)) { f.nodeIndex = c++ } } } else { for (e = 0, c = 1, b = a.childNodes; f = b[e]; e++) { if (f.nodeType == 1 && (!g || f._countedByPrototype)) { f.nodeIndex = c++ } } } }, unique: function(b) { if (b.length == 0) { return b } var d, e, c, a; d = []; for (c = 0, a = b.length; c < a; c++) { if (typeof (e = b[c])._countedByPrototype == "undefined") { e._countedByPrototype = Prototype.emptyFunction; d.push(Element.extend(e)) } } return Selector.handlers.unmark(d) }, descendant: function(a) { var d, c, b; d = Selector.handlers; for (c = 0, b = []; node = a[c]; c++) { d.concat(b, node.getElementsByTagName("*")) } return b }, child: function(a) { var e, d, c, f, b, g; e = Selector.handlers; for (d = 0, c = []; f = a[d]; d++) { for (b = 0; g = f.childNodes[b]; b++) { if (g.nodeType == 1 && g.tagName != "!") { c.push(g) } } } return c }, adjacent: function(a) { var c, b, e, d; for (c = 0, b = []; e = a[c]; c++) { d = this.nextElementSibling(e); if (d) { b.push(d) } } return b }, laterSibling: function(a) { var d, c, b, e; d = Selector.handlers; for (c = 0, b = []; e = a[c]; c++) { d.concat(b, Element.nextSiblings(e)) } return b }, nextElementSibling: function(a) { while (a = a.nextSibling) { if (a.nodeType == 1) { return a } } return null }, previousElementSibling: function(a) { while (a = a.previousSibling) { if (a.nodeType == 1) { return a } } return null }, tagName: function(a, j, c, b) { var k, e, g, f, d; k = c.toUpperCase(); e = []; g = Selector.handlers; if (a) { if (b) { if (b == "descendant") { for (f = 0; d = a[f]; f++) { g.concat(e, d.getElementsByTagName(c)) } return e } else { a = this[b](a) } if (c == "*") { return a } } for (f = 0; d = a[f]; f++) { if (d.tagName.toUpperCase() === k) { e.push(d) } } return e } else { return j.getElementsByTagName(c) } }, id: function(a, l, b, c) { var k, g, f, e, d; k = $(b); g = Selector.handlers; if (l == document) { if (!k) { return [] } if (!a) { return [k] } } else { if (!l.sourceIndex || l.sourceIndex < 1) { a = l.getElementsByTagName("*"); for (e = 0; d = a[e]; e++) { if (d.id === b) { return [d] } } } } if (a) { if (c) { if (c == "child") { for (f = 0; d = a[f]; f++) { if (k.parentNode == d) { return [k] } } } else { if (c == "descendant") { for (f = 0; d = a[f]; f++) { if (Element.descendantOf(k, d)) { return [k] } } } else { if (c == "adjacent") { for (f = 0; d = a[f]; f++) { if (Selector.handlers.previousElementSibling(k) == d) { return [k] } } } else { a = g[c](a) } } } } for (f = 0; d = a[f]; f++) { if (d == k) { return [k] } } return [] } return (k && Element.descendantOf(k, l)) ? [k] : [] }, className: function(b, a, c, d) { if (b && d) { b = this[d](b) } return Selector.handlers.byClassName(b, a, c) }, byClassName: function(c, b, f) { if (!c) { c = Selector.handlers.descendant([b]) } var h, e, d, g, a; h = " " + f + " "; for (e = 0, d = []; g = c[e]; e++) { a = g.className; if (a.length == 0) { continue } if (a == f || (" " + a + " ").include(h)) { d.push(g) } } return d }, attrPresence: function(c, b, a, g) { if (!c) { c = b.getElementsByTagName("*") } if (c && g) { c = this[g](c) } var e, d, f; e = []; for (d = 0; f = c[d]; d++) { if (Element.hasAttribute(f, a)) { e.push(f) } } return e }, attr: function(a, j, h, k, c, b) { if (!a) { a = j.getElementsByTagName("*") } if (a && b) { a = this[b](a) } var l, f, e, d, g; l = Selector.operators[c]; f = []; for (e = 0; d = a[e]; e++) { g = Element.readAttribute(d, h); if (g === null) { continue } if (l(g, k)) { f.push(d) } } return f }, pseudo: function(b, c, e, a, d) { if (b && d) { b = this[d](b) } if (!b) { b = a.getElementsByTagName("*") } return Selector.pseudos[c](b, e, a) } }, pseudos: { "first-child": function(b, f, a) { for (var d = 0, c = [], e; e = b[d]; d++) { if (Selector.handlers.previousElementSibling(e)) { continue } c.push(e) } return c }, "last-child": function(b, f, a) { for (var d = 0, c = [], e; e = b[d]; d++) { if (Selector.handlers.nextElementSibling(e)) { continue } c.push(e) } return c }, "only-child": function(b, g, a) { var e, d, c, f; e = Selector.handlers; for (d = 0, c = []; f = b[d]; d++) { if (!e.previousElementSibling(f) && !e.nextElementSibling(f)) { c.push(f) } } return c }, "nth-child": function(b, c, a) { return Selector.pseudos.nth(b, c, a) }, "nth-last-child": function(b, c, a) { return Selector.pseudos.nth(b, c, a, true) }, "nth-of-type": function(b, c, a) { return Selector.pseudos.nth(b, c, a, false, true) }, "nth-last-of-type": function(b, c, a) { return Selector.pseudos.nth(b, c, a, true, true) }, "first-of-type": function(b, c, a) { return Selector.pseudos.nth(b, "1", a, false, true) }, "last-of-type": function(b, c, a) { return Selector.pseudos.nth(b, "1", a, true, true) }, "only-of-type": function(b, d, a) { var c = Selector.pseudos; return c["last-of-type"](c["first-of-type"](b, d, a), d, a) }, getIndices: function(d, c, e) { if (d == 0) { return c > 0 ? [c] : [] } return $R(1, e).inject([], function(a, b) { if (0 == (b - c) % d && (b - c) / d >= 0) { a.push(b) } return a }) }, nth: function(c, s, u, r, e) { if (c.length == 0) { return [] } if (s == "even") { s = "2n+0" } if (s == "odd") { s = "2n+1" } var q, p, d, g, o, f, v, t, w, k, n; q = Selector.handlers; p = []; d = []; q.mark(c); for (o = 0; f = c[o]; o++) { if (!f.parentNode._countedByPrototype) { q.index(f.parentNode, r, e); d.push(f.parentNode) } } if (s.match(/^\d+$/)) { s = Number(s); for (o = 0; f = c[o]; o++) { if (f.nodeIndex == s) { p.push(f) } } } else { if (g = s.match(/^(-?\d*)?n(([+-])(\d+))?/)) { if (g[1] == "-") { g[1] = -1 } v = g[1] ? Number(g[1]) : 1; t = g[2] ? Number(g[2]) : 0; w = Selector.pseudos.getIndices(v, t, c.length); for (o = 0, k = w.length; f = c[o]; o++) { for (n = 0; n < k; n++) { if (f.nodeIndex == w[n]) { p.push(f) } } } } } q.unmark(c); q.unmark(d); return p }, empty: function(b, f, a) { for (var d = 0, c = [], e; e = b[d]; d++) { if (e.tagName == "!" || e.firstChild) { continue } c.push(e) } return c }, not: function(d, a, b) { var g, c, f, e, j; g = Selector.handlers; c = new Selector(a).findElements(b); g.mark(c); for (f = 0, e = []; j = d[f]; f++) { if (!j._countedByPrototype) { e.push(j) } } g.unmark(c); return e }, enabled: function(b, f, a) { for (var d = 0, c = [], e; e = b[d]; d++) { if (!e.disabled && (!e.type || e.type !== "hidden")) { c.push(e) } } return c }, disabled: function(b, f, a) { for (var d = 0, c = [], e; e = b[d]; d++) { if (e.disabled) { c.push(e) } } return c }, checked: function(b, f, a) { for (var d = 0, c = [], e; e = b[d]; d++) { if (e.checked) { c.push(e) } } return c } }, operators: { "=": function(b, a) { return b == a }, "!=": function(b, a) { return b != a }, "^=": function(b, a) { return b == a || b && b.startsWith(a) }, "$=": function(b, a) { return b == a || b && b.endsWith(a) }, "*=": function(b, a) { return b == a || b && b.include(a) }, "~=": function(b, a) { return (" " + b + " ").include(" " + a + " ") }, "|=": function(b, a) { return ("-" + (b || "").toUpperCase() + "-").include("-" + (a || "").toUpperCase() + "-") } }, split: function(b) { var a = []; b.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(c) { a.push(c[1].strip()) }); return a }, matchElements: function(f, g) { var e, d, c, b, a; e = $$(g); d = Selector.handlers; d.mark(e); for (c = 0, b = []; a = f[c]; c++) { if (a._countedByPrototype) { b.push(a) } } d.unmark(e); return b }, findElement: function(b, c, a) { if (Object.isNumber(c)) { a = c; c = false } return Selector.matchElements(b, c || "*")[a || 0] }, findChildElements: function(e, g) { g = Selector.split(g.join(",")); var d, f, c, b, a; d = []; f = Selector.handlers; for (c = 0, b = g.length; c < b; c++) { a = new Selector(g[c].strip()); f.concat(d, a.findElements(e)) } return (b > 1) ? f.unique(d) : d } }); if (Prototype.Browser.IE) { Object.extend(Selector.handlers, { concat: function(d, c) { for (var e = 0, f; f = c[e]; e++) { if (f.tagName !== "!") { d.push(f) } } return d } }) } function $$() { return Selector.findChildElements(document, $A(arguments)) } Form = { reset: function(a) { a = $(a); a.reset(); return a }, serializeElements: function(g, b) { if (typeof b != "object") { b = { hash: !!b} } else { if (Object.isUndefined(b.hash)) { b.hash = true } } var c, f, a, e, d; a = false; e = b.submit; d = g.inject({}, function(h, i) { if (!i.disabled && i.name) { c = i.name; f = $(i).getValue(); if (f != null && i.type != "file" && (i.type != "submit" || (!a && e !== false && (!e || c == e) && (a = true)))) { if (c in h) { if (!Object.isArray(h[c])) { h[c] = [h[c]] } h[c].push(f) } else { h[c] = f } } } return h }); return b.hash ? d : Object.toQueryString(d) } }; Form.Methods = { serialize: function(b, a) { return Form.serializeElements(Form.getElements(b), a) }, getElements: function(e) { var f, a, d, c, b; f = $(e).getElementsByTagName("*"); a = []; d = Form.Element.Serializers; for (c = 0; b = f[c]; c++) { a.push(b) } return a.inject([], function(g, h) { if (d[h.tagName.toLowerCase()]) { g.push(Element.extend(h)) } return g }) }, getInputs: function(g, c, d) { g = $(g); var a, e, h, f, b; a = g.getElementsByTagName("input"); if (!c && !d) { return $A(a).map(Element.extend) } for (e = 0, h = [], f = a.length; e < f; e++) { b = a[e]; if ((c && b.type != c) || (d && b.name != d)) { continue } h.push(Element.extend(b)) } return h }, disable: function(a) { a = $(a); Form.getElements(a).invoke("disable"); return a }, enable: function(a) { a = $(a); Form.getElements(a).invoke("enable"); return a }, findFirstElement: function(b) { var c, a; c = $(b).getElements().findAll(function(d) { return "hidden" != d.type && !d.disabled }); a = c.findAll(function(d) { return d.hasAttribute("tabIndex") && d.tabIndex >= 0 }).sortBy(function(d) { return d.tabIndex }).first(); return a ? a : c.find(function(d) { return /^(?:input|select|textarea)$/i.test(d.tagName) }) }, focusFirstElement: function(a) { a = $(a); a.findFirstElement().activate(); return a }, request: function(b, a) { b = $(b), a = Object.clone(a || {}); var d = a.parameters, c = b.readAttribute("action") || ""; if (c.blank()) { c = window.location.href } a.parameters = b.serialize(true); if (d) { if (Object.isString(d)) { d = d.toQueryParams() } Object.extend(a.parameters, d) } if (b.hasAttribute("method") && !a.method) { a.method = b.method } return new Ajax.Request(c, a) } }; Form.Element = { focus: function(a) { $(a).focus(); return a }, select: function(a) { $(a).select(); return a } }; Form.Element.Methods = { serialize: function(a) { a = $(a); if (!a.disabled && a.name) { var b, c; b = a.getValue(); if (b != undefined) { c = {}; c[a.name] = b; return Object.toQueryString(c) } } return "" }, getValue: function(a) { a = $(a); var b = a.tagName.toLowerCase(); return Form.Element.Serializers[b](a) }, setValue: function(a, b) { a = $(a); var c = a.tagName.toLowerCase(); Form.Element.Serializers[c](a, b); return a }, clear: function(a) { $(a).value = ""; return a }, present: function(a) { return $(a).value != "" }, activate: function(a) { a = $(a); try { a.focus(); if (a.select && (a.tagName.toLowerCase() != "input" || !(/^(?:button|reset|submit)$/i.test(a.type)))) { a.select() } } catch (b) { } return a }, disable: function(a) { a = $(a); a.disabled = true; return a }, enable: function(a) { a = $(a); a.disabled = false; return a } }; Field = Form.Element; $F = Form.Element.Methods.getValue; Form.Element.Serializers = { input: function(a, b) { switch (a.type.toLowerCase()) { case "checkbox": case "radio": return Form.Element.Serializers.inputSelector(a, b); default: return Form.Element.Serializers.textarea(a, b) } }, inputSelector: function(a, b) { if (Object.isUndefined(b)) { return a.checked ? a.value : null } else { a.checked = !!b } }, textarea: function(a, b) { if (Object.isUndefined(b)) { return a.value } else { a.value = b } }, select: function(c, f) { if (Object.isUndefined(f)) { return this[c.type == "select-one" ? "selectOne" : "selectMany"](c) } else { var g, b, e, a, d; g = !Object.isArray(f); for (b = 0, e = c.length; b < e; b++) { a = c.options[b]; d = this.optionValue(a); if (g) { if (d == f) { a.selected = true; return } } else { a.selected = f.include(d) } } } }, selectOne: function(b) { var a = b.selectedIndex; return a >= 0 ? this.optionValue(b.options[a]) : null }, selectMany: function(d) { var e, c, a, b; e = d.length; if (!e) { return null } for (c = 0, a = []; c < e; c++) { b = d.options[c]; if (b.selected) { a.push(this.optionValue(b)) } } return a }, optionValue: function(a) { return Element.extend(a).hasAttribute("value") ? a.value : a.text } }; Abstract.TimedObserver = Class.create(PeriodicalExecuter, { initialize: function($super, a, b, c) { $super(c, b); this.element = $(a); this.lastValue = this.getValue() }, execute: function() { var a = this.getValue(); if (Object.isString(this.lastValue) && Object.isString(a) ? this.lastValue != a : String(this.lastValue) != String(a)) { this.callback(this.element, a); this.lastValue = a } } }); Form.Element.Observer = Class.create(Abstract.TimedObserver, { getValue: function() { return Form.Element.getValue(this.element) } }); Form.Observer = Class.create(Abstract.TimedObserver, { getValue: function() { return Form.serialize(this.element) } }); Abstract.EventObserver = Class.create({ initialize: function(a, b) { this.element = $(a); this.callback = b; this.lastValue = this.getValue(); if (this.element.tagName.toLowerCase() == "form") { this.registerFormCallbacks() } else { this.registerCallback(this.element) } }, onElementEvent: function() { var a = this.getValue(); if (this.lastValue != a) { this.callback(this.element, a); this.lastValue = a } }, registerFormCallbacks: function() { Form.getElements(this.element).each(this.registerCallback, this) }, registerCallback: function(a) { if (a.type) { switch (a.type.toLowerCase()) { case "checkbox": case "radio": Event.observe(a, "click", this.onElementEvent.bind(this)); break; default: Event.observe(a, "change", this.onElementEvent.bind(this)); break } } } }); Form.Element.EventObserver = Class.create(Abstract.EventObserver, { getValue: function() { return Form.Element.getValue(this.element) } }); Form.EventObserver = Class.create(Abstract.EventObserver, { getValue: function() { return Form.serialize(this.element) } }); (function() { var v, e, w, h, o, t, d, l; v = { KEY_BACKSPACE: 8, KEY_TAB: 9, KEY_RETURN: 13, KEY_ESC: 27, KEY_LEFT: 37, KEY_UP: 38, KEY_RIGHT: 39, KEY_DOWN: 40, KEY_DELETE: 46, KEY_HOME: 36, KEY_END: 35, KEY_PAGEUP: 33, KEY_PAGEDOWN: 34, KEY_INSERT: 45, cache: {} }; e = document.documentElement; w = "onmouseenter" in e && "onmouseleave" in e; if (Prototype.Browser.IE) { h = { 0: 1, 1: 4, 2: 2 }; o = function(y, x) { return y.button === h[x] } } else { if (Prototype.Browser.WebKit) { o = function(y, x) { switch (x) { case 0: return y.which == 1 && !y.metaKey; case 1: return y.which == 1 && y.metaKey; default: return false } } } else { o = function(y, x) { return y.which ? (y.which === x + 1) : (y.button === x) } } } function r(x) { return o(x, 0) } function q(x) { return o(x, 1) } function k(x) { return o(x, 2) } function c(z) { z = v.extend(z); var y = z.target, x = z.type, A = z.currentTarget; if (A && A.tagName) { if (x === "load" || x === "error" || (x === "click" && A.tagName.toLowerCase() === "input" && A.type === "radio")) { y = A } } if (y.nodeType == Node.TEXT_NODE) { y = y.parentNode } return Element.extend(y) } function m(y, A) { var x, z; x = v.element(y); if (!A) { return x } z = [x].concat(x.ancestors()); return Selector.findElement(z, A, 0) } function p(x) { return { x: b(x), y: a(x)} } function b(z) { var y = document.documentElement, x = document.body || { scrollLeft: 0 }; return z.pageX || (z.clientX + (y.scrollLeft || x.scrollLeft) - (y.clientLeft || 0)) } function a(z) { var y = document.documentElement, x = document.body || { scrollTop: 0 }; return z.pageY || (z.clientY + (y.scrollTop || x.scrollTop) - (y.clientTop || 0)) } function n(x) { v.extend(x); x.preventDefault(); x.stopPropagation(); x.stopped = true } v.Methods = { isLeftClick: r, isMiddleClick: q, isRightClick: k, element: c, findElement: m, pointer: p, pointerX: b, pointerY: a, stop: n }; t = Object.keys(v.Methods).inject({}, function(x, y) { x[y] = v.Methods[y].methodize(); return x }); if (Prototype.Browser.IE) { function g(y) { var x; switch (y.type) { case "mouseover": x = y.fromElement; break; case "mouseout": x = y.toElement; break; default: return null } return Element.extend(x) } Object.extend(t, { stopPropagation: function() { this.cancelBubble = true }, preventDefault: function() { this.returnValue = false }, inspect: function() { return "[object Event]" } }); v.extend = function(y, x) { if (!y) { return false } if (y._extendedByPrototype) { return y } y._extendedByPrototype = Prototype.emptyFunction; var z = v.pointer(y); Object.extend(y, { target: y.srcElement || x, relatedTarget: g(y), pageX: z.x, pageY: z.y }); return Object.extend(y, t) } } else { v.prototype = window.Event.prototype || document.createEvent("HTMLEvents").__proto__; Object.extend(v.prototype, t); v.extend = Prototype.K } function j(B, A, C) { var z, x, y; z = Element.retrieve(B, "prototype_event_registry"); if (Object.isUndefined(z)) { d.push(B); z = Element.retrieve(B, "prototype_event_registry", $H()) } x = z.get(A); if (Object.isUndefined(x)) { x = []; z.set(A, x) } if (x.pluck("handler").include(C)) { return false } if (A.include(":")) { y = function(D) { if (Object.isUndefined(D.eventName)) { return false } if (D.eventName !== A) { return false } v.extend(D, B); C.call(B, D) } } else { if (!w && (A === "mouseenter" || A === "mouseleave")) { if (A === "mouseenter" || A === "mouseleave") { y = function(E) { v.extend(E, B); var D = E.relatedTarget; while (D && D !== B) { try { D = D.parentNode } catch (F) { D = B } } if (D === B) { return } C.call(B, E) } } } else { y = function(D) { v.extend(D, B); C.call(B, D) } } } y.handler = C; x.push(y); return y } function f() { for (var x = 0, y = d.length; x < y; x++) { v.stopObserving(d[x]); d[x] = null } } d = []; if (Prototype.Browser.IE) { window.attachEvent("onunload", f) } if (Prototype.Browser.WebKit) { window.addEventListener("unload", Prototype.emptyFunction, false) } l = Prototype.K; if (!w) { l = function(y) { var x = { mouseenter: "mouseover", mouseleave: "mouseout" }; return y in x ? x[y] : y } } function s(A, z, B) { A = $(A); var y, x; y = j(A, z, B); if (!y) { return A } if (z.include(":")) { if (A.addEventListener) { A.addEventListener("dataavailable", y, false) } else { A.attachEvent("ondataavailable", y); A.attachEvent("onfilterchange", y) } } else { x = l(z); if (A.addEventListener) { A.addEventListener(x, y, false) } else { A.attachEvent("on" + x, y) } } return A } function i(C, A, D) { C = $(C); var z, B, y, x; z = Element.retrieve(C, "prototype_event_registry"); if (Object.isUndefined(z)) { return C } if (A && !D) { B = z.get(A); if (Object.isUndefined(B)) { return C } B.each(function(E) { Element.stopObserving(C, A, E.handler) }); return C } else { if (!A) { z.each(function(G) { var E = G.key, F = G.value; F.each(function(H) { Element.stopObserving(C, E, H.handler) }) }); return C } } B = z.get(A); if (!B) { return } y = B.find(function(E) { return E.handler === D }); if (!y) { return C } x = l(A); if (A.include(":")) { if (C.removeEventListener) { C.removeEventListener("dataavailable", y, false) } else { C.detachEvent("ondataavailable", y); C.detachEvent("onfilterchange", y) } } else { if (C.removeEventListener) { C.removeEventListener(x, y, false) } else { C.detachEvent("on" + x, y) } } z.set(A, B.without(y)); return C } function u(A, z, y, x) { A = $(A); if (Object.isUndefined(x)) { x = true } if (A == document && document.createEvent && !A.dispatchEvent) { A = document.documentElement } var B; if (document.createEvent) { B = document.createEvent("HTMLEvents"); B.initEvent("dataavailable", true, true) } else { B = document.createEventObject(); B.eventType = x ? "ondataavailable" : "onfilterchange" } B.eventName = z; B.memo = y || {}; if (document.createEvent) { A.dispatchEvent(B) } else { A.fireEvent(B.eventType, B) } return v.extend(B) } Object.extend(v, v.Methods); Object.extend(v, { fire: u, observe: s, stopObserving: i }); Element.addMethods({ fire: u, observe: s, stopObserving: i }); Object.extend(document, { fire: u.methodize(), observe: s.methodize(), stopObserving: i.methodize(), loaded: false }); if (window.Event) { Object.extend(window.Event, v) } else { window.Event = v } })(); (function() { var d; function a() { if (document.loaded) { return } if (d) { window.clearTimeout(d) } document.loaded = true; document.fire("dom:loaded") } function c() { if (document.readyState === "complete") { document.stopObserving("readystatechange", c); a() } } function b() { try { document.documentElement.doScroll("left") } catch (f) { d = b.defer(); return } a() } if (document.addEventListener) { document.addEventListener("DOMContentLoaded", a, false) } else { document.observe("readystatechange", c); if (window == top) { d = b.defer() } } Event.observe(window, "load", a) })(); Element.addMethods(); Hash.toQueryString = Object.toQueryString; Toggle = { display: Element.toggle }; Element.Methods.childOf = Element.Methods.descendantOf; Insertion = { Before: function(a, b) { return Element.insert(a, { before: b }) }, Top: function(a, b) { return Element.insert(a, { top: b }) }, Bottom: function(a, b) { return Element.insert(a, { bottom: b }) }, After: function(a, b) { return Element.insert(a, { after: b }) } }; $continue = new Error('"throw $continue" is deprecated, use "return" instead'); Position = { includeScrollOffsets: false, prepare: function() { this.deltaX = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0; this.deltaY = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0 }, within: function(b, a, c) { if (this.includeScrollOffsets) { return this.withinIncludingScrolloffsets(b, a, c) } this.xcomp = a; this.ycomp = c; this.offset = Element.cumulativeOffset(b); return (c >= this.offset[1] && c < this.offset[1] + b.offsetHeight && a >= this.offset[0] && a < this.offset[0] + b.offsetWidth) }, withinIncludingScrolloffsets: function(b, a, d) { var c = Element.cumulativeScrollOffset(b); this.xcomp = a + c[0] - this.deltaX; this.ycomp = d + c[1] - this.deltaY; this.offset = Element.cumulativeOffset(b); return (this.ycomp >= this.offset[1] && this.ycomp < this.offset[1] + b.offsetHeight && this.xcomp >= this.offset[0] && this.xcomp < this.offset[0] + b.offsetWidth) }, overlap: function(b, a) { if (!b) { return 0 } if (b == "vertical") { return ((this.offset[1] + a.offsetHeight) - this.ycomp) / a.offsetHeight } if (b == "horizontal") { return ((this.offset[0] + a.offsetWidth) - this.xcomp) / a.offsetWidth } }, cumulativeOffset: Element.Methods.cumulativeOffset, positionedOffset: Element.Methods.positionedOffset, absolutize: function(a) { Position.prepare(); return Element.absolutize(a) }, relativize: function(a) { Position.prepare(); return Element.relativize(a) }, realOffset: Element.Methods.cumulativeScrollOffset, offsetParent: Element.Methods.getOffsetParent, page: Element.Methods.viewportOffset, clone: function(b, c, a) { a = a || {}; return Element.clonePosition(c, b, a) } }; if (!document.getElementsByClassName) { document.getElementsByClassName = function(b) { function a(c) { return c.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + c + " ')]" } b.getElementsByClassName = Prototype.BrowserFeatures.XPath ? function(c, e) { e = e.toString().strip(); var d = /\s/.test(e) ? $w(e).map(a).join("") : a(e); return d ? document._getElementsByXPath(".//*" + d, c) : [] } : function(e, f) { f = f.toString().strip(); var g, h, c, d, k, j; g = []; h = (/\s/.test(f) ? $w(f) : null); if (!h && !f) { return g } c = $(e).getElementsByTagName("*"); f = " " + f + " "; for (d = 0; k = c[d]; d++) { if (k.className && (j = " " + k.className + " ") && (j.include(f) || (h && h.all(function(i) { return !i.toString().blank() && j.include(" " + i + " ") })))) { g.push(Element.extend(k)) } } return g }; return function(d, c) { return $(c || document.body).getElementsByClassName(d) } } (Element.Methods) } Element.ClassNames = Class.create(); Element.ClassNames.prototype = { initialize: function(a) { this.element = $(a) }, _each: function(a) { this.element.className.split(/\s+/).select(function(b) { return b.length > 0 })._each(a) }, set: function(a) { this.element.className = a }, add: function(a) { if (this.include(a)) { return } this.set($A(this).concat(a).join(" ")) }, remove: function(a) { if (!this.include(a)) { return } this.set($A(this).without(a).join(" ")) }, toString: function() { return $A(this).join(" ") } }; Object.extend(Element.ClassNames.prototype, Enumerable); Scriptaculous = { Version: "1.8.3", REQUIRED_PROTOTYPE: "1.6.0.3", load: function() { function a(b) { var c = b.replace(/_.*|\./g, ""); c = parseInt(c + "0".times(4 - c.length)); return b.indexOf("_") > -1 ? c - 1 : c } if ((typeof Prototype == "undefined") || (typeof Element == "undefined") || (typeof Element.Methods == "undefined") || (a(Prototype.Version) < a(Scriptaculous.REQUIRED_PROTOTYPE))) { throw ("script.aculo.us requires the Prototype JavaScript framework >= " + Scriptaculous.REQUIRED_PROTOTYPE) } } }; Scriptaculous.load(); Builder = { NODEMAP: { AREA: "map", CAPTION: "table", COL: "table", COLGROUP: "table", LEGEND: "fieldset", OPTGROUP: "select", OPTION: "select", PARAM: "object", TBODY: "table", TD: "table", TFOOT: "table", TH: "table", THEAD: "table", TR: "table" }, node: function(a) { a = a.toUpperCase(); var g, b, d, c; g = this.NODEMAP[a] || "div"; b = document.createElement(g); try { b.innerHTML = "<" + a + "></" + a + ">" } catch (f) { } d = b.firstChild || null; if (d && (d.tagName.toUpperCase() != a)) { d = d.getElementsByTagName(a)[0] } if (!d) { d = document.createElement(a) } if (!d) { return } if (arguments[1]) { if (this._isStringOrNumber(arguments[1]) || (arguments[1] instanceof Array) || arguments[1].tagName) { this._children(d, arguments[1]) } else { c = this._attributes(arguments[1]); if (c.length) { try { b.innerHTML = "<" + a + " " + c + "></" + a + ">" } catch (f) { } d = b.firstChild || null; if (!d) { d = document.createElement(a); for (attr in arguments[1]) { d[attr == "class" ? "className" : attr] = arguments[1][attr] } } if (d.tagName.toUpperCase() != a) { d = b.getElementsByTagName(a)[0] } } } } if (arguments[2]) { this._children(d, arguments[2]) } return $(d) }, _text: function(a) { return document.createTextNode(a) }, ATTR_MAP: { className: "class", htmlFor: "for" }, _attributes: function(a) { var b = []; for (attribute in a) { b.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) + '="' + a[attribute].toString().escapeHTML().gsub(/"/, "&quot;") + '"') } return b.join(" ") }, _children: function(b, a) { if (a.tagName) { b.appendChild(a); return } if (typeof a == "object") { a.flatten().each(function(c) { if (typeof c == "object") { b.appendChild(c) } else { if (Builder._isStringOrNumber(c)) { b.appendChild(Builder._text(c)) } } }) } else { if (Builder._isStringOrNumber(a)) { b.appendChild(Builder._text(a)) } } }, _isStringOrNumber: function(a) { return (typeof a == "string" || typeof a == "number") }, build: function(b) { var a = this.node("div"); $(a).update(b.strip()); return a.down() }, dump: function(b) { if (typeof b != "object" && typeof b != "function") { b = window } var a = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/); a.each(function(c) { b[c] = function() { return Builder.node.apply(Builder, [c].concat($A(arguments))) } }) } }; String.prototype.parseColor = function() { var a, c, b; a = "#"; if (this.slice(0, 4) == "rgb(") { c = this.slice(4, this.length - 1).split(","); b = 0; do { a += parseInt(c[b]).toColorPart() } while (++b < 3) } else { if (this.slice(0, 1) == "#") { if (this.length == 4) { for (b = 1; b < 4; b++) { a += (this.charAt(b) + this.charAt(b)).toLowerCase() } } if (this.length == 7) { a = this.toLowerCase() } } } return (a.length == 7 ? a : (arguments[0] || this)) }; Element.collectTextNodes = function(a) { return $A($(a).childNodes).collect(function(b) { return (b.nodeType == 3 ? b.nodeValue : (b.hasChildNodes() ? Element.collectTextNodes(b) : "")) }).flatten().join("") }; Element.collectTextNodesIgnoreClass = function(a, b) { return $A($(a).childNodes).collect(function(c) { return (c.nodeType == 3 ? c.nodeValue : ((c.hasChildNodes() && !Element.hasClassName(c, b)) ? Element.collectTextNodesIgnoreClass(c, b) : "")) }).flatten().join("") }; Element.setContentZoom = function(a, b) { a = $(a); a.setStyle({ fontSize: (b / 100) + "em" }); if (Prototype.Browser.WebKit) { window.scrollBy(0, 0) } return a }; Element.getInlineOpacity = function(a) { return $(a).style.opacity || "" }; Element.forceRerendering = function(a) { try { a = $(a); var c = document.createTextNode(" "); a.appendChild(c); a.removeChild(c) } catch (b) { } }; Effect = { _elementDoesNotExistError: { name: "ElementDoesNotExistError", message: "The specified DOM element does not exist, but is required for this effect to operate" }, Transitions: { linear: Prototype.K, sinoidal: function(a) { return (-Math.cos(a * Math.PI) / 2) + 0.5 }, reverse: function(a) { return 1 - a }, flicker: function(a) { a = ((-Math.cos(a * Math.PI) / 4) + 0.75) + Math.random() / 4; return a > 1 ? 1 : a }, wobble: function(a) { return (-Math.cos(a * Math.PI * (9 * a)) / 2) + 0.5 }, pulse: function(b, a) { return (-Math.cos((b * ((a || 5) - 0.5) * 2) * Math.PI) / 2) + 0.5 }, spring: function(a) { return 1 - (Math.cos(a * 4.5 * Math.PI) * Math.exp(-a * 6)) }, none: function(a) { return 0 }, full: function(a) { return 1 } }, DefaultOptions: { duration: 1, fps: 100, sync: false, from: 0, to: 1, delay: 0, queue: "parallel" }, tagifyText: function(a) { var b = "position:relative"; if (Prototype.Browser.IE) { b += ";zoom:1" } a = $(a); $A(a.childNodes).each(function(c) { if (c.nodeType == 3) { c.nodeValue.toArray().each(function(d) { a.insertBefore(new Element("span", { style: b }).update(d == " " ? String.fromCharCode(160) : d), c) }); Element.remove(c) } }) }, multiple: function(b, c) { var e, a, d; if (((typeof b == "object") || Object.isFunction(b)) && (b.length)) { e = b } else { e = $(b).childNodes } a = Object.extend({ speed: 0.1, delay: 0 }, arguments[2] || {}); d = a.delay; $A(e).each(function(g, f) { new c(g, Object.extend(a, { delay: f * a.speed + d })) }) }, PAIRS: { slide: ["SlideDown", "SlideUp"], blind: ["BlindDown", "BlindUp"], appear: ["Appear", "Fade"] }, toggle: function(b, c, a) { b = $(b); c = (c || "appear").toLowerCase(); return Effect[Effect.PAIRS[c][b.visible() ? 1 : 0]](b, Object.extend({ queue: { position: "end", scope: (b.id || "global"), limit: 1} }, a || {})) } }; Effect.DefaultOptions.transition = Effect.Transitions.sinoidal; Effect.ScopedQueue = Class.create(Enumerable, { initialize: function() { this.effects = []; this.interval = null }, _each: function(a) { this.effects._each(a) }, add: function(b) { var c, a; c = new Date().getTime(); a = Object.isString(b.options.queue) ? b.options.queue : b.options.queue.position; switch (a) { case "front": this.effects.findAll(function(d) { return d.state == "idle" }).each(function(d) { d.startOn += b.finishOn; d.finishOn += b.finishOn }); break; case "with-last": c = this.effects.pluck("startOn").max() || c; break; case "end": c = this.effects.pluck("finishOn").max() || c; break } b.startOn += c; b.finishOn += c; if (!b.options.queue.limit || (this.effects.length < b.options.queue.limit)) { this.effects.push(b) } if (!this.interval) { this.interval = setInterval(this.loop.bind(this), 15) } }, remove: function(a) { this.effects = this.effects.reject(function(b) { return b == a }); if (this.effects.length == 0) { clearInterval(this.interval); this.interval = null } }, loop: function() { var c, b, a; c = new Date().getTime(); for (b = 0, a = this.effects.length; b < a; b++) { this.effects[b] && this.effects[b].loop(c) } } }); Effect.Queues = { instances: $H(), get: function(a) { if (!Object.isString(a)) { return a } return this.instances.get(a) || this.instances.set(a, new Effect.ScopedQueue()) } }; Effect.Queue = Effect.Queues.get("global"); Effect.Base = Class.create({ position: null, start: function(a) { if (a && a.transition === false) { a.transition = Effect.Transitions.linear } this.options = Object.extend(Object.extend({}, Effect.DefaultOptions), a || {}); this.currentFrame = 0; this.state = "idle"; this.startOn = this.options.delay * 1000; this.finishOn = this.startOn + (this.options.duration * 1000); this.fromToDelta = this.options.to - this.options.from; this.totalTime = this.finishOn - this.startOn; this.totalFrames = this.options.fps * this.options.duration; this.render = (function() { function b(d, c) { if (d.options[c + "Internal"]) { d.options[c + "Internal"](d) } if (d.options[c]) { d.options[c](d) } } return function(c) { if (this.state === "idle") { this.state = "running"; b(this, "beforeSetup"); if (this.setup) { this.setup() } b(this, "afterSetup") } if (this.state === "running") { c = (this.options.transition(c) * this.fromToDelta) + this.options.from; this.position = c; b(this, "beforeUpdate"); if (this.update) { this.update(c) } b(this, "afterUpdate") } } })(); this.event("beforeStart"); if (!this.options.sync) { Effect.Queues.get(Object.isString(this.options.queue) ? "global" : this.options.queue.scope).add(this) } }, loop: function(c) { if (c >= this.startOn) { if (c >= this.finishOn) { this.render(1); this.cancel(); this.event("beforeFinish"); if (this.finish) { this.finish() } this.event("afterFinish"); return } var b = (c - this.startOn) / this.totalTime, a = (b * this.totalFrames).round(); if (a > this.currentFrame) { this.render(b); this.currentFrame = a } } }, cancel: function() { if (!this.options.sync) { Effect.Queues.get(Object.isString(this.options.queue) ? "global" : this.options.queue.scope).remove(this) } this.state = "finished" }, event: function(a) { if (this.options[a + "Internal"]) { this.options[a + "Internal"](this) } if (this.options[a]) { this.options[a](this) } }, inspect: function() { var a = $H(); for (property in this) { if (!Object.isFunction(this[property])) { a.set(property, this[property]) } } return "#<Effect:" + a.inspect() + ",options:" + $H(this.options).inspect() + ">" } }); Effect.Parallel = Class.create(Effect.Base, { initialize: function(a) { this.effects = a || []; this.start(arguments[1]) }, update: function(a) { this.effects.invoke("render", a) }, finish: function(a) { this.effects.each(function(b) { b.render(1); b.cancel(); b.event("beforeFinish"); if (b.finish) { b.finish(a) } b.event("afterFinish") }) } }); Effect.Tween = Class.create(Effect.Base, { initialize: function(c, f, e) { c = Object.isString(c) ? $(c) : c; var b = $A(arguments), d = b.last(), a = b.length == 5 ? b[3] : null; this.method = Object.isFunction(d) ? d.bind(c) : Object.isFunction(c[d]) ? c[d].bind(c) : function(g) { c[d] = g }; this.start(Object.extend({ from: f, to: e }, a || {})) }, update: function(a) { this.method(a) } }); Effect.Event = Class.create(Effect.Base, { initialize: function() { this.start(Object.extend({ duration: 0 }, arguments[0] || {})) }, update: Prototype.emptyFunction }); Effect.Opacity = Class.create(Effect.Base, { initialize: function(b) { this.element = $(b); if (!this.element) { throw (Effect._elementDoesNotExistError) } if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) { this.element.setStyle({ zoom: 1 }) } var a = Object.extend({ from: this.element.getOpacity() || 0, to: 1 }, arguments[1] || {}); this.start(a) }, update: function(a) { this.element.setOpacity(a) } }); Effect.Move = Class.create(Effect.Base, { initialize: function(b) { this.element = $(b); if (!this.element) { throw (Effect._elementDoesNotExistError) } var a = Object.extend({ x: 0, y: 0, mode: "relative" }, arguments[1] || {}); this.start(a) }, setup: function() { this.element.makePositioned(); this.originalLeft = parseFloat(this.element.getStyle("left") || "0"); this.originalTop = parseFloat(this.element.getStyle("top") || "0"); if (this.options.mode == "absolute") { this.options.x = this.options.x - this.originalLeft; this.options.y = this.options.y - this.originalTop } }, update: function(a) { this.element.setStyle({ left: (this.options.x * a + this.originalLeft).round() + "px", top: (this.options.y * a + this.originalTop).round() + "px" }) } }); Effect.MoveBy = function(b, a, c) { return new Effect.Move(b, Object.extend({ x: c, y: a }, arguments[3] || {})) }; Effect.Scale = Class.create(Effect.Base, { initialize: function(b, c) { this.element = $(b); if (!this.element) { throw (Effect._elementDoesNotExistError) } var a = Object.extend({ scaleX: true, scaleY: true, scaleContent: true, scaleFromCenter: false, scaleMode: "box", scaleFrom: 100, scaleTo: c }, arguments[2] || {}); this.start(a) }, setup: function() { this.restoreAfterFinish = this.options.restoreAfterFinish || false; this.elementPositioning = this.element.getStyle("position"); this.originalStyle = {}; ["top", "left", "width", "height", "fontSize"].each(function(b) { this.originalStyle[b] = this.element.style[b] } .bind(this)); this.originalTop = this.element.offsetTop; this.originalLeft = this.element.offsetLeft; var a = this.element.getStyle("font-size") || "100%"; ["em", "px", "%", "pt"].each(function(b) { if (a.indexOf(b) > 0) { this.fontSize = parseFloat(a); this.fontSizeType = b } } .bind(this)); this.factor = (this.options.scaleTo - this.options.scaleFrom) / 100; this.dims = null; if (this.options.scaleMode == "box") { this.dims = [this.element.offsetHeight, this.element.offsetWidth] } if (/^content/.test(this.options.scaleMode)) { this.dims = [this.element.scrollHeight, this.element.scrollWidth] } if (!this.dims) { this.dims = [this.options.scaleMode.originalHeight, this.options.scaleMode.originalWidth] } }, update: function(a) { var b = (this.options.scaleFrom / 100) + (this.factor * a); if (this.options.scaleContent && this.fontSize) { this.element.setStyle({ fontSize: this.fontSize * b + this.fontSizeType }) } this.setDimensions(this.dims[0] * b, this.dims[1] * b) }, finish: function(a) { if (this.restoreAfterFinish) { this.element.setStyle(this.originalStyle) } }, setDimensions: function(a, e) { var f, c, b; f = {}; if (this.options.scaleX) { f.width = e.round() + "px" } if (this.options.scaleY) { f.height = a.round() + "px" } if (this.options.scaleFromCenter) { c = (a - this.dims[0]) / 2; b = (e - this.dims[1]) / 2; if (this.elementPositioning == "absolute") { if (this.options.scaleY) { f.top = this.originalTop - c + "px" } if (this.options.scaleX) { f.left = this.originalLeft - b + "px" } } else { if (this.options.scaleY) { f.top = -c + "px" } if (this.options.scaleX) { f.left = -b + "px" } } } this.element.setStyle(f) } }); Effect.Highlight = Class.create(Effect.Base, { initialize: function(b) { this.element = $(b); if (!this.element) { throw (Effect._elementDoesNotExistError) } var a = Object.extend({ startcolor: "#ffff99" }, arguments[1] || {}); this.start(a) }, setup: function() { if (this.element.getStyle("display") == "none") { this.cancel(); return } this.oldStyle = {}; if (!this.options.keepBackgroundImage) { this.oldStyle.backgroundImage = this.element.getStyle("background-image"); this.element.setStyle({ backgroundImage: "none" }) } if (!this.options.endcolor) { this.options.endcolor = this.element.getStyle("background-color").parseColor("#ffffff") } if (!this.options.restorecolor) { this.options.restorecolor = this.element.getStyle("background-color") } this._base = $R(0, 2).map(function(a) { return parseInt(this.options.startcolor.slice(a * 2 + 1, a * 2 + 3), 16) } .bind(this)); this._delta = $R(0, 2).map(function(a) { return parseInt(this.options.endcolor.slice(a * 2 + 1, a * 2 + 3), 16) - this._base[a] } .bind(this)) }, update: function(a) { this.element.setStyle({ backgroundColor: $R(0, 2).inject("#", function(b, c, d) { return b + ((this._base[d] + (this._delta[d] * a)).round().toColorPart()) } .bind(this)) }) }, finish: function() { this.element.setStyle(Object.extend(this.oldStyle, { backgroundColor: this.options.restorecolor })) } }); Effect.ScrollTo = function(c) { var b = arguments[1] || {}, a = document.viewport.getScrollOffsets(), d = $(c).cumulativeOffset(); if (b.offset) { d[1] += b.offset } return new Effect.Tween(null, a.top, d[1], b, function(e) { scrollTo(a.left, e.round()) }) }; Effect.Fade = function(c) { c = $(c); var a, b; a = c.getInlineOpacity(); b = Object.extend({ from: c.getOpacity() || 1, to: 0, afterFinishInternal: function(d) { if (d.options.to != 0) { return } d.element.hide().setStyle({ opacity: a }) } }, arguments[1] || {}); return new Effect.Opacity(c, b) }; Effect.Appear = function(b) { b = $(b); var a = Object.extend({ from: (b.getStyle("display") == "none" ? 0 : b.getOpacity() || 0), to: 1, afterFinishInternal: function(c) { c.element.forceRerendering() }, beforeSetup: function(c) { c.element.setOpacity(c.options.from).show() } }, arguments[1] || {}); return new Effect.Opacity(b, a) }; Effect.Puff = function(b) { b = $(b); var a = { opacity: b.getInlineOpacity(), position: b.getStyle("position"), top: b.style.top, left: b.style.left, width: b.style.width, height: b.style.height }; return new Effect.Parallel([new Effect.Scale(b, 200, { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), new Effect.Opacity(b, { sync: true, to: 0 })], Object.extend({ duration: 1, beforeSetupInternal: function(c) { Position.absolutize(c.effects[0].element) }, afterFinishInternal: function(c) { c.effects[0].element.hide().setStyle(a) } }, arguments[1] || {})) }; Effect.BlindUp = function(a) { a = $(a); a.makeClipping(); return new Effect.Scale(a, 0, Object.extend({ scaleContent: false, scaleX: false, restoreAfterFinish: true, afterFinishInternal: function(b) { b.element.hide().undoClipping() } }, arguments[1] || {})) }; Effect.BlindDown = function(b) { b = $(b); var a = b.getDimensions(); return new Effect.Scale(b, 100, Object.extend({ scaleContent: false, scaleX: false, scaleFrom: 0, scaleMode: { originalHeight: a.height, originalWidth: a.width }, restoreAfterFinish: true, afterSetup: function(c) { c.element.makeClipping().setStyle({ height: "0px" }).show() }, afterFinishInternal: function(c) { c.element.undoClipping() } }, arguments[1] || {})) }; Effect.SwitchOff = function(b) { b = $(b); var a = b.getInlineOpacity(); return new Effect.Appear(b, Object.extend({ duration: 0.4, from: 0, transition: Effect.Transitions.flicker, afterFinishInternal: function(c) { new Effect.Scale(c.element, 1, { duration: 0.3, scaleFromCenter: true, scaleX: false, scaleContent: false, restoreAfterFinish: true, beforeSetup: function(d) { d.element.makePositioned().makeClipping() }, afterFinishInternal: function(d) { d.element.hide().undoClipping().undoPositioned().setStyle({ opacity: a }) } }) } }, arguments[1] || {})) }; Effect.DropOut = function(b) { b = $(b); var a = { top: b.getStyle("top"), left: b.getStyle("left"), opacity: b.getInlineOpacity() }; return new Effect.Parallel([new Effect.Move(b, { x: 0, y: 100, sync: true }), new Effect.Opacity(b, { sync: true, to: 0 })], Object.extend({ duration: 0.5, beforeSetup: function(c) { c.effects[0].element.makePositioned() }, afterFinishInternal: function(c) { c.effects[0].element.hide().undoPositioned().setStyle(a) } }, arguments[1] || {})) }; Effect.Shake = function(d) { d = $(d); var b, e, c, a; b = Object.extend({ distance: 20, duration: 0.5 }, arguments[1] || {}); e = parseFloat(b.distance); c = parseFloat(b.duration) / 10; a = { top: d.getStyle("top"), left: d.getStyle("left") }; return new Effect.Move(d, { x: e, y: 0, duration: c, afterFinishInternal: function(f) { new Effect.Move(f.element, { x: -e * 2, y: 0, duration: c * 2, afterFinishInternal: function(g) { new Effect.Move(g.element, { x: e * 2, y: 0, duration: c * 2, afterFinishInternal: function(h) { new Effect.Move(h.element, { x: -e * 2, y: 0, duration: c * 2, afterFinishInternal: function(i) { new Effect.Move(i.element, { x: e * 2, y: 0, duration: c * 2, afterFinishInternal: function(j) { new Effect.Move(j.element, { x: -e, y: 0, duration: c, afterFinishInternal: function(k) { k.element.undoPositioned().setStyle(a) } }) } }) } }) } }) } }) } }) }; Effect.SlideDown = function(c) { c = $(c).cleanWhitespace(); var a, b; a = c.down().getStyle("bottom"); b = c.getDimensions(); return new Effect.Scale(c, 100, Object.extend({ scaleContent: false, scaleX: false, scaleFrom: window.opera ? 0 : 1, scaleMode: { originalHeight: b.height, originalWidth: b.width }, restoreAfterFinish: true, afterSetup: function(d) { d.element.makePositioned(); d.element.down().makePositioned(); if (window.opera) { d.element.setStyle({ top: "" }) } d.element.makeClipping().setStyle({ height: "0px" }).show() }, afterUpdateInternal: function(d) { d.element.down().setStyle({ bottom: (d.dims[0] - d.element.clientHeight) + "px" }) }, afterFinishInternal: function(d) { d.element.undoClipping().undoPositioned(); d.element.down().undoPositioned().setStyle({ bottom: a }) } }, arguments[1] || {})) }; Effect.SlideUp = function(c) { c = $(c).cleanWhitespace(); var a, b; a = c.down().getStyle("bottom"); b = c.getDimensions(); return new Effect.Scale(c, window.opera ? 0 : 1, Object.extend({ scaleContent: false, scaleX: false, scaleMode: "box", scaleFrom: 100, scaleMode: { originalHeight: b.height, originalWidth: b.width }, restoreAfterFinish: true, afterSetup: function(d) { d.element.makePositioned(); d.element.down().makePositioned(); if (window.opera) { d.element.setStyle({ top: "" }) } d.element.makeClipping().show() }, afterUpdateInternal: function(d) { d.element.down().setStyle({ bottom: (d.dims[0] - d.element.clientHeight) + "px" }) }, afterFinishInternal: function(d) { d.element.hide().undoClipping().undoPositioned(); d.element.down().undoPositioned().setStyle({ bottom: a }) } }, arguments[1] || {})) }; Effect.Squish = function(a) { return new Effect.Scale(a, window.opera ? 1 : 0, { restoreAfterFinish: true, beforeSetup: function(b) { b.element.makeClipping() }, afterFinishInternal: function(b) { b.element.hide().undoClipping() } }) }; Effect.Grow = function(c) { c = $(c); var b, a, g, h, f, e, d; b = Object.extend({ direction: "center", moveTransition: Effect.Transitions.sinoidal, scaleTransition: Effect.Transitions.sinoidal, opacityTransition: Effect.Transitions.full }, arguments[1] || {}); a = { top: c.style.top, left: c.style.left, height: c.style.height, width: c.style.width, opacity: c.getInlineOpacity() }; g = c.getDimensions(); switch (b.direction) { case "top-left": h = f = e = d = 0; break; case "top-right": h = g.width; f = d = 0; e = -g.width; break; case "bottom-left": h = e = 0; f = g.height; d = -g.height; break; case "bottom-right": h = g.width; f = g.height; e = -g.width; d = -g.height; break; case "center": h = g.width / 2; f = g.height / 2; e = -g.width / 2; d = -g.height / 2; break } return new Effect.Move(c, { x: h, y: f, duration: 0.01, beforeSetup: function(i) { i.element.hide().makeClipping().makePositioned() }, afterFinishInternal: function(i) { new Effect.Parallel([new Effect.Opacity(i.element, { sync: true, to: 1, from: 0, transition: b.opacityTransition }), new Effect.Move(i.element, { x: e, y: d, sync: true, transition: b.moveTransition }), new Effect.Scale(i.element, 100, { scaleMode: { originalHeight: g.height, originalWidth: g.width }, sync: true, scaleFrom: window.opera ? 1 : 0, transition: b.scaleTransition, restoreAfterFinish: true })], Object.extend({ beforeSetup: function(j) { j.effects[0].element.setStyle({ height: "0px" }).show() }, afterFinishInternal: function(j) { j.effects[0].element.undoClipping().undoPositioned().setStyle(a) } }, b)) } }) }; Effect.Shrink = function(c) { c = $(c); var b, a, f, e, d; b = Object.extend({ direction: "center", moveTransition: Effect.Transitions.sinoidal, scaleTransition: Effect.Transitions.sinoidal, opacityTransition: Effect.Transitions.none }, arguments[1] || {}); a = { top: c.style.top, left: c.style.left, height: c.style.height, width: c.style.width, opacity: c.getInlineOpacity() }; f = c.getDimensions(); switch (b.direction) { case "top-left": e = d = 0; break; case "top-right": e = f.width; d = 0; break; case "bottom-left": e = 0; d = f.height; break; case "bottom-right": e = f.width; d = f.height; break; case "center": e = f.width / 2; d = f.height / 2; break } return new Effect.Parallel([new Effect.Opacity(c, { sync: true, to: 0, from: 1, transition: b.opacityTransition }), new Effect.Scale(c, window.opera ? 1 : 0, { sync: true, transition: b.scaleTransition, restoreAfterFinish: true }), new Effect.Move(c, { x: e, y: d, sync: true, transition: b.moveTransition })], Object.extend({ beforeStartInternal: function(g) { g.effects[0].element.makePositioned().makeClipping() }, afterFinishInternal: function(g) { g.effects[0].element.hide().undoClipping().undoPositioned().setStyle(a) } }, b)) }; Effect.Pulsate = function(c) { c = $(c); var b = arguments[1] || {}, a = c.getInlineOpacity(), e = b.transition || Effect.Transitions.linear, d = function(f) { return 1 - e((-Math.cos((f * (b.pulses || 5) * 2) * Math.PI) / 2) + 0.5) }; return new Effect.Opacity(c, Object.extend(Object.extend({ duration: 2, from: 0, afterFinishInternal: function(f) { f.element.setStyle({ opacity: a }) } }, b), { transition: d })) }; Effect.Fold = function(b) { b = $(b); var a = { top: b.style.top, left: b.style.left, width: b.style.width, height: b.style.height }; b.makeClipping(); return new Effect.Scale(b, 5, Object.extend({ scaleContent: false, scaleX: false, afterFinishInternal: function(c) { new Effect.Scale(b, 1, { scaleContent: false, scaleY: false, afterFinishInternal: function(d) { d.element.hide().undoClipping().setStyle(a) } }) } }, arguments[1] || {})) }; Effect.Morph = Class.create(Effect.Base, { initialize: function(c) { this.element = $(c); if (!this.element) { throw (Effect._elementDoesNotExistError) } var a, b; a = Object.extend({ style: {} }, arguments[1] || {}); if (!Object.isString(a.style)) { this.style = $H(a.style) } else { if (a.style.include(":")) { this.style = a.style.parseStyle() } else { this.element.addClassName(a.style); this.style = $H(this.element.getStyles()); this.element.removeClassName(a.style); b = this.element.getStyles(); this.style = this.style.reject(function(d) { return d.value == b[d.key] }); a.afterFinishInternal = function(d) { d.element.addClassName(d.options.style); d.transforms.each(function(e) { d.element.style[e.style] = "" }) } } } this.start(a) }, setup: function() { function a(b) { if (!b || ["rgba(0, 0, 0, 0)", "transparent"].include(b)) { b = "#ffffff" } b = b.parseColor(); return $R(0, 2).map(function(c) { return parseInt(b.slice(c * 2 + 1, c * 2 + 3), 16) }) } this.transforms = this.style.map(function(g) { var f, e, d, c, b; f = g[0]; e = g[1]; d = null; if (e.parseColor("#zzzzzz") != "#zzzzzz") { e = e.parseColor(); d = "color" } else { if (f == "opacity") { e = parseFloat(e); if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) { this.element.setStyle({ zoom: 1 }) } } else { if (Element.CSS_LENGTH.test(e)) { c = e.match(/^([\+\-]?[0-9\.]+)(.*)$/); e = parseFloat(c[1]); d = (c.length == 3) ? c[2] : null } } } b = this.element.getStyle(f); return { style: f.camelize(), originalValue: d == "color" ? a(b) : parseFloat(b || 0), targetValue: d == "color" ? a(e) : e, unit: d} } .bind(this)).reject(function(b) { return ((b.originalValue == b.targetValue) || (b.unit != "color" && (isNaN(b.originalValue) || isNaN(b.targetValue)))) }) }, update: function(a) { var d = {}, b, c = this.transforms.length; while (c--) { d[(b = this.transforms[c]).style] = b.unit == "color" ? "#" + (Math.round(b.originalValue[0] + (b.targetValue[0] - b.originalValue[0]) * a)).toColorPart() + (Math.round(b.originalValue[1] + (b.targetValue[1] - b.originalValue[1]) * a)).toColorPart() + (Math.round(b.originalValue[2] + (b.targetValue[2] - b.originalValue[2]) * a)).toColorPart() : (b.originalValue + (b.targetValue - b.originalValue) * a).toFixed(3) + (b.unit === null ? "" : b.unit) } this.element.setStyle(d, true) } }); Effect.Transform = Class.create({ initialize: function(a) { this.tracks = []; this.options = arguments[1] || {}; this.addTracks(a) }, addTracks: function(a) { a.each(function(b) { b = $H(b); var c = b.values().first(); this.tracks.push($H({ ids: b.keys().first(), effect: Effect.Morph, options: { style: c} })) } .bind(this)); return this }, play: function() { return new Effect.Parallel(this.tracks.map(function(a) { var d, c, b, e; d = a.get("ids"); c = a.get("effect"); b = a.get("options"); e = [$(d) || $$(d)].flatten(); return e.map(function(f) { return new c(f, Object.extend({ sync: true }, b)) }) }).flatten(), this.options) } }); Element.CSS_PROPERTIES = $w("backgroundColor backgroundPosition borderBottomColor borderBottomStyle borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderSpacing borderTopColor borderTopStyle borderTopWidth bottom clip color fontSize fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop markerOffset maxHeight maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft paddingRight paddingTop right textIndent top width wordSpacing zIndex"); Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/; String.__parseStyleElement = document.createElement("div"); String.prototype.parseStyle = function() { var b, a = $H(); if (Prototype.Browser.WebKit) { b = new Element("div", { style: this }).style } else { String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>'; b = String.__parseStyleElement.childNodes[0].style } Element.CSS_PROPERTIES.each(function(c) { if (b[c]) { a.set(c, b[c]) } }); if (Prototype.Browser.IE && this.include("opacity")) { a.set("opacity", this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]) } return a }; if (document.defaultView && document.defaultView.getComputedStyle) { Element.getStyles = function(b) { var a = document.defaultView.getComputedStyle($(b), null); return Element.CSS_PROPERTIES.inject({}, function(c, d) { c[d] = a[d]; return c }) } } else { Element.getStyles = function(b) { b = $(b); var a = b.currentStyle, c; c = Element.CSS_PROPERTIES.inject({}, function(d, e) { d[e] = a[e]; return d }); if (!c.opacity) { c.opacity = b.getOpacity() } return c } } Effect.Methods = { morph: function(a, b) { a = $(a); new Effect.Morph(a, Object.extend({ style: b }, arguments[2] || {})); return a }, visualEffect: function(c, e, b) { c = $(c); var d = e.dasherize().camelize(), a = d.charAt(0).toUpperCase() + d.substring(1); new Effect[a](c, b); return c }, highlight: function(b, a) { b = $(b); new Effect.Highlight(b, a); return b } }; $w("fade appear grow shrink fold blindUp blindDown slideUp slideDown pulsate shake puff squish switchOff dropOut").each(function(a) { Effect.Methods[a] = function(c, b) { c = $(c); Effect[a.charAt(0).toUpperCase() + a.substring(1)](c, b); return c } }); $w("getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles").each(function(a) { Effect.Methods[a] = Element[a] }); Element.addMethods(Effect.Methods); if (typeof Effect == "undefined") { throw ("controls.js requires including script.aculo.us' effects.js library") } Autocompleter = {}; Autocompleter.Base = Class.create({ baseInitialize: function(b, c, a) { b = $(b); this.element = b; this.update = $(c); this.hasFocus = false; this.changed = false; this.active = false; this.index = 0; this.entryCount = 0; this.oldElementValue = this.element.value; if (this.setOptions) { this.setOptions(a) } else { this.options = a || {} } this.options.paramName = this.options.paramName || this.element.name; this.options.tokens = this.options.tokens || []; this.options.frequency = this.options.frequency || 0.4; this.options.minChars = this.options.minChars || 1; this.options.onShow = this.options.onShow || function(d, e) { if (!e.style.position || e.style.position == "absolute") { e.style.position = "absolute"; Position.clone(d, e, { setHeight: false, offsetTop: d.offsetHeight }) } Effect.Appear(e, { duration: 0.15 }) }; this.options.onHide = this.options.onHide || function(d, e) { new Effect.Fade(e, { duration: 0.15 }) }; if (typeof (this.options.tokens) == "string") { this.options.tokens = new Array(this.options.tokens) } if (!this.options.tokens.include("\n")) { this.options.tokens.push("\n") } this.observer = null; this.element.setAttribute("autocomplete", "off"); Element.hide(this.update); Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this)); Event.observe(this.element, "keydown", this.onKeyPress.bindAsEventListener(this)) }, show: function() { if (Element.getStyle(this.update, "display") == "none") { this.options.onShow(this.element, this.update) } if (!this.iefix && (Prototype.Browser.IE) && (Element.getStyle(this.update, "position") == "absolute")) { new Insertion.After(this.update, '<iframe id="' + this.update.id + '_iefix" style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" src="javascript:false;" frameborder="0" scrolling="no"></iframe>'); this.iefix = $(this.update.id + "_iefix") } if (this.iefix) { setTimeout(this.fixIEOverlapping.bind(this), 50) } }, fixIEOverlapping: function() { Position.clone(this.update, this.iefix, { setTop: (!this.update.style.height) }); this.iefix.style.zIndex = 1; this.update.style.zIndex = 2; Element.show(this.iefix) }, hide: function() { this.stopIndicator(); if (Element.getStyle(this.update, "display") != "none") { this.options.onHide(this.element, this.update) } if (this.iefix) { Element.hide(this.iefix) } }, startIndicator: function() { if (this.options.indicator) { Element.show(this.options.indicator) } }, stopIndicator: function() { if (this.options.indicator) { Element.hide(this.options.indicator) } }, onKeyPress: function(a) { if (this.active) { switch (a.keyCode) { case Event.KEY_TAB: case Event.KEY_RETURN: this.selectEntry(); Event.stop(a); case Event.KEY_ESC: this.hide(); this.active = false; Event.stop(a); return; case Event.KEY_LEFT: case Event.KEY_RIGHT: return; case Event.KEY_UP: this.markPrevious(); this.render(); Event.stop(a); return; case Event.KEY_DOWN: this.markNext(); this.render(); Event.stop(a); return } } else { if (a.keyCode == Event.KEY_TAB || a.keyCode == Event.KEY_RETURN || (Prototype.Browser.WebKit > 0 && a.keyCode == 0)) { return } } this.changed = true; this.hasFocus = true; if (this.observer) { clearTimeout(this.observer) } this.observer = setTimeout(this.onObserverEvent.bind(this), this.options.frequency * 1000) }, activate: function() { this.changed = false; this.hasFocus = true; this.getUpdatedChoices() }, onHover: function(b) { var a = Event.findElement(b, "LI"); if (this.index != a.autocompleteIndex) { this.index = a.autocompleteIndex; this.render() } Event.stop(b) }, onClick: function(b) { var a = Event.findElement(b, "LI"); this.index = a.autocompleteIndex; this.selectEntry(); this.hide() }, onBlur: function(a) { setTimeout(this.hide.bind(this), 250); this.hasFocus = false; this.active = false }, render: function() { if (this.entryCount > 0) { for (var a = 0; a < this.entryCount; a++) { this.index == a ? Element.addClassName(this.getEntry(a), "selected") : Element.removeClassName(this.getEntry(a), "selected") } if (this.hasFocus) { this.show(); this.active = true } } else { this.active = false; this.hide() } }, markPrevious: function() { if (this.index > 0) { this.index-- } else { this.index = this.entryCount - 1 } this.getEntry(this.index).scrollIntoView(true) }, markNext: function() { if (this.index < this.entryCount - 1) { this.index++ } else { this.index = 0 } this.getEntry(this.index).scrollIntoView(false) }, getEntry: function(a) { return this.update.firstChild.childNodes[a] }, getCurrentEntry: function() { return this.getEntry(this.index) }, selectEntry: function() { this.active = false; this.updateElement(this.getCurrentEntry()) }, updateElement: function(f) { if (this.options.updateElement) { this.options.updateElement(f); return } var d, a, c, e, b; d = ""; if (this.options.select) { a = $(f).select("." + this.options.select) || []; if (a.length > 0) { d = Element.collectTextNodes(a[0], this.options.select) } } else { d = Element.collectTextNodesIgnoreClass(f, "informal") } c = this.getTokenBounds(); if (c[0] != -1) { e = this.element.value.substr(0, c[0]); b = this.element.value.substr(c[0]).match(/^\s+/); if (b) { e += b[0] } this.element.value = e + d + this.element.value.substr(c[1]) } else { this.element.value = d } this.oldElementValue = this.element.value; this.element.focus(); if (this.options.afterUpdateElement) { this.options.afterUpdateElement(this.element, f) } }, updateChoices: function(c) { if (!this.changed && this.hasFocus) { this.update.innerHTML = c; Element.cleanWhitespace(this.update); Element.cleanWhitespace(this.update.down()); if (this.update.firstChild && this.update.down().childNodes) { this.entryCount = this.update.down().childNodes.length; var a, b; for (a = 0; a < this.entryCount; a++) { b = this.getEntry(a); b.autocompleteIndex = a; this.addObservers(b) } } else { this.entryCount = 0 } this.stopIndicator(); this.index = 0; if (this.entryCount == 1 && this.options.autoSelect) { this.selectEntry(); this.hide() } else { this.render() } } }, addObservers: function(a) { Event.observe(a, "mouseover", this.onHover.bindAsEventListener(this)); Event.observe(a, "click", this.onClick.bindAsEventListener(this)) }, onObserverEvent: function() { this.changed = false; this.tokenBounds = null; if (this.getToken().length >= this.options.minChars) { this.getUpdatedChoices() } else { this.active = false; this.hide() } this.oldElementValue = this.element.value }, getToken: function() { var a = this.getTokenBounds(); return this.element.value.substring(a[0], a[1]).strip() }, getTokenBounds: function() { if (null != this.tokenBounds) { return this.tokenBounds } var e, f, h, d, c, b, a, g; e = this.element.value; if (e.strip().empty()) { return [-1, 0] } f = arguments.callee.getFirstDifferencePos(e, this.oldElementValue); h = (f == this.oldElementValue.length ? 1 : 0); d = -1; c = e.length; for (b = 0, a = this.options.tokens.length; b < a; ++b) { g = e.lastIndexOf(this.options.tokens[b], f + h - 1); if (g > d) { d = g } g = e.indexOf(this.options.tokens[b], f + h); if (-1 != g && g < c) { c = g } } return (this.tokenBounds = [d + 1, c]) } }); Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function(c, a) { var d, b; d = Math.min(c.length, a.length); for (b = 0; b < d; ++b) { if (c[b] != a[b]) { return b } } return d }; Ajax.Autocompleter = Class.create(Autocompleter.Base, { initialize: function(c, d, b, a) { this.baseInitialize(c, d, a); this.options.asynchronous = true; this.options.onComplete = this.onComplete.bind(this); this.options.defaultParams = this.options.parameters || null; this.url = b }, getUpdatedChoices: function() { this.startIndicator(); var a = encodeURIComponent(this.options.paramName) + "=" + encodeURIComponent(this.getToken()); this.options.parameters = this.options.callback ? this.options.callback(this.element, a) : a; if (this.options.defaultParams) { this.options.parameters += "&" + this.options.defaultParams } new Ajax.Request(this.url, this.options) }, onComplete: function(a) { this.updateChoices(a.responseText) } }); Autocompleter.Local = Class.create(Autocompleter.Base, { initialize: function(b, d, c, a) { this.baseInitialize(b, d, a); this.options.array = c }, getUpdatedChoices: function() { this.updateChoices(this.options.selector(this)) }, setOptions: function(a) { this.options = Object.extend({ choices: 10, partialSearch: true, partialChars: 2, ignoreCase: true, fullSearch: false, selector: function(b) { var d, c, h, g, e, f, j; d = []; c = []; h = b.getToken(); g = 0; for (e = 0; e < b.options.array.length && d.length < b.options.choices; e++) { f = b.options.array[e]; j = b.options.ignoreCase ? f.toLowerCase().indexOf(h.toLowerCase()) : f.indexOf(h); while (j != -1) { if (j == 0 && f.length != h.length) { d.push("<li><strong>" + f.substr(0, h.length) + "</strong>" + f.substr(h.length) + "</li>"); break } else { if (h.length >= b.options.partialChars && b.options.partialSearch && j != -1) { if (b.options.fullSearch || /\s/.test(f.substr(j - 1, 1))) { c.push("<li>" + f.substr(0, j) + "<strong>" + f.substr(j, h.length) + "</strong>" + f.substr(j + h.length) + "</li>"); break } } } j = b.options.ignoreCase ? f.toLowerCase().indexOf(h.toLowerCase(), j + 1) : f.indexOf(h, j + 1) } } if (c.length) { d = d.concat(c.slice(0, b.options.choices - d.length)) } return "<ul>" + d.join("") + "</ul>" } }, a || {}) } }); Field.scrollFreeActivate = function(a) { setTimeout(function() { Field.activate(a) }, 1) }; Ajax.InPlaceEditor = Class.create({ initialize: function(c, b, a) { this.url = b; this.element = c = $(c); this.prepareOptions(); this._controls = {}; arguments.callee.dealWithDeprecatedOptions(a); Object.extend(this.options, a || {}); if (!this.options.formId && this.element.id) { this.options.formId = this.element.id + "-inplaceeditor"; if ($(this.options.formId)) { this.options.formId = "" } } if (this.options.externalControl) { this.options.externalControl = $(this.options.externalControl) } if (!this.options.externalControl) { this.options.externalControlOnly = false } this._originalBackground = this.element.getStyle("background-color") || "transparent"; this.element.title = this.options.clickToEditText; this._boundCancelHandler = this.handleFormCancellation.bind(this); this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this); this._boundFailureHandler = this.handleAJAXFailure.bind(this); this._boundSubmitHandler = this.handleFormSubmission.bind(this); this._boundWrapperHandler = this.wrapUp.bind(this); this.registerListeners() }, checkForEscapeOrReturn: function(a) { if (!this._editing || a.ctrlKey || a.altKey || a.shiftKey) { return } if (Event.KEY_ESC == a.keyCode) { this.handleFormCancellation(a) } else { if (Event.KEY_RETURN == a.keyCode) { this.handleFormSubmission(a) } } }, createControl: function(g, c, b) { var e, f, a, d; e = this.options[g + "Control"]; f = this.options[g + "Text"]; if ("button" == e) { a = document.createElement("input"); a.type = "submit"; a.value = f; a.className = "editor_" + g + "_button"; if ("cancel" == g) { a.onclick = this._boundCancelHandler } this._form.appendChild(a); this._controls[g] = a } else { if ("link" == e) { d = document.createElement("a"); d.href = "#"; d.appendChild(document.createTextNode(f)); d.onclick = "cancel" == g ? this._boundCancelHandler : this._boundSubmitHandler; d.className = "editor_" + g + "_link"; if (b) { d.className += " " + b } this._form.appendChild(d); this._controls[g] = d } } }, createEditField: function() { var c, b, a; c = (this.options.loadTextURL ? this.options.loadingText : this.getText()); if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) { b = document.createElement("input"); b.type = "text"; a = this.options.size || this.options.cols || 0; if (0 < a) { b.size = a } } else { b = document.createElement("textarea"); b.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows); b.cols = this.options.cols || 40 } b.name = this.options.paramName; b.value = c; b.className = "editor_field"; if (this.options.submitOnBlur) { b.onblur = this._boundSubmitHandler } this._controls.editor = b; if (this.options.loadTextURL) { this.loadExternalText() } this._form.appendChild(this._controls.editor) }, createForm: function() { var b = this; function a(d, e) { var c = b.options["text" + d + "Controls"]; if (!c || e === false) { return } b._form.appendChild(document.createTextNode(c)) } this._form = $(document.createElement("form")); this._form.id = this.options.formId; this._form.addClassName(this.options.formClassName); this._form.onsubmit = this._boundSubmitHandler; this.createEditField(); if ("textarea" == this._controls.editor.tagName.toLowerCase()) { this._form.appendChild(document.createElement("br")) } if (this.options.onFormCustomization) { this.options.onFormCustomization(this, this._form) } a("Before", this.options.okControl || this.options.cancelControl); this.createControl("ok", this._boundSubmitHandler); a("Between", this.options.okControl && this.options.cancelControl); this.createControl("cancel", this._boundCancelHandler, "editor_cancel"); a("After", this.options.okControl || this.options.cancelControl) }, destroy: function() { if (this._oldInnerHTML) { this.element.innerHTML = this._oldInnerHTML } this.leaveEditMode(); this.unregisterListeners() }, enterEditMode: function(a) { if (this._saving || this._editing) { return } this._editing = true; this.triggerCallback("onEnterEditMode"); if (this.options.externalControl) { this.options.externalControl.hide() } this.element.hide(); this.createForm(); this.element.parentNode.insertBefore(this._form, this.element); if (!this.options.loadTextURL) { this.postProcessEditField() } if (a) { Event.stop(a) } }, enterHover: function(a) { if (this.options.hoverClassName) { this.element.addClassName(this.options.hoverClassName) } if (this._saving) { return } this.triggerCallback("onEnterHover") }, getText: function() { return this.element.innerHTML.unescapeHTML() }, handleAJAXFailure: function(a) { this.triggerCallback("onFailure", a); if (this._oldInnerHTML) { this.element.innerHTML = this._oldInnerHTML; this._oldInnerHTML = null } }, handleFormCancellation: function(a) { this.wrapUp(); if (a) { Event.stop(a) } }, handleFormSubmission: function(d) { var b, c, f, a; b = this._form; c = $F(this._controls.editor); this.prepareSubmission(); f = this.options.callback(b, c) || ""; if (Object.isString(f)) { f = f.toQueryParams() } f.editorId = this.element.id; if (this.options.htmlResponse) { a = Object.extend({ evalScripts: true }, this.options.ajaxOptions); Object.extend(a, { parameters: f, onComplete: this._boundWrapperHandler, onFailure: this._boundFailureHandler }); new Ajax.Updater({ success: this.element }, this.url, a) } else { a = Object.extend({ method: "get" }, this.options.ajaxOptions); Object.extend(a, { parameters: f, onComplete: this._boundWrapperHandler, onFailure: this._boundFailureHandler }); new Ajax.Request(this.url, a) } if (d) { Event.stop(d) } }, leaveEditMode: function() { this.element.removeClassName(this.options.savingClassName); this.removeForm(); this.leaveHover(); this.element.style.backgroundColor = this._originalBackground; this.element.show(); if (this.options.externalControl) { this.options.externalControl.show() } this._saving = false; this._editing = false; this._oldInnerHTML = null; this.triggerCallback("onLeaveEditMode") }, leaveHover: function(a) { if (this.options.hoverClassName) { this.element.removeClassName(this.options.hoverClassName) } if (this._saving) { return } this.triggerCallback("onLeaveHover") }, loadExternalText: function() { this._form.addClassName(this.options.loadingClassName); this._controls.editor.disabled = true; var a = Object.extend({ method: "get" }, this.options.ajaxOptions); Object.extend(a, { parameters: "editorId=" + encodeURIComponent(this.element.id), onComplete: Prototype.emptyFunction, onSuccess: function(c) { this._form.removeClassName(this.options.loadingClassName); var b = c.responseText; if (this.options.stripLoadedTextTags) { b = b.stripTags() } this._controls.editor.value = b; this._controls.editor.disabled = false; this.postProcessEditField() } .bind(this), onFailure: this._boundFailureHandler }); new Ajax.Request(this.options.loadTextURL, a) }, postProcessEditField: function() { var a = this.options.fieldPostCreation; if (a) { $(this._controls.editor)["focus" == a ? "focus" : "activate"]() } }, prepareOptions: function() { this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions); Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks); [this._extraDefaultOptions].flatten().compact().each(function(a) { Object.extend(this.options, a) } .bind(this)) }, prepareSubmission: function() { this._saving = true; this.removeForm(); this.leaveHover(); this.showSaving() }, registerListeners: function() { this._listeners = {}; var a; $H(Ajax.InPlaceEditor.Listeners).each(function(b) { a = this[b.value].bind(this); this._listeners[b.key] = a; if (!this.options.externalControlOnly) { this.element.observe(b.key, a) } if (this.options.externalControl) { this.options.externalControl.observe(b.key, a) } } .bind(this)) }, removeForm: function() { if (!this._form) { return } this._form.remove(); this._form = null; this._controls = {} }, showSaving: function() { this._oldInnerHTML = this.element.innerHTML; this.element.innerHTML = this.options.savingText; this.element.addClassName(this.options.savingClassName); this.element.style.backgroundColor = this._originalBackground; this.element.show() }, triggerCallback: function(b, a) { if ("function" == typeof this.options[b]) { this.options[b](this, a) } }, unregisterListeners: function() { $H(this._listeners).each(function(a) { if (!this.options.externalControlOnly) { this.element.stopObserving(a.key, a.value) } if (this.options.externalControl) { this.options.externalControl.stopObserving(a.key, a.value) } } .bind(this)) }, wrapUp: function(a) { this.leaveEditMode(); this._boundComplete(a, this.element) } }); Object.extend(Ajax.InPlaceEditor.prototype, { dispose: Ajax.InPlaceEditor.prototype.destroy }); Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, { initialize: function($super, c, b, a) { this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions; $super(c, b, a) }, createEditField: function() { var a = document.createElement("select"); a.name = this.options.paramName; a.size = 1; this._controls.editor = a; this._collection = this.options.collection || []; if (this.options.loadCollectionURL) { this.loadCollection() } else { this.checkForExternalText() } this._form.appendChild(this._controls.editor) }, loadCollection: function() { this._form.addClassName(this.options.loadingClassName); this.showLoadingText(this.options.loadingCollectionText); var options = Object.extend({ method: "get" }, this.options.ajaxOptions); Object.extend(options, { parameters: "editorId=" + encodeURIComponent(this.element.id), onComplete: Prototype.emptyFunction, onSuccess: function(transport) { var js = transport.responseText.strip(); if (!/^\[.*\]$/.test(js)) { throw ("Server returned an invalid collection representation.") } this._collection = eval(js); this.checkForExternalText() } .bind(this), onFailure: this.onFailure }); new Ajax.Request(this.options.loadCollectionURL, options) }, showLoadingText: function(b) { this._controls.editor.disabled = true; var a = this._controls.editor.firstChild; if (!a) { a = document.createElement("option"); a.value = ""; this._controls.editor.appendChild(a); a.selected = true } a.update((b || "").stripScripts().stripTags()) }, checkForExternalText: function() { this._text = this.getText(); if (this.options.loadTextURL) { this.loadExternalText() } else { this.buildOptionList() } }, loadExternalText: function() { this.showLoadingText(this.options.loadingText); var a = Object.extend({ method: "get" }, this.options.ajaxOptions); Object.extend(a, { parameters: "editorId=" + encodeURIComponent(this.element.id), onComplete: Prototype.emptyFunction, onSuccess: function(b) { this._text = b.responseText.strip(); this.buildOptionList() } .bind(this), onFailure: this.onFailure }); new Ajax.Request(this.options.loadTextURL, a) }, buildOptionList: function() { this._form.removeClassName(this.options.loadingClassName); this._collection = this._collection.map(function(d) { return 2 === d.length ? d : [d, d].flatten() }); var b, a, c; b = ("value" in this.options) ? this.options.value : this._text; a = this._collection.any(function(d) { return d[0] == b } .bind(this)); this._controls.editor.update(""); this._collection.each(function(e, d) { c = document.createElement("option"); c.value = e[0]; c.selected = a ? e[0] == b : 0 == d; c.appendChild(document.createTextNode(e[1])); this._controls.editor.appendChild(c) } .bind(this)); this._controls.editor.disabled = false; Field.scrollFreeActivate(this._controls.editor) } }); Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function(a) { if (!a) { return } function b(c, d) { if (c in a || d === undefined) { return } a[c] = d } b("cancelControl", (a.cancelLink ? "link" : (a.cancelButton ? "button" : a.cancelLink == a.cancelButton == false ? false : undefined))); b("okControl", (a.okLink ? "link" : (a.okButton ? "button" : a.okLink == a.okButton == false ? false : undefined))); b("highlightColor", a.highlightcolor); b("highlightEndColor", a.highlightendcolor) }; Object.extend(Ajax.InPlaceEditor, { DefaultOptions: { ajaxOptions: {}, autoRows: 3, cancelControl: "link", cancelText: "cancel", clickToEditText: "Click to edit", externalControl: null, externalControlOnly: false, fieldPostCreation: "activate", formClassName: "inplaceeditor-form", formId: null, highlightColor: "#ffff99", highlightEndColor: "#ffffff", hoverClassName: "", htmlResponse: true, loadingClassName: "inplaceeditor-loading", loadingText: "Loading...", okControl: "button", okText: "ok", paramName: "value", rows: 1, savingClassName: "inplaceeditor-saving", savingText: "Saving...", size: 0, stripLoadedTextTags: false, submitOnBlur: false, textAfterControls: "", textBeforeControls: "", textBetweenControls: "" }, DefaultCallbacks: { callback: function(a) { return Form.serialize(a) }, onComplete: function(b, a) { new Effect.Highlight(a, { startcolor: this.options.highlightColor, keepBackgroundImage: true }) }, onEnterEditMode: null, onEnterHover: function(a) { a.element.style.backgroundColor = a.options.highlightColor; if (a._effect) { a._effect.cancel() } }, onFailure: function(b, a) { alert("Error communication with the server: " + b.responseText.stripTags()) }, onFormCustomization: null, onLeaveEditMode: null, onLeaveHover: function(a) { a._effect = new Effect.Highlight(a.element, { startcolor: a.options.highlightColor, endcolor: a.options.highlightEndColor, restorecolor: a._originalBackground, keepBackgroundImage: true }) } }, Listeners: { click: "enterEditMode", keydown: "checkForEscapeOrReturn", mouseover: "enterHover", mouseout: "leaveHover"} }); Ajax.InPlaceCollectionEditor.DefaultOptions = { loadingCollectionText: "Loading options..." }; Form.Element.DelayedObserver = Class.create({ initialize: function(b, a, c) { this.delay = a || 0.5; this.element = $(b); this.callback = c; this.timer = null; this.lastValue = $F(this.element); Event.observe(this.element, "keyup", this.delayedListener.bindAsEventListener(this)) }, delayedListener: function(a) { if (this.lastValue == $F(this.element)) { return } if (this.timer) { clearTimeout(this.timer) } this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); this.lastValue = $F(this.element) }, onTimerEvent: function() { this.timer = null; this.callback(this.element, $F(this.element)) } }); if (Object.isUndefined(Effect)) { throw ("dragdrop.js requires including script.aculo.us' effects.js library") } Droppables = { drops: [], remove: function(a) { this.drops = this.drops.reject(function(b) { return b.element == $(a) }) }, add: function(b) { b = $(b); var a, c; a = Object.extend({ greedy: true, hoverclass: null, tree: false }, arguments[1] || {}); if (a.containment) { a._containers = []; c = a.containment; if (Object.isArray(c)) { c.each(function(d) { a._containers.push($(d)) }) } else { a._containers.push($(c)) } } if (a.accept) { a.accept = [a.accept].flatten() } Element.makePositioned(b); a.element = b; this.drops.push(a) }, findDeepestChild: function(b) { deepest = b[0]; for (var a = 1; a < b.length; ++a) { if (Element.isParent(b[a].element, deepest.element)) { deepest = b[a] } } return deepest }, isContained: function(b, a) { var c; if (a.tree) { c = b.treeNode } else { c = b.parentNode } return a._containers.detect(function(d) { return c == d }) }, isAffected: function(a, c, b) { return ((b.element != c) && ((!b._containers) || this.isContained(c, b)) && ((!b.accept) || (Element.classNames(c).detect(function(d) { return b.accept.include(d) }))) && Position.within(b.element, a[0], a[1])) }, deactivate: function(a) { if (a.hoverclass) { Element.removeClassName(a.element, a.hoverclass) } this.last_active = null }, activate: function(a) { if (a.hoverclass) { Element.addClassName(a.element, a.hoverclass) } this.last_active = a }, show: function(a, c) { if (!this.drops.length) { return } var b, d = []; this.drops.each(function(e) { if (Droppables.isAffected(a, c, e)) { d.push(e) } }); if (d.length > 0) { b = Droppables.findDeepestChild(d) } if (this.last_active && this.last_active != b) { this.deactivate(this.last_active) } if (b) { Position.within(b.element, a[0], a[1]); if (b.onHover) { b.onHover(c, b.element, Position.overlap(b.overlap, b.element)) } if (b != this.last_active) { Droppables.activate(b) } } }, fire: function(b, a) { if (!this.last_active) { return } Position.prepare(); if (this.isAffected([Event.pointerX(b), Event.pointerY(b)], a, this.last_active)) { if (this.last_active.onDrop) { this.last_active.onDrop(a, this.last_active.element, b); return true } } }, reset: function() { if (this.last_active) { this.deactivate(this.last_active) } } }; Draggables = { drags: [], observers: [], register: function(a) { if (this.drags.length == 0) { this.eventMouseUp = this.endDrag.bindAsEventListener(this); this.eventMouseMove = this.updateDrag.bindAsEventListener(this); this.eventKeypress = this.keyPress.bindAsEventListener(this); Event.observe(document, "mouseup", this.eventMouseUp); Event.observe(document, "mousemove", this.eventMouseMove); Event.observe(document, "keypress", this.eventKeypress) } this.drags.push(a) }, unregister: function(a) { this.drags = this.drags.reject(function(b) { return b == a }); if (this.drags.length == 0) { Event.stopObserving(document, "mouseup", this.eventMouseUp); Event.stopObserving(document, "mousemove", this.eventMouseMove); Event.stopObserving(document, "keypress", this.eventKeypress) } }, activate: function(a) { if (a.options.delay) { this._timeout = setTimeout(function() { Draggables._timeout = null; window.focus(); Draggables.activeDraggable = a } .bind(this), a.options.delay) } else { window.focus(); this.activeDraggable = a } }, deactivate: function() { this.activeDraggable = null }, updateDrag: function(a) { if (!this.activeDraggable) { return } var b = [Event.pointerX(a), Event.pointerY(a)]; if (this._lastPointer && (this._lastPointer.inspect() == b.inspect())) { return } this._lastPointer = b; this.activeDraggable.updateDrag(a, b) }, endDrag: function(a) { if (this._timeout) { clearTimeout(this._timeout); this._timeout = null } if (!this.activeDraggable) { return } this._lastPointer = null; this.activeDraggable.endDrag(a); this.activeDraggable = null }, keyPress: function(a) { if (this.activeDraggable) { this.activeDraggable.keyPress(a) } }, addObserver: function(a) { this.observers.push(a); this._cacheObserverCallbacks() }, removeObserver: function(a) { this.observers = this.observers.reject(function(b) { return b.element == a }); this._cacheObserverCallbacks() }, notify: function(b, a, c) { if (this[b + "Count"] > 0) { this.observers.each(function(d) { if (d[b]) { d[b](b, a, c) } }) } if (a.options[b]) { a.options[b](a, c) } }, _cacheObserverCallbacks: function() { ["onStart", "onEnd", "onDrag"].each(function(a) { Draggables[a + "Count"] = Draggables.observers.select(function(b) { return b[a] }).length }) } }; Draggable = Class.create({ initialize: function(b) { var c, a; c = { handle: false, reverteffect: function(f, e, d) { var g = Math.sqrt(Math.abs(e ^ 2) + Math.abs(d ^ 2)) * 0.02; new Effect.Move(f, { x: -d, y: -e, duration: g, queue: { scope: "_draggable", position: "end"} }) }, endeffect: function(e) { var d = Object.isNumber(e._opacity) ? e._opacity : 1; new Effect.Opacity(e, { duration: 0.2, from: 0.7, to: d, queue: { scope: "_draggable", position: "end" }, afterFinish: function() { Draggable._dragging[e] = false } }) }, zindex: 1000, revert: false, quiet: false, scroll: false, scrollSensitivity: 20, scrollSpeed: 15, snap: false, delay: 0 }; if (!arguments[1] || Object.isUndefined(arguments[1].endeffect)) { Object.extend(c, { starteffect: function(d) { d._opacity = Element.getOpacity(d); Draggable._dragging[d] = true; new Effect.Opacity(d, { duration: 0.2, from: d._opacity, to: 0.7 }) } }) } a = Object.extend(c, arguments[1] || {}); this.element = $(b); if (a.handle && Object.isString(a.handle)) { this.handle = this.element.down("." + a.handle, 0) } if (!this.handle) { this.handle = $(a.handle) } if (!this.handle) { this.handle = this.element } if (a.scroll && !a.scroll.scrollTo && !a.scroll.outerHTML) { a.scroll = $(a.scroll); this._isScrollChild = Element.childOf(this.element, a.scroll) } Element.makePositioned(this.element); this.options = a; this.dragging = false; this.eventMouseDown = this.initDrag.bindAsEventListener(this); Event.observe(this.handle, "mousedown", this.eventMouseDown); Draggables.register(this) }, destroy: function() { Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); Draggables.unregister(this) }, currentDelta: function() { return ([parseInt(Element.getStyle(this.element, "left") || "0"), parseInt(Element.getStyle(this.element, "top") || "0")]) }, initDrag: function(a) { if (!Object.isUndefined(Draggable._dragging[this.element]) && Draggable._dragging[this.element]) { return } if (Event.isLeftClick(a)) { var c, b, d; c = Event.element(a); if ((tag_name = c.tagName.toUpperCase()) && (tag_name == "INPUT" || tag_name == "SELECT" || tag_name == "OPTION" || tag_name == "BUTTON" || tag_name == "TEXTAREA")) { return } b = [Event.pointerX(a), Event.pointerY(a)]; d = this.element.cumulativeOffset(); this.offset = [0, 1].map(function(e) { return (b[e] - d[e]) }); Draggables.activate(this); Event.stop(a) } }, startDrag: function(b) { this.dragging = true; if (!this.delta) { this.delta = this.currentDelta() } if (this.options.zindex) { this.originalZ = parseInt(Element.getStyle(this.element, "z-index") || 0); this.element.style.zIndex = this.options.zindex } if (this.options.ghosting) { this._clone = this.element.cloneNode(true); this._originallyAbsolute = (this.element.getStyle("position") == "absolute"); if (!this._originallyAbsolute) { Position.absolutize(this.element) } this.element.parentNode.insertBefore(this._clone, this.element) } if (this.options.scroll) { if (this.options.scroll == window) { var a = this._getWindowScroll(this.options.scroll); this.originalScrollLeft = a.left; this.originalScrollTop = a.top } else { this.originalScrollLeft = this.options.scroll.scrollLeft; this.originalScrollTop = this.options.scroll.scrollTop } } Draggables.notify("onStart", this, b); if (this.options.starteffect) { this.options.starteffect(this.element) } }, updateDrag: function(event, pointer) { if (!this.dragging) { this.startDrag(event) } if (!this.options.quiet) { Position.prepare(); Droppables.show(pointer, this.element) } Draggables.notify("onDrag", this, event); this.draw(pointer); if (this.options.change) { this.options.change(this) } if (this.options.scroll) { this.stopScrolling(); var p, speed; if (this.options.scroll == window) { with (this._getWindowScroll(this.options.scroll)) { p = [left, top, left + width, top + height] } } else { p = Position.page(this.options.scroll); p[0] += this.options.scroll.scrollLeft + Position.deltaX; p[1] += this.options.scroll.scrollTop + Position.deltaY; p.push(p[0] + this.options.scroll.offsetWidth); p.push(p[1] + this.options.scroll.offsetHeight) } speed = [0, 0]; if (pointer[0] < (p[0] + this.options.scrollSensitivity)) { speed[0] = pointer[0] - (p[0] + this.options.scrollSensitivity) } if (pointer[1] < (p[1] + this.options.scrollSensitivity)) { speed[1] = pointer[1] - (p[1] + this.options.scrollSensitivity) } if (pointer[0] > (p[2] - this.options.scrollSensitivity)) { speed[0] = pointer[0] - (p[2] - this.options.scrollSensitivity) } if (pointer[1] > (p[3] - this.options.scrollSensitivity)) { speed[1] = pointer[1] - (p[3] - this.options.scrollSensitivity) } this.startScrolling(speed) } if (Prototype.Browser.WebKit) { window.scrollBy(0, 0) } Event.stop(event) }, finishDrag: function(b, f) { this.dragging = false; var e, g, a, c; if (this.options.quiet) { Position.prepare(); e = [Event.pointerX(b), Event.pointerY(b)]; Droppables.show(e, this.element) } if (this.options.ghosting) { if (!this._originallyAbsolute) { Position.relativize(this.element) } delete this._originallyAbsolute; Element.remove(this._clone); this._clone = null } g = false; if (f) { g = Droppables.fire(b, this.element); if (!g) { g = false } } if (g && this.options.onDropped) { this.options.onDropped(this.element) } Draggables.notify("onEnd", this, b); a = this.options.revert; if (a && Object.isFunction(a)) { a = a(this.element) } c = this.currentDelta(); if (a && this.options.reverteffect) { if (g == 0 || a != "failure") { this.options.reverteffect(this.element, c[1] - this.delta[1], c[0] - this.delta[0]) } } else { this.delta = c } if (this.options.zindex) { this.element.style.zIndex = this.originalZ } if (this.options.endeffect) { this.options.endeffect(this.element) } Draggables.deactivate(this); Droppables.reset() }, keyPress: function(a) { if (a.keyCode != Event.KEY_ESC) { return } this.finishDrag(a, false); Event.stop(a) }, endDrag: function(a) { if (!this.dragging) { return } this.stopScrolling(); this.finishDrag(a, true); Event.stop(a) }, draw: function(a) { var g, c, f, e, b; g = this.element.cumulativeOffset(); if (this.options.ghosting) { c = Position.realOffset(this.element); g[0] += c[0] - Position.deltaX; g[1] += c[1] - Position.deltaY } f = this.currentDelta(); g[0] -= f[0]; g[1] -= f[1]; if (this.options.scroll && (this.options.scroll != window && this._isScrollChild)) { g[0] -= this.options.scroll.scrollLeft - this.originalScrollLeft; g[1] -= this.options.scroll.scrollTop - this.originalScrollTop } e = [0, 1].map(function(d) { return (a[d] - g[d] - this.offset[d]) } .bind(this)); if (this.options.snap) { if (Object.isFunction(this.options.snap)) { e = this.options.snap(e[0], e[1], this) } else { if (Object.isArray(this.options.snap)) { e = e.map(function(d, h) { return (d / this.options.snap[h]).round() * this.options.snap[h] } .bind(this)) } else { e = e.map(function(d) { return (d / this.options.snap).round() * this.options.snap } .bind(this)) } } } b = this.element.style; if ((!this.options.constraint) || (this.options.constraint == "horizontal")) { b.left = e[0] + "px" } if ((!this.options.constraint) || (this.options.constraint == "vertical")) { b.top = e[1] + "px" } if (b.visibility == "hidden") { b.visibility = "" } }, stopScrolling: function() { if (this.scrollInterval) { clearInterval(this.scrollInterval); this.scrollInterval = null; Draggables._lastScrollPointer = null } }, startScrolling: function(a) { if (!(a[0] || a[1])) { return } this.scrollSpeed = [a[0] * this.options.scrollSpeed, a[1] * this.options.scrollSpeed]; this.lastScrolled = new Date(); this.scrollInterval = setInterval(this.scroll.bind(this), 10) }, scroll: function() { var current, delta, d; current = new Date(); delta = current - this.lastScrolled; this.lastScrolled = current; if (this.options.scroll == window) { with (this._getWindowScroll(this.options.scroll)) { if (this.scrollSpeed[0] || this.scrollSpeed[1]) { d = delta / 1000; this.options.scroll.scrollTo(left + d * this.scrollSpeed[0], top + d * this.scrollSpeed[1]) } } } else { this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000; this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000 } Position.prepare(); Droppables.show(Draggables._lastPointer, this.element); Draggables.notify("onDrag", this); if (this._isScrollChild) { Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer); Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000; Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000; if (Draggables._lastScrollPointer[0] < 0) { Draggables._lastScrollPointer[0] = 0 } if (Draggables._lastScrollPointer[1] < 0) { Draggables._lastScrollPointer[1] = 0 } this.draw(Draggables._lastScrollPointer) } if (this.options.change) { this.options.change(this) } }, _getWindowScroll: function(w) { var T, L, W, H; with (w.document) { if (w.document.documentElement && documentElement.scrollTop) { T = documentElement.scrollTop; L = documentElement.scrollLeft } else { if (w.document.body) { T = body.scrollTop; L = body.scrollLeft } } if (w.innerWidth) { W = w.innerWidth; H = w.innerHeight } else { if (w.document.documentElement && documentElement.clientWidth) { W = documentElement.clientWidth; H = documentElement.clientHeight } else { W = body.offsetWidth; H = body.offsetHeight } } } return { top: T, left: L, width: W, height: H} } }); Draggable._dragging = {}; SortableObserver = Class.create({ initialize: function(b, a) { this.element = $(b); this.observer = a; this.lastValue = Sortable.serialize(this.element) }, onStart: function() { this.lastValue = Sortable.serialize(this.element) }, onEnd: function() { Sortable.unmark(); if (this.lastValue != Sortable.serialize(this.element)) { this.observer(this.element) } } }); Sortable = { SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/, sortables: {}, _findRootElement: function(a) { while (a.tagName.toUpperCase() != "BODY") { if (a.id && Sortable.sortables[a.id]) { return a } a = a.parentNode } }, options: function(a) { a = Sortable._findRootElement($(a)); if (!a) { return } return Sortable.sortables[a.id] }, destroy: function(a) { a = $(a); var b = Sortable.sortables[a.id]; if (b) { Draggables.removeObserver(b.element); b.droppables.each(function(c) { Droppables.remove(c) }); b.draggables.invoke("destroy"); delete Sortable.sortables[b.element.id] } }, create: function(c) { c = $(c); var b, a, d, e; b = Object.extend({ element: c, tag: "li", dropOnEmpty: false, tree: false, treeTag: "ul", overlap: "vertical", constraint: "vertical", containment: c, handle: false, only: false, delay: 0, hoverclass: null, ghosting: false, quiet: false, scroll: false, scrollSensitivity: 20, scrollSpeed: 15, format: this.SERIALIZE_RULE, elements: false, handles: false, onChange: Prototype.emptyFunction, onUpdate: Prototype.emptyFunction }, arguments[1] || {}); this.destroy(c); a = { revert: true, quiet: b.quiet, scroll: b.scroll, scrollSpeed: b.scrollSpeed, scrollSensitivity: b.scrollSensitivity, delay: b.delay, ghosting: b.ghosting, constraint: b.constraint, handle: b.handle }; if (b.starteffect) { a.starteffect = b.starteffect } if (b.reverteffect) { a.reverteffect = b.reverteffect } else { if (b.ghosting) { a.reverteffect = function(f) { f.style.top = 0; f.style.left = 0 } } } if (b.endeffect) { a.endeffect = b.endeffect } if (b.zindex) { a.zindex = b.zindex } d = { overlap: b.overlap, containment: b.containment, tree: b.tree, hoverclass: b.hoverclass, onHover: Sortable.onHover }; e = { onHover: Sortable.onEmptyHover, overlap: b.overlap, containment: b.containment, hoverclass: b.hoverclass }; Element.cleanWhitespace(c); b.draggables = []; b.droppables = []; if (b.dropOnEmpty || b.tree) { Droppables.add(c, e); b.droppables.push(c) } (b.elements || this.findElements(c, b) || []).each(function(h, f) { var g = b.handles ? $(b.handles[f]) : (b.handle ? $(h).select("." + b.handle)[0] : h); b.draggables.push(new Draggable(h, Object.extend(a, { handle: g }))); Droppables.add(h, d); if (b.tree) { h.treeNode = c } b.droppables.push(h) }); if (b.tree) { (Sortable.findTreeElements(c, b) || []).each(function(f) { Droppables.add(f, e); f.treeNode = c; b.droppables.push(f) }) } this.sortables[c.identify()] = b; Draggables.addObserver(new SortableObserver(c, b.onUpdate)) }, findElements: function(b, a) { return Element.findChildren(b, a.only, a.tree ? true : false, a.tag) }, findTreeElements: function(b, a) { return Element.findChildren(b, a.only, a.tree ? true : false, a.treeTag) }, onHover: function(e, d, a) { if (Element.isParent(d, e)) { return } var b, c; if (a > 0.33 && a < 0.66 && Sortable.options(d).tree) { return } else { if (a > 0.5) { Sortable.mark(d, "before"); if (d.previousSibling != e) { b = e.parentNode; e.style.visibility = "hidden"; d.parentNode.insertBefore(e, d); if (d.parentNode != b) { Sortable.options(b).onChange(e) } Sortable.options(d.parentNode).onChange(e) } } else { Sortable.mark(d, "after"); c = d.nextSibling || null; if (c != e) { b = e.parentNode; e.style.visibility = "hidden"; d.parentNode.insertBefore(e, c); if (d.parentNode != b) { Sortable.options(b).onChange(e) } Sortable.options(d.parentNode).onChange(e) } } } }, onEmptyHover: function(e, g, h) { var i, a, f, c, b, d; i = e.parentNode; a = Sortable.options(g); if (!Element.isParent(g, e)) { c = Sortable.findElements(g, { tag: a.tag, only: a.only }); b = null; if (c) { d = Element.offsetSize(g, a.overlap) * (1 - h); for (f = 0; f < c.length; f += 1) { if (d - Element.offsetSize(c[f], a.overlap) >= 0) { d -= Element.offsetSize(c[f], a.overlap) } else { if (d - (Element.offsetSize(c[f], a.overlap) / 2) >= 0) { b = f + 1 < c.length ? c[f + 1] : null; break } else { b = c[f]; break } } } } g.insertBefore(e, b); Sortable.options(i).onChange(e); a.onChange(e) } }, unmark: function() { if (Sortable._marker) { Sortable._marker.hide() } }, mark: function(b, a) { var d, c; d = Sortable.options(b.parentNode); if (d && !d.ghosting) { return } if (!Sortable._marker) { Sortable._marker = ($("dropmarker") || Element.extend(document.createElement("DIV"))).hide().addClassName("dropmarker").setStyle({ position: "absolute" }); document.getElementsByTagName("body").item(0).appendChild(Sortable._marker) } c = b.cumulativeOffset(); Sortable._marker.setStyle({ left: c[0] + "px", top: c[1] + "px" }); if (a == "after") { if (d.overlap == "horizontal") { Sortable._marker.setStyle({ left: (c[0] + b.clientWidth) + "px" }) } else { Sortable._marker.setStyle({ top: (c[1] + b.clientHeight) + "px" }) } } Sortable._marker.show() }, _tree: function(e, b, f) { var d, c, a, g; d = Sortable.findElements(e, b) || []; for (c = 0; c < d.length; ++c) { a = d[c].id.match(b.format); if (!a) { continue } g = { id: encodeURIComponent(a ? a[1] : null), element: e, parent: f, children: [], position: f.children.length, container: $(d[c]).down(b.treeTag) }; if (g.container) { this._tree(g.container, b, g) } f.children.push(g) } return f }, tree: function(d) { d = $(d); var c, b, a; c = this.options(d); b = Object.extend({ tag: c.tag, treeTag: c.treeTag, only: c.only, name: d.id, format: c.format }, arguments[1] || {}); a = { id: null, parent: null, children: [], container: d, position: 0 }; return Sortable._tree(d, b, a) }, _constructIndex: function(b) { var a = ""; do { if (b.id) { a = "[" + b.position + "]" + a } } while ((b = b.parent) != null); return a }, sequence: function(b) { b = $(b); var a = Object.extend(this.options(b), arguments[1] || {}); return $(this.findElements(b, a) || []).map(function(c) { return c.id.match(a.format) ? c.id.match(a.format)[1] : "" }) }, setSequence: function(b, c) { b = $(b); var a, d; a = Object.extend(this.options(b), arguments[2] || {}); d = {}; this.findElements(b, a).each(function(e) { if (e.id.match(a.format)) { d[e.id.match(a.format)[1]] = [e, e.parentNode] } e.parentNode.removeChild(e) }); c.each(function(e) { var f = d[e]; if (f) { f[1].appendChild(f[0]); delete d[e] } }) }, serialize: function(c) { c = $(c); var b, a; b = Object.extend(Sortable.options(c), arguments[1] || {}); a = encodeURIComponent((arguments[1] && arguments[1].name) ? arguments[1].name : c.id); if (b.tree) { return Sortable.tree(c, arguments[1]).children.map(function(d) { return [a + Sortable._constructIndex(d) + "[id]=" + encodeURIComponent(d.id)].concat(d.children.map(arguments.callee)) }).flatten().join("&") } else { return Sortable.sequence(c, arguments[1]).map(function(d) { return a + "[]=" + encodeURIComponent(d) }).join("&") } } }; Element.isParent = function(b, a) { if (!b.parentNode || b == a) { return false } if (b.parentNode == a) { return true } return Element.isParent(b.parentNode, a) }; Element.findChildren = function(d, b, a, c) { if (!d.hasChildNodes()) { return null } c = c.toUpperCase(); if (b) { b = [b].flatten() } var e = []; $A(d.childNodes).each(function(g) { if (g.tagName && g.tagName.toUpperCase() == c && (!b || (Element.classNames(g).detect(function(h) { return b.include(h) })))) { e.push(g) } if (a) { var f = Element.findChildren(g, b, a, c); if (f) { e.push(f) } } }); return (e.length > 0 ? e.flatten() : []) }; Element.offsetSize = function(a, b) { return a["offset" + ((b == "vertical" || b == "height") ? "Height" : "Width")] }; if (!Control) { Control = {} } Control.Slider = Class.create({ initialize: function(d, a, b) { var c = this; if (Object.isArray(d)) { this.handles = d.collect(function(f) { return $(f) }) } else { this.handles = [$(d)] } this.track = $(a); this.options = b || {}; this.axis = this.options.axis || "horizontal"; this.increment = this.options.increment || 1; this.step = parseInt(this.options.step || "1"); this.range = this.options.range || $R(0, 1); this.value = 0; this.values = this.handles.map(function() { return 0 }); this.spans = this.options.spans ? this.options.spans.map(function(e) { return $(e) }) : false; this.options.startSpan = $(this.options.startSpan || null); this.options.endSpan = $(this.options.endSpan || null); this.restricted = this.options.restricted || false; this.maximum = this.options.maximum || this.range.end; this.minimum = this.options.minimum || this.range.start; this.alignX = parseInt(this.options.alignX || "0"); this.alignY = parseInt(this.options.alignY || "0"); this.trackLength = this.maximumOffset() - this.minimumOffset(); this.handleLength = this.isVertical() ? (this.handles[0].offsetHeight != 0 ? this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/, "")) : (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : this.handles[0].style.width.replace(/px$/, "")); this.active = false; this.dragging = false; this.disabled = false; if (this.options.disabled) { this.setDisabled() } this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; if (this.allowedValues) { this.minimum = this.allowedValues.min(); this.maximum = this.allowedValues.max() } this.eventMouseDown = this.startDrag.bindAsEventListener(this); this.eventMouseUp = this.endDrag.bindAsEventListener(this); this.eventMouseMove = this.update.bindAsEventListener(this); this.handles.each(function(f, e) { e = c.handles.length - 1 - e; c.setValue(parseFloat((Object.isArray(c.options.sliderValue) ? c.options.sliderValue[e] : c.options.sliderValue) || c.range.start), e); f.makePositioned().observe("mousedown", c.eventMouseDown) }); this.track.observe("mousedown", this.eventMouseDown); document.observe("mouseup", this.eventMouseUp); document.observe("mousemove", this.eventMouseMove); this.initialized = true }, dispose: function() { var a = this; Event.stopObserving(this.track, "mousedown", this.eventMouseDown); Event.stopObserving(document, "mouseup", this.eventMouseUp); Event.stopObserving(document, "mousemove", this.eventMouseMove); this.handles.each(function(b) { Event.stopObserving(b, "mousedown", a.eventMouseDown) }) }, setDisabled: function() { this.disabled = true }, setEnabled: function() { this.disabled = false }, getNearestValue: function(b) { if (this.allowedValues) { if (b >= this.allowedValues.max()) { return (this.allowedValues.max()) } if (b <= this.allowedValues.min()) { return (this.allowedValues.min()) } var d, c, a; d = Math.abs(this.allowedValues[0] - b); c = this.allowedValues[0]; this.allowedValues.each(function(e) { a = Math.abs(e - b); if (a <= d) { c = e; d = a } }); return c } if (b > this.range.end) { return this.range.end } if (b < this.range.start) { return this.range.start } return b }, setValue: function(b, a) { if (!this.active) { this.activeHandleIdx = a || 0; this.activeHandle = this.handles[this.activeHandleIdx]; this.updateStyles() } a = a || this.activeHandleIdx || 0; if (this.initialized && this.restricted) { if ((a > 0) && (b < this.values[a - 1])) { b = this.values[a - 1] } if ((a < (this.handles.length - 1)) && (b > this.values[a + 1])) { b = this.values[a + 1] } } b = this.getNearestValue(b); this.values[a] = b; this.value = this.values[0]; this.handles[a].style[this.isVertical() ? "top" : "left"] = this.translateToPx(b); this.drawSpans(); if (!this.dragging || !this.event) { this.updateFinished() } }, setValueBy: function(b, a) { this.setValue(this.values[a || this.activeHandleIdx || 0] + b, a || this.activeHandleIdx || 0) }, translateToPx: function(a) { return Math.round(((this.trackLength - this.handleLength) / (this.range.end - this.range.start)) * (a - this.range.start)) + "px" }, translateToValue: function(a) { return ((a / (this.trackLength - this.handleLength) * (this.range.end - this.range.start)) + this.range.start) }, getRange: function(b) { var a = this.values.sortBy(Prototype.K); b = b || 0; return $R(a[b], a[b + 1]) }, minimumOffset: function() { return (this.isVertical() ? this.alignY : this.alignX) }, maximumOffset: function() { return (this.isVertical() ? (this.track.offsetHeight != 0 ? this.track.offsetHeight : this.track.style.height.replace(/px$/, "")) - this.alignY : (this.track.offsetWidth != 0 ? this.track.offsetWidth : this.track.style.width.replace(/px$/, "")) - this.alignX) }, isVertical: function() { return (this.axis == "vertical") }, drawSpans: function() { var a = this; if (this.spans) { $R(0, this.spans.length - 1).each(function(b) { a.setSpan(a.spans[b], a.getRange(b)) }) } if (this.options.startSpan) { this.setSpan(this.options.startSpan, $R(0, this.values.length > 1 ? this.getRange(0).min() : this.value)) } if (this.options.endSpan) { this.setSpan(this.options.endSpan, $R(this.values.length > 1 ? this.getRange(this.spans.length - 1).max() : this.value, this.maximum)) } }, setSpan: function(b, a) { if (this.isVertical()) { b.style.top = this.translateToPx(a.start); b.style.height = this.translateToPx(a.end - a.start + this.range.start) } else { b.style.left = this.translateToPx(a.start); b.style.width = this.translateToPx(a.end - a.start + this.range.start) } }, updateStyles: function() { this.handles.each(function(a) { Element.removeClassName(a, "selected") }); Element.addClassName(this.activeHandle, "selected") }, startDrag: function(c) { if (Event.isLeftClick(c)) { if (!this.disabled) { this.active = true; var d, e, a, b; d = Event.element(c); e = [Event.pointerX(c), Event.pointerY(c)]; a = d; if (a == this.track) { b = this.track.cumulativeOffset(); this.event = c; this.setValue(this.translateToValue((this.isVertical() ? e[1] - b[1] : e[0] - b[0]) - (this.handleLength / 2))); b = this.activeHandle.cumulativeOffset(); this.offsetX = (e[0] - b[0]); this.offsetY = (e[1] - b[1]) } else { while ((this.handles.indexOf(d) == -1) && d.parentNode) { d = d.parentNode } if (this.handles.indexOf(d) != -1) { this.activeHandle = d; this.activeHandleIdx = this.handles.indexOf(this.activeHandle); this.updateStyles(); b = this.activeHandle.cumulativeOffset(); this.offsetX = (e[0] - b[0]); this.offsetY = (e[1] - b[1]) } } } Event.stop(c) } }, update: function(a) { if (this.active) { if (!this.dragging) { this.dragging = true } this.draw(a); if (Prototype.Browser.WebKit) { window.scrollBy(0, 0) } Event.stop(a) } }, draw: function(b) { var c, a; c = [Event.pointerX(b), Event.pointerY(b)]; a = this.track.cumulativeOffset(); c[0] -= this.offsetX + a[0]; c[1] -= this.offsetY + a[1]; this.event = b; this.setValue(this.translateToValue(this.isVertical() ? c[1] : c[0])); if (this.initialized && this.options.onSlide) { this.options.onSlide(this.values.length > 1 ? this.values : this.value, this) } }, endDrag: function(a) { if (this.active && this.dragging) { this.finishDrag(a, true); Event.stop(a) } this.active = false; this.dragging = false }, finishDrag: function(a, b) { this.active = false; this.dragging = false; this.updateFinished() }, updateFinished: function() { if (this.initialized && this.options.onChange) { this.options.onChange(this.values.length > 1 ? this.values : this.value, this) } this.event = null } }); Sound = { tracks: {}, _enabled: true, template: new Template('<embed style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>'), enable: function() { Sound._enabled = true }, disable: function() { Sound._enabled = false }, play: function(b) { if (!Sound._enabled) { return } var a = Object.extend({ track: "global", url: b, replace: false }, arguments[1] || {}); if (a.replace && this.tracks[a.track]) { $R(0, this.tracks[a.track].id).each(function(d) { var c = $("sound_" + a.track + "_" + d); c.Stop && c.Stop(); c.remove() }); this.tracks[a.track] = null } if (!this.tracks[a.track]) { this.tracks[a.track] = { id: 0} } else { this.tracks[a.track].id++ } a.id = this.tracks[a.track].id; $$("body")[0].insert(Prototype.Browser.IE ? new Element("bgsound", { id: "sound_" + a.track + "_" + a.id, src: a.url, loop: 1, autostart: true }) : Sound.template.evaluate(a)) } }; if (Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0) { if (navigator.plugins && $A(navigator.plugins).detect(function(a) { return a.name.indexOf("QuickTime") != -1 })) { Sound.template = new Template('<object id="sound_#{track}_#{id}" width="0" height="0" type="audio/mpeg" data="#{url}"/>') } else { if (navigator.plugins && $A(navigator.plugins).detect(function(a) { return a.name.indexOf("Windows Media") != -1 })) { Sound.template = new Template('<object id="sound_#{track}_#{id}" type="application/x-mplayer2" data="#{url}"></object>') } else { if (navigator.plugins && $A(navigator.plugins).detect(function(a) { return a.name.indexOf("RealPlayer") != -1 })) { Sound.template = new Template('<embed type="audio/x-pn-realaudio-plugin" style="height:0" id="sound_#{track}_#{id}" src="#{url}" loop="false" autostart="true" hidden="true"/>') } else { Sound.play = function() { } } } } };
function getSearchResults(artistParam, locationParam, fromDateParam, toDateParam, filterParam, includeSimilar, startWith, linkToReplace) {
    var requestURL = "";

    if (linkToReplace != null) {
        if (typeof (linkToReplace.remove) == 'function')
            linkToReplace.remove();
        else
            linkToReplace.innerHTML = "";
    }

    setValueForPlaceHolder($('artistName'), artistParam);
    setValueForPlaceHolder($('location'), locationParam);
    setValueForPlaceHolder($('fromDate'), fromDateParam);
    setValueForPlaceHolder($('toDate'), toDateParam);

    if (filterParam == "True")
        $('chkOnlyWithEvents').checked = true;

    $('chkWithSimilar').checked = (includeSimilar == "True");
    $('tdOnlyWithEvents').style.display = (includeSimilar == "True" ? "block" : "none");


    if (locationParam != "" && artistParam == "")
        requestURL = 'findshowslocation.aspx?location=' + locationParam + '&fromDate=' + fromDateParam + '&toDate=' + toDateParam + '&startWith=' + startWith;
    else
        requestURL = 'findshows.aspx?artistName=' + artistParam + '&location=' + locationParam + '&fromDate=' + fromDateParam + '&toDate=' + toDateParam + '&chkOnlyWithEvents=' + filterParam + '&chkWithSimilar=' + includeSimilar + '&startWith=' + startWith;

    new Ajax.Updater('resultsDiv', requestURL, { evalScripts: true, insertion: Insertion.Bottom });

    $('activityIndicatorDiv').show();
}

function removeSpinner() {
    $('activityIndicatorDiv').hide();
}

var currImage = 1;

function switchImage(url) {
    var currImgID = "artistImg" + currImage;

    // Switch
    //currImage = currImage == 1 ? 2 : 1;

    var newImgID = "artistImg" + currImage;
    $(newImgID).src = url;

    //Effect.Fade(currImgID);
    //Effect.Appear(newImgID);
}

// Artist links area
var objId;
var linkEffectTimer;

function showLinks(artistID) {
    objId = "linksDiv" + artistID;

    window.clearTimeout(linkEffectTimer);
    linkEffectTimer = window.setTimeout('$(objId).style.visibility="visible"; $(objId).highlight({startcolor: "#4D7380", endcolor: "#000000"});', 200);
}

function hideLinks(artistID) {
    objId = "linksDiv" + artistID;

    window.clearTimeout(linkEffectTimer);
    linkEffectTimer = window.setTimeout('$(objId).style.visibility="hidden";', 1000);
}

function removePlaceHolder(txtObj) {
    if (txtObj.getAttribute("placeholder") == txtObj.value) {
        txtObj.value = "";
        txtObj.removeClassName("blur");
    }

    // Encode ampersands
    txtObj.value = txtObj.value.replace("&", "%26");
}

function setValueForPlaceHolder(txtObj, value) {
    // Fake focus ansd set value
    var tmpStr = utf8_decode(unescape(value));
    txtObj.value = tmpStr.replace(/\+/g, ' ');
    txtObj.removeClassName("blur");
}

function showPopUp(popid) {
    $(popid).style.visibility = 'visible';
}

function hidePopUp(popid) {
    $(popid).style.visibility = 'hidden';
}

// private method for UTF-8 decoding
function utf8_decode(utftext) {
    var string = "";
    var i = 0;
    var c = c1 = c2 = 0;

    while (i < utftext.length) {

        c = utftext.charCodeAt(i);

        if (c < 128) {
            string += String.fromCharCode(c);
            i++;
        }
        else if ((c > 191) && (c < 224)) {
            c2 = utftext.charCodeAt(i + 1);
            string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
            i += 2;
        }
        else {
            c2 = utftext.charCodeAt(i + 1);
            c3 = utftext.charCodeAt(i + 2);
            string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }

    }

    return string;
}


var countriesList = [
'Andorra',
'United Arab Emirates',
'Afghanistan',
'Antigua And Barbuda',
'Anguilla',
'Albania',
'Armenia',
'Netherlands Antilles',
'Angola',
'Antarctica',
'Argentina',
'American Samoa',
'Austria',
'Australia',
'Aruba',
'Azerbaijan',
'Bosnia And Herzegovina',
'Barbados',
'Bangladesh',
'Belgium',
'Burkina Faso',
'Bulgaria',
'Bahrain',
'Burundi',
'Benin',
'Bermuda',
'Brunei Darussalam',
'Bolivia',
'Brazil',
'Bahamas',
'Bhutan',
'Bouvet Island',
'Botswana',
'Belarus',
'Belize',
'Canada',
'Cocos (Keeling) Islands',
'Congo',
'Central African Republic',
'Congo',
'Switzerland',
'Cote D`Ivoire',
'Cook Islands',
'Chile',
'Cameroon',
'China',
'Colombia',
'Costa Rica',
'Cuba',
'Cape Verde',
'Christmas Island',
'Cyprus',
'Czech Republic',
'Germany',
'Djibouti',
'Denmark',
'Dominica',
'Dominican Republic',
'Algeria',
'Ecuador',
'Estonia',
'Egypt',
'Western Sarara',
'Eritrea',
'Spain',
'Ethiopia',
'Finland',
'Fiji',
'Falkland Islands',
'Micronesia',
'Faroe Islands',
'France',
'Gabon',
'United Kingdom',
'Grenada',
'Georgia',
'French Guiana',
'Ghana',
'Gibraltar',
'Greenland',
'Gambia',
'Guinea',
'Guadeloupe',
'Equatorial Guinea',
'Greece',
'Guatemala',
'Guam',
'Guinea-Bissau',
'Guyana',
'Hong Kong',
'Honduras',
'Croatia',
'Haiti',
'Hungary',
'Indonesia',
'Ireland',
'Israel',
'India',
'British Indian Ocean',
'Iraq',
'Iran',
'Iceland',
'Italy',
'Jamaica',
'Jordan',
'Japan',
'Kenya',
'Kyrgyzstan',
'Cambodia',
'Kiribati',
'Comoros',
'Saint Kitts And Nevis',
'Korea, Dem. Republic',
'Korea, Republic Of',
'Kuwait',
'Cayman Islands',
'Kazakhstan',
'Lao',
'Lebanon',
'Saint Lucia',
'Liechtenstein',
'Sri Lanka',
'Liberia',
'Lesotho',
'Lithuania',
'Luxembourg',
'Latvia',
'Libyan Arab Jamabiriya',
'Morocco',
'Monaco',
'Moldova, Republic Of',
'Madagascar',
'Marshall Islands',
'Macedonia',
'Mali',
'Myanmar',
'Mongolia',
'Macau',
'Martinique',
'Mauritania',
'Montserrat',
'Malta',
'Mauritius',
'Maldives',
'Malawi',
'Mexico',
'Malaysia',
'Mozambique',
'Namibia',
'New Caledonia',
'Niger',
'Norfolk Island',
'Nigeria',
'Nicaragua',
'Netherlands',
'Norway',
'Nepal',
'Niue',
'New Zealand',
'Oman',
'Panama',
'Peru',
'French Polynesia',
'Papua New Guinea',
'Philippines',
'Pakistan',
'Poland',
'Pitcairn',
'Puerto Rico',
'Portugal',
'Palau',
'Paraguay',
'Qatar',
'Romania',
'Russian Federation',
'Rwanda',
'Saudi Arabia',
'Solomon Islands',
'Seychelles',
'Sudan',
'Sweden',
'Singapore',
'Saint Helena',
'Slovenia',
'Slovakia',
'Sierra Leone',
'San Marino',
'Senegal',
'Somalia',
'Suriname',
'Sao Tome And Principe',
'El Salvador',
'Syrian Arab Republic',
'Swaziland',
'Chad',
'Togo',
'Thailand',
'Tajikistan',
'Tokelau',
'Turkmenistan',
'Tunisia',
'Tonga',
'East Timor',
'Turkey',
'Trinidad And Tobago',
'Tuvalu',
'Taiwan',
'Tanzania',
'Ukraine',
'Uganda',
'United States',
'Uruguay',
'Uzbekistan',
'Venezuela',
'Virgin Islands',
'Viet Nam',
'Vanuatu',
'Wallis And Futuna',
'Samoa',
'Yemen',
'Mayotte',
'Yugoslavia',
'South Africa',
'Zambia',
'Zimbabwe'];


// Calendar

// if two digit year input dates after this year considered 20 century.
var NUM_CENTYEAR = 30;
// is time input control required by default
var BUL_TIMECOMPONENT = false;
// are year scrolling buttons required by default
var BUL_YEARSCROLL = true;

var calendars = [];
var RE_NUM = /^\-?\d+$/;

function calendar1(obj_target) {

    // assigning methods
    this.gen_date = cal_gen_date1;
    this.gen_time = cal_gen_time1;
    this.gen_tsmp = cal_gen_tsmp1;
    this.prs_date = cal_prs_date1;
    this.prs_time = cal_prs_time1;
    this.prs_tsmp = cal_prs_tsmp1;
    this.popup = cal_popup1;

    // validate input parameters
    if (!obj_target)
        return cal_error("Error calling the calendar: no target control specified");
    if (obj_target.value == null)
        return cal_error("Error calling the calendar: parameter specified is not valid target control");
    this.target = obj_target;
    this.time_comp = BUL_TIMECOMPONENT;
    this.year_scroll = BUL_YEARSCROLL;

    // register in global collections
    this.id = calendars.length;
    calendars[this.id] = this;
}

function cal_popup1(str_datetime) {
    if (str_datetime)
        this.dt_current = this.prs_tsmp(str_datetime);
    else
        this.dt_selected = this.dt_current = this.prs_tsmp(this.target.value);

    if (!this.dt_current) return;

    var obj_calwindow = window.open(
		'calendar.html?id=' + this.id + '&s=' + this.dt_selected.valueOf() + '&c=' + this.dt_current.valueOf(),
		'Calendar', 'width=200,height=' + (this.time_comp ? 215 : 190) +
		',status=no,resizable=no,top=200,left=200,dependent=yes,alwaysRaised=yes'
	);
    obj_calwindow.opener = window;
    obj_calwindow.focus();
}

// timestamp generating function
function cal_gen_tsmp1(dt_datetime) {
    return (this.gen_date(dt_datetime) + ' ' + this.gen_time(dt_datetime));
}

// date generating function
function cal_gen_date1(dt_datetime) {
    return (
		(dt_datetime.getDate() < 10 ? '0' : '') + dt_datetime.getDate() + "-"
		+ (dt_datetime.getMonth() < 9 ? '0' : '') + (dt_datetime.getMonth() + 1) + "-"
		+ dt_datetime.getFullYear()
	);
}
// time generating function
function cal_gen_time1(dt_datetime) {
    return (
		(dt_datetime.getHours() < 10 ? '0' : '') + dt_datetime.getHours() + ":"
		+ (dt_datetime.getMinutes() < 10 ? '0' : '') + (dt_datetime.getMinutes()) + ":"
		+ (dt_datetime.getSeconds() < 10 ? '0' : '') + (dt_datetime.getSeconds())
	);
}

// timestamp parsing function
function cal_prs_tsmp1(str_datetime) {
    // if no parameter specified return current timestamp
    if (!str_datetime)
        return (new Date());

    // if positive integer treat as milliseconds from epoch
    if (RE_NUM.exec(str_datetime))
        return new Date(str_datetime);

    // else treat as date in string format
    var arr_datetime = str_datetime.split(' ');
    return this.prs_time(arr_datetime[1], this.prs_date(arr_datetime[0]));
}

// date parsing function
function cal_prs_date1(str_date) {

    var arr_date = str_date.split('-');

    if (arr_date.length != 3) return cal_error("Invalid date format: '" + str_date + "'.\nFormat accepted is dd-mm-yyyy.");
    if (!arr_date[0]) return cal_error("Invalid date format: '" + str_date + "'.\nNo day of month value can be found.");
    if (!RE_NUM.exec(arr_date[0])) return cal_error("Invalid day of month value: '" + arr_date[0] + "'.\nAllowed values are unsigned integers.");
    if (!arr_date[1]) return cal_error("Invalid date format: '" + str_date + "'.\nNo month value can be found.");
    if (!RE_NUM.exec(arr_date[1])) return cal_error("Invalid month value: '" + arr_date[1] + "'.\nAllowed values are unsigned integers.");
    if (!arr_date[2]) return cal_error("Invalid date format: '" + str_date + "'.\nNo year value can be found.");
    if (!RE_NUM.exec(arr_date[2])) return cal_error("Invalid year value: '" + arr_date[2] + "'.\nAllowed values are unsigned integers.");

    var dt_date = new Date();
    dt_date.setDate(1);

    if (arr_date[1] < 1 || arr_date[1] > 12) return cal_error("Invalid month value: '" + arr_date[1] + "'.\nAllowed range is 01-12.");
    dt_date.setMonth(arr_date[1] - 1);

    if (arr_date[2] < 100) arr_date[2] = Number(arr_date[2]) + (arr_date[2] < NUM_CENTYEAR ? 2000 : 1900);
    dt_date.setFullYear(arr_date[2]);

    var dt_numdays = new Date(arr_date[2], arr_date[1], 0);
    dt_date.setDate(arr_date[0]);
    if (dt_date.getMonth() != (arr_date[1] - 1)) return cal_error("Invalid day of month value: '" + arr_date[0] + "'.\nAllowed range is 01-" + dt_numdays.getDate() + ".");

    return (dt_date)
}

// time parsing function
function cal_prs_time1(str_time, dt_date) {

    if (!dt_date) return null;
    var arr_time = String(str_time ? str_time : '').split(':');

    if (!arr_time[0]) dt_date.setHours(0);
    else if (RE_NUM.exec(arr_time[0]))
        if (arr_time[0] < 24) dt_date.setHours(arr_time[0]);
    else return cal_error("Invalid hours value: '" + arr_time[0] + "'.\nAllowed range is 00-23.");
    else return cal_error("Invalid hours value: '" + arr_time[0] + "'.\nAllowed values are unsigned integers.");

    if (!arr_time[1]) dt_date.setMinutes(0);
    else if (RE_NUM.exec(arr_time[1]))
        if (arr_time[1] < 60) dt_date.setMinutes(arr_time[1]);
    else return cal_error("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed range is 00-59.");
    else return cal_error("Invalid minutes value: '" + arr_time[1] + "'.\nAllowed values are unsigned integers.");

    if (!arr_time[2]) dt_date.setSeconds(0);
    else if (RE_NUM.exec(arr_time[2]))
        if (arr_time[2] < 60) dt_date.setSeconds(arr_time[2]);
    else return cal_error("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed range is 00-59.");
    else return cal_error("Invalid seconds value: '" + arr_time[2] + "'.\nAllowed values are unsigned integers.");

    dt_date.setMilliseconds(0);
    return dt_date;
}

function cal_error(str_message) {
    alert(str_message);
    return null;
}

