diff options
| author | ctrlaltca@gmail.com <> | 2011-05-10 20:39:33 +0000 | 
|---|---|---|
| committer | ctrlaltca@gmail.com <> | 2011-05-10 20:39:33 +0000 | 
| commit | 3ef4e5b9dd7500fbd8125f8a6e382891bead9aca (patch) | |
| tree | 5375ce46dac755291d1f2c7a71e0434249f677cb /framework/Web/Javascripts/source | |
| parent | 65b4ddd7d3b9317585acf2f9189a3bd406dea4bf (diff) | |
updated prototype to 1.7, scriptaculous to 1.9.0 and dropped json.js for json2.js. fixes #199 and 272
Diffstat (limited to 'framework/Web/Javascripts/source')
| -rw-r--r-- | framework/Web/Javascripts/source/packages.php | 6 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/prado/activecontrols/json.js | 340 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/prado/activecontrols/json2.js | 479 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/prototype-1.6.0.3/prototype.js | 4320 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/prototype-1.7/prototype.js | 6082 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/CHANGELOG (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/CHANGELOG) | 24 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/MIT-LICENSE (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/MIT-LICENSE) | 2 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/builder.js (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/builder.js) | 4 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/controls.js (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/controls.js) | 8 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/dragdrop.js (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/dragdrop.js) | 15 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/effects.js (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/effects.js) | 21 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/scriptaculous.js (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/scriptaculous.js) | 20 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/slider.js (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/slider.js) | 12 | ||||
| -rw-r--r-- | framework/Web/Javascripts/source/scriptaculous-1.9.0/sound.js (renamed from framework/Web/Javascripts/source/scriptaculous-1.8.2/sound.js) | 10 | 
14 files changed, 6636 insertions, 4707 deletions
| diff --git a/framework/Web/Javascripts/source/packages.php b/framework/Web/Javascripts/source/packages.php index 7ced14bc..cc66a700 100644 --- a/framework/Web/Javascripts/source/packages.php +++ b/framework/Web/Javascripts/source/packages.php @@ -3,8 +3,8 @@  //$Id$
  // To make future upgrades easier
 -if (!defined('PROTOTYPE_DIR')) define ('PROTOTYPE_DIR', 'prototype-1.6.0.3');
 -if (!defined('SCRIPTACULOUS_DIR')) define ('SCRIPTACULOUS_DIR', 'scriptaculous-1.8.2');
 +if (!defined('PROTOTYPE_DIR')) define ('PROTOTYPE_DIR', 'prototype-1.7');
 +if (!defined('SCRIPTACULOUS_DIR')) define ('SCRIPTACULOUS_DIR', 'scriptaculous-1.9.0');
  //package names and its contents (files relative to the current directory)
  $packages = array(
 @@ -39,7 +39,7 @@ $packages = array(  	'ajax' => array(
  		SCRIPTACULOUS_DIR.'/controls.js',
 -		'prado/activecontrols/json.js',
 +		'prado/activecontrols/json2.js',
  		'prado/activecontrols/ajax3.js',
  		'prado/activecontrols/activecontrols3.js',
  		'prado/activecontrols/inlineeditor.js'
 diff --git a/framework/Web/Javascripts/source/prado/activecontrols/json.js b/framework/Web/Javascripts/source/prado/activecontrols/json.js deleted file mode 100644 index 25b17b5f..00000000 --- a/framework/Web/Javascripts/source/prado/activecontrols/json.js +++ /dev/null @@ -1,340 +0,0 @@ -/*
 -Copyright (c) 2005 JSON.org
 -
 -Permission is hereby granted, free of charge, to any person obtaining a copy
 -of this software and associated documentation files (the "Software"), to deal
 -in the Software without restriction, including without limitation the rights
 -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 -copies of the Software, and to permit persons to whom the Software is
 -furnished to do so, subject to the following conditions:
 -
 -The Software shall be used for Good, not Evil.
 -
 -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 -SOFTWARE.
 -*/
 -
 -Array.prototype.______array = '______array';
 -
 -Prado.JSON = {
 -    org: 'http://www.JSON.org',
 -    copyright: '(c)2005 JSON.org',
 -    license: 'http://www.crockford.com/JSON/license.html',
 -
 -    stringify: function (arg) {
 -        var c, i, l, s = '', v;
 -
 -        switch (typeof arg) {
 -        case 'object':
 -            if (arg) {
 -                if (arg.______array == '______array') {
 -                    for (i = 0; i < arg.length; ++i) {
 -                        v = this.stringify(arg[i]);
 -                        if (s) {
 -                            s += ',';
 -                        }
 -                        s += v;
 -                    }
 -                    return '[' + s + ']';
 -                } else if (typeof arg.toString != 'undefined') {
 -                    for (i in arg) {
 -                        v = arg[i];
 -                        if (typeof v != 'undefined' && typeof v != 'function') {
 -                            v = this.stringify(v);
 -                            if (s) {
 -                                s += ',';
 -                            }
 -                            s += this.stringify(i) + ':' + v;
 -                        }
 -                    }
 -                    return '{' + s + '}';
 -                }
 -            }
 -            return 'null';
 -        case 'number':
 -            return isFinite(arg) ? String(arg) : 'null';
 -        case 'string':
 -            l = arg.length;
 -            s = '"';
 -            for (i = 0; i < l; i += 1) {
 -                c = arg.charAt(i);
 -                if (c >= ' ') {
 -                    if (c == '\\' || c == '"') {
 -                        s += '\\';
 -                    }
 -                    s += c;
 -                } else {
 -                    switch (c) {
 -                        case '\b':
 -                            s += '\\b';
 -                            break;
 -                        case '\f':
 -                            s += '\\f';
 -                            break;
 -                        case '\n':
 -                            s += '\\n';
 -                            break;
 -                        case '\r':
 -                            s += '\\r';
 -                            break;
 -                        case '\t':
 -                            s += '\\t';
 -                            break;
 -                        default:
 -                            c = c.charCodeAt();
 -                            s += '\\u00' + Math.floor(c / 16).toString(16) +
 -                                (c % 16).toString(16);
 -                    }
 -                }
 -            }
 -            return s + '"';
 -        case 'boolean':
 -            return String(arg);
 -        default:
 -            return 'null';
 -        }
 -    },
 -    parse: function (text) {
 -        var at = 0;
 -        var ch = ' ';
 -
 -        function error(m) {
 -            throw {
 -                name: 'JSONError',
 -                message: m,
 -                at: at - 1,
 -                text: text
 -            };
 -        }
 -
 -        function next() {
 -            ch = text.charAt(at);
 -            at += 1;
 -            return ch;
 -        }
 -
 -        function white() {
 -            while (ch) {
 -                if (ch <= ' ') {
 -                    next();
 -                } else if (ch == '/') {
 -                    switch (next()) {
 -                        case '/':
 -                            while (next() && ch != '\n' && ch != '\r') {}
 -                            break;
 -                        case '*':
 -                            next();
 -                            for (;;) {
 -                                if (ch) {
 -                                    if (ch == '*') {
 -                                        if (next() == '/') {
 -                                            next();
 -                                            break;
 -                                        }
 -                                    } else {
 -                                        next();
 -                                    }
 -                                } else {
 -                                    error("Unterminated comment");
 -                                }
 -                            }
 -                            break;
 -                        default:
 -                            error("Syntax error");
 -                    }
 -                } else {
 -                    break;
 -                }
 -            }
 -        }
 -
 -        function string() {
 -            var i, s = '', t, u;
 -
 -            if (ch == '"') {
 -outer:          while (next()) {
 -                    if (ch == '"') {
 -                        next();
 -                        return s;
 -                    } else if (ch == '\\') {
 -                        switch (next()) {
 -                        case 'b':
 -                            s += '\b';
 -                            break;
 -                        case 'f':
 -                            s += '\f';
 -                            break;
 -                        case 'n':
 -                            s += '\n';
 -                            break;
 -                        case 'r':
 -                            s += '\r';
 -                            break;
 -                        case 't':
 -                            s += '\t';
 -                            break;
 -                        case 'u':
 -                            u = 0;
 -                            for (i = 0; i < 4; i += 1) {
 -                                t = parseInt(next(), 16);
 -                                if (!isFinite(t)) {
 -                                    break outer;
 -                                }
 -                                u = u * 16 + t;
 -                            }
 -                            s += String.fromCharCode(u);
 -                            break;
 -                        default:
 -                            s += ch;
 -                        }
 -                    } else {
 -                        s += ch;
 -                    }
 -                }
 -            }
 -            error("Bad string");
 -        }
 -
 -        function array() {
 -            var a = [];
 -
 -            if (ch == '[') {
 -                next();
 -                white();
 -                if (ch == ']') {
 -                    next();
 -                    return a;
 -                }
 -                while (ch) {
 -                    a.push(value());
 -                    white();
 -                    if (ch == ']') {
 -                        next();
 -                        return a;
 -                    } else if (ch != ',') {
 -                        break;
 -                    }
 -                    next();
 -                    white();
 -                }
 -            }
 -            error("Bad array");
 -        }
 -
 -        function object() {
 -            var k, o = {};
 -
 -            if (ch == '{') {
 -                next();
 -                white();
 -                if (ch == '}') {
 -                    next();
 -                    return o;
 -                }
 -                while (ch) {
 -                    k = string();
 -                    white();
 -                    if (ch != ':') {
 -                        break;
 -                    }
 -                    next();
 -                    o[k] = value();
 -                    white();
 -                    if (ch == '}') {
 -                        next();
 -                        return o;
 -                    } else if (ch != ',') {
 -                        break;
 -                    }
 -                    next();
 -                    white();
 -                }
 -            }
 -            error("Bad object");
 -        }
 -
 -        function number() {
 -            var n = '', v;
 -            if (ch == '-') {
 -                n = '-';
 -                next();
 -            }
 -            while (ch >= '0' && ch <= '9') {
 -                n += ch;
 -                next();
 -            }
 -            if (ch == '.') {
 -                n += '.';
 -                while (next() && ch >= '0' && ch <= '9') {
 -                    n += ch;
 -                }
 -            }
 -            if (ch == 'e' || ch == 'E') {
 -                n += 'e';
 -                next();
 -                if (ch == '-' || ch == '+') {
 -                    n += ch;
 -                    next();
 -                }
 -                while (ch >= '0' && ch <= '9') {
 -                    n += ch;
 -                    next();
 -                }
 -            }
 -            v = +n;
 -            if (!isFinite(v)) {
 -                ////error("Bad number");
 -            } else {
 -                return v;
 -            }
 -        }
 -
 -        function word() {
 -            switch (ch) {
 -                case 't':
 -                    if (next() == 'r' && next() == 'u' && next() == 'e') {
 -                        next();
 -                        return true;
 -                    }
 -                    break;
 -                case 'f':
 -                    if (next() == 'a' && next() == 'l' && next() == 's' &&
 -                            next() == 'e') {
 -                        next();
 -                        return false;
 -                    }
 -                    break;
 -                case 'n':
 -                    if (next() == 'u' && next() == 'l' && next() == 'l') {
 -                        next();
 -                        return null;
 -                    }
 -                    break;
 -            }
 -            error("Syntax error");
 -        }
 -
 -        function value() {
 -            white();
 -            switch (ch) {
 -                case '{':
 -                    return object();
 -                case '[':
 -                    return array();
 -                case '"':
 -                    return string();
 -                case '-':
 -                    return number();
 -                default:
 -                    return ch >= '0' && ch <= '9' ? number() : word();
 -            }
 -        }
 -
 -        return value();
 -    }
 -};
\ No newline at end of file diff --git a/framework/Web/Javascripts/source/prado/activecontrols/json2.js b/framework/Web/Javascripts/source/prado/activecontrols/json2.js new file mode 100644 index 00000000..3eec6f20 --- /dev/null +++ b/framework/Web/Javascripts/source/prado/activecontrols/json2.js @@ -0,0 +1,479 @@ +/* +    http://www.JSON.org/json2.js +    2011-02-23 + +    Public Domain. + +    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + +    See http://www.JSON.org/js.html + + +    This code should be minified before deployment. +    See http://javascript.crockford.com/jsmin.html + +    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO +    NOT CONTROL. + + +    This file creates a global JSON object containing two methods: stringify +    and parse. + +        JSON.stringify(value, replacer, space) +            value       any JavaScript value, usually an object or array. + +            replacer    an optional parameter that determines how object +                        values are stringified for objects. It can be a +                        function or an array of strings. + +            space       an optional parameter that specifies the indentation +                        of nested structures. If it is omitted, the text will +                        be packed without extra whitespace. If it is a number, +                        it will specify the number of spaces to indent at each +                        level. If it is a string (such as '\t' or ' '), +                        it contains the characters used to indent at each level. + +            This method produces a JSON text from a JavaScript value. + +            When an object value is found, if the object contains a toJSON +            method, its toJSON method will be called and the result will be +            stringified. A toJSON method does not serialize: it returns the +            value represented by the name/value pair that should be serialized, +            or undefined if nothing should be serialized. The toJSON method +            will be passed the key associated with the value, and this will be +            bound to the value + +            For example, this would serialize Dates as ISO strings. + +                Date.prototype.toJSON = function (key) { +                    function f(n) { +                        // Format integers to have at least two digits. +                        return n < 10 ? '0' + n : n; +                    } + +                    return this.getUTCFullYear()   + '-' + +                         f(this.getUTCMonth() + 1) + '-' + +                         f(this.getUTCDate())      + 'T' + +                         f(this.getUTCHours())     + ':' + +                         f(this.getUTCMinutes())   + ':' + +                         f(this.getUTCSeconds())   + 'Z'; +                }; + +            You can provide an optional replacer method. It will be passed the +            key and value of each member, with this bound to the containing +            object. The value that is returned from your method will be +            serialized. If your method returns undefined, then the member will +            be excluded from the serialization. + +            If the replacer parameter is an array of strings, then it will be +            used to select the members to be serialized. It filters the results +            such that only members with keys listed in the replacer array are +            stringified. + +            Values that do not have JSON representations, such as undefined or +            functions, will not be serialized. Such values in objects will be +            dropped; in arrays they will be replaced with null. You can use +            a replacer function to replace those with JSON values. +            JSON.stringify(undefined) returns undefined. + +            The optional space parameter produces a stringification of the +            value that is filled with line breaks and indentation to make it +            easier to read. + +            If the space parameter is a non-empty string, then that string will +            be used for indentation. If the space parameter is a number, then +            the indentation will be that many spaces. + +            Example: + +            text = JSON.stringify(['e', {pluribus: 'unum'}]); +            // text is '["e",{"pluribus":"unum"}]' + + +            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); +            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + +            text = JSON.stringify([new Date()], function (key, value) { +                return this[key] instanceof Date ? +                    'Date(' + this[key] + ')' : value; +            }); +            // text is '["Date(---current time---)"]' + + +        JSON.parse(text, reviver) +            This method parses a JSON text to produce an object or array. +            It can throw a SyntaxError exception. + +            The optional reviver parameter is a function that can filter and +            transform the results. It receives each of the keys and values, +            and its return value is used instead of the original value. +            If it returns what it received, then the structure is not modified. +            If it returns undefined then the member is deleted. + +            Example: + +            // Parse the text. Values that look like ISO date strings will +            // be converted to Date objects. + +            myData = JSON.parse(text, function (key, value) { +                var a; +                if (typeof value === 'string') { +                    a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); +                    if (a) { +                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], +                            +a[5], +a[6])); +                    } +                } +                return value; +            }); + +            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { +                var d; +                if (typeof value === 'string' && +                        value.slice(0, 5) === 'Date(' && +                        value.slice(-1) === ')') { +                    d = new Date(value.slice(5, -1)); +                    if (d) { +                        return d; +                    } +                } +                return value; +            }); + + +    This is a reference implementation. You are free to copy, modify, or +    redistribute. +*/ + +/*jslint evil: true, strict: false, regexp: false */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, +    call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, +    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, +    lastIndex, length, parse, prototype, push, replace, slice, stringify, +    test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +if (!Prado.JSON) { +    Prado.JSON = {}; +} + +(function () { +    "use strict"; + +    function f(n) { +        // Format integers to have at least two digits. +        return n < 10 ? '0' + n : n; +    } + +    if (typeof Date.prototype.toJSON !== 'function') { + +        Date.prototype.toJSON = function (key) { + +            return isFinite(this.valueOf()) ? +                this.getUTCFullYear()     + '-' + +                f(this.getUTCMonth() + 1) + '-' + +                f(this.getUTCDate())      + 'T' + +                f(this.getUTCHours())     + ':' + +                f(this.getUTCMinutes())   + ':' + +                f(this.getUTCSeconds())   + 'Z' : null; +        }; + +        String.prototype.toJSON      = +            Number.prototype.toJSON  = +            Boolean.prototype.toJSON = function (key) { +                return this.valueOf(); +            }; +    } + +    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, +        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, +        gap, +        indent, +        meta = {    // table of character substitutions +            '\b': '\\b', +            '\t': '\\t', +            '\n': '\\n', +            '\f': '\\f', +            '\r': '\\r', +            '"' : '\\"', +            '\\': '\\\\' +        }, +        rep; + + +    function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + +        escapable.lastIndex = 0; +        return escapable.test(string) ? '"' + string.replace(escapable, function (a) { +            var c = meta[a]; +            return typeof c === 'string' ? c : +                '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); +        }) + '"' : '"' + string + '"'; +    } + + +    function str(key, holder) { + +// Produce a string from holder[key]. + +        var i,          // The loop counter. +            k,          // The member key. +            v,          // The member value. +            length, +            mind = gap, +            partial, +            value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + +        if (value && typeof value === 'object' && +                typeof value.toJSON === 'function') { +            value = value.toJSON(key); +        } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + +        if (typeof rep === 'function') { +            value = rep.call(holder, key, value); +        } + +// What happens next depends on the value's type. + +        switch (typeof value) { +        case 'string': +            return quote(value); + +        case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + +            return isFinite(value) ? String(value) : 'null'; + +        case 'boolean': +        case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + +            return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + +        case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + +            if (!value) { +                return 'null'; +            } + +// Make an array to hold the partial results of stringifying this object value. + +            gap += indent; +            partial = []; + +// Is the value an array? + +            if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + +                length = value.length; +                for (i = 0; i < length; i += 1) { +                    partial[i] = str(i, value) || 'null'; +                } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + +                v = partial.length === 0 ? '[]' : gap ? +                    '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : +                    '[' + partial.join(',') + ']'; +                gap = mind; +                return v; +            } + +// If the replacer is an array, use it to select the members to be stringified. + +            if (rep && typeof rep === 'object') { +                length = rep.length; +                for (i = 0; i < length; i += 1) { +                    if (typeof rep[i] === 'string') { +                        k = rep[i]; +                        v = str(k, value); +                        if (v) { +                            partial.push(quote(k) + (gap ? ': ' : ':') + v); +                        } +                    } +                } +            } else { + +// Otherwise, iterate through all of the keys in the object. + +                for (k in value) { +                    if (Object.prototype.hasOwnProperty.call(value, k)) { +                        v = str(k, value); +                        if (v) { +                            partial.push(quote(k) + (gap ? ': ' : ':') + v); +                        } +                    } +                } +            } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + +            v = partial.length === 0 ? '{}' : gap ? +                '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : +                '{' + partial.join(',') + '}'; +            gap = mind; +            return v; +        } +    } + +// If the JSON object does not yet have a stringify method, give it one. + +    if (typeof Prado.JSON.stringify !== 'function') { +        Prado.JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + +            var i; +            gap = ''; +            indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + +            if (typeof space === 'number') { +                for (i = 0; i < space; i += 1) { +                    indent += ' '; +                } + +// If the space parameter is a string, it will be used as the indent string. + +            } else if (typeof space === 'string') { +                indent = space; +            } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + +            rep = replacer; +            if (replacer && typeof replacer !== 'function' && +                    (typeof replacer !== 'object' || +                    typeof replacer.length !== 'number')) { +                throw new Error('JSON.stringify'); +            } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + +            return str('', {'': value}); +        }; +    } + + +// If the JSON object does not yet have a parse method, give it one. + +    if (typeof Prado.JSON.parse !== 'function') { +        Prado.JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + +            var j; + +            function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + +                var k, v, value = holder[key]; +                if (value && typeof value === 'object') { +                    for (k in value) { +                        if (Object.prototype.hasOwnProperty.call(value, k)) { +                            v = walk(value, k); +                            if (v !== undefined) { +                                value[k] = v; +                            } else { +                                delete value[k]; +                            } +                        } +                    } +                } +                return reviver.call(holder, key, value); +            } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + +            text = String(text); +            cx.lastIndex = 0; +            if (cx.test(text)) { +                text = text.replace(cx, function (a) { +                    return '\\u' + +                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4); +                }); +            } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + +            if (/^[\],:{}\s]*$/ +                    .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') +                        .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') +                        .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + +                j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + +                return typeof reviver === 'function' ? +                    walk({'': j}, '') : j; +            } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + +            throw new SyntaxError('JSON.parse'); +        }; +    } +}()); diff --git a/framework/Web/Javascripts/source/prototype-1.6.0.3/prototype.js b/framework/Web/Javascripts/source/prototype-1.6.0.3/prototype.js deleted file mode 100644 index dfe8ab4e..00000000 --- a/framework/Web/Javascripts/source/prototype-1.6.0.3/prototype.js +++ /dev/null @@ -1,4320 +0,0 @@ -/*  Prototype JavaScript framework, version 1.6.0.3 - *  (c) 2005-2008 Sam Stephenson - * - *  Prototype is freely distributable under the terms of an MIT-style license. - *  For details, see the Prototype web site: http://www.prototypejs.org/ - * - *--------------------------------------------------------------------------*/ - -var Prototype = { -  Version: '1.6.0.3', - -  Browser: { -    IE:     !!(window.attachEvent && -      navigator.userAgent.indexOf('Opera') === -1), -    Opera:  navigator.userAgent.indexOf('Opera') > -1, -    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1, -    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && -      navigator.userAgent.indexOf('KHTML') === -1, -    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/) -  }, - -  BrowserFeatures: { -    XPath: !!document.evaluate, -    SelectorsAPI: !!document.querySelector, -    ElementExtensions: !!window.HTMLElement, -    SpecificElementExtensions: -      document.createElement('div')['__proto__'] && -      document.createElement('div')['__proto__'] !== -        document.createElement('form')['__proto__'] -  }, - -  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>', -  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, - -  emptyFunction: function() { }, -  K: function(x) { return x } -}; - -if (Prototype.Browser.MobileSafari) -  Prototype.BrowserFeatures.SpecificElementExtensions = false; - - -/* Based on Alex Arnell's inheritance implementation. */ -var Class = { -  create: function() { -    var parent = null, properties = $A(arguments); -    if (Object.isFunction(properties[0])) -      parent = properties.shift(); - -    function klass() { -      this.initialize.apply(this, arguments); -    } - -    Object.extend(klass, Class.Methods); -    klass.superclass = parent; -    klass.subclasses = []; - -    if (parent) { -      var subclass = function() { }; -      subclass.prototype = parent.prototype; -      klass.prototype = new subclass; -      parent.subclasses.push(klass); -    } - -    for (var i = 0; i < properties.length; i++) -      klass.addMethods(properties[i]); - -    if (!klass.prototype.initialize) -      klass.prototype.initialize = Prototype.emptyFunction; - -    klass.prototype.constructor = klass; - -    return klass; -  } -}; - -Class.Methods = { -  addMethods: function(source) { -    var ancestor   = this.superclass && this.superclass.prototype; -    var properties = Object.keys(source); - -    if (!Object.keys({ toString: true }).length) -      properties.push("toString", "valueOf"); - -    for (var i = 0, length = properties.length; i < length; i++) { -      var property = properties[i], value = source[property]; -      if (ancestor && Object.isFunction(value) && -          value.argumentNames().first() == "$super") { -        var method = value; -        value = (function(m) { -          return function() { return ancestor[m].apply(this, arguments) }; -        })(property).wrap(method); - -        value.valueOf = method.valueOf.bind(method); -        value.toString = method.toString.bind(method); -      } -      this.prototype[property] = value; -    } - -    return this; -  } -}; - -var Abstract = { }; - -Object.extend = function(destination, source) { -  for (var property in source) -    destination[property] = source[property]; -  return destination; -}; - -Object.extend(Object, { -  inspect: function(object) { -    try { -      if (Object.isUndefined(object)) return 'undefined'; -      if (object === null) return 'null'; -      return object.inspect ? object.inspect() : String(object); -    } catch (e) { -      if (e instanceof RangeError) return '...'; -      throw e; -    } -  }, - -  toJSON: function(object) { -    var type = typeof object; -    switch (type) { -      case 'undefined': -      case 'function': -      case 'unknown': return; -      case 'boolean': return object.toString(); -    } - -    if (object === null) return 'null'; -    if (object.toJSON) return object.toJSON(); -    if (Object.isElement(object)) return; - -    var results = []; -    for (var property in object) { -      var value = Object.toJSON(object[property]); -      if (!Object.isUndefined(value)) -        results.push(property.toJSON() + ': ' + value); -    } - -    return '{' + results.join(', ') + '}'; -  }, - -  toQueryString: function(object) { -    return $H(object).toQueryString(); -  }, - -  toHTML: function(object) { -    return object && object.toHTML ? object.toHTML() : String.interpret(object); -  }, - -  keys: function(object) { -    var keys = []; -    for (var property in object) -      keys.push(property); -    return keys; -  }, - -  values: function(object) { -    var values = []; -    for (var property in object) -      values.push(object[property]); -    return values; -  }, - -  clone: function(object) { -    return Object.extend({ }, object); -  }, - -  isElement: function(object) { -    return !!(object && object.nodeType == 1); -  }, - -  isArray: function(object) { -    return object != null && typeof object == "object" && -      'splice' in object && 'join' in object; -  }, - -  isHash: function(object) { -    return object instanceof Hash; -  }, - -  isFunction: function(object) { -    return typeof object == "function"; -  }, - -  isString: function(object) { -    return typeof object == "string"; -  }, - -  isNumber: function(object) { -    return typeof object == "number"; -  }, - -  isUndefined: function(object) { -    return typeof object == "undefined"; -  } -}); - -Object.extend(Function.prototype, { -  argumentNames: function() { -    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^\)]*)\)/)[1] -      .replace(/\s+/g, '').split(','); -    return names.length == 1 && !names[0] ? [] : names; -  }, - -  bind: function() { -    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; -    var __method = this, args = $A(arguments), object = args.shift(); -    return function() { -      return __method.apply(object, args.concat($A(arguments))); -    } -  }, - -  bindAsEventListener: function() { -    var __method = this, args = $A(arguments), object = args.shift(); -    return function(event) { -      return __method.apply(object, [event || window.event].concat(args)); -    } -  }, - -  curry: function() { -    if (!arguments.length) return this; -    var __method = this, args = $A(arguments); -    return function() { -      return __method.apply(this, args.concat($A(arguments))); -    } -  }, - -  delay: function() { -    var __method = this, args = $A(arguments), timeout = args.shift() * 1000; -    return window.setTimeout(function() { -      return __method.apply(__method, args); -    }, timeout); -  }, - -  defer: function() { -    var args = [0.01].concat($A(arguments)); -    return this.delay.apply(this, args); -  }, - -  wrap: function(wrapper) { -    var __method = this; -    return function() { -      return wrapper.apply(this, [__method.bind(this)].concat($A(arguments))); -    } -  }, - -  methodize: function() { -    if (this._methodized) return this._methodized; -    var __method = this; -    return this._methodized = function() { -      return __method.apply(null, [this].concat($A(arguments))); -    }; -  } -}); - -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"'; -}; - -var Try = { -  these: function() { -    var returnValue; - -    for (var i = 0, length = arguments.length; i < length; i++) { -      var lambda = arguments[i]; -      try { -        returnValue = lambda(); -        break; -      } catch (e) { } -    } - -    return returnValue; -  } -}; - -RegExp.prototype.match = RegExp.prototype.test; - -RegExp.escape = function(str) { -  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); -}; - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create({ -  initialize: function(callback, frequency) { -    this.callback = callback; -    this.frequency = frequency; -    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(); -      } finally { -        this.currentlyExecuting = false; -      } -    } -  } -}); -Object.extend(String, { -  interpret: function(value) { -    return value == null ? '' : String(value); -  }, -  specialChar: { -    '\b': '\\b', -    '\t': '\\t', -    '\n': '\\n', -    '\f': '\\f', -    '\r': '\\r', -    '\\': '\\\\' -  } -}); - -Object.extend(String.prototype, { -  gsub: function(pattern, replacement) { -    var result = '', source = this, match; -    replacement = arguments.callee.prepareReplacement(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; -  }, - -  sub: function(pattern, replacement, count) { -    replacement = this.gsub.prepareReplacement(replacement); -    count = Object.isUndefined(count) ? 1 : count; - -    return this.gsub(pattern, function(match) { -      if (--count < 0) return match[0]; -      return replacement(match); -    }); -  }, - -  scan: function(pattern, iterator) { -    this.gsub(pattern, iterator); -    return String(this); -  }, - -  truncate: function(length, truncation) { -    length = length || 30; -    truncation = Object.isUndefined(truncation) ? '...' : truncation; -    return this.length > length ? -      this.slice(0, length - truncation.length) + truncation : String(this); -  }, - -  strip: function() { -    return this.replace(/^\s+/, '').replace(/\s+$/, ''); -  }, - -  stripTags: function() { -    return this.replace(/<\/?[^>]+>/gi, ''); -  }, - -  stripScripts: function() { -    return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); -  }, - -  extractScripts: function() { -    var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); -    var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); -    return (this.match(matchAll) || []).map(function(scriptTag) { -      return (scriptTag.match(matchOne) || ['', ''])[1]; -    }); -  }, - -  evalScripts: function() { -    return this.extractScripts().map(function(script) { return eval(script) }); -  }, - -  escapeHTML: function() { -    var self = arguments.callee; -    self.text.data = this; -    return self.div.innerHTML; -  }, - -  unescapeHTML: function() { -    var div = new Element('div'); -    div.innerHTML = this.stripTags(); -    return div.childNodes[0] ? (div.childNodes.length > 1 ? -      $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) : -      div.childNodes[0].nodeValue) : ''; -  }, - -  toQueryParams: function(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 = decodeURIComponent(pair.shift()); -        var 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; -    }); -  }, - -  toArray: function() { -    return this.split(''); -  }, - -  succ: function() { -    return this.slice(0, this.length - 1) + -      String.fromCharCode(this.charCodeAt(this.length - 1) + 1); -  }, - -  times: function(count) { -    return count < 1 ? '' : new Array(count + 1).join(this); -  }, - -  camelize: function() { -    var parts = this.split('-'), len = parts.length; -    if (len == 1) return parts[0]; - -    var camelized = this.charAt(0) == '-' -      ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1) -      : parts[0]; - -    for (var i = 1; i < len; i++) -      camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1); - -    return camelized; -  }, - -  capitalize: function() { -    return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase(); -  }, - -  underscore: function() { -    return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase(); -  }, - -  dasherize: function() { -    return this.gsub(/_/,'-'); -  }, - -  inspect: function(useDoubleQuotes) { -    var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) { -      var character = String.specialChar[match[0]]; -      return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16); -    }); -    if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"'; -    return "'" + escapedString.replace(/'/g, '\\\'') + "'"; -  }, - -  toJSON: function() { -    return this.inspect(true); -  }, - -  unfilterJSON: function(filter) { -    return this.sub(filter || Prototype.JSONFilter, '#{1}'); -  }, - -  isJSON: function() { -    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); -  }, - -  evalJSON: function(sanitize) { -    var json = this.unfilterJSON(); -    try { -      if (!sanitize || json.isJSON()) return eval('(' + json + ')'); -    } catch (e) { } -    throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); -  }, - -  include: function(pattern) { -    return this.indexOf(pattern) > -1; -  }, - -  startsWith: function(pattern) { -    return this.indexOf(pattern) === 0; -  }, - -  endsWith: function(pattern) { -    var d = this.length - pattern.length; -    return d >= 0 && this.lastIndexOf(pattern) === d; -  }, - -  empty: function() { -    return this == ''; -  }, - -  blank: function() { -    return /^\s*$/.test(this); -  }, - -  interpolate: function(object, pattern) { -    return new Template(this, pattern).evaluate(object); -  } -}); - -if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, { -  escapeHTML: function() { -    return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); -  }, -  unescapeHTML: function() { -    return this.stripTags().replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>'); -  } -}); - -String.prototype.gsub.prepareReplacement = function(replacement) { -  if (Object.isFunction(replacement)) return replacement; -  var template = new Template(replacement); -  return function(match) { return template.evaluate(match) }; -}; - -String.prototype.parseQuery = String.prototype.toQueryParams; - -Object.extend(String.prototype.escapeHTML, { -  div:  document.createElement('div'), -  text: document.createTextNode('') -}); - -String.prototype.escapeHTML.div.appendChild(String.prototype.escapeHTML.text); - -var Template = Class.create({ -  initialize: function(template, pattern) { -    this.template = template.toString(); -    this.pattern = pattern || Template.Pattern; -  }, - -  evaluate: function(object) { -    if (Object.isFunction(object.toTemplateReplacements)) -      object = object.toTemplateReplacements(); - -    return this.template.gsub(this.pattern, function(match) { -      if (object == null) return ''; - -      var before = match[1] || ''; -      if (before == '\\') return match[2]; - -      var ctx = object, expr = match[3]; -      var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; -      match = pattern.exec(expr); -      if (match == null) return before; - -      while (match != null) { -        var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1]; -        ctx = ctx[comp]; -        if (null == ctx || '' == match[3]) break; -        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); -        match = pattern.exec(expr); -      } - -      return before + String.interpret(ctx); -    }); -  } -}); -Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; - -var $break = { }; - -var Enumerable = { -  each: function(iterator, context) { -    var index = 0; -    try { -      this._each(function(value) { -        iterator.call(context, value, index++); -      }); -    } catch (e) { -      if (e != $break) throw e; -    } -    return this; -  }, - -  eachSlice: function(number, iterator, context) { -    var index = -number, slices = [], array = this.toArray(); -    if (number < 1) return array; -    while ((index += number) < array.length) -      slices.push(array.slice(index, index+number)); -    return slices.collect(iterator, context); -  }, - -  all: function(iterator, context) { -    iterator = iterator || Prototype.K; -    var result = true; -    this.each(function(value, index) { -      result = result && !!iterator.call(context, value, index); -      if (!result) throw $break; -    }); -    return result; -  }, - -  any: function(iterator, context) { -    iterator = iterator || Prototype.K; -    var result = false; -    this.each(function(value, index) { -      if (result = !!iterator.call(context, value, index)) -        throw $break; -    }); -    return result; -  }, - -  collect: function(iterator, context) { -    iterator = iterator || Prototype.K; -    var results = []; -    this.each(function(value, index) { -      results.push(iterator.call(context, value, index)); -    }); -    return results; -  }, - -  detect: function(iterator, context) { -    var result; -    this.each(function(value, index) { -      if (iterator.call(context, value, index)) { -        result = value; -        throw $break; -      } -    }); -    return result; -  }, - -  findAll: function(iterator, context) { -    var results = []; -    this.each(function(value, index) { -      if (iterator.call(context, value, index)) -        results.push(value); -    }); -    return results; -  }, - -  grep: function(filter, iterator, context) { -    iterator = iterator || Prototype.K; -    var results = []; - -    if (Object.isString(filter)) -      filter = new RegExp(filter); - -    this.each(function(value, index) { -      if (filter.match(value)) -        results.push(iterator.call(context, value, index)); -    }); -    return results; -  }, - -  include: function(object) { -    if (Object.isFunction(this.indexOf)) -      if (this.indexOf(object) != -1) return true; - -    var found = false; -    this.each(function(value) { -      if (value == object) { -        found = true; -        throw $break; -      } -    }); -    return found; -  }, - -  inGroupsOf: function(number, fillWith) { -    fillWith = Object.isUndefined(fillWith) ? null : fillWith; -    return this.eachSlice(number, function(slice) { -      while(slice.length < number) slice.push(fillWith); -      return slice; -    }); -  }, - -  inject: function(memo, iterator, context) { -    this.each(function(value, index) { -      memo = iterator.call(context, memo, value, index); -    }); -    return memo; -  }, - -  invoke: function(method) { -    var args = $A(arguments).slice(1); -    return this.map(function(value) { -      return value[method].apply(value, args); -    }); -  }, - -  max: function(iterator, context) { -    iterator = iterator || Prototype.K; -    var result; -    this.each(function(value, index) { -      value = iterator.call(context, value, index); -      if (result == null || value >= result) -        result = value; -    }); -    return result; -  }, - -  min: function(iterator, context) { -    iterator = iterator || Prototype.K; -    var result; -    this.each(function(value, index) { -      value = iterator.call(context, value, index); -      if (result == null || value < result) -        result = value; -    }); -    return result; -  }, - -  partition: function(iterator, context) { -    iterator = iterator || Prototype.K; -    var trues = [], falses = []; -    this.each(function(value, index) { -      (iterator.call(context, value, index) ? -        trues : falses).push(value); -    }); -    return [trues, falses]; -  }, - -  pluck: function(property) { -    var results = []; -    this.each(function(value) { -      results.push(value[property]); -    }); -    return results; -  }, - -  reject: function(iterator, context) { -    var results = []; -    this.each(function(value, index) { -      if (!iterator.call(context, value, index)) -        results.push(value); -    }); -    return results; -  }, - -  sortBy: function(iterator, context) { -    return this.map(function(value, index) { -      return { -        value: value, -        criteria: iterator.call(context, value, index) -      }; -    }).sort(function(left, right) { -      var a = left.criteria, b = right.criteria; -      return a < b ? -1 : a > b ? 1 : 0; -    }).pluck('value'); -  }, - -  toArray: function() { -    return this.map(); -  }, - -  zip: function() { -    var iterator = Prototype.K, args = $A(arguments); -    if (Object.isFunction(args.last())) -      iterator = args.pop(); - -    var collections = [this].concat(args).map($A); -    return this.map(function(value, index) { -      return iterator(collections.pluck(index)); -    }); -  }, - -  size: function() { -    return this.toArray().length; -  }, - -  inspect: function() { -    return '#<Enumerable:' + this.toArray().inspect() + '>'; -  } -}; - -Object.extend(Enumerable, { -  map:     Enumerable.collect, -  find:    Enumerable.detect, -  select:  Enumerable.findAll, -  filter:  Enumerable.findAll, -  member:  Enumerable.include, -  entries: Enumerable.toArray, -  every:   Enumerable.all, -  some:    Enumerable.any -}); -function $A(iterable) { -  if (!iterable) return []; -  if (iterable.toArray) return iterable.toArray(); -  var length = iterable.length || 0, results = new Array(length); -  while (length--) results[length] = iterable[length]; -  return results; -} - -if (Prototype.Browser.WebKit) { -  $A = function(iterable) { -    if (!iterable) return []; -    // In Safari, only use the `toArray` method if it's not a NodeList. -    // A NodeList is a function, has an function `item` property, and a numeric -    // `length` property. Adapted from Google Doctype. -    if (!(typeof iterable === 'function' && typeof iterable.length === -        'number' && typeof iterable.item === 'function') && iterable.toArray) -      return iterable.toArray(); -    var length = iterable.length || 0, results = new Array(length); -    while (length--) results[length] = iterable[length]; -    return results; -  }; -} - -Array.from = $A; - -Object.extend(Array.prototype, Enumerable); - -if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { -  _each: function(iterator) { -    for (var i = 0, length = this.length; i < length; i++) -      iterator(this[i]); -  }, - -  clear: function() { -    this.length = 0; -    return this; -  }, - -  first: function() { -    return this[0]; -  }, - -  last: function() { -    return this[this.length - 1]; -  }, - -  compact: function() { -    return this.select(function(value) { -      return value != null; -    }); -  }, - -  flatten: function() { -    return this.inject([], function(array, value) { -      return array.concat(Object.isArray(value) ? -        value.flatten() : [value]); -    }); -  }, - -  without: function() { -    var values = $A(arguments); -    return this.select(function(value) { -      return !values.include(value); -    }); -  }, - -  reverse: function(inline) { -    return (inline !== false ? this : this.toArray())._reverse(); -  }, - -  reduce: function() { -    return this.length > 1 ? this : this[0]; -  }, - -  uniq: function(sorted) { -    return this.inject([], function(array, value, index) { -      if (0 == index || (sorted ? array.last() != value : !array.include(value))) -        array.push(value); -      return array; -    }); -  }, - -  intersect: function(array) { -    return this.uniq().findAll(function(item) { -      return array.detect(function(value) { return item === value }); -    }); -  }, - -  clone: function() { -    return [].concat(this); -  }, - -  size: function() { -    return this.length; -  }, - -  inspect: function() { -    return '[' + this.map(Object.inspect).join(', ') + ']'; -  }, - -  toJSON: function() { -    var results = []; -    this.each(function(object) { -      var value = Object.toJSON(object); -      if (!Object.isUndefined(value)) results.push(value); -    }); -    return '[' + results.join(', ') + ']'; -  } -}); - -// use native browser JS 1.6 implementation if available -if (Object.isFunction(Array.prototype.forEach)) -  Array.prototype._each = Array.prototype.forEach; - -if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) { -  i || (i = 0); -  var length = this.length; -  if (i < 0) i = length + i; -  for (; i < length; i++) -    if (this[i] === item) return i; -  return -1; -}; - -if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) { -  i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; -  var n = this.slice(0, i).reverse().indexOf(item); -  return (n < 0) ? n : i - n - 1; -}; - -Array.prototype.toArray = Array.prototype.clone; - -function $w(string) { -  if (!Object.isString(string)) return []; -  string = string.strip(); -  return string ? string.split(/\s+/) : []; -} - -if (Prototype.Browser.Opera){ -  Array.prototype.concat = function() { -    var array = []; -    for (var i = 0, length = this.length; i < length; i++) array.push(this[i]); -    for (var i = 0, length = arguments.length; i < length; i++) { -      if (Object.isArray(arguments[i])) { -        for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++) -          array.push(arguments[i][j]); -      } else { -        array.push(arguments[i]); -      } -    } -    return array; -  }; -} -Object.extend(Number.prototype, { -  toColorPart: function() { -    return this.toPaddedString(2, 16); -  }, - -  succ: function() { -    return this + 1; -  }, - -  times: function(iterator, context) { -    $R(0, this, true).each(iterator, context); -    return this; -  }, - -  toPaddedString: function(length, radix) { -    var string = this.toString(radix || 10); -    return '0'.times(length - string.length) + string; -  }, - -  toJSON: function() { -    return isFinite(this) ? this.toString() : 'null'; -  } -}); - -$w('abs round ceil floor').each(function(method){ -  Number.prototype[method] = Math[method].methodize(); -}); -function $H(object) { -  return new Hash(object); -}; - -var Hash = Class.create(Enumerable, (function() { - -  function toQueryPair(key, value) { -    if (Object.isUndefined(value)) return key; -    return key + '=' + encodeURIComponent(String.interpret(value)); -  } - -  return { -    initialize: function(object) { -      this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); -    }, - -    _each: function(iterator) { -      for (var key in this._object) { -        var value = this._object[key], pair = [key, value]; -        pair.key = key; -        pair.value = value; -        iterator(pair); -      } -    }, - -    set: function(key, value) { -      return this._object[key] = value; -    }, - -    get: function(key) { -      // simulating poorly supported hasOwnProperty -      if (this._object[key] !== Object.prototype[key]) -        return this._object[key]; -    }, - -    unset: function(key) { -      var value = this._object[key]; -      delete this._object[key]; -      return value; -    }, - -    toObject: function() { -      return Object.clone(this._object); -    }, - -    keys: function() { -      return this.pluck('key'); -    }, - -    values: function() { -      return this.pluck('value'); -    }, - -    index: function(value) { -      var match = this.detect(function(pair) { -        return pair.value === value; -      }); -      return match && match.key; -    }, - -    merge: function(object) { -      return this.clone().update(object); -    }, - -    update: function(object) { -      return new Hash(object).inject(this, function(result, pair) { -        result.set(pair.key, pair.value); -        return result; -      }); -    }, - -    toQueryString: function() { -      return this.inject([], function(results, pair) { -        var key = encodeURIComponent(pair.key), values = pair.value; - -        if (values && typeof values == 'object') { -          if (Object.isArray(values)) -            return results.concat(values.map(toQueryPair.curry(key))); -        } else results.push(toQueryPair(key, values)); -        return results; -      }).join('&'); -    }, - -    inspect: function() { -      return '#<Hash:{' + this.map(function(pair) { -        return pair.map(Object.inspect).join(': '); -      }).join(', ') + '}>'; -    }, - -    toJSON: function() { -      return Object.toJSON(this.toObject()); -    }, - -    clone: function() { -      return new Hash(this); -    } -  } -})()); - -Hash.prototype.toTemplateReplacements = Hash.prototype.toObject; -Hash.from = $H; -var ObjectRange = Class.create(Enumerable, { -  initialize: function(start, end, exclusive) { -    this.start = start; -    this.end = end; -    this.exclusive = exclusive; -  }, - -  _each: function(iterator) { -    var value = this.start; -    while (this.include(value)) { -      iterator(value); -      value = value.succ(); -    } -  }, - -  include: function(value) { -    if (value < this.start) -      return false; -    if (this.exclusive) -      return value < this.end; -    return value <= this.end; -  } -}); - -var $R = function(start, end, exclusive) { -  return new ObjectRange(start, end, exclusive); -}; - -var 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(iterator) { -    this.responders._each(iterator); -  }, - -  register: function(responder) { -    if (!this.include(responder)) -      this.responders.push(responder); -  }, - -  unregister: function(responder) { -    this.responders = this.responders.without(responder); -  }, - -  dispatch: function(callback, request, transport, json) { -    this.each(function(responder) { -      if (Object.isFunction(responder[callback])) { -        try { -          responder[callback].apply(responder, [request, transport, json]); -        } catch (e) { } -      } -    }); -  } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ -  onCreate:   function() { Ajax.activeRequestCount++ }, -  onComplete: function() { Ajax.activeRequestCount-- } -}); - -Ajax.Base = Class.create({ -  initialize: function(options) { -    this.options = { -      method:       'post', -      asynchronous: true, -      contentType:  'application/x-www-form-urlencoded', -      encoding:     'UTF-8', -      parameters:   '', -      evalJSON:     true, -      evalJS:       true -    }; -    Object.extend(this.options, options || { }); - -    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, url, options) { -    $super(options); -    this.transport = Ajax.getTransport(); -    this.request(url); -  }, - -  request: function(url) { -    this.url = url; -    this.method = this.options.method; -    var params = Object.clone(this.options.parameters); - -    if (!['get', 'post'].include(this.method)) { -      // simulate other verbs over post -      params['_method'] = this.method; -      this.method = 'post'; -    } - -    this.parameters = params; - -    if (params = Object.toQueryString(params)) { -      // when GET, append parameters to URL -      if (this.method == 'get') -        this.url += (this.url.include('?') ? '&' : '?') + params; -      else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) -        params += '&_='; -    } - -    try { -      var response = new Ajax.Response(this); -      if (this.options.onCreate) this.options.onCreate(response); -      Ajax.Responders.dispatch('onCreate', this, response); - -      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 || params) : null; -      this.transport.send(this.body); - -      /* Force Firefox to handle ready state 4 for synchronous requests */ -      if (!this.options.asynchronous && this.transport.overrideMimeType) -        this.onStateChange(); - -    } -    catch (e) { -      this.dispatchException(e); -    } -  }, - -  onStateChange: function() { -    var readyState = this.transport.readyState; -    if (readyState > 1 && !((readyState == 4) && this._complete)) -      this.respondToReadyState(this.transport.readyState); -  }, - -  setRequestHeaders: function() { -    var headers = { -      'X-Requested-With': 'XMLHttpRequest', -      'X-Prototype-Version': Prototype.Version, -      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' -    }; - -    if (this.method == 'post') { -      headers['Content-type'] = this.options.contentType + -        (this.options.encoding ? '; charset=' + this.options.encoding : ''); - -      /* Force "Connection: close" for older Mozilla browsers to work -       * around a bug where XMLHttpRequest sends an incorrect -       * Content-length header. See Mozilla Bugzilla #246651. -       */ -      if (this.transport.overrideMimeType && -          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) -            headers['Connection'] = 'close'; -    } - -    // user-defined headers -    if (typeof this.options.requestHeaders == 'object') { -      var extras = this.options.requestHeaders; - -      if (Object.isFunction(extras.push)) -        for (var i = 0, length = extras.length; i < length; i += 2) -          headers[extras[i]] = extras[i+1]; -      else -        $H(extras).each(function(pair) { headers[pair.key] = pair.value }); -    } - -    for (var name in headers) -      this.transport.setRequestHeader(name, headers[name]); -  }, - -  success: function() { -    var status = this.getStatus(); -    return !status || (status >= 200 && status < 300); -  }, - -  getStatus: function() { -    try { -      return this.transport.status || 0; -    } catch (e) { return 0 } -  }, - -  respondToReadyState: function(readyState) { -    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); - -    if (state == 'Complete') { -      try { -        this._complete = true; -        (this.options['on' + response.status] -         || this.options['on' + (this.success() ? 'Success' : 'Failure')] -         || Prototype.emptyFunction)(response, response.headerJSON); -      } catch (e) { -        this.dispatchException(e); -      } - -      var contentType = response.getHeader('Content-type'); -      if (this.options.evalJS == 'force' -          || (this.options.evalJS && this.isSameOrigin() && contentType -          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) -        this.evalResponse(); -    } - -    try { -      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); -      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); -    } catch (e) { -      this.dispatchException(e); -    } - -    if (state == 'Complete') { -      // avoid memory leak in MSIE: clean up -      this.transport.onreadystatechange = Prototype.emptyFunction; -    } -  }, - -  isSameOrigin: function() { -    var m = this.url.match(/^\s*https?:\/\/[^\/]*/); -    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ -      protocol: location.protocol, -      domain: document.domain, -      port: location.port ? ':' + location.port : '' -    })); -  }, - -  getHeader: function(name) { -    try { -      return this.transport.getResponseHeader(name) || null; -    } catch (e) { return null } -  }, - -  evalResponse: function() { -    try { -      return eval((this.transport.responseText || '').unfilterJSON()); -    } catch (e) { -      this.dispatchException(e); -    } -  }, - -  dispatchException: function(exception) { -    (this.options.onException || Prototype.emptyFunction)(this, exception); -    Ajax.Responders.dispatch('onException', this, exception); -  } -}); - -Ajax.Request.Events = -  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Response = Class.create({ -  initialize: function(request){ -    this.request = request; -    var transport  = this.transport  = request.transport, -        readyState = this.readyState = transport.readyState; - -    if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { -      this.status       = this.getStatus(); -      this.statusText   = this.getStatusText(); -      this.responseText = String.interpret(transport.responseText); -      this.headerJSON   = this._getHeaderJSON(); -    } - -    if(readyState == 4) { -      var xml = transport.responseXML; -      this.responseXML  = Object.isUndefined(xml) ? null : xml; -      this.responseJSON = this._getResponseJSON(); -    } -  }, - -  status:      0, -  statusText: '', - -  getStatus: Ajax.Request.prototype.getStatus, - -  getStatusText: function() { -    try { -      return this.transport.statusText || ''; -    } catch (e) { return '' } -  }, - -  getHeader: Ajax.Request.prototype.getHeader, - -  getAllHeaders: function() { -    try { -      return this.getAllResponseHeaders(); -    } catch (e) { return null } -  }, - -  getResponseHeader: function(name) { -    return this.transport.getResponseHeader(name); -  }, - -  getAllResponseHeaders: function() { -    return this.transport.getAllResponseHeaders(); -  }, - -  _getHeaderJSON: function() { -    var json = this.getHeader('X-JSON'); -    if (!json) return null; -    json = decodeURIComponent(escape(json)); -    try { -      return json.evalJSON(this.request.options.sanitizeJSON || -        !this.request.isSameOrigin()); -    } catch (e) { -      this.request.dispatchException(e); -    } -  }, - -  _getResponseJSON: function() { -    var options = this.request.options; -    if (!options.evalJSON || (options.evalJSON != 'force' && -      !(this.getHeader('Content-type') || '').include('application/json')) || -        this.responseText.blank()) -          return null; -    try { -      return this.responseText.evalJSON(options.sanitizeJSON || -        !this.request.isSameOrigin()); -    } catch (e) { -      this.request.dispatchException(e); -    } -  } -}); - -Ajax.Updater = Class.create(Ajax.Request, { -  initialize: function($super, container, url, options) { -    this.container = { -      success: (container.success || container), -      failure: (container.failure || (container.success ? null : container)) -    }; - -    options = Object.clone(options); -    var onComplete = options.onComplete; -    options.onComplete = (function(response, json) { -      this.updateContent(response.responseText); -      if (Object.isFunction(onComplete)) onComplete(response, json); -    }).bind(this); - -    $super(url, options); -  }, - -  updateContent: function(responseText) { -    var receiver = this.container[this.success() ? 'success' : 'failure'], -        options = this.options; - -    if (!options.evalScripts) responseText = responseText.stripScripts(); - -    if (receiver = $(receiver)) { -      if (options.insertion) { -        if (Object.isString(options.insertion)) { -          var insertion = { }; insertion[options.insertion] = responseText; -          receiver.insert(insertion); -        } -        else options.insertion(receiver, responseText); -      } -      else receiver.update(responseText); -    } -  } -}); - -Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { -  initialize: function($super, container, url, options) { -    $super(options); -    this.onComplete = this.options.onComplete; - -    this.frequency = (this.options.frequency || 2); -    this.decay = (this.options.decay || 1); - -    this.updater = { }; -    this.container = container; -    this.url = url; - -    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(response) { -    if (this.options.decay) { -      this.decay = (response.responseText == this.lastText ? -        this.decay * this.options.decay : 1); - -      this.lastText = response.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 $(element) { -  if (arguments.length > 1) { -    for (var i = 0, elements = [], length = arguments.length; i < length; i++) -      elements.push($(arguments[i])); -    return elements; -  } -  if (Object.isString(element)) -    element = document.getElementById(element); -  return Element.extend(element); -} - -if (Prototype.BrowserFeatures.XPath) { -  document._getElementsByXPath = function(expression, parentElement) { -    var results = []; -    var query = document.evaluate(expression, $(parentElement) || document, -      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); -    for (var i = 0, length = query.snapshotLength; i < length; i++) -      results.push(Element.extend(query.snapshotItem(i))); -    return results; -  }; -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Node) var Node = { }; - -if (!Node.ELEMENT_NODE) { -  // DOM level 2 ECMAScript Language Binding -  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() { -  var element = this.Element; -  this.Element = function(tagName, attributes) { -    attributes = attributes || { }; -    tagName = tagName.toLowerCase(); -    var cache = Element.cache; -    if (Prototype.Browser.IE && attributes.name) { -      tagName = '<' + tagName + ' name="' + attributes.name + '">'; -      delete attributes.name; -      return Element.writeAttribute(document.createElement(tagName), attributes); -    } -    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); -    return Element.writeAttribute(cache[tagName].cloneNode(false), attributes); -  }; -  Object.extend(this.Element, element || { }); -  if (element) this.Element.prototype = element.prototype; -}).call(window); - -Element.cache = { }; - -Element.Methods = { -  visible: function(element) { -    return $(element).style.display != 'none'; -  }, - -  toggle: function(element) { -    element = $(element); -    Element[Element.visible(element) ? 'hide' : 'show'](element); -    return element; -  }, - -  hide: function(element) { -    element = $(element); -    element.style.display = 'none'; -    return element; -  }, - -  show: function(element) { -    element = $(element); -    element.style.display = ''; -    return element; -  }, - -  remove: function(element) { -    element = $(element); -    element.parentNode.removeChild(element); -    return element; -  }, - -  update: function(element, content) { -    element = $(element); -    if (content && content.toElement) content = content.toElement(); -    if (Object.isElement(content)) return element.update().insert(content); -    content = Object.toHTML(content); -    element.innerHTML = content.stripScripts(); -    content.evalScripts.bind(content).defer(); -    return element; -  }, - -  replace: function(element, content) { -    element = $(element); -    if (content && content.toElement) content = content.toElement(); -    else if (!Object.isElement(content)) { -      content = Object.toHTML(content); -      var range = element.ownerDocument.createRange(); -      range.selectNode(element); -      content.evalScripts.bind(content).defer(); -      content = range.createContextualFragment(content.stripScripts()); -    } -    element.parentNode.replaceChild(content, element); -    return element; -  }, - -  insert: function(element, insertions) { -    element = $(element); - -    if (Object.isString(insertions) || Object.isNumber(insertions) || -        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) -          insertions = {bottom:insertions}; - -    var content, insert, tagName, childNodes; - -    for (var position in insertions) { -      content  = insertions[position]; -      position = position.toLowerCase(); -      insert = Element._insertionTranslations[position]; - -      if (content && content.toElement) content = content.toElement(); -      if (Object.isElement(content)) { -        insert(element, content); -        continue; -      } - -      content = Object.toHTML(content); - -      tagName = ((position == 'before' || position == 'after') -        ? element.parentNode : element).tagName.toUpperCase(); - -      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); - -      if (position == 'top' || position == 'after') childNodes.reverse(); -      childNodes.each(insert.curry(element)); - -      content.evalScripts.bind(content).defer(); -    } - -    return element; -  }, - -  wrap: function(element, wrapper, attributes) { -    element = $(element); -    if (Object.isElement(wrapper)) -      $(wrapper).writeAttribute(attributes || { }); -    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); -    else wrapper = new Element('div', wrapper); -    if (element.parentNode) -      element.parentNode.replaceChild(wrapper, element); -    wrapper.appendChild(element); -    return wrapper; -  }, - -  inspect: function(element) { -    element = $(element); -    var result = '<' + element.tagName.toLowerCase(); -    $H({'id': 'id', 'className': 'class'}).each(function(pair) { -      var property = pair.first(), attribute = pair.last(); -      var value = (element[property] || '').toString(); -      if (value) result += ' ' + attribute + '=' + value.inspect(true); -    }); -    return result + '>'; -  }, - -  recursivelyCollect: function(element, property) { -    element = $(element); -    var elements = []; -    while (element = element[property]) -      if (element.nodeType == 1) -        elements.push(Element.extend(element)); -    return elements; -  }, - -  ancestors: function(element) { -    return $(element).recursivelyCollect('parentNode'); -  }, - -  descendants: function(element) { -    return $(element).select("*"); -  }, - -  firstDescendant: function(element) { -    element = $(element).firstChild; -    while (element && element.nodeType != 1) element = element.nextSibling; -    return $(element); -  }, - -  immediateDescendants: function(element) { -    if (!(element = $(element).firstChild)) return []; -    while (element && element.nodeType != 1) element = element.nextSibling; -    if (element) return [element].concat($(element).nextSiblings()); -    return []; -  }, - -  previousSiblings: function(element) { -    return $(element).recursivelyCollect('previousSibling'); -  }, - -  nextSiblings: function(element) { -    return $(element).recursivelyCollect('nextSibling'); -  }, - -  siblings: function(element) { -    element = $(element); -    return element.previousSiblings().reverse().concat(element.nextSiblings()); -  }, - -  match: function(element, selector) { -    if (Object.isString(selector)) -      selector = new Selector(selector); -    return selector.match($(element)); -  }, - -  up: function(element, expression, index) { -    element = $(element); -    if (arguments.length == 1) return $(element.parentNode); -    var ancestors = element.ancestors(); -    return Object.isNumber(expression) ? ancestors[expression] : -      Selector.findElement(ancestors, expression, index); -  }, - -  down: function(element, expression, index) { -    element = $(element); -    if (arguments.length == 1) return element.firstDescendant(); -    return Object.isNumber(expression) ? element.descendants()[expression] : -      Element.select(element, expression)[index || 0]; -  }, - -  previous: function(element, expression, index) { -    element = $(element); -    if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element)); -    var previousSiblings = element.previousSiblings(); -    return Object.isNumber(expression) ? previousSiblings[expression] : -      Selector.findElement(previousSiblings, expression, index); -  }, - -  next: function(element, expression, index) { -    element = $(element); -    if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element)); -    var nextSiblings = element.nextSiblings(); -    return Object.isNumber(expression) ? nextSiblings[expression] : -      Selector.findElement(nextSiblings, expression, index); -  }, - -  select: function() { -    var args = $A(arguments), element = $(args.shift()); -    return Selector.findChildElements(element, args); -  }, - -  adjacent: function() { -    var args = $A(arguments), element = $(args.shift()); -    return Selector.findChildElements(element.parentNode, args).without(element); -  }, - -  identify: function(element) { -    element = $(element); -    var id = element.readAttribute('id'), self = arguments.callee; -    if (id) return id; -    do { id = 'anonymous_element_' + self.counter++ } while ($(id)); -    element.writeAttribute('id', id); -    return id; -  }, - -  readAttribute: function(element, name) { -    element = $(element); -    if (Prototype.Browser.IE) { -      var t = Element._attributeTranslations.read; -      if (t.values[name]) return t.values[name](element, name); -      if (t.names[name]) name = t.names[name]; -      if (name.include(':')) { -        return (!element.attributes || !element.attributes[name]) ? null : -         element.attributes[name].value; -      } -    } -    return element.getAttribute(name); -  }, - -  writeAttribute: function(element, name, value) { -    element = $(element); -    var attributes = { }, t = Element._attributeTranslations.write; - -    if (typeof name == 'object') attributes = name; -    else attributes[name] = Object.isUndefined(value) ? true : value; - -    for (var attr in attributes) { -      name = t.names[attr] || attr; -      value = attributes[attr]; -      if (t.values[attr]) name = t.values[attr](element, value); -      if (value === false || value === null) -        element.removeAttribute(name); -      else if (value === true) -        element.setAttribute(name, name); -      else element.setAttribute(name, value); -    } -    return element; -  }, - -  getHeight: function(element) { -    return $(element).getDimensions().height; -  }, - -  getWidth: function(element) { -    return $(element).getDimensions().width; -  }, - -  classNames: function(element) { -    return new Element.ClassNames(element); -  }, - -  hasClassName: function(element, className) { -    if (!(element = $(element))) return; -    var elementClassName = element.className; -    return (elementClassName.length > 0 && (elementClassName == className || -      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); -  }, - -  addClassName: function(element, className) { -    if (!(element = $(element))) return; -    if (!element.hasClassName(className)) -      element.className += (element.className ? ' ' : '') + className; -    return element; -  }, - -  removeClassName: function(element, className) { -    if (!(element = $(element))) return; -    element.className = element.className.replace( -      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); -    return element; -  }, - -  toggleClassName: function(element, className) { -    if (!(element = $(element))) return; -    return element[element.hasClassName(className) ? -      'removeClassName' : 'addClassName'](className); -  }, - -  // removes whitespace-only text node children -  cleanWhitespace: function(element) { -    element = $(element); -    var node = element.firstChild; -    while (node) { -      var nextNode = node.nextSibling; -      if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) -        element.removeChild(node); -      node = nextNode; -    } -    return element; -  }, - -  empty: function(element) { -    return $(element).innerHTML.blank(); -  }, - -  descendantOf: function(element, ancestor) { -    element = $(element), ancestor = $(ancestor); - -    if (element.compareDocumentPosition) -      return (element.compareDocumentPosition(ancestor) & 8) === 8; - -    if (ancestor.contains) -      return ancestor.contains(element) && ancestor !== element; - -    while (element = element.parentNode) -      if (element == ancestor) return true; - -    return false; -  }, - -  scrollTo: function(element) { -    element = $(element); -    var pos = element.cumulativeOffset(); -    window.scrollTo(pos[0], pos[1]); -    return element; -  }, - -  getStyle: function(element, style) { -    element = $(element); -    style = style == 'float' ? 'cssFloat' : style.camelize(); -    var value = element.style[style]; -    if (!value || value == 'auto') { -      var css = document.defaultView.getComputedStyle(element, null); -      value = css ? css[style] : null; -    } -    if (style == 'opacity') return value ? parseFloat(value) : 1.0; -    return value == 'auto' ? null : value; -  }, - -  getOpacity: function(element) { -    return $(element).getStyle('opacity'); -  }, - -  setStyle: function(element, styles) { -    element = $(element); -    var elementStyle = element.style, match; -    if (Object.isString(styles)) { -      element.style.cssText += ';' + styles; -      return styles.include('opacity') ? -        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; -    } -    for (var property in styles) -      if (property == 'opacity') element.setOpacity(styles[property]); -      else -        elementStyle[(property == 'float' || property == 'cssFloat') ? -          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : -            property] = styles[property]; - -    return element; -  }, - -  setOpacity: function(element, value) { -    element = $(element); -    element.style.opacity = (value == 1 || value === '') ? '' : -      (value < 0.00001) ? 0 : value; -    return element; -  }, - -  getDimensions: function(element) { -    element = $(element); -    var display = element.getStyle('display'); -    if (display != 'none' && display != null) // Safari bug -      return {width: element.offsetWidth, height: element.offsetHeight}; - -    // All *Width and *Height properties give 0 on elements with display none, -    // so enable the element temporarily -    var els = element.style; -    var originalVisibility = els.visibility; -    var originalPosition = els.position; -    var originalDisplay = els.display; -    els.visibility = 'hidden'; -    els.position = 'absolute'; -    els.display = 'block'; -    var originalWidth = element.clientWidth; -    var originalHeight = element.clientHeight; -    els.display = originalDisplay; -    els.position = originalPosition; -    els.visibility = originalVisibility; -    return {width: originalWidth, height: originalHeight}; -  }, - -  makePositioned: function(element) { -    element = $(element); -    var pos = Element.getStyle(element, 'position'); -    if (pos == 'static' || !pos) { -      element._madePositioned = true; -      element.style.position = 'relative'; -      // Opera returns the offset relative to the positioning context, when an -      // element is position relative but top and left have not been defined -      if (Prototype.Browser.Opera) { -        element.style.top = 0; -        element.style.left = 0; -      } -    } -    return element; -  }, - -  undoPositioned: function(element) { -    element = $(element); -    if (element._madePositioned) { -      element._madePositioned = undefined; -      element.style.position = -        element.style.top = -        element.style.left = -        element.style.bottom = -        element.style.right = ''; -    } -    return element; -  }, - -  makeClipping: function(element) { -    element = $(element); -    if (element._overflow) return element; -    element._overflow = Element.getStyle(element, 'overflow') || 'auto'; -    if (element._overflow !== 'hidden') -      element.style.overflow = 'hidden'; -    return element; -  }, - -  undoClipping: function(element) { -    element = $(element); -    if (!element._overflow) return element; -    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; -    element._overflow = null; -    return element; -  }, - -  cumulativeOffset: function(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; -      element = element.offsetParent; -    } while (element); -    return Element._returnOffset(valueL, valueT); -  }, - -  positionedOffset: function(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; -      element = element.offsetParent; -      if (element) { -        if (element.tagName.toUpperCase() == 'BODY') break; -        var p = Element.getStyle(element, 'position'); -        if (p !== 'static') break; -      } -    } while (element); -    return Element._returnOffset(valueL, valueT); -  }, - -  absolutize: function(element) { -    element = $(element); -    if (element.getStyle('position') == 'absolute') return element; -    // Position.prepare(); // To be done manually by Scripty when it needs it. - -    var offsets = element.positionedOffset(); -    var top     = offsets[1]; -    var left    = offsets[0]; -    var width   = element.clientWidth; -    var height  = element.clientHeight; - -    element._originalLeft   = left - parseFloat(element.style.left  || 0); -    element._originalTop    = top  - parseFloat(element.style.top || 0); -    element._originalWidth  = element.style.width; -    element._originalHeight = element.style.height; - -    element.style.position = 'absolute'; -    element.style.top    = top + 'px'; -    element.style.left   = left + 'px'; -    element.style.width  = width + 'px'; -    element.style.height = height + 'px'; -    return element; -  }, - -  relativize: function(element) { -    element = $(element); -    if (element.getStyle('position') == 'relative') return element; -    // Position.prepare(); // To be done manually by Scripty when it needs it. - -    element.style.position = 'relative'; -    var top  = parseFloat(element.style.top  || 0) - (element._originalTop || 0); -    var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - -    element.style.top    = top + 'px'; -    element.style.left   = left + 'px'; -    element.style.height = element._originalHeight; -    element.style.width  = element._originalWidth; -    return element; -  }, - -  cumulativeScrollOffset: function(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.scrollTop  || 0; -      valueL += element.scrollLeft || 0; -      element = element.parentNode; -    } while (element); -    return Element._returnOffset(valueL, valueT); -  }, - -  getOffsetParent: function(element) { -    if (element.offsetParent) return $(element.offsetParent); -    if (element == document.body) return $(element); - -    while ((element = element.parentNode) && element != document.body) -      if (Element.getStyle(element, 'position') != 'static') -        return $(element); - -    return $(document.body); -  }, - -  viewportOffset: function(forElement) { -    var valueT = 0, valueL = 0; - -    var element = forElement; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; - -      // Safari fix -      if (element.offsetParent == document.body && -        Element.getStyle(element, 'position') == 'absolute') break; - -    } while (element = element.offsetParent); - -    element = forElement; -    do { -      if (!Prototype.Browser.Opera || (element.tagName && (element.tagName.toUpperCase() == 'BODY'))) { -        valueT -= element.scrollTop  || 0; -        valueL -= element.scrollLeft || 0; -      } -    } while (element = element.parentNode); - -    return Element._returnOffset(valueL, valueT); -  }, - -  clonePosition: function(element, source) { -    var options = Object.extend({ -      setLeft:    true, -      setTop:     true, -      setWidth:   true, -      setHeight:  true, -      offsetTop:  0, -      offsetLeft: 0 -    }, arguments[2] || { }); - -    // find page position of source -    source = $(source); -    var p = source.viewportOffset(); - -    // find coordinate system to use -    element = $(element); -    var delta = [0, 0]; -    var parent = null; -    // delta [0,0] will do fine with position: fixed elements, -    // position:absolute needs offsetParent deltas -    if (Element.getStyle(element, 'position') == 'absolute') { -      parent = element.getOffsetParent(); -      delta = parent.viewportOffset(); -    } - -    // correct by body offsets (fixes Safari) -    if (parent == document.body) { -      delta[0] -= document.body.offsetLeft; -      delta[1] -= document.body.offsetTop; -    } - -    // set position -    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px'; -    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px'; -    if (options.setWidth)  element.style.width = source.offsetWidth + 'px'; -    if (options.setHeight) element.style.height = source.offsetHeight + 'px'; -    return element; -  } -}; - -Element.Methods.identify.counter = 1; - -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(proceed, element, style) { -      switch (style) { -        case 'left': case 'top': case 'right': case 'bottom': -          if (proceed(element, 'position') === 'static') return null; -        case 'height': case 'width': -          // returns '0px' for hidden elements; we want it to return null -          if (!Element.visible(element)) return null; - -          // returns the border-box dimensions rather than the content-box -          // dimensions, so we subtract padding and borders from the value -          var dim = parseInt(proceed(element, style), 10); - -          if (dim !== element['offset' + style.capitalize()]) -            return dim + 'px'; - -          var properties; -          if (style === 'height') { -            properties = ['border-top-width', 'padding-top', -             'padding-bottom', 'border-bottom-width']; -          } -          else { -            properties = ['border-left-width', 'padding-left', -             'padding-right', 'border-right-width']; -          } -          return properties.inject(dim, function(memo, property) { -            var val = proceed(element, property); -            return val === null ? memo : memo - parseInt(val, 10); -          }) + 'px'; -        default: return proceed(element, style); -      } -    } -  ); - -  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( -    function(proceed, element, attribute) { -      if (attribute === 'title') return element.title; -      return proceed(element, attribute); -    } -  ); -} - -else if (Prototype.Browser.IE) { -  // IE doesn't report offsets correctly for static elements, so we change them -  // to "relative" to get the values, then change them back. -  Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap( -    function(proceed, element) { -      element = $(element); -      // IE throws an error if element is not in document -      try { element.offsetParent } -      catch(e) { return $(document.body) } -      var position = element.getStyle('position'); -      if (position !== 'static') return proceed(element); -      element.setStyle({ position: 'relative' }); -      var value = proceed(element); -      element.setStyle({ position: position }); -      return value; -    } -  ); - -  $w('positionedOffset viewportOffset').each(function(method) { -    Element.Methods[method] = Element.Methods[method].wrap( -      function(proceed, element) { -        element = $(element); -        try { element.offsetParent } -        catch(e) { return Element._returnOffset(0,0) } -        var position = element.getStyle('position'); -        if (position !== 'static') return proceed(element); -        // Trigger hasLayout on the offset parent so that IE6 reports -        // accurate offsetTop and offsetLeft values for position: fixed. -        var offsetParent = element.getOffsetParent(); -        if (offsetParent && offsetParent.getStyle('position') === 'fixed') -          offsetParent.setStyle({ zoom: 1 }); -        element.setStyle({ position: 'relative' }); -        var value = proceed(element); -        element.setStyle({ position: position }); -        return value; -      } -    ); -  }); - -  Element.Methods.cumulativeOffset = Element.Methods.cumulativeOffset.wrap( -    function(proceed, element) { -      try { element.offsetParent } -      catch(e) { return Element._returnOffset(0,0) } -      return proceed(element); -    } -  ); - -  Element.Methods.getStyle = function(element, style) { -    element = $(element); -    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); -    var value = element.style[style]; -    if (!value && element.currentStyle) value = element.currentStyle[style]; - -    if (style == 'opacity') { -      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) -        if (value[1]) return parseFloat(value[1]) / 100; -      return 1.0; -    } - -    if (value == 'auto') { -      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) -        return element['offset' + style.capitalize()] + 'px'; -      return null; -    } -    return value; -  }; - -  Element.Methods.setOpacity = function(element, value) { -    function stripAlpha(filter){ -      return filter.replace(/alpha\([^\)]*\)/gi,''); -    } -    element = $(element); -    var currentStyle = element.currentStyle; -    if ((currentStyle && !currentStyle.hasLayout) || -      (!currentStyle && element.style.zoom == 'normal')) -        element.style.zoom = 1; - -    var filter = element.getStyle('filter'), style = element.style; -    if (value == 1 || value === '') { -      (filter = stripAlpha(filter)) ? -        style.filter = filter : style.removeAttribute('filter'); -      return element; -    } else if (value < 0.00001) value = 0; -    style.filter = stripAlpha(filter) + -      'alpha(opacity=' + (value * 100) + ')'; -    return element; -  }; - -  Element._attributeTranslations = { -    read: { -      names: { -        'class': 'className', -        'for':   'htmlFor' -      }, -      values: { -        _getAttr: function(element, attribute) { -          return element.getAttribute(attribute, 2); -        }, -        _getAttrNode: function(element, attribute) { -          var node = element.getAttributeNode(attribute); -          return node ? node.value : ""; -        }, -        _getEv: function(element, attribute) { -          attribute = element.getAttribute(attribute); -          return attribute ? attribute.toString().slice(23, -2) : null; -        }, -        _flag: function(element, attribute) { -          return $(element).hasAttribute(attribute) ? attribute : null; -        }, -        style: function(element) { -          return element.style.cssText.toLowerCase(); -        }, -        title: function(element) { -          return element.title; -        } -      } -    } -  }; - -  Element._attributeTranslations.write = { -    names: Object.extend({ -      cellpadding: 'cellPadding', -      cellspacing: 'cellSpacing' -    }, Element._attributeTranslations.read.names), -    values: { -      checked: function(element, value) { -        element.checked = !!value; -      }, - -      style: function(element, value) { -        element.style.cssText = value ? value : ''; -      } -    } -  }; - -  Element._attributeTranslations.has = {}; - -  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + -      'encType maxLength readOnly longDesc frameBorder').each(function(attr) { -    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; -    Element._attributeTranslations.has[attr.toLowerCase()] = attr; -  }); - -  (function(v) { -    Object.extend(v, { -      href:        v._getAttr, -      src:         v._getAttr, -      type:        v._getAttr, -      action:      v._getAttrNode, -      disabled:    v._flag, -      checked:     v._flag, -      readonly:    v._flag, -      multiple:    v._flag, -      onload:      v._getEv, -      onunload:    v._getEv, -      onclick:     v._getEv, -      ondblclick:  v._getEv, -      onmousedown: v._getEv, -      onmouseup:   v._getEv, -      onmouseover: v._getEv, -      onmousemove: v._getEv, -      onmouseout:  v._getEv, -      onfocus:     v._getEv, -      onblur:      v._getEv, -      onkeypress:  v._getEv, -      onkeydown:   v._getEv, -      onkeyup:     v._getEv, -      onsubmit:    v._getEv, -      onreset:     v._getEv, -      onselect:    v._getEv, -      onchange:    v._getEv -    }); -  })(Element._attributeTranslations.read.values); -} - -else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { -  Element.Methods.setOpacity = function(element, value) { -    element = $(element); -    element.style.opacity = (value == 1) ? 0.999999 : -      (value === '') ? '' : (value < 0.00001) ? 0 : value; -    return element; -  }; -} - -else if (Prototype.Browser.WebKit) { -  Element.Methods.setOpacity = function(element, value) { -    element = $(element); -    element.style.opacity = (value == 1 || value === '') ? '' : -      (value < 0.00001) ? 0 : value; - -    if (value == 1) -      if(element.tagName.toUpperCase() == 'IMG' && element.width) { -        element.width++; element.width--; -      } else try { -        var n = document.createTextNode(' '); -        element.appendChild(n); -        element.removeChild(n); -      } catch (e) { } - -    return element; -  }; - -  // Safari returns margins on body which is incorrect if the child is absolutely -  // positioned.  For performance reasons, redefine Element#cumulativeOffset for -  // KHTML/WebKit only. -  Element.Methods.cumulativeOffset = function(element) { -    var valueT = 0, valueL = 0; -    do { -      valueT += element.offsetTop  || 0; -      valueL += element.offsetLeft || 0; -      if (element.offsetParent == document.body) -        if (Element.getStyle(element, 'position') == 'absolute') break; - -      element = element.offsetParent; -    } while (element); - -    return Element._returnOffset(valueL, valueT); -  }; -} - -if (Prototype.Browser.IE || Prototype.Browser.Opera) { -  // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements -  Element.Methods.update = function(element, content) { -    element = $(element); - -    if (content && content.toElement) content = content.toElement(); -    if (Object.isElement(content)) return element.update().insert(content); - -    content = Object.toHTML(content); -    var tagName = element.tagName.toUpperCase(); - -    if (tagName in Element._insertionTranslations.tags) { -      $A(element.childNodes).each(function(node) { element.removeChild(node) }); -      Element._getContentFromAnonymousElement(tagName, content.stripScripts()) -        .each(function(node) { element.appendChild(node) }); -    } -    else element.innerHTML = content.stripScripts(); - -    content.evalScripts.bind(content).defer(); -    return element; -  }; -} - -if ('outerHTML' in document.createElement('div')) { -  Element.Methods.replace = function(element, content) { -    element = $(element); - -    if (content && content.toElement) content = content.toElement(); -    if (Object.isElement(content)) { -      element.parentNode.replaceChild(content, element); -      return element; -    } - -    content = Object.toHTML(content); -    var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); - -    if (Element._insertionTranslations.tags[tagName]) { -      var nextSibling = element.next(); -      var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); -      parent.removeChild(element); -      if (nextSibling) -        fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); -      else -        fragments.each(function(node) { parent.appendChild(node) }); -    } -    else element.outerHTML = content.stripScripts(); - -    content.evalScripts.bind(content).defer(); -    return element; -  }; -} - -Element._returnOffset = function(l, t) { -  var result = [l, t]; -  result.left = l; -  result.top = t; -  return result; -}; - -Element._getContentFromAnonymousElement = function(tagName, html) { -  var div = new Element('div'), t = Element._insertionTranslations.tags[tagName]; -  if (t) { -    div.innerHTML = t[0] + html + t[1]; -    t[2].times(function() { div = div.firstChild }); -  } else div.innerHTML = html; -  return $A(div.childNodes); -}; - -Element._insertionTranslations = { -  before: function(element, node) { -    element.parentNode.insertBefore(node, element); -  }, -  top: function(element, node) { -    element.insertBefore(node, element.firstChild); -  }, -  bottom: function(element, node) { -    element.appendChild(node); -  }, -  after: function(element, node) { -    element.parentNode.insertBefore(node, element.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() { -  Object.extend(this.tags, { -    THEAD: this.tags.TBODY, -    TFOOT: this.tags.TBODY, -    TH:    this.tags.TD -  }); -}).call(Element._insertionTranslations); - -Element.Methods.Simulated = { -  hasAttribute: function(element, attribute) { -    attribute = Element._attributeTranslations.has[attribute] || attribute; -    var node = $(element).getAttributeNode(attribute); -    return !!(node && node.specified); -  } -}; - -Element.Methods.ByTag = { }; - -Object.extend(Element, Element.Methods); - -if (!Prototype.BrowserFeatures.ElementExtensions && -    document.createElement('div')['__proto__']) { -  window.HTMLElement = { }; -  window.HTMLElement.prototype = document.createElement('div')['__proto__']; -  Prototype.BrowserFeatures.ElementExtensions = true; -} - -Element.extend = (function() { -  if (Prototype.BrowserFeatures.SpecificElementExtensions) -    return Prototype.K; - -  var Methods = { }, ByTag = Element.Methods.ByTag; - -  var extend = Object.extend(function(element) { -    if (!element || element._extendedByPrototype || -        element.nodeType != 1 || element == window) return element; - -    var methods = Object.clone(Methods), -      tagName = element.tagName.toUpperCase(), property, value; - -    // extend methods for specific tags -    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); - -    for (property in methods) { -      value = methods[property]; -      if (Object.isFunction(value) && !(property in element)) -        element[property] = value.methodize(); -    } - -    element._extendedByPrototype = Prototype.emptyFunction; -    return element; - -  }, { -    refresh: function() { -      // extend methods for all tags (Safari doesn't need this) -      if (!Prototype.BrowserFeatures.ElementExtensions) { -        Object.extend(Methods, Element.Methods); -        Object.extend(Methods, Element.Methods.Simulated); -      } -    } -  }); - -  extend.refresh(); -  return extend; -})(); - -Element.hasAttribute = function(element, attribute) { -  if (element.hasAttribute) return element.hasAttribute(attribute); -  return Element.Methods.Simulated.hasAttribute(element, attribute); -}; - -Element.addMethods = function(methods) { -  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; - -  if (!methods) { -    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) { -    var tagName = methods; -    methods = arguments[1]; -  } - -  if (!tagName) Object.extend(Element.Methods, methods || { }); -  else { -    if (Object.isArray(tagName)) tagName.each(extend); -    else extend(tagName); -  } - -  function extend(tagName) { -    tagName = tagName.toUpperCase(); -    if (!Element.Methods.ByTag[tagName]) -      Element.Methods.ByTag[tagName] = { }; -    Object.extend(Element.Methods.ByTag[tagName], methods); -  } - -  function copy(methods, destination, onlyIfAbsent) { -    onlyIfAbsent = onlyIfAbsent || false; -    for (var property in methods) { -      var value = methods[property]; -      if (!Object.isFunction(value)) continue; -      if (!onlyIfAbsent || !(property in destination)) -        destination[property] = value.methodize(); -    } -  } - -  function findDOMClass(tagName) { -    var klass; -    var trans = { -      "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 (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; -    if (window[klass]) return window[klass]; -    klass = 'HTML' + tagName + 'Element'; -    if (window[klass]) return window[klass]; -    klass = 'HTML' + tagName.capitalize() + 'Element'; -    if (window[klass]) return window[klass]; - -    window[klass] = { }; -    window[klass].prototype = document.createElement(tagName)['__proto__']; -    return window[klass]; -  } - -  if (F.ElementExtensions) { -    copy(Element.Methods, HTMLElement.prototype); -    copy(Element.Methods.Simulated, HTMLElement.prototype, true); -  } - -  if (F.SpecificElementExtensions) { -    for (var tag in Element.Methods.ByTag) { -      var klass = findDOMClass(tag); -      if (Object.isUndefined(klass)) continue; -      copy(T[tag], klass.prototype); -    } -  } - -  Object.extend(Element, Element.Methods); -  delete Element.ByTag; - -  if (Element.extend.refresh) Element.extend.refresh(); -  Element.cache = { }; -}; - -document.viewport = { -  getDimensions: function() { -    var dimensions = { }, B = Prototype.Browser; -    $w('width height').each(function(d) { -      var D = d.capitalize(); -      if (B.WebKit && !document.evaluate) { -        // Safari <3.0 needs self.innerWidth/Height -        dimensions[d] = self['inner' + D]; -      } else if (B.Opera && parseFloat(window.opera.version()) < 9.5) { -        // Opera <9.5 needs document.body.clientWidth/Height -        dimensions[d] = document.body['client' + D] -      } else { -        dimensions[d] = document.documentElement['client' + D]; -      } -    }); -    return dimensions; -  }, - -  getWidth: function() { -    return this.getDimensions().width; -  }, - -  getHeight: function() { -    return this.getDimensions().height; -  }, - -  getScrollOffsets: function() { -    return Element._returnOffset( -      window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft, -      window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop); -  } -}; -/* Portions of the Selector class are derived from Jack Slocum's DomQuery, - * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style - * license.  Please see http://www.yui-ext.com/ for more information. */ - -var Selector = Class.create({ -  initialize: function(expression) { -    this.expression = expression.strip(); - -    if (this.shouldUseSelectorsAPI()) { -      this.mode = 'selectorsAPI'; -    } else if (this.shouldUseXPath()) { -      this.mode = 'xpath'; -      this.compileXPathMatcher(); -    } else { -      this.mode = "normal"; -      this.compileMatcher(); -    } - -  }, - -  shouldUseXPath: function() { -    if (!Prototype.BrowserFeatures.XPath) return false; - -    var e = this.expression; - -    // Safari 3 chokes on :*-of-type and :empty -    if (Prototype.Browser.WebKit && -     (e.include("-of-type") || e.include(":empty"))) -      return false; - -    // XPath can't do namespaced attributes, nor can it read -    // the "checked" property from DOM nodes -    if ((/(\[[\w-]*?:|:checked)/).test(e)) -      return false; - -    return true; -  }, - -  shouldUseSelectorsAPI: function() { -    if (!Prototype.BrowserFeatures.SelectorsAPI) return false; - -    if (!Selector._div) Selector._div = new Element('div'); - -    // Make sure the browser treats the selector as valid. Test on an -    // isolated element to minimize cost of this check. -    try { -      Selector._div.querySelector(this.expression); -    } catch(e) { -      return false; -    } - -    return true; -  }, - -  compileMatcher: function() { -    var e = this.expression, ps = Selector.patterns, h = Selector.handlers, -        c = Selector.criteria, le, p, m; - -    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 (var i in ps) { -        p = ps[i]; -        if (m = e.match(p)) { -          this.matcher.push(Object.isFunction(c[i]) ? c[i](m) : -            new Template(c[i]).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 e = this.expression, ps = Selector.patterns, -        x = Selector.xpath, le, m; - -    if (Selector._cache[e]) { -      this.xpath = Selector._cache[e]; return; -    } - -    this.matcher = ['.//*']; -    while (e && le != e && (/\S/).test(e)) { -      le = e; -      for (var i in ps) { -        if (m = e.match(ps[i])) { -          this.matcher.push(Object.isFunction(x[i]) ? x[i](m) : -            new Template(x[i]).evaluate(m)); -          e = e.replace(m[0], ''); -          break; -        } -      } -    } - -    this.xpath = this.matcher.join(''); -    Selector._cache[this.expression] = this.xpath; -  }, - -  findElements: function(root) { -    root = root || document; -    var e = this.expression, results; - -    switch (this.mode) { -      case 'selectorsAPI': -        // querySelectorAll queries document-wide, then filters to descendants -        // of the context element. That's not what we want. -        // Add an explicit context to the selector if necessary. -        if (root !== document) { -          var oldId = root.id, id = $(root).identify(); -          e = "#" + id + " " + e; -        } - -        results = $A(root.querySelectorAll(e)).map(Element.extend); -        root.id = oldId; - -        return results; -      case 'xpath': -        return document._getElementsByXPath(this.xpath, root); -      default: -       return this.matcher(root); -    } -  }, - -  match: function(element) { -    this.tokens = []; - -    var e = this.expression, ps = Selector.patterns, as = Selector.assertions; -    var le, p, m; - -    while (e && le !== e && (/\S/).test(e)) { -      le = e; -      for (var i in ps) { -        p = ps[i]; -        if (m = e.match(p)) { -          // use the Selector.assertions methods unless the selector -          // is too complex. -          if (as[i]) { -            this.tokens.push([i, Object.clone(m)]); -            e = e.replace(m[0], ''); -          } else { -            // reluctantly do a document-wide search -            // and look for a match in the array -            return this.findElements(document).include(element); -          } -        } -      } -    } - -    var match = true, name, matches; -    for (var i = 0, token; token = this.tokens[i]; i++) { -      name = token[0], matches = token[1]; -      if (!Selector.assertions[name](element, matches)) { -        match = false; break; -      } -    } - -    return match; -  }, - -  toString: function() { -    return this.expression; -  }, - -  inspect: function() { -    return "#<Selector:" + this.expression.inspect() + ">"; -  } -}); - -Object.extend(Selector, { -  _cache: { }, - -  xpath: { -    descendant:   "//*", -    child:        "/*", -    adjacent:     "/following-sibling::*[1]", -    laterSibling: '/following-sibling::*', -    tagName:      function(m) { -      if (m[1] == '*') return ''; -      return "[local-name()='" + m[1].toLowerCase() + -             "' or local-name()='" + m[1].toUpperCase() + "']"; -    }, -    className:    "[contains(concat(' ', @class, ' '), ' #{1} ')]", -    id:           "[@id='#{1}']", -    attrPresence: function(m) { -      m[1] = m[1].toLowerCase(); -      return new Template("[@#{1}]").evaluate(m); -    }, -    attr: function(m) { -      m[1] = m[1].toLowerCase(); -      m[3] = m[5] || m[6]; -      return new Template(Selector.xpath.operators[m[2]]).evaluate(m); -    }, -    pseudo: function(m) { -      var h = Selector.xpath.pseudos[m[1]]; -      if (!h) return ''; -      if (Object.isFunction(h)) return h(m); -      return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m); -    }, -    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(m) { -        var e = m[6], p = Selector.patterns, -            x = Selector.xpath, le, v; - -        var exclusion = []; -        while (e && le != e && (/\S/).test(e)) { -          le = e; -          for (var i in p) { -            if (m = e.match(p[i])) { -              v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m); -              exclusion.push("(" + v.substring(1, v.length - 1) + ")"); -              e = e.replace(m[0], ''); -              break; -            } -          } -        } -        return "[not(" + exclusion.join(" and ") + ")]"; -      }, -      'nth-child':      function(m) { -        return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m); -      }, -      'nth-last-child': function(m) { -        return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m); -      }, -      'nth-of-type':    function(m) { -        return Selector.xpath.pseudos.nth("position() ", m); -      }, -      'nth-last-of-type': function(m) { -        return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m); -      }, -      'first-of-type':  function(m) { -        m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m); -      }, -      'last-of-type':   function(m) { -        m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m); -      }, -      'only-of-type':   function(m) { -        var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m); -      }, -      nth: function(fragment, m) { -        var mm, formula = m[6], predicate; -        if (formula == 'even') formula = '2n+0'; -        if (formula == 'odd')  formula = '2n+1'; -        if (mm = formula.match(/^(\d+)$/)) // digit only -          return '[' + fragment + "= " + mm[1] + ']'; -        if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b -          if (mm[1] == "-") mm[1] = -1; -          var a = mm[1] ? Number(mm[1]) : 1; -          var b = mm[2] ? Number(mm[2]) : 0; -          predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " + -          "((#{fragment} - #{b}) div #{a} >= 0)]"; -          return new Template(predicate).evaluate({ -            fragment: fragment, a: a, b: b }); -        } -      } -    } -  }, - -  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(m) { -      m[3] = (m[5] || m[6]); -      return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m); -    }, -    pseudo: function(m) { -      if (m[6]) m[6] = m[6].replace(/"/g, '\\"'); -      return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m); -    }, -    descendant:   'c = "descendant";', -    child:        'c = "child";', -    adjacent:     'c = "adjacent";', -    laterSibling: 'c = "laterSibling";' -  }, - -  patterns: { -    // combinators must be listed first -    // (and descendant needs to be last combinator) -    laterSibling: /^\s*~\s*/, -    child:        /^\s*>\s*/, -    adjacent:     /^\s*\+\s*/, -    descendant:   /^\s/, - -    // selectors follow -    tagName:      /^\s*(\*|[\w\-]+)(\b|$)?/, -    id:           /^#([\w\-\*]+)(\b|$)/, -    className:    /^\.([\w\-\*]+)(\b|$)/, -    pseudo: -/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/, -    attrPresence: /^\[((?:[\w]+:)?[\w]+)\]/, -    attr:         /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/ -  }, - -  // for Selector.match and Element#match -  assertions: { -    tagName: function(element, matches) { -      return matches[1].toUpperCase() == element.tagName.toUpperCase(); -    }, - -    className: function(element, matches) { -      return Element.hasClassName(element, matches[1]); -    }, - -    id: function(element, matches) { -      return element.id === matches[1]; -    }, - -    attrPresence: function(element, matches) { -      return Element.hasAttribute(element, matches[1]); -    }, - -    attr: function(element, matches) { -      var nodeValue = Element.readAttribute(element, matches[1]); -      return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]); -    } -  }, - -  handlers: { -    // UTILITY FUNCTIONS -    // joins two collections -    concat: function(a, b) { -      for (var i = 0, node; node = b[i]; i++) -        a.push(node); -      return a; -    }, - -    // marks an array of nodes for counting -    mark: function(nodes) { -      var _true = Prototype.emptyFunction; -      for (var i = 0, node; node = nodes[i]; i++) -        node._countedByPrototype = _true; -      return nodes; -    }, - -    unmark: function(nodes) { -      for (var i = 0, node; node = nodes[i]; i++) -        node._countedByPrototype = undefined; -      return nodes; -    }, - -    // mark each child node with its position (for nth calls) -    // "ofType" flag indicates whether we're indexing for nth-of-type -    // rather than nth-child -    index: function(parentNode, reverse, ofType) { -      parentNode._countedByPrototype = Prototype.emptyFunction; -      if (reverse) { -        for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) { -          var node = nodes[i]; -          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; -        } -      } else { -        for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++) -          if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++; -      } -    }, - -    // filters out duplicates and extends all nodes -    unique: function(nodes) { -      if (nodes.length == 0) return nodes; -      var results = [], n; -      for (var i = 0, l = nodes.length; i < l; i++) -        if (!(n = nodes[i])._countedByPrototype) { -          n._countedByPrototype = Prototype.emptyFunction; -          results.push(Element.extend(n)); -        } -      return Selector.handlers.unmark(results); -    }, - -    // COMBINATOR FUNCTIONS -    descendant: function(nodes) { -      var h = Selector.handlers; -      for (var i = 0, results = [], node; node = nodes[i]; i++) -        h.concat(results, node.getElementsByTagName('*')); -      return results; -    }, - -    child: function(nodes) { -      var h = Selector.handlers; -      for (var i = 0, results = [], node; node = nodes[i]; i++) { -        for (var j = 0, child; child = node.childNodes[j]; j++) -          if (child.nodeType == 1 && child.tagName != '!') results.push(child); -      } -      return results; -    }, - -    adjacent: function(nodes) { -      for (var i = 0, results = [], node; node = nodes[i]; i++) { -        var next = this.nextElementSibling(node); -        if (next) results.push(next); -      } -      return results; -    }, - -    laterSibling: function(nodes) { -      var h = Selector.handlers; -      for (var i = 0, results = [], node; node = nodes[i]; i++) -        h.concat(results, Element.nextSiblings(node)); -      return results; -    }, - -    nextElementSibling: function(node) { -      while (node = node.nextSibling) -        if (node.nodeType == 1) return node; -      return null; -    }, - -    previousElementSibling: function(node) { -      while (node = node.previousSibling) -        if (node.nodeType == 1) return node; -      return null; -    }, - -    // TOKEN FUNCTIONS -    tagName: function(nodes, root, tagName, combinator) { -      var uTagName = tagName.toUpperCase(); -      var results = [], h = Selector.handlers; -      if (nodes) { -        if (combinator) { -          // fastlane for ordinary descendant combinators -          if (combinator == "descendant") { -            for (var i = 0, node; node = nodes[i]; i++) -              h.concat(results, node.getElementsByTagName(tagName)); -            return results; -          } else nodes = this[combinator](nodes); -          if (tagName == "*") return nodes; -        } -        for (var i = 0, node; node = nodes[i]; i++) -          if (node.tagName.toUpperCase() === uTagName) results.push(node); -        return results; -      } else return root.getElementsByTagName(tagName); -    }, - -    id: function(nodes, root, id, combinator) { -      var targetNode = $(id), h = Selector.handlers; -      if (!targetNode) return []; -      if (!nodes && root == document) return [targetNode]; -      if (nodes) { -        if (combinator) { -          if (combinator == 'child') { -            for (var i = 0, node; node = nodes[i]; i++) -              if (targetNode.parentNode == node) return [targetNode]; -          } else if (combinator == 'descendant') { -            for (var i = 0, node; node = nodes[i]; i++) -              if (Element.descendantOf(targetNode, node)) return [targetNode]; -          } else if (combinator == 'adjacent') { -            for (var i = 0, node; node = nodes[i]; i++) -              if (Selector.handlers.previousElementSibling(targetNode) == node) -                return [targetNode]; -          } else nodes = h[combinator](nodes); -        } -        for (var i = 0, node; node = nodes[i]; i++) -          if (node == targetNode) return [targetNode]; -        return []; -      } -      return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : []; -    }, - -    className: function(nodes, root, className, combinator) { -      if (nodes && combinator) nodes = this[combinator](nodes); -      return Selector.handlers.byClassName(nodes, root, className); -    }, - -    byClassName: function(nodes, root, className) { -      if (!nodes) nodes = Selector.handlers.descendant([root]); -      var needle = ' ' + className + ' '; -      for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) { -        nodeClassName = node.className; -        if (nodeClassName.length == 0) continue; -        if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle)) -          results.push(node); -      } -      return results; -    }, - -    attrPresence: function(nodes, root, attr, combinator) { -      if (!nodes) nodes = root.getElementsByTagName("*"); -      if (nodes && combinator) nodes = this[combinator](nodes); -      var results = []; -      for (var i = 0, node; node = nodes[i]; i++) -        if (Element.hasAttribute(node, attr)) results.push(node); -      return results; -    }, - -    attr: function(nodes, root, attr, value, operator, combinator) { -      if (!nodes) nodes = root.getElementsByTagName("*"); -      if (nodes && combinator) nodes = this[combinator](nodes); -      var handler = Selector.operators[operator], results = []; -      for (var i = 0, node; node = nodes[i]; i++) { -        var nodeValue = Element.readAttribute(node, attr); -        if (nodeValue === null) continue; -        if (handler(nodeValue, value)) results.push(node); -      } -      return results; -    }, - -    pseudo: function(nodes, name, value, root, combinator) { -      if (nodes && combinator) nodes = this[combinator](nodes); -      if (!nodes) nodes = root.getElementsByTagName("*"); -      return Selector.pseudos[name](nodes, value, root); -    } -  }, - -  pseudos: { -    'first-child': function(nodes, value, root) { -      for (var i = 0, results = [], node; node = nodes[i]; i++) { -        if (Selector.handlers.previousElementSibling(node)) continue; -          results.push(node); -      } -      return results; -    }, -    'last-child': function(nodes, value, root) { -      for (var i = 0, results = [], node; node = nodes[i]; i++) { -        if (Selector.handlers.nextElementSibling(node)) continue; -          results.push(node); -      } -      return results; -    }, -    'only-child': function(nodes, value, root) { -      var h = Selector.handlers; -      for (var i = 0, results = [], node; node = nodes[i]; i++) -        if (!h.previousElementSibling(node) && !h.nextElementSibling(node)) -          results.push(node); -      return results; -    }, -    'nth-child':        function(nodes, formula, root) { -      return Selector.pseudos.nth(nodes, formula, root); -    }, -    'nth-last-child':   function(nodes, formula, root) { -      return Selector.pseudos.nth(nodes, formula, root, true); -    }, -    'nth-of-type':      function(nodes, formula, root) { -      return Selector.pseudos.nth(nodes, formula, root, false, true); -    }, -    'nth-last-of-type': function(nodes, formula, root) { -      return Selector.pseudos.nth(nodes, formula, root, true, true); -    }, -    'first-of-type':    function(nodes, formula, root) { -      return Selector.pseudos.nth(nodes, "1", root, false, true); -    }, -    'last-of-type':     function(nodes, formula, root) { -      return Selector.pseudos.nth(nodes, "1", root, true, true); -    }, -    'only-of-type':     function(nodes, formula, root) { -      var p = Selector.pseudos; -      return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root); -    }, - -    // handles the an+b logic -    getIndices: function(a, b, total) { -      if (a == 0) return b > 0 ? [b] : []; -      return $R(1, total).inject([], function(memo, i) { -        if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i); -        return memo; -      }); -    }, - -    // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type -    nth: function(nodes, formula, root, reverse, ofType) { -      if (nodes.length == 0) return []; -      if (formula == 'even') formula = '2n+0'; -      if (formula == 'odd')  formula = '2n+1'; -      var h = Selector.handlers, results = [], indexed = [], m; -      h.mark(nodes); -      for (var i = 0, node; node = nodes[i]; i++) { -        if (!node.parentNode._countedByPrototype) { -          h.index(node.parentNode, reverse, ofType); -          indexed.push(node.parentNode); -        } -      } -      if (formula.match(/^\d+$/)) { // just a number -        formula = Number(formula); -        for (var i = 0, node; node = nodes[i]; i++) -          if (node.nodeIndex == formula) results.push(node); -      } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b -        if (m[1] == "-") m[1] = -1; -        var a = m[1] ? Number(m[1]) : 1; -        var b = m[2] ? Number(m[2]) : 0; -        var indices = Selector.pseudos.getIndices(a, b, nodes.length); -        for (var i = 0, node, l = indices.length; node = nodes[i]; i++) { -          for (var j = 0; j < l; j++) -            if (node.nodeIndex == indices[j]) results.push(node); -        } -      } -      h.unmark(nodes); -      h.unmark(indexed); -      return results; -    }, - -    'empty': function(nodes, value, root) { -      for (var i = 0, results = [], node; node = nodes[i]; i++) { -        // IE treats comments as element nodes -        if (node.tagName == '!' || node.firstChild) continue; -        results.push(node); -      } -      return results; -    }, - -    'not': function(nodes, selector, root) { -      var h = Selector.handlers, selectorType, m; -      var exclusions = new Selector(selector).findElements(root); -      h.mark(exclusions); -      for (var i = 0, results = [], node; node = nodes[i]; i++) -        if (!node._countedByPrototype) results.push(node); -      h.unmark(exclusions); -      return results; -    }, - -    'enabled': function(nodes, value, root) { -      for (var i = 0, results = [], node; node = nodes[i]; i++) -        if (!node.disabled && (!node.type || node.type !== 'hidden')) -          results.push(node); -      return results; -    }, - -    'disabled': function(nodes, value, root) { -      for (var i = 0, results = [], node; node = nodes[i]; i++) -        if (node.disabled) results.push(node); -      return results; -    }, - -    'checked': function(nodes, value, root) { -      for (var i = 0, results = [], node; node = nodes[i]; i++) -        if (node.checked) results.push(node); -      return results; -    } -  }, - -  operators: { -    '=':  function(nv, v) { return nv == v; }, -    '!=': function(nv, v) { return nv != v; }, -    '^=': function(nv, v) { return nv == v || nv && nv.startsWith(v); }, -    '$=': function(nv, v) { return nv == v || nv && nv.endsWith(v); }, -    '*=': function(nv, v) { return nv == v || nv && nv.include(v); }, -    '$=': function(nv, v) { return nv.endsWith(v); }, -    '*=': function(nv, v) { return nv.include(v); }, -    '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); }, -    '|=': function(nv, v) { return ('-' + (nv || "").toUpperCase() + -     '-').include('-' + (v || "").toUpperCase() + '-'); } -  }, - -  split: function(expression) { -    var expressions = []; -    expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) { -      expressions.push(m[1].strip()); -    }); -    return expressions; -  }, - -  matchElements: function(elements, expression) { -    var matches = $$(expression), h = Selector.handlers; -    h.mark(matches); -    for (var i = 0, results = [], element; element = elements[i]; i++) -      if (element._countedByPrototype) results.push(element); -    h.unmark(matches); -    return results; -  }, - -  findElement: function(elements, expression, index) { -    if (Object.isNumber(expression)) { -      index = expression; expression = false; -    } -    return Selector.matchElements(elements, expression || '*')[index || 0]; -  }, - -  findChildElements: function(element, expressions) { -    expressions = Selector.split(expressions.join(',')); -    var results = [], h = Selector.handlers; -    for (var i = 0, l = expressions.length, selector; i < l; i++) { -      selector = new Selector(expressions[i].strip()); -      h.concat(results, selector.findElements(element)); -    } -    return (l > 1) ? h.unique(results) : results; -  } -}); - -if (Prototype.Browser.IE) { -  Object.extend(Selector.handlers, { -    // IE returns comment nodes on getElementsByTagName("*"). -    // Filter them out. -    concat: function(a, b) { -      for (var i = 0, node; node = b[i]; i++) -        if (node.tagName !== "!") a.push(node); -      return a; -    }, - -    // IE improperly serializes _countedByPrototype in (inner|outer)HTML. -    unmark: function(nodes) { -      for (var i = 0, node; node = nodes[i]; i++) -        node.removeAttribute('_countedByPrototype'); -      return nodes; -    } -  }); -} - -function $$() { -  return Selector.findChildElements(document, $A(arguments)); -} -var Form = { -  reset: function(form) { -    $(form).reset(); -    return form; -  }, - -  serializeElements: function(elements, options) { -    if (typeof options != 'object') options = { hash: !!options }; -    else if (Object.isUndefined(options.hash)) options.hash = true; -    var key, value, submitted = false, submit = options.submit; - -    var data = elements.inject({ }, function(result, element) { -      if (!element.disabled && element.name) { -        key = element.name; value = $(element).getValue(); -        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && -            submit !== false && (!submit || key == submit) && (submitted = true)))) { -          if (key in result) { -            // a key is already present; construct an array of values -            if (!Object.isArray(result[key])) result[key] = [result[key]]; -            result[key].push(value); -          } -          else result[key] = value; -        } -      } -      return result; -    }); - -    return options.hash ? data : Object.toQueryString(data); -  } -}; - -Form.Methods = { -  serialize: function(form, options) { -    return Form.serializeElements(Form.getElements(form), options); -  }, - -  getElements: function(form) { -    return $A($(form).getElementsByTagName('*')).inject([], -      function(elements, child) { -        if (Form.Element.Serializers[child.tagName.toLowerCase()]) -          elements.push(Element.extend(child)); -        return elements; -      } -    ); -  }, - -  getInputs: function(form, typeName, name) { -    form = $(form); -    var inputs = form.getElementsByTagName('input'); - -    if (!typeName && !name) return $A(inputs).map(Element.extend); - -    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { -      var input = inputs[i]; -      if ((typeName && input.type != typeName) || (name && input.name != name)) -        continue; -      matchingInputs.push(Element.extend(input)); -    } - -    return matchingInputs; -  }, - -  disable: function(form) { -    form = $(form); -    Form.getElements(form).invoke('disable'); -    return form; -  }, - -  enable: function(form) { -    form = $(form); -    Form.getElements(form).invoke('enable'); -    return form; -  }, - -  findFirstElement: function(form) { -    var elements = $(form).getElements().findAll(function(element) { -      return 'hidden' != element.type && !element.disabled; -    }); -    var firstByIndex = elements.findAll(function(element) { -      return element.hasAttribute('tabIndex') && element.tabIndex >= 0; -    }).sortBy(function(element) { return element.tabIndex }).first(); - -    return firstByIndex ? firstByIndex : elements.find(function(element) { -      return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); -    }); -  }, - -  focusFirstElement: function(form) { -    form = $(form); -    form.findFirstElement().activate(); -    return form; -  }, - -  request: function(form, options) { -    form = $(form), options = Object.clone(options || { }); - -    var params = options.parameters, action = form.readAttribute('action') || ''; -    if (action.blank()) action = window.location.href; -    options.parameters = form.serialize(true); - -    if (params) { -      if (Object.isString(params)) params = params.toQueryParams(); -      Object.extend(options.parameters, params); -    } - -    if (form.hasAttribute('method') && !options.method) -      options.method = form.method; - -    return new Ajax.Request(action, options); -  } -}; - -/*--------------------------------------------------------------------------*/ - -Form.Element = { -  focus: function(element) { -    $(element).focus(); -    return element; -  }, - -  select: function(element) { -    $(element).select(); -    return element; -  } -}; - -Form.Element.Methods = { -  serialize: function(element) { -    element = $(element); -    if (!element.disabled && element.name) { -      var value = element.getValue(); -      if (value != undefined) { -        var pair = { }; -        pair[element.name] = value; -        return Object.toQueryString(pair); -      } -    } -    return ''; -  }, - -  getValue: function(element) { -    element = $(element); -    var method = element.tagName.toLowerCase(); -    return Form.Element.Serializers[method](element); -  }, - -  setValue: function(element, value) { -    element = $(element); -    var method = element.tagName.toLowerCase(); -    Form.Element.Serializers[method](element, value); -    return element; -  }, - -  clear: function(element) { -    $(element).value = ''; -    return element; -  }, - -  present: function(element) { -    return $(element).value != ''; -  }, - -  activate: function(element) { -    element = $(element); -    try { -      element.focus(); -      if (element.select && (element.tagName.toLowerCase() != 'input' || -          !['button', 'reset', 'submit'].include(element.type))) -        element.select(); -    } catch (e) { } -    return element; -  }, - -  disable: function(element) { -    element = $(element); -    element.disabled = true; -    return element; -  }, - -  enable: function(element) { -    element = $(element); -    element.disabled = false; -    return element; -  } -}; - -/*--------------------------------------------------------------------------*/ - -var Field = Form.Element; -var $F = Form.Element.Methods.getValue; - -/*--------------------------------------------------------------------------*/ - -Form.Element.Serializers = { -  input: function(element, value) { -    switch (element.type.toLowerCase()) { -      case 'checkbox': -      case 'radio': -        return Form.Element.Serializers.inputSelector(element, value); -      default: -        return Form.Element.Serializers.textarea(element, value); -    } -  }, - -  inputSelector: function(element, value) { -    if (Object.isUndefined(value)) return element.checked ? element.value : null; -    else element.checked = !!value; -  }, - -  textarea: function(element, value) { -    if (Object.isUndefined(value)) return element.value; -    else element.value = value; -  }, - -  select: function(element, value) { -    if (Object.isUndefined(value)) -      return this[element.type == 'select-one' ? -        'selectOne' : 'selectMany'](element); -    else { -      var opt, currentValue, single = !Object.isArray(value); -      for (var i = 0, length = element.length; i < length; i++) { -        opt = element.options[i]; -        currentValue = this.optionValue(opt); -        if (single) { -          if (currentValue == value) { -            opt.selected = true; -            return; -          } -        } -        else opt.selected = value.include(currentValue); -      } -    } -  }, - -  selectOne: function(element) { -    var index = element.selectedIndex; -    return index >= 0 ? this.optionValue(element.options[index]) : null; -  }, - -  selectMany: function(element) { -    var values, length = element.length; -    if (!length) return null; - -    for (var i = 0, values = []; i < length; i++) { -      var opt = element.options[i]; -      if (opt.selected) values.push(this.optionValue(opt)); -    } -    return values; -  }, - -  optionValue: function(opt) { -    // extend element because hasAttribute may not be native -    return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text; -  } -}; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = Class.create(PeriodicalExecuter, { -  initialize: function($super, element, frequency, callback) { -    $super(callback, frequency); -    this.element   = $(element); -    this.lastValue = this.getValue(); -  }, - -  execute: function() { -    var value = this.getValue(); -    if (Object.isString(this.lastValue) && Object.isString(value) ? -        this.lastValue != value : String(this.lastValue) != String(value)) { -      this.callback(this.element, value); -      this.lastValue = value; -    } -  } -}); - -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(element, callback) { -    this.element  = $(element); -    this.callback = callback; - -    this.lastValue = this.getValue(); -    if (this.element.tagName.toLowerCase() == 'form') -      this.registerFormCallbacks(); -    else -      this.registerCallback(this.element); -  }, - -  onElementEvent: function() { -    var value = this.getValue(); -    if (this.lastValue != value) { -      this.callback(this.element, value); -      this.lastValue = value; -    } -  }, - -  registerFormCallbacks: function() { -    Form.getElements(this.element).each(this.registerCallback, this); -  }, - -  registerCallback: function(element) { -    if (element.type) { -      switch (element.type.toLowerCase()) { -        case 'checkbox': -        case 'radio': -          Event.observe(element, 'click', this.onElementEvent.bind(this)); -          break; -        default: -          Event.observe(element, '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); -  } -}); -if (!window.Event) var Event = { }; - -Object.extend(Event, { -  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: { }, - -  relatedTarget: function(event) { -    var element; -    switch(event.type) { -      case 'mouseover': element = event.fromElement; break; -      case 'mouseout':  element = event.toElement;   break; -      default: return null; -    } -    return Element.extend(element); -  } -}); - -Event.Methods = (function() { -  var isButton; - -  if (Prototype.Browser.IE) { -    var buttonMap = { 0: 1, 1: 4, 2: 2 }; -    isButton = function(event, code) { -      return event.button == buttonMap[code]; -    }; - -  } else if (Prototype.Browser.WebKit) { -    isButton = function(event, code) { -      switch (code) { -        case 0: return event.which == 1 && !event.metaKey; -        case 1: return event.which == 1 && event.metaKey; -        default: return false; -      } -    }; - -  } else { -    isButton = function(event, code) { -      return event.which ? (event.which === code + 1) : (event.button === code); -    }; -  } - -  return { -    isLeftClick:   function(event) { return isButton(event, 0) }, -    isMiddleClick: function(event) { return isButton(event, 1) }, -    isRightClick:  function(event) { return isButton(event, 2) }, - -    element: function(event) { -      event = Event.extend(event); - -      var node          = event.target, -          type          = event.type, -          currentTarget = event.currentTarget; - -      if (currentTarget && currentTarget.tagName) { -        // Firefox screws up the "click" event when moving between radio buttons -        // via arrow keys. It also screws up the "load" and "error" events on images, -        // reporting the document as the target instead of the original image. -        if (type === 'load' || type === 'error' || -          (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' -            && currentTarget.type === 'radio')) -              node = currentTarget; -      } -      if (node.nodeType == Node.TEXT_NODE) node = node.parentNode; -      return Element.extend(node); -    }, - -    findElement: function(event, expression) { -      var element = Event.element(event); -      if (!expression) return element; -      var elements = [element].concat(element.ancestors()); -      return Selector.findElement(elements, expression, 0); -    }, - -    pointer: function(event) { -      var docElement = document.documentElement, -      body = document.body || { scrollLeft: 0, scrollTop: 0 }; -      return { -        x: event.pageX || (event.clientX + -          (docElement.scrollLeft || body.scrollLeft) - -          (docElement.clientLeft || 0)), -        y: event.pageY || (event.clientY + -          (docElement.scrollTop || body.scrollTop) - -          (docElement.clientTop || 0)) -      }; -    }, - -    pointerX: function(event) { return Event.pointer(event).x }, -    pointerY: function(event) { return Event.pointer(event).y }, - -    stop: function(event) { -      Event.extend(event); -      event.preventDefault(); -      event.stopPropagation(); -      event.stopped = true; -    } -  }; -})(); - -Event.extend = (function() { -  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { -    m[name] = Event.Methods[name].methodize(); -    return m; -  }); - -  if (Prototype.Browser.IE) { -    Object.extend(methods, { -      stopPropagation: function() { this.cancelBubble = true }, -      preventDefault:  function() { this.returnValue = false }, -      inspect: function() { return "[object Event]" } -    }); - -    return function(event) { -      if (!event) return false; -      if (event._extendedByPrototype) return event; - -      event._extendedByPrototype = Prototype.emptyFunction; -      var pointer = Event.pointer(event); -      Object.extend(event, { -        target: event.srcElement, -        relatedTarget: Event.relatedTarget(event), -        pageX:  pointer.x, -        pageY:  pointer.y -      }); -      return Object.extend(event, methods); -    }; - -  } else { -    Event.prototype = Event.prototype || document.createEvent("HTMLEvents")['__proto__']; -    Object.extend(Event.prototype, methods); -    return Prototype.K; -  } -})(); - -Object.extend(Event, (function() { -  var cache = Event.cache; - -  function getEventID(element) { -    if (element._prototypeEventID) return element._prototypeEventID[0]; -    arguments.callee.id = arguments.callee.id || 1; -    return element._prototypeEventID = [++arguments.callee.id]; -  } - -  function getDOMEventName(eventName) { -    if (eventName && eventName.include(':')) return "dataavailable"; -    return eventName; -  } - -  function getCacheForID(id) { -    return cache[id] = cache[id] || { }; -  } - -  function getWrappersForEventName(id, eventName) { -    var c = getCacheForID(id); -    return c[eventName] = c[eventName] || []; -  } - -  function createWrapper(element, eventName, handler) { -    var id = getEventID(element); -    var c = getWrappersForEventName(id, eventName); -    if (c.pluck("handler").include(handler)) return false; - -    var wrapper = function(event) { -      if (!Event || !Event.extend || -        (event.eventName && event.eventName != eventName)) -          return false; - -      Event.extend(event); -      handler.call(element, event); -    }; - -    wrapper.handler = handler; -    c.push(wrapper); -    return wrapper; -  } - -  function findWrapper(id, eventName, handler) { -    var c = getWrappersForEventName(id, eventName); -    return c.find(function(wrapper) { return wrapper.handler == handler }); -  } - -  function destroyWrapper(id, eventName, handler) { -    var c = getCacheForID(id); -    if (!c[eventName]) return false; -    c[eventName] = c[eventName].without(findWrapper(id, eventName, handler)); -  } - -  function destroyCache() { -    for (var id in cache) -      for (var eventName in cache[id]) -        cache[id][eventName] = null; -  } - - -  // Internet Explorer needs to remove event handlers on page unload -  // in order to avoid memory leaks. -  if (window.attachEvent) { -    window.attachEvent("onunload", destroyCache); -  } - -  // Safari has a dummy event handler on page unload so that it won't -  // use its bfcache. Safari <= 3.1 has an issue with restoring the "document" -  // object when page is returned to via the back button using its bfcache. -  if (Prototype.Browser.WebKit) { -    window.addEventListener('unload', Prototype.emptyFunction, false); -  } - -  return { -    observe: function(element, eventName, handler) { -      element = $(element); -      var name = getDOMEventName(eventName); - -      var wrapper = createWrapper(element, eventName, handler); -      if (!wrapper) return element; - -      if (element.addEventListener) { -        element.addEventListener(name, wrapper, false); -      } else { -        element.attachEvent("on" + name, wrapper); -      } - -      return element; -    }, - -    stopObserving: function(element, eventName, handler) { -      element = $(element); -      var id = getEventID(element), name = getDOMEventName(eventName); - -      if (!handler && eventName) { -        getWrappersForEventName(id, eventName).each(function(wrapper) { -          element.stopObserving(eventName, wrapper.handler); -        }); -        return element; - -      } else if (!eventName) { -        Object.keys(getCacheForID(id)).each(function(eventName) { -          element.stopObserving(eventName); -        }); -        return element; -      } - -      var wrapper = findWrapper(id, eventName, handler); -      if (!wrapper) return element; - -      if (element.removeEventListener) { -        element.removeEventListener(name, wrapper, false); -      } else { -        element.detachEvent("on" + name, wrapper); -      } - -      destroyWrapper(id, eventName, handler); - -      return element; -    }, - -    fire: function(element, eventName, memo) { -      element = $(element); -      if (element == document && document.createEvent && !element.dispatchEvent) -        element = document.documentElement; - -      var event; -      if (document.createEvent) { -        event = document.createEvent("HTMLEvents"); -        event.initEvent("dataavailable", true, true); -      } else { -        event = document.createEventObject(); -        event.eventType = "ondataavailable"; -      } - -      event.eventName = eventName; -      event.memo = memo || { }; - -      if (document.createEvent) { -        element.dispatchEvent(event); -      } else { -        element.fireEvent(event.eventType, event); -      } - -      return Event.extend(event); -    } -  }; -})()); - -Object.extend(Event, Event.Methods); - -Element.addMethods({ -  fire:          Event.fire, -  observe:       Event.observe, -  stopObserving: Event.stopObserving -}); - -Object.extend(document, { -  fire:          Element.Methods.fire.methodize(), -  observe:       Element.Methods.observe.methodize(), -  stopObserving: Element.Methods.stopObserving.methodize(), -  loaded:        false -}); - -(function() { -  /* Support for the DOMContentLoaded event is based on work by Dan Webb, -     Matthias Miller, Dean Edwards and John Resig. */ - -  var timer; - -  function fireContentLoadedEvent() { -    if (document.loaded) return; -    if (timer) window.clearInterval(timer); -    document.fire("dom:loaded"); -    document.loaded = true; -  } - -  if (document.addEventListener) { -    if (Prototype.Browser.WebKit) { -      timer = window.setInterval(function() { -        if (/loaded|complete/.test(document.readyState)) -          fireContentLoadedEvent(); -      }, 0); - -      Event.observe(window, "load", fireContentLoadedEvent); - -    } else { -      document.addEventListener("DOMContentLoaded", -        fireContentLoadedEvent, false); -    } - -  } else { -    document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>"); -    $("__onDOMContentLoaded").onreadystatechange = function() { -      if (this.readyState == "complete") { -        this.onreadystatechange = null; -        fireContentLoadedEvent(); -      } -    }; -  } -})(); -/*------------------------------- DEPRECATED -------------------------------*/ - -Hash.toQueryString = Object.toQueryString; - -var Toggle = { display: Element.toggle }; - -Element.Methods.childOf = Element.Methods.descendantOf; - -var Insertion = { -  Before: function(element, content) { -    return Element.insert(element, {before:content}); -  }, - -  Top: function(element, content) { -    return Element.insert(element, {top:content}); -  }, - -  Bottom: function(element, content) { -    return Element.insert(element, {bottom:content}); -  }, - -  After: function(element, content) { -    return Element.insert(element, {after:content}); -  } -}; - -var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); - -// This should be moved to script.aculo.us; notice the deprecated methods -// further below, that map to the newer Element methods. -var Position = { -  // set to true if needed, warning: firefox performance problems -  // NOT neeeded for page scrolling, only if draggable contained in -  // scrollable elements -  includeScrollOffsets: false, - -  // must be called before calling withinIncludingScrolloffset, every time the -  // page is scrolled -  prepare: function() { -    this.deltaX =  window.pageXOffset -                || document.documentElement.scrollLeft -                || document.body.scrollLeft -                || 0; -    this.deltaY =  window.pageYOffset -                || document.documentElement.scrollTop -                || document.body.scrollTop -                || 0; -  }, - -  // caches x/y coordinate pair to use with overlap -  within: function(element, x, y) { -    if (this.includeScrollOffsets) -      return this.withinIncludingScrolloffsets(element, x, y); -    this.xcomp = x; -    this.ycomp = y; -    this.offset = Element.cumulativeOffset(element); - -    return (y >= this.offset[1] && -            y <  this.offset[1] + element.offsetHeight && -            x >= this.offset[0] && -            x <  this.offset[0] + element.offsetWidth); -  }, - -  withinIncludingScrolloffsets: function(element, x, y) { -    var offsetcache = Element.cumulativeScrollOffset(element); - -    this.xcomp = x + offsetcache[0] - this.deltaX; -    this.ycomp = y + offsetcache[1] - this.deltaY; -    this.offset = Element.cumulativeOffset(element); - -    return (this.ycomp >= this.offset[1] && -            this.ycomp <  this.offset[1] + element.offsetHeight && -            this.xcomp >= this.offset[0] && -            this.xcomp <  this.offset[0] + element.offsetWidth); -  }, - -  // within must be called directly before -  overlap: function(mode, element) { -    if (!mode) return 0; -    if (mode == 'vertical') -      return ((this.offset[1] + element.offsetHeight) - this.ycomp) / -        element.offsetHeight; -    if (mode == 'horizontal') -      return ((this.offset[0] + element.offsetWidth) - this.xcomp) / -        element.offsetWidth; -  }, - -  // Deprecation layer -- use newer Element methods now (1.5.2). - -  cumulativeOffset: Element.Methods.cumulativeOffset, - -  positionedOffset: Element.Methods.positionedOffset, - -  absolutize: function(element) { -    Position.prepare(); -    return Element.absolutize(element); -  }, - -  relativize: function(element) { -    Position.prepare(); -    return Element.relativize(element); -  }, - -  realOffset: Element.Methods.cumulativeScrollOffset, - -  offsetParent: Element.Methods.getOffsetParent, - -  page: Element.Methods.viewportOffset, - -  clone: function(source, target, options) { -    options = options || { }; -    return Element.clonePosition(target, source, options); -  } -}; - -/*--------------------------------------------------------------------------*/ - -if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ -  function iter(name) { -    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; -  } - -  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? -  function(element, className) { -    className = className.toString().strip(); -    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); -    return cond ? document._getElementsByXPath('.//*' + cond, element) : []; -  } : function(element, className) { -    className = className.toString().strip(); -    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); -    if (!classNames && !className) return elements; - -    var nodes = $(element).getElementsByTagName('*'); -    className = ' ' + className + ' '; - -    for (var i = 0, child, cn; child = nodes[i]; i++) { -      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || -          (classNames && classNames.all(function(name) { -            return !name.toString().blank() && cn.include(' ' + name + ' '); -          })))) -        elements.push(Element.extend(child)); -    } -    return elements; -  }; - -  return function(className, parentElement) { -    return $(parentElement || document.body).getElementsByClassName(className); -  }; -}(Element.Methods); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { -  initialize: function(element) { -    this.element = $(element); -  }, - -  _each: function(iterator) { -    this.element.className.split(/\s+/).select(function(name) { -      return name.length > 0; -    })._each(iterator); -  }, - -  set: function(className) { -    this.element.className = className; -  }, - -  add: function(classNameToAdd) { -    if (this.include(classNameToAdd)) return; -    this.set($A(this).concat(classNameToAdd).join(' ')); -  }, - -  remove: function(classNameToRemove) { -    if (!this.include(classNameToRemove)) return; -    this.set($A(this).without(classNameToRemove).join(' ')); -  }, - -  toString: function() { -    return $A(this).join(' '); -  } -}; - -Object.extend(Element.ClassNames.prototype, Enumerable); - -/*--------------------------------------------------------------------------*/ - -Element.addMethods();
\ No newline at end of file diff --git a/framework/Web/Javascripts/source/prototype-1.7/prototype.js b/framework/Web/Javascripts/source/prototype-1.7/prototype.js new file mode 100644 index 00000000..474b2231 --- /dev/null +++ b/framework/Web/Javascripts/source/prototype-1.7/prototype.js @@ -0,0 +1,6082 @@ +/*  Prototype JavaScript framework, version 1.7 + *  (c) 2005-2010 Sam Stephenson + * + *  Prototype is freely distributable under the terms of an MIT-style license. + *  For details, see the Prototype web site: http://www.prototypejs.org/ + * + *--------------------------------------------------------------------------*/ + +var Prototype = { + +  Version: '1.7', + +  Browser: (function(){ +    var ua = navigator.userAgent; +    var isOpera = Object.prototype.toString.call(window.opera) == '[object Opera]'; +    return { +      IE:             !!window.attachEvent && !isOpera, +      Opera:          isOpera, +      WebKit:         ua.indexOf('AppleWebKit/') > -1, +      Gecko:          ua.indexOf('Gecko') > -1 && ua.indexOf('KHTML') === -1, +      MobileSafari:   /Apple.*Mobile/.test(ua) +    } +  })(), + +  BrowserFeatures: { +    XPath: !!document.evaluate, + +    SelectorsAPI: !!document.querySelector, + +    ElementExtensions: (function() { +      var constructor = window.Element || window.HTMLElement; +      return !!(constructor && constructor.prototype); +    })(), +    SpecificElementExtensions: (function() { +      if (typeof window.HTMLDivElement !== 'undefined') +        return true; + +      var div = document.createElement('div'), +          form = document.createElement('form'), +          isSupported = false; + +      if (div['__proto__'] && (div['__proto__'] !== form['__proto__'])) { +        isSupported = true; +      } + +      div = form = null; + +      return isSupported; +    })() +  }, + +  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>', +  JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/, + +  emptyFunction: function() { }, + +  K: function(x) { return x } +}; + +if (Prototype.Browser.MobileSafari) +  Prototype.BrowserFeatures.SpecificElementExtensions = false; + + +var Abstract = { }; + + +var Try = { +  these: function() { +    var returnValue; + +    for (var i = 0, length = arguments.length; i < length; i++) { +      var lambda = arguments[i]; +      try { +        returnValue = lambda(); +        break; +      } catch (e) { } +    } + +    return returnValue; +  } +}; + +/* Based on Alex Arnell's inheritance implementation. */ + +var Class = (function() { + +  var IS_DONTENUM_BUGGY = (function(){ +    for (var p in { toString: 1 }) { +      if (p === 'toString') return false; +    } +    return true; +  })(); + +  function subclass() {}; +  function create() { +    var parent = null, properties = $A(arguments); +    if (Object.isFunction(properties[0])) +      parent = properties.shift(); + +    function klass() { +      this.initialize.apply(this, arguments); +    } + +    Object.extend(klass, Class.Methods); +    klass.superclass = parent; +    klass.subclasses = []; + +    if (parent) { +      subclass.prototype = parent.prototype; +      klass.prototype = new subclass; +      parent.subclasses.push(klass); +    } + +    for (var i = 0, length = properties.length; i < length; i++) +      klass.addMethods(properties[i]); + +    if (!klass.prototype.initialize) +      klass.prototype.initialize = Prototype.emptyFunction; + +    klass.prototype.constructor = klass; +    return klass; +  } + +  function addMethods(source) { +    var ancestor   = this.superclass && this.superclass.prototype, +        properties = Object.keys(source); + +    if (IS_DONTENUM_BUGGY) { +      if (source.toString != Object.prototype.toString) +        properties.push("toString"); +      if (source.valueOf != Object.prototype.valueOf) +        properties.push("valueOf"); +    } + +    for (var i = 0, length = properties.length; i < length; i++) { +      var property = properties[i], value = source[property]; +      if (ancestor && Object.isFunction(value) && +          value.argumentNames()[0] == "$super") { +        var method = value; +        value = (function(m) { +          return function() { return ancestor[m].apply(this, arguments); }; +        })(property).wrap(method); + +        value.valueOf = method.valueOf.bind(method); +        value.toString = method.toString.bind(method); +      } +      this.prototype[property] = value; +    } + +    return this; +  } + +  return { +    create: create, +    Methods: { +      addMethods: addMethods +    } +  }; +})(); +(function() { + +  var _toString = Object.prototype.toString, +      NULL_TYPE = 'Null', +      UNDEFINED_TYPE = 'Undefined', +      BOOLEAN_TYPE = 'Boolean', +      NUMBER_TYPE = 'Number', +      STRING_TYPE = 'String', +      OBJECT_TYPE = 'Object', +      FUNCTION_CLASS = '[object Function]', +      BOOLEAN_CLASS = '[object Boolean]', +      NUMBER_CLASS = '[object Number]', +      STRING_CLASS = '[object String]', +      ARRAY_CLASS = '[object Array]', +      DATE_CLASS = '[object Date]', +      NATIVE_JSON_STRINGIFY_SUPPORT = window.JSON && +        typeof JSON.stringify === 'function' && +        JSON.stringify(0) === '0' && +        typeof JSON.stringify(Prototype.K) === 'undefined'; + +  function Type(o) { +    switch(o) { +      case null: return NULL_TYPE; +      case (void 0): return UNDEFINED_TYPE; +    } +    var type = typeof o; +    switch(type) { +      case 'boolean': return BOOLEAN_TYPE; +      case 'number':  return NUMBER_TYPE; +      case 'string':  return STRING_TYPE; +    } +    return OBJECT_TYPE; +  } + +  function extend(destination, source) { +    for (var property in source) +      destination[property] = source[property]; +    return destination; +  } + +  function inspect(object) { +    try { +      if (isUndefined(object)) return 'undefined'; +      if (object === null) return 'null'; +      return object.inspect ? object.inspect() : String(object); +    } catch (e) { +      if (e instanceof RangeError) return '...'; +      throw e; +    } +  } + +  function toJSON(value) { +    return Str('', { '': value }, []); +  } + +  function Str(key, holder, stack) { +    var value = holder[key], +        type = typeof value; + +    if (Type(value) === OBJECT_TYPE && typeof value.toJSON === 'function') { +      value = value.toJSON(key); +    } + +    var _class = _toString.call(value); + +    switch (_class) { +      case NUMBER_CLASS: +      case BOOLEAN_CLASS: +      case STRING_CLASS: +        value = value.valueOf(); +    } + +    switch (value) { +      case null: return 'null'; +      case true: return 'true'; +      case false: return 'false'; +    } + +    type = typeof value; +    switch (type) { +      case 'string': +        return value.inspect(true); +      case 'number': +        return isFinite(value) ? String(value) : 'null'; +      case 'object': + +        for (var i = 0, length = stack.length; i < length; i++) { +          if (stack[i] === value) { throw new TypeError(); } +        } +        stack.push(value); + +        var partial = []; +        if (_class === ARRAY_CLASS) { +          for (var i = 0, length = value.length; i < length; i++) { +            var str = Str(i, value, stack); +            partial.push(typeof str === 'undefined' ? 'null' : str); +          } +          partial = '[' + partial.join(',') + ']'; +        } else { +          var keys = Object.keys(value); +          for (var i = 0, length = keys.length; i < length; i++) { +            var key = keys[i], str = Str(key, value, stack); +            if (typeof str !== "undefined") { +               partial.push(key.inspect(true)+ ':' + str); +             } +          } +          partial = '{' + partial.join(',') + '}'; +        } +        stack.pop(); +        return partial; +    } +  } + +  function stringify(object) { +    return JSON.stringify(object); +  } + +  function toQueryString(object) { +    return $H(object).toQueryString(); +  } + +  function toHTML(object) { +    return object && object.toHTML ? object.toHTML() : String.interpret(object); +  } + +  function keys(object) { +    if (Type(object) !== OBJECT_TYPE) { throw new TypeError(); } +    var results = []; +    for (var property in object) { +      if (object.hasOwnProperty(property)) { +        results.push(property); +      } +    } +    return results; +  } + +  function values(object) { +    var results = []; +    for (var property in object) +      results.push(object[property]); +    return results; +  } + +  function clone(object) { +    return extend({ }, object); +  } + +  function isElement(object) { +    return !!(object && object.nodeType == 1); +  } + +  function isArray(object) { +    return _toString.call(object) === ARRAY_CLASS; +  } + +  var hasNativeIsArray = (typeof Array.isArray == 'function') +    && Array.isArray([]) && !Array.isArray({}); + +  if (hasNativeIsArray) { +    isArray = Array.isArray; +  } + +  function isHash(object) { +    return object instanceof Hash; +  } + +  function isFunction(object) { +    return _toString.call(object) === FUNCTION_CLASS; +  } + +  function isString(object) { +    return _toString.call(object) === STRING_CLASS; +  } + +  function isNumber(object) { +    return _toString.call(object) === NUMBER_CLASS; +  } + +  function isDate(object) { +    return _toString.call(object) === DATE_CLASS; +  } + +  function isUndefined(object) { +    return typeof object === "undefined"; +  } + +  extend(Object, { +    extend:        extend, +    inspect:       inspect, +    toJSON:        NATIVE_JSON_STRINGIFY_SUPPORT ? stringify : toJSON, +    toQueryString: toQueryString, +    toHTML:        toHTML, +    keys:          Object.keys || keys, +    values:        values, +    clone:         clone, +    isElement:     isElement, +    isArray:       isArray, +    isHash:        isHash, +    isFunction:    isFunction, +    isString:      isString, +    isNumber:      isNumber, +    isDate:        isDate, +    isUndefined:   isUndefined +  }); +})(); +Object.extend(Function.prototype, (function() { +  var slice = Array.prototype.slice; + +  function update(array, args) { +    var arrayLength = array.length, length = args.length; +    while (length--) array[arrayLength + length] = args[length]; +    return array; +  } + +  function merge(array, args) { +    array = slice.call(array, 0); +    return update(array, args); +  } + +  function argumentNames() { +    var names = this.toString().match(/^[\s\(]*function[^(]*\(([^)]*)\)/)[1] +      .replace(/\/\/.*?[\r\n]|\/\*(?:.|[\r\n])*?\*\//g, '') +      .replace(/\s+/g, '').split(','); +    return names.length == 1 && !names[0] ? [] : names; +  } + +  function bind(context) { +    if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this; +    var __method = this, args = slice.call(arguments, 1); +    return function() { +      var a = merge(args, arguments); +      return __method.apply(context, a); +    } +  } + +  function bindAsEventListener(context) { +    var __method = this, args = slice.call(arguments, 1); +    return function(event) { +      var a = update([event || window.event], args); +      return __method.apply(context, a); +    } +  } + +  function curry() { +    if (!arguments.length) return this; +    var __method = this, args = slice.call(arguments, 0); +    return function() { +      var a = merge(args, arguments); +      return __method.apply(this, a); +    } +  } + +  function delay(timeout) { +    var __method = this, args = slice.call(arguments, 1); +    timeout = timeout * 1000; +    return window.setTimeout(function() { +      return __method.apply(__method, args); +    }, timeout); +  } + +  function defer() { +    var args = update([0.01], arguments); +    return this.delay.apply(this, args); +  } + +  function wrap(wrapper) { +    var __method = this; +    return function() { +      var a = update([__method.bind(this)], arguments); +      return wrapper.apply(this, a); +    } +  } + +  function methodize() { +    if (this._methodized) return this._methodized; +    var __method = this; +    return this._methodized = function() { +      var a = update([this], arguments); +      return __method.apply(null, a); +    }; +  } + +  return { +    argumentNames:       argumentNames, +    bind:                bind, +    bindAsEventListener: bindAsEventListener, +    curry:               curry, +    delay:               delay, +    defer:               defer, +    wrap:                wrap, +    methodize:           methodize +  } +})()); + + + +(function(proto) { + + +  function toISOString() { +    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'; +  } + + +  function toJSON() { +    return this.toISOString(); +  } + +  if (!proto.toISOString) proto.toISOString = toISOString; +  if (!proto.toJSON) proto.toJSON = toJSON; + +})(Date.prototype); + + +RegExp.prototype.match = RegExp.prototype.test; + +RegExp.escape = function(str) { +  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1'); +}; +var PeriodicalExecuter = Class.create({ +  initialize: function(callback, frequency) { +    this.callback = callback; +    this.frequency = frequency; +    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(e) { +        this.currentlyExecuting = false; +        throw e; +      } +    } +  } +}); +Object.extend(String, { +  interpret: function(value) { +    return value == null ? '' : String(value); +  }, +  specialChar: { +    '\b': '\\b', +    '\t': '\\t', +    '\n': '\\n', +    '\f': '\\f', +    '\r': '\\r', +    '\\': '\\\\' +  } +}); + +Object.extend(String.prototype, (function() { +  var NATIVE_JSON_PARSE_SUPPORT = window.JSON && +    typeof JSON.parse === 'function' && +    JSON.parse('{"test": true}').test; + +  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 = 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,'&').replace(/</g,'<').replace(/>/g,'>'); +  } + +  function unescapeHTML() { +    return this.stripTags().replace(/</g,'<').replace(/>/g,'>').replace(/&/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 = 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() { +    return this.replace(/-+(.)?/g, function(match, chr) { +      return chr ? chr.toUpperCase() : ''; +    }); +  } + +  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 unfilterJSON(filter) { +    return this.replace(filter || Prototype.JSONFilter, '$1'); +  } + +  function isJSON() { +    var str = this; +    if (str.blank()) return false; +    str = str.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'); +    str = str.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'); +    str = str.replace(/(?:^|:|,)(?:\s*\[)+/g, ''); +    return (/^[\],:{}\s]*$/).test(str); +  } + +  function evalJSON(sanitize) { +    var json = this.unfilterJSON(), +        cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; +    if (cx.test(json)) { +      json = json.replace(cx, function (a) { +        return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); +      }); +    } +    try { +      if (!sanitize || json.isJSON()) return eval('(' + json + ')'); +    } catch (e) { } +    throw new SyntaxError('Badly formed JSON string: ' + this.inspect()); +  } + +  function parseJSON() { +    var json = this.unfilterJSON(); +    return JSON.parse(json); +  } + +  function include(pattern) { +    return this.indexOf(pattern) > -1; +  } + +  function startsWith(pattern) { +    return this.lastIndexOf(pattern, 0) === 0; +  } + +  function endsWith(pattern) { +    var d = this.length - pattern.length; +    return d >= 0 && this.indexOf(pattern, d) === 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 || 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, +    unfilterJSON:   unfilterJSON, +    isJSON:         isJSON, +    evalJSON:       NATIVE_JSON_PARSE_SUPPORT ? parseJSON : evalJSON, +    include:        include, +    startsWith:     startsWith, +    endsWith:       endsWith, +    empty:          empty, +    blank:          blank, +    interpolate:    interpolate +  }; +})()); + +var Template = Class.create({ +  initialize: function(template, pattern) { +    this.template = template.toString(); +    this.pattern = pattern || Template.Pattern; +  }, + +  evaluate: function(object) { +    if (object && Object.isFunction(object.toTemplateReplacements)) +      object = object.toTemplateReplacements(); + +    return this.template.gsub(this.pattern, function(match) { +      if (object == null) return (match[1] + ''); + +      var before = match[1] || ''; +      if (before == '\\') return match[2]; + +      var ctx = object, expr = match[3], +          pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/; + +      match = pattern.exec(expr); +      if (match == null) return before; + +      while (match != null) { +        var comp = match[1].startsWith('[') ? match[2].replace(/\\\\]/g, ']') : match[1]; +        ctx = ctx[comp]; +        if (null == ctx || '' == match[3]) break; +        expr = expr.substring('[' == match[3] ? match[1].length : match[0].length); +        match = pattern.exec(expr); +      } + +      return before + String.interpret(ctx); +    }); +  } +}); +Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/; + +var $break = { }; + +var Enumerable = (function() { +  function each(iterator, context) { +    var index = 0; +    try { +      this._each(function(value) { +        iterator.call(context, value, index++); +      }); +    } catch (e) { +      if (e != $break) throw e; +    } +    return this; +  } + +  function eachSlice(number, iterator, context) { +    var index = -number, slices = [], array = this.toArray(); +    if (number < 1) return array; +    while ((index += number) < array.length) +      slices.push(array.slice(index, index+number)); +    return slices.collect(iterator, context); +  } + +  function all(iterator, context) { +    iterator = iterator || Prototype.K; +    var result = true; +    this.each(function(value, index) { +      result = result && !!iterator.call(context, value, index); +      if (!result) throw $break; +    }); +    return result; +  } + +  function any(iterator, context) { +    iterator = iterator || Prototype.K; +    var result = false; +    this.each(function(value, index) { +      if (result = !!iterator.call(context, value, index)) +        throw $break; +    }); +    return result; +  } + +  function collect(iterator, context) { +    iterator = iterator || Prototype.K; +    var results = []; +    this.each(function(value, index) { +      results.push(iterator.call(context, value, index)); +    }); +    return results; +  } + +  function detect(iterator, context) { +    var result; +    this.each(function(value, index) { +      if (iterator.call(context, value, index)) { +        result = value; +        throw $break; +      } +    }); +    return result; +  } + +  function findAll(iterator, context) { +    var results = []; +    this.each(function(value, index) { +      if (iterator.call(context, value, index)) +        results.push(value); +    }); +    return results; +  } + +  function grep(filter, iterator, context) { +    iterator = iterator || Prototype.K; +    var results = []; + +    if (Object.isString(filter)) +      filter = new RegExp(RegExp.escape(filter)); + +    this.each(function(value, index) { +      if (filter.match(value)) +        results.push(iterator.call(context, value, index)); +    }); +    return results; +  } + +  function include(object) { +    if (Object.isFunction(this.indexOf)) +      if (this.indexOf(object) != -1) return true; + +    var found = false; +    this.each(function(value) { +      if (value == object) { +        found = true; +        throw $break; +      } +    }); +    return found; +  } + +  function inGroupsOf(number, fillWith) { +    fillWith = Object.isUndefined(fillWith) ? null : fillWith; +    return this.eachSlice(number, function(slice) { +      while(slice.length < number) slice.push(fillWith); +      return slice; +    }); +  } + +  function inject(memo, iterator, context) { +    this.each(function(value, index) { +      memo = iterator.call(context, memo, value, index); +    }); +    return memo; +  } + +  function invoke(method) { +    var args = $A(arguments).slice(1); +    return this.map(function(value) { +      return value[method].apply(value, args); +    }); +  } + +  function max(iterator, context) { +    iterator = iterator || Prototype.K; +    var result; +    this.each(function(value, index) { +      value = iterator.call(context, value, index); +      if (result == null || value >= result) +        result = value; +    }); +    return result; +  } + +  function min(iterator, context) { +    iterator = iterator || Prototype.K; +    var result; +    this.each(function(value, index) { +      value = iterator.call(context, value, index); +      if (result == null || value < result) +        result = value; +    }); +    return result; +  } + +  function partition(iterator, context) { +    iterator = iterator || Prototype.K; +    var trues = [], falses = []; +    this.each(function(value, index) { +      (iterator.call(context, value, index) ? +        trues : falses).push(value); +    }); +    return [trues, falses]; +  } + +  function pluck(property) { +    var results = []; +    this.each(function(value) { +      results.push(value[property]); +    }); +    return results; +  } + +  function reject(iterator, context) { +    var results = []; +    this.each(function(value, index) { +      if (!iterator.call(context, value, index)) +        results.push(value); +    }); +    return results; +  } + +  function sortBy(iterator, context) { +    return this.map(function(value, index) { +      return { +        value: value, +        criteria: iterator.call(context, value, index) +      }; +    }).sort(function(left, right) { +      var a = left.criteria, b = right.criteria; +      return a < b ? -1 : a > b ? 1 : 0; +    }).pluck('value'); +  } + +  function toArray() { +    return this.map(); +  } + +  function zip() { +    var iterator = Prototype.K, args = $A(arguments); +    if (Object.isFunction(args.last())) +      iterator = args.pop(); + +    var collections = [this].concat(args).map($A); +    return this.map(function(value, index) { +      return iterator(collections.pluck(index)); +    }); +  } + +  function size() { +    return this.toArray().length; +  } + +  function inspect() { +    return '#<Enumerable:' + this.toArray().inspect() + '>'; +  } + + + + + + + + + +  return { +    each:       each, +    eachSlice:  eachSlice, +    all:        all, +    every:      all, +    any:        any, +    some:       any, +    collect:    collect, +    map:        collect, +    detect:     detect, +    findAll:    findAll, +    select:     findAll, +    filter:     findAll, +    grep:       grep, +    include:    include, +    member:     include, +    inGroupsOf: inGroupsOf, +    inject:     inject, +    invoke:     invoke, +    max:        max, +    min:        min, +    partition:  partition, +    pluck:      pluck, +    reject:     reject, +    sortBy:     sortBy, +    toArray:    toArray, +    entries:    toArray, +    zip:        zip, +    size:       size, +    inspect:    inspect, +    find:       detect +  }; +})(); + +function $A(iterable) { +  if (!iterable) return []; +  if ('toArray' in Object(iterable)) return iterable.toArray(); +  var length = iterable.length || 0, results = new Array(length); +  while (length--) results[length] = iterable[length]; +  return results; +} + + +function $w(string) { +  if (!Object.isString(string)) return []; +  string = string.strip(); +  return string ? string.split(/\s+/) : []; +} + +Array.from = $A; + + +(function() { +  var arrayProto = Array.prototype, +      slice = arrayProto.slice, +      _each = arrayProto.forEach; // use native browser JS 1.6 implementation if available + +  function each(iterator, context) { +    for (var i = 0, length = this.length >>> 0; i < length; i++) { +      if (i in this) iterator.call(context, this[i], i, this); +    } +  } +  if (!_each) _each = each; + +  function clear() { +    this.length = 0; +    return this; +  } + +  function first() { +    return this[0]; +  } + +  function last() { +    return this[this.length - 1]; +  } + +  function compact() { +    return this.select(function(value) { +      return value != null; +    }); +  } + +  function flatten() { +    return this.inject([], function(array, value) { +      if (Object.isArray(value)) +        return array.concat(value.flatten()); +      array.push(value); +      return array; +    }); +  } + +  function without() { +    var values = slice.call(arguments, 0); +    return this.select(function(value) { +      return !values.include(value); +    }); +  } + +  function reverse(inline) { +    return (inline === false ? this.toArray() : this)._reverse(); +  } + +  function uniq(sorted) { +    return this.inject([], function(array, value, index) { +      if (0 == index || (sorted ? array.last() != value : !array.include(value))) +        array.push(value); +      return array; +    }); +  } + +  function intersect(array) { +    return this.uniq().findAll(function(item) { +      return array.detect(function(value) { return item === value }); +    }); +  } + + +  function clone() { +    return slice.call(this, 0); +  } + +  function size() { +    return this.length; +  } + +  function inspect() { +    return '[' + this.map(Object.inspect).join(', ') + ']'; +  } + +  function indexOf(item, i) { +    i || (i = 0); +    var length = this.length; +    if (i < 0) i = length + i; +    for (; i < length; i++) +      if (this[i] === item) return i; +    return -1; +  } + +  function lastIndexOf(item, i) { +    i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1; +    var n = this.slice(0, i).reverse().indexOf(item); +    return (n < 0) ? n : i - n - 1; +  } + +  function concat() { +    var array = slice.call(this, 0), item; +    for (var i = 0, length = arguments.length; i < length; i++) { +      item = arguments[i]; +      if (Object.isArray(item) && !('callee' in item)) { +        for (var j = 0, arrayLength = item.length; j < arrayLength; j++) +          array.push(item[j]); +      } else { +        array.push(item); +      } +    } +    return array; +  } + +  Object.extend(arrayProto, Enumerable); + +  if (!arrayProto._reverse) +    arrayProto._reverse = arrayProto.reverse; + +  Object.extend(arrayProto, { +    _each:     _each, +    clear:     clear, +    first:     first, +    last:      last, +    compact:   compact, +    flatten:   flatten, +    without:   without, +    reverse:   reverse, +    uniq:      uniq, +    intersect: intersect, +    clone:     clone, +    toArray:   clone, +    size:      size, +    inspect:   inspect +  }); + +  var CONCAT_ARGUMENTS_BUGGY = (function() { +    return [].concat(arguments)[0][0] !== 1; +  })(1,2) + +  if (CONCAT_ARGUMENTS_BUGGY) arrayProto.concat = concat; + +  if (!arrayProto.indexOf) arrayProto.indexOf = indexOf; +  if (!arrayProto.lastIndexOf) arrayProto.lastIndexOf = lastIndexOf; +})(); +function $H(object) { +  return new Hash(object); +}; + +var Hash = Class.create(Enumerable, (function() { +  function initialize(object) { +    this._object = Object.isHash(object) ? object.toObject() : Object.clone(object); +  } + + +  function _each(iterator) { +    for (var key in this._object) { +      var value = this._object[key], pair = [key, value]; +      pair.key = key; +      pair.value = value; +      iterator(pair); +    } +  } + +  function set(key, value) { +    return this._object[key] = value; +  } + +  function get(key) { +    if (this._object[key] !== Object.prototype[key]) +      return this._object[key]; +  } + +  function unset(key) { +    var value = this._object[key]; +    delete this._object[key]; +    return value; +  } + +  function toObject() { +    return Object.clone(this._object); +  } + + + +  function keys() { +    return this.pluck('key'); +  } + +  function values() { +    return this.pluck('value'); +  } + +  function index(value) { +    var match = this.detect(function(pair) { +      return pair.value === value; +    }); +    return match && match.key; +  } + +  function merge(object) { +    return this.clone().update(object); +  } + +  function update(object) { +    return new Hash(object).inject(this, function(result, pair) { +      result.set(pair.key, pair.value); +      return result; +    }); +  } + +  function toQueryPair(key, value) { +    if (Object.isUndefined(value)) return key; +    return key + '=' + encodeURIComponent(String.interpret(value)); +  } + +  function toQueryString() { +    return this.inject([], function(results, pair) { +      var key = encodeURIComponent(pair.key), values = pair.value; + +      if (values && typeof values == 'object') { +        if (Object.isArray(values)) { +          var queryValues = []; +          for (var i = 0, len = values.length, value; i < len; i++) { +            value = values[i]; +            queryValues.push(toQueryPair(key, value)); +          } +          return results.concat(queryValues); +        } +      } else results.push(toQueryPair(key, values)); +      return results; +    }).join('&'); +  } + +  function inspect() { +    return '#<Hash:{' + this.map(function(pair) { +      return pair.map(Object.inspect).join(': '); +    }).join(', ') + '}>'; +  } + +  function clone() { +    return new Hash(this); +  } + +  return { +    initialize:             initialize, +    _each:                  _each, +    set:                    set, +    get:                    get, +    unset:                  unset, +    toObject:               toObject, +    toTemplateReplacements: toObject, +    keys:                   keys, +    values:                 values, +    index:                  index, +    merge:                  merge, +    update:                 update, +    toQueryString:          toQueryString, +    inspect:                inspect, +    toJSON:                 toObject, +    clone:                  clone +  }; +})()); + +Hash.from = $H; +Object.extend(Number.prototype, (function() { +  function toColorPart() { +    return this.toPaddedString(2, 16); +  } + +  function succ() { +    return this + 1; +  } + +  function times(iterator, context) { +    $R(0, this, true).each(iterator, context); +    return this; +  } + +  function toPaddedString(length, radix) { +    var string = this.toString(radix || 10); +    return '0'.times(length - string.length) + string; +  } + +  function abs() { +    return Math.abs(this); +  } + +  function round() { +    return Math.round(this); +  } + +  function ceil() { +    return Math.ceil(this); +  } + +  function floor() { +    return Math.floor(this); +  } + +  return { +    toColorPart:    toColorPart, +    succ:           succ, +    times:          times, +    toPaddedString: toPaddedString, +    abs:            abs, +    round:          round, +    ceil:           ceil, +    floor:          floor +  }; +})()); + +function $R(start, end, exclusive) { +  return new ObjectRange(start, end, exclusive); +} + +var ObjectRange = Class.create(Enumerable, (function() { +  function initialize(start, end, exclusive) { +    this.start = start; +    this.end = end; +    this.exclusive = exclusive; +  } + +  function _each(iterator) { +    var value = this.start; +    while (this.include(value)) { +      iterator(value); +      value = value.succ(); +    } +  } + +  function include(value) { +    if (value < this.start) +      return false; +    if (this.exclusive) +      return value < this.end; +    return value <= this.end; +  } + +  return { +    initialize: initialize, +    _each:      _each, +    include:    include +  }; +})()); + + + +var 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(iterator) { +    this.responders._each(iterator); +  }, + +  register: function(responder) { +    if (!this.include(responder)) +      this.responders.push(responder); +  }, + +  unregister: function(responder) { +    this.responders = this.responders.without(responder); +  }, + +  dispatch: function(callback, request, transport, json) { +    this.each(function(responder) { +      if (Object.isFunction(responder[callback])) { +        try { +          responder[callback].apply(responder, [request, transport, json]); +        } catch (e) { } +      } +    }); +  } +}; + +Object.extend(Ajax.Responders, Enumerable); + +Ajax.Responders.register({ +  onCreate:   function() { Ajax.activeRequestCount++ }, +  onComplete: function() { Ajax.activeRequestCount-- } +}); +Ajax.Base = Class.create({ +  initialize: function(options) { +    this.options = { +      method:       'post', +      asynchronous: true, +      contentType:  'application/x-www-form-urlencoded', +      encoding:     'UTF-8', +      parameters:   '', +      evalJSON:     true, +      evalJS:       true +    }; +    Object.extend(this.options, options || { }); + +    this.options.method = this.options.method.toLowerCase(); + +    if (Object.isHash(this.options.parameters)) +      this.options.parameters = this.options.parameters.toObject(); +  } +}); +Ajax.Request = Class.create(Ajax.Base, { +  _complete: false, + +  initialize: function($super, url, options) { +    $super(options); +    this.transport = Ajax.getTransport(); +    this.request(url); +  }, + +  request: function(url) { +    this.url = url; +    this.method = this.options.method; +    var params = Object.isString(this.options.parameters) ? +          this.options.parameters : +          Object.toQueryString(this.options.parameters); + +    if (!['get', 'post'].include(this.method)) { +      params += (params ? '&' : '') + "_method=" + this.method; +      this.method = 'post'; +    } + +    if (params && this.method === 'get') { +      this.url += (this.url.include('?') ? '&' : '?') + params; +    } + +    this.parameters = params.toQueryParams(); + +    try { +      var response = new Ajax.Response(this); +      if (this.options.onCreate) this.options.onCreate(response); +      Ajax.Responders.dispatch('onCreate', this, response); + +      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 || params) : null; +      this.transport.send(this.body); + +      /* Force Firefox to handle ready state 4 for synchronous requests */ +      if (!this.options.asynchronous && this.transport.overrideMimeType) +        this.onStateChange(); + +    } +    catch (e) { +      this.dispatchException(e); +    } +  }, + +  onStateChange: function() { +    var readyState = this.transport.readyState; +    if (readyState > 1 && !((readyState == 4) && this._complete)) +      this.respondToReadyState(this.transport.readyState); +  }, + +  setRequestHeaders: function() { +    var headers = { +      'X-Requested-With': 'XMLHttpRequest', +      'X-Prototype-Version': Prototype.Version, +      'Accept': 'text/javascript, text/html, application/xml, text/xml, */*' +    }; + +    if (this.method == 'post') { +      headers['Content-type'] = this.options.contentType + +        (this.options.encoding ? '; charset=' + this.options.encoding : ''); + +      /* Force "Connection: close" for older Mozilla browsers to work +       * around a bug where XMLHttpRequest sends an incorrect +       * Content-length header. See Mozilla Bugzilla #246651. +       */ +      if (this.transport.overrideMimeType && +          (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005) +            headers['Connection'] = 'close'; +    } + +    if (typeof this.options.requestHeaders == 'object') { +      var extras = this.options.requestHeaders; + +      if (Object.isFunction(extras.push)) +        for (var i = 0, length = extras.length; i < length; i += 2) +          headers[extras[i]] = extras[i+1]; +      else +        $H(extras).each(function(pair) { headers[pair.key] = pair.value }); +    } + +    for (var name in headers) +      this.transport.setRequestHeader(name, headers[name]); +  }, + +  success: function() { +    var status = this.getStatus(); +    return !status || (status >= 200 && status < 300) || status == 304; +  }, + +  getStatus: function() { +    try { +      if (this.transport.status === 1223) return 204; +      return this.transport.status || 0; +    } catch (e) { return 0 } +  }, + +  respondToReadyState: function(readyState) { +    var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this); + +    if (state == 'Complete') { +      try { +        this._complete = true; +        (this.options['on' + response.status] +         || this.options['on' + (this.success() ? 'Success' : 'Failure')] +         || Prototype.emptyFunction)(response, response.headerJSON); +      } catch (e) { +        this.dispatchException(e); +      } + +      var contentType = response.getHeader('Content-type'); +      if (this.options.evalJS == 'force' +          || (this.options.evalJS && this.isSameOrigin() && contentType +          && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) +        this.evalResponse(); +    } + +    try { +      (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON); +      Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON); +    } catch (e) { +      this.dispatchException(e); +    } + +    if (state == 'Complete') { +      this.transport.onreadystatechange = Prototype.emptyFunction; +    } +  }, + +  isSameOrigin: function() { +    var m = this.url.match(/^\s*https?:\/\/[^\/]*/); +    return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({ +      protocol: location.protocol, +      domain: document.domain, +      port: location.port ? ':' + location.port : '' +    })); +  }, + +  getHeader: function(name) { +    try { +      return this.transport.getResponseHeader(name) || null; +    } catch (e) { return null; } +  }, + +  evalResponse: function() { +    try { +      return eval((this.transport.responseText || '').unfilterJSON()); +    } catch (e) { +      this.dispatchException(e); +    } +  }, + +  dispatchException: function(exception) { +    (this.options.onException || Prototype.emptyFunction)(this, exception); +    Ajax.Responders.dispatch('onException', this, exception); +  } +}); + +Ajax.Request.Events = +  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; + + + + + + + + +Ajax.Response = Class.create({ +  initialize: function(request){ +    this.request = request; +    var transport  = this.transport  = request.transport, +        readyState = this.readyState = transport.readyState; + +    if ((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) { +      this.status       = this.getStatus(); +      this.statusText   = this.getStatusText(); +      this.responseText = String.interpret(transport.responseText); +      this.headerJSON   = this._getHeaderJSON(); +    } + +    if (readyState == 4) { +      var xml = transport.responseXML; +      this.responseXML  = Object.isUndefined(xml) ? null : xml; +      this.responseJSON = this._getResponseJSON(); +    } +  }, + +  status:      0, + +  statusText: '', + +  getStatus: Ajax.Request.prototype.getStatus, + +  getStatusText: function() { +    try { +      return this.transport.statusText || ''; +    } catch (e) { return '' } +  }, + +  getHeader: Ajax.Request.prototype.getHeader, + +  getAllHeaders: function() { +    try { +      return this.getAllResponseHeaders(); +    } catch (e) { return null } +  }, + +  getResponseHeader: function(name) { +    return this.transport.getResponseHeader(name); +  }, + +  getAllResponseHeaders: function() { +    return this.transport.getAllResponseHeaders(); +  }, + +  _getHeaderJSON: function() { +    var json = this.getHeader('X-JSON'); +    if (!json) return null; +    json = decodeURIComponent(escape(json)); +    try { +      return json.evalJSON(this.request.options.sanitizeJSON || +        !this.request.isSameOrigin()); +    } catch (e) { +      this.request.dispatchException(e); +    } +  }, + +  _getResponseJSON: function() { +    var options = this.request.options; +    if (!options.evalJSON || (options.evalJSON != 'force' && +      !(this.getHeader('Content-type') || '').include('application/json')) || +        this.responseText.blank()) +          return null; +    try { +      return this.responseText.evalJSON(options.sanitizeJSON || +        !this.request.isSameOrigin()); +    } catch (e) { +      this.request.dispatchException(e); +    } +  } +}); + +Ajax.Updater = Class.create(Ajax.Request, { +  initialize: function($super, container, url, options) { +    this.container = { +      success: (container.success || container), +      failure: (container.failure || (container.success ? null : container)) +    }; + +    options = Object.clone(options); +    var onComplete = options.onComplete; +    options.onComplete = (function(response, json) { +      this.updateContent(response.responseText); +      if (Object.isFunction(onComplete)) onComplete(response, json); +    }).bind(this); + +    $super(url, options); +  }, + +  updateContent: function(responseText) { +    var receiver = this.container[this.success() ? 'success' : 'failure'], +        options = this.options; + +    if (!options.evalScripts) responseText = responseText.stripScripts(); + +    if (receiver = $(receiver)) { +      if (options.insertion) { +        if (Object.isString(options.insertion)) { +          var insertion = { }; insertion[options.insertion] = responseText; +          receiver.insert(insertion); +        } +        else options.insertion(receiver, responseText); +      } +      else receiver.update(responseText); +    } +  } +}); + +Ajax.PeriodicalUpdater = Class.create(Ajax.Base, { +  initialize: function($super, container, url, options) { +    $super(options); +    this.onComplete = this.options.onComplete; + +    this.frequency = (this.options.frequency || 2); +    this.decay = (this.options.decay || 1); + +    this.updater = { }; +    this.container = container; +    this.url = url; + +    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(response) { +    if (this.options.decay) { +      this.decay = (response.responseText == this.lastText ? +        this.decay * this.options.decay : 1); + +      this.lastText = response.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 $(element) { +  if (arguments.length > 1) { +    for (var i = 0, elements = [], length = arguments.length; i < length; i++) +      elements.push($(arguments[i])); +    return elements; +  } +  if (Object.isString(element)) +    element = document.getElementById(element); +  return Element.extend(element); +} + +if (Prototype.BrowserFeatures.XPath) { +  document._getElementsByXPath = function(expression, parentElement) { +    var results = []; +    var query = document.evaluate(expression, $(parentElement) || document, +      null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); +    for (var i = 0, length = query.snapshotLength; i < length; i++) +      results.push(Element.extend(query.snapshotItem(i))); +    return results; +  }; +} + +/*--------------------------------------------------------------------------*/ + +if (!Node) var 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(global) { +  function shouldUseCache(tagName, attributes) { +    if (tagName === 'select') return false; +    if ('type' in attributes) return false; +    return true; +  } + +  var HAS_EXTENDED_CREATE_ELEMENT_SYNTAX = (function(){ +    try { +      var el = document.createElement('<input name="x">'); +      return el.tagName.toLowerCase() === 'input' && el.name === 'x'; +    } +    catch(err) { +      return false; +    } +  })(); + +  var element = global.Element; + +  global.Element = function(tagName, attributes) { +    attributes = attributes || { }; +    tagName = tagName.toLowerCase(); +    var cache = Element.cache; + +    if (HAS_EXTENDED_CREATE_ELEMENT_SYNTAX && attributes.name) { +      tagName = '<' + tagName + ' name="' + attributes.name + '">'; +      delete attributes.name; +      return Element.writeAttribute(document.createElement(tagName), attributes); +    } + +    if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName)); + +    var node = shouldUseCache(tagName, attributes) ? +     cache[tagName].cloneNode(false) : document.createElement(tagName); + +    return Element.writeAttribute(node, attributes); +  }; + +  Object.extend(global.Element, element || { }); +  if (element) global.Element.prototype = element.prototype; + +})(this); + +Element.idCounter = 1; +Element.cache = { }; + +Element._purgeElement = function(element) { +  var uid = element._prototypeUID; +  if (uid) { +    Element.stopObserving(element); +    element._prototypeUID = void 0; +    delete Element.Storage[uid]; +  } +} + +Element.Methods = { +  visible: function(element) { +    return $(element).style.display != 'none'; +  }, + +  toggle: function(element) { +    element = $(element); +    Element[Element.visible(element) ? 'hide' : 'show'](element); +    return element; +  }, + +  hide: function(element) { +    element = $(element); +    element.style.display = 'none'; +    return element; +  }, + +  show: function(element) { +    element = $(element); +    element.style.display = ''; +    return element; +  }, + +  remove: function(element) { +    element = $(element); +    element.parentNode.removeChild(element); +    return element; +  }, + +  update: (function(){ + +    var SELECT_ELEMENT_INNERHTML_BUGGY = (function(){ +      var el = document.createElement("select"), +          isBuggy = true; +      el.innerHTML = "<option value=\"test\">test</option>"; +      if (el.options && el.options[0]) { +        isBuggy = el.options[0].nodeName.toUpperCase() !== "OPTION"; +      } +      el = null; +      return isBuggy; +    })(); + +    var TABLE_ELEMENT_INNERHTML_BUGGY = (function(){ +      try { +        var el = document.createElement("table"); +        if (el && el.tBodies) { +          el.innerHTML = "<tbody><tr><td>test</td></tr></tbody>"; +          var isBuggy = typeof el.tBodies[0] == "undefined"; +          el = null; +          return isBuggy; +        } +      } catch (e) { +        return true; +      } +    })(); + +    var LINK_ELEMENT_INNERHTML_BUGGY = (function() { +      try { +        var el = document.createElement('div'); +        el.innerHTML = "<link>"; +        var isBuggy = (el.childNodes.length === 0); +        el = null; +        return isBuggy; +      } catch(e) { +        return true; +      } +    })(); + +    var ANY_INNERHTML_BUGGY = SELECT_ELEMENT_INNERHTML_BUGGY || +     TABLE_ELEMENT_INNERHTML_BUGGY || LINK_ELEMENT_INNERHTML_BUGGY; + +    var SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING = (function () { +      var s = document.createElement("script"), +          isBuggy = false; +      try { +        s.appendChild(document.createTextNode("")); +        isBuggy = !s.firstChild || +          s.firstChild && s.firstChild.nodeType !== 3; +      } catch (e) { +        isBuggy = true; +      } +      s = null; +      return isBuggy; +    })(); + + +    function update(element, content) { +      element = $(element); +      var purgeElement = Element._purgeElement; + +      var descendants = element.getElementsByTagName('*'), +       i = descendants.length; +      while (i--) purgeElement(descendants[i]); + +      if (content && content.toElement) +        content = content.toElement(); + +      if (Object.isElement(content)) +        return element.update().insert(content); + +      content = Object.toHTML(content); + +      var tagName = element.tagName.toUpperCase(); + +      if (tagName === 'SCRIPT' && SCRIPT_ELEMENT_REJECTS_TEXTNODE_APPENDING) { +        element.text = content; +        return element; +      } + +      if (ANY_INNERHTML_BUGGY) { +        if (tagName in Element._insertionTranslations.tags) { +          while (element.firstChild) { +            element.removeChild(element.firstChild); +          } +          Element._getContentFromAnonymousElement(tagName, content.stripScripts()) +            .each(function(node) { +              element.appendChild(node) +            }); +        } else if (LINK_ELEMENT_INNERHTML_BUGGY && Object.isString(content) && content.indexOf('<link') > -1) { +          while (element.firstChild) { +            element.removeChild(element.firstChild); +          } +          var nodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts(), true); +          nodes.each(function(node) { element.appendChild(node) }); +        } +        else { +          element.innerHTML = content.stripScripts(); +        } +      } +      else { +        element.innerHTML = content.stripScripts(); +      } + +      content.evalScripts.bind(content).defer(); +      return element; +    } + +    return update; +  })(), + +  replace: function(element, content) { +    element = $(element); +    if (content && content.toElement) content = content.toElement(); +    else if (!Object.isElement(content)) { +      content = Object.toHTML(content); +      var range = element.ownerDocument.createRange(); +      range.selectNode(element); +      content.evalScripts.bind(content).defer(); +      content = range.createContextualFragment(content.stripScripts()); +    } +    element.parentNode.replaceChild(content, element); +    return element; +  }, + +  insert: function(element, insertions) { +    element = $(element); + +    if (Object.isString(insertions) || Object.isNumber(insertions) || +        Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML))) +          insertions = {bottom:insertions}; + +    var content, insert, tagName, childNodes; + +    for (var position in insertions) { +      content  = insertions[position]; +      position = position.toLowerCase(); +      insert = Element._insertionTranslations[position]; + +      if (content && content.toElement) content = content.toElement(); +      if (Object.isElement(content)) { +        insert(element, content); +        continue; +      } + +      content = Object.toHTML(content); + +      tagName = ((position == 'before' || position == 'after') +        ? element.parentNode : element).tagName.toUpperCase(); + +      childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); + +      if (position == 'top' || position == 'after') childNodes.reverse(); +      childNodes.each(insert.curry(element)); + +      content.evalScripts.bind(content).defer(); +    } + +    return element; +  }, + +  wrap: function(element, wrapper, attributes) { +    element = $(element); +    if (Object.isElement(wrapper)) +      $(wrapper).writeAttribute(attributes || { }); +    else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes); +    else wrapper = new Element('div', wrapper); +    if (element.parentNode) +      element.parentNode.replaceChild(wrapper, element); +    wrapper.appendChild(element); +    return wrapper; +  }, + +  inspect: function(element) { +    element = $(element); +    var result = '<' + element.tagName.toLowerCase(); +    $H({'id': 'id', 'className': 'class'}).each(function(pair) { +      var property = pair.first(), +          attribute = pair.last(), +          value = (element[property] || '').toString(); +      if (value) result += ' ' + attribute + '=' + value.inspect(true); +    }); +    return result + '>'; +  }, + +  recursivelyCollect: function(element, property, maximumLength) { +    element = $(element); +    maximumLength = maximumLength || -1; +    var elements = []; + +    while (element = element[property]) { +      if (element.nodeType == 1) +        elements.push(Element.extend(element)); +      if (elements.length == maximumLength) +        break; +    } + +    return elements; +  }, + +  ancestors: function(element) { +    return Element.recursivelyCollect(element, 'parentNode'); +  }, + +  descendants: function(element) { +    return Element.select(element, "*"); +  }, + +  firstDescendant: function(element) { +    element = $(element).firstChild; +    while (element && element.nodeType != 1) element = element.nextSibling; +    return $(element); +  }, + +  immediateDescendants: function(element) { +    var results = [], child = $(element).firstChild; +    while (child) { +      if (child.nodeType === 1) { +        results.push(Element.extend(child)); +      } +      child = child.nextSibling; +    } +    return results; +  }, + +  previousSiblings: function(element, maximumLength) { +    return Element.recursivelyCollect(element, 'previousSibling'); +  }, + +  nextSiblings: function(element) { +    return Element.recursivelyCollect(element, 'nextSibling'); +  }, + +  siblings: function(element) { +    element = $(element); +    return Element.previousSiblings(element).reverse() +      .concat(Element.nextSiblings(element)); +  }, + +  match: function(element, selector) { +    element = $(element); +    if (Object.isString(selector)) +      return Prototype.Selector.match(element, selector); +    return selector.match(element); +  }, + +  up: function(element, expression, index) { +    element = $(element); +    if (arguments.length == 1) return $(element.parentNode); +    var ancestors = Element.ancestors(element); +    return Object.isNumber(expression) ? ancestors[expression] : +      Prototype.Selector.find(ancestors, expression, index); +  }, + +  down: function(element, expression, index) { +    element = $(element); +    if (arguments.length == 1) return Element.firstDescendant(element); +    return Object.isNumber(expression) ? Element.descendants(element)[expression] : +      Element.select(element, expression)[index || 0]; +  }, + +  previous: function(element, expression, index) { +    element = $(element); +    if (Object.isNumber(expression)) index = expression, expression = false; +    if (!Object.isNumber(index)) index = 0; + +    if (expression) { +      return Prototype.Selector.find(element.previousSiblings(), expression, index); +    } else { +      return element.recursivelyCollect("previousSibling", index + 1)[index]; +    } +  }, + +  next: function(element, expression, index) { +    element = $(element); +    if (Object.isNumber(expression)) index = expression, expression = false; +    if (!Object.isNumber(index)) index = 0; + +    if (expression) { +      return Prototype.Selector.find(element.nextSiblings(), expression, index); +    } else { +      var maximumLength = Object.isNumber(index) ? index + 1 : 1; +      return element.recursivelyCollect("nextSibling", index + 1)[index]; +    } +  }, + + +  select: function(element) { +    element = $(element); +    var expressions = Array.prototype.slice.call(arguments, 1).join(', '); +    return Prototype.Selector.select(expressions, element); +  }, + +  adjacent: function(element) { +    element = $(element); +    var expressions = Array.prototype.slice.call(arguments, 1).join(', '); +    return Prototype.Selector.select(expressions, element.parentNode).without(element); +  }, + +  identify: function(element) { +    element = $(element); +    var id = Element.readAttribute(element, 'id'); +    if (id) return id; +    do { id = 'anonymous_element_' + Element.idCounter++ } while ($(id)); +    Element.writeAttribute(element, 'id', id); +    return id; +  }, + +  readAttribute: function(element, name) { +    element = $(element); +    if (Prototype.Browser.IE) { +      var t = Element._attributeTranslations.read; +      if (t.values[name]) return t.values[name](element, name); +      if (t.names[name]) name = t.names[name]; +      if (name.include(':')) { +        return (!element.attributes || !element.attributes[name]) ? null : +         element.attributes[name].value; +      } +    } +    return element.getAttribute(name); +  }, + +  writeAttribute: function(element, name, value) { +    element = $(element); +    var attributes = { }, t = Element._attributeTranslations.write; + +    if (typeof name == 'object') attributes = name; +    else attributes[name] = Object.isUndefined(value) ? true : value; + +    for (var attr in attributes) { +      name = t.names[attr] || attr; +      value = attributes[attr]; +      if (t.values[attr]) name = t.values[attr](element, value); +      if (value === false || value === null) +        element.removeAttribute(name); +      else if (value === true) +        element.setAttribute(name, name); +      else element.setAttribute(name, value); +    } +    return element; +  }, + +  getHeight: function(element) { +    return Element.getDimensions(element).height; +  }, + +  getWidth: function(element) { +    return Element.getDimensions(element).width; +  }, + +  classNames: function(element) { +    return new Element.ClassNames(element); +  }, + +  hasClassName: function(element, className) { +    if (!(element = $(element))) return; +    var elementClassName = element.className; +    return (elementClassName.length > 0 && (elementClassName == className || +      new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName))); +  }, + +  addClassName: function(element, className) { +    if (!(element = $(element))) return; +    if (!Element.hasClassName(element, className)) +      element.className += (element.className ? ' ' : '') + className; +    return element; +  }, + +  removeClassName: function(element, className) { +    if (!(element = $(element))) return; +    element.className = element.className.replace( +      new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip(); +    return element; +  }, + +  toggleClassName: function(element, className) { +    if (!(element = $(element))) return; +    return Element[Element.hasClassName(element, className) ? +      'removeClassName' : 'addClassName'](element, className); +  }, + +  cleanWhitespace: function(element) { +    element = $(element); +    var node = element.firstChild; +    while (node) { +      var nextNode = node.nextSibling; +      if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) +        element.removeChild(node); +      node = nextNode; +    } +    return element; +  }, + +  empty: function(element) { +    return $(element).innerHTML.blank(); +  }, + +  descendantOf: function(element, ancestor) { +    element = $(element), ancestor = $(ancestor); + +    if (element.compareDocumentPosition) +      return (element.compareDocumentPosition(ancestor) & 8) === 8; + +    if (ancestor.contains) +      return ancestor.contains(element) && ancestor !== element; + +    while (element = element.parentNode) +      if (element == ancestor) return true; + +    return false; +  }, + +  scrollTo: function(element) { +    element = $(element); +    var pos = Element.cumulativeOffset(element); +    window.scrollTo(pos[0], pos[1]); +    return element; +  }, + +  getStyle: function(element, style) { +    element = $(element); +    style = style == 'float' ? 'cssFloat' : style.camelize(); +    var value = element.style[style]; +    if (!value || value == 'auto') { +      var css = document.defaultView.getComputedStyle(element, null); +      value = css ? css[style] : null; +    } +    if (style == 'opacity') return value ? parseFloat(value) : 1.0; +    return value == 'auto' ? null : value; +  }, + +  getOpacity: function(element) { +    return $(element).getStyle('opacity'); +  }, + +  setStyle: function(element, styles) { +    element = $(element); +    var elementStyle = element.style, match; +    if (Object.isString(styles)) { +      element.style.cssText += ';' + styles; +      return styles.include('opacity') ? +        element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element; +    } +    for (var property in styles) +      if (property == 'opacity') element.setOpacity(styles[property]); +      else +        elementStyle[(property == 'float' || property == 'cssFloat') ? +          (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') : +            property] = styles[property]; + +    return element; +  }, + +  setOpacity: function(element, value) { +    element = $(element); +    element.style.opacity = (value == 1 || value === '') ? '' : +      (value < 0.00001) ? 0 : value; +    return element; +  }, + +  makePositioned: function(element) { +    element = $(element); +    var pos = Element.getStyle(element, 'position'); +    if (pos == 'static' || !pos) { +      element._madePositioned = true; +      element.style.position = 'relative'; +      if (Prototype.Browser.Opera) { +        element.style.top = 0; +        element.style.left = 0; +      } +    } +    return element; +  }, + +  undoPositioned: function(element) { +    element = $(element); +    if (element._madePositioned) { +      element._madePositioned = undefined; +      element.style.position = +        element.style.top = +        element.style.left = +        element.style.bottom = +        element.style.right = ''; +    } +    return element; +  }, + +  makeClipping: function(element) { +    element = $(element); +    if (element._overflow) return element; +    element._overflow = Element.getStyle(element, 'overflow') || 'auto'; +    if (element._overflow !== 'hidden') +      element.style.overflow = 'hidden'; +    return element; +  }, + +  undoClipping: function(element) { +    element = $(element); +    if (!element._overflow) return element; +    element.style.overflow = element._overflow == 'auto' ? '' : element._overflow; +    element._overflow = null; +    return element; +  }, + +  clonePosition: function(element, source) { +    var options = Object.extend({ +      setLeft:    true, +      setTop:     true, +      setWidth:   true, +      setHeight:  true, +      offsetTop:  0, +      offsetLeft: 0 +    }, arguments[2] || { }); + +    source = $(source); +    var p = Element.viewportOffset(source), delta = [0, 0], parent = null; + +    element = $(element); + +    if (Element.getStyle(element, 'position') == 'absolute') { +      parent = Element.getOffsetParent(element); +      delta = Element.viewportOffset(parent); +    } + +    if (parent == document.body) { +      delta[0] -= document.body.offsetLeft; +      delta[1] -= document.body.offsetTop; +    } + +    if (options.setLeft)   element.style.left  = (p[0] - delta[0] + options.offsetLeft) + 'px'; +    if (options.setTop)    element.style.top   = (p[1] - delta[1] + options.offsetTop) + 'px'; +    if (options.setWidth)  element.style.width = source.offsetWidth + 'px'; +    if (options.setHeight) element.style.height = source.offsetHeight + 'px'; +    return element; +  } +}; + +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(proceed, element, style) { +      switch (style) { +        case 'height': case 'width': +          if (!Element.visible(element)) return null; + +          var dim = parseInt(proceed(element, style), 10); + +          if (dim !== element['offset' + style.capitalize()]) +            return dim + 'px'; + +          var properties; +          if (style === 'height') { +            properties = ['border-top-width', 'padding-top', +             'padding-bottom', 'border-bottom-width']; +          } +          else { +            properties = ['border-left-width', 'padding-left', +             'padding-right', 'border-right-width']; +          } +          return properties.inject(dim, function(memo, property) { +            var val = proceed(element, property); +            return val === null ? memo : memo - parseInt(val, 10); +          }) + 'px'; +        default: return proceed(element, style); +      } +    } +  ); + +  Element.Methods.readAttribute = Element.Methods.readAttribute.wrap( +    function(proceed, element, attribute) { +      if (attribute === 'title') return element.title; +      return proceed(element, attribute); +    } +  ); +} + +else if (Prototype.Browser.IE) { +  Element.Methods.getStyle = function(element, style) { +    element = $(element); +    style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize(); +    var value = element.style[style]; +    if (!value && element.currentStyle) value = element.currentStyle[style]; + +    if (style == 'opacity') { +      if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/)) +        if (value[1]) return parseFloat(value[1]) / 100; +      return 1.0; +    } + +    if (value == 'auto') { +      if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none')) +        return element['offset' + style.capitalize()] + 'px'; +      return null; +    } +    return value; +  }; + +  Element.Methods.setOpacity = function(element, value) { +    function stripAlpha(filter){ +      return filter.replace(/alpha\([^\)]*\)/gi,''); +    } +    element = $(element); +    var currentStyle = element.currentStyle; +    if ((currentStyle && !currentStyle.hasLayout) || +      (!currentStyle && element.style.zoom == 'normal')) +        element.style.zoom = 1; + +    var filter = element.getStyle('filter'), style = element.style; +    if (value == 1 || value === '') { +      (filter = stripAlpha(filter)) ? +        style.filter = filter : style.removeAttribute('filter'); +      return element; +    } else if (value < 0.00001) value = 0; +    style.filter = stripAlpha(filter) + +      'alpha(opacity=' + (value * 100) + ')'; +    return element; +  }; + +  Element._attributeTranslations = (function(){ + +    var classProp = 'className', +        forProp = 'for', +        el = document.createElement('div'); + +    el.setAttribute(classProp, 'x'); + +    if (el.className !== 'x') { +      el.setAttribute('class', 'x'); +      if (el.className === 'x') { +        classProp = 'class'; +      } +    } +    el = null; + +    el = document.createElement('label'); +    el.setAttribute(forProp, 'x'); +    if (el.htmlFor !== 'x') { +      el.setAttribute('htmlFor', 'x'); +      if (el.htmlFor === 'x') { +        forProp = 'htmlFor'; +      } +    } +    el = null; + +    return { +      read: { +        names: { +          'class':      classProp, +          'className':  classProp, +          'for':        forProp, +          'htmlFor':    forProp +        }, +        values: { +          _getAttr: function(element, attribute) { +            return element.getAttribute(attribute); +          }, +          _getAttr2: function(element, attribute) { +            return element.getAttribute(attribute, 2); +          }, +          _getAttrNode: function(element, attribute) { +            var node = element.getAttributeNode(attribute); +            return node ? node.value : ""; +          }, +          _getEv: (function(){ + +            var el = document.createElement('div'), f; +            el.onclick = Prototype.emptyFunction; +            var value = el.getAttribute('onclick'); + +            if (String(value).indexOf('{') > -1) { +              f = function(element, attribute) { +                attribute = element.getAttribute(attribute); +                if (!attribute) return null; +                attribute = attribute.toString(); +                attribute = attribute.split('{')[1]; +                attribute = attribute.split('}')[0]; +                return attribute.strip(); +              }; +            } +            else if (value === '') { +              f = function(element, attribute) { +                attribute = element.getAttribute(attribute); +                if (!attribute) return null; +                return attribute.strip(); +              }; +            } +            el = null; +            return f; +          })(), +          _flag: function(element, attribute) { +            return $(element).hasAttribute(attribute) ? attribute : null; +          }, +          style: function(element) { +            return element.style.cssText.toLowerCase(); +          }, +          title: function(element) { +            return element.title; +          } +        } +      } +    } +  })(); + +  Element._attributeTranslations.write = { +    names: Object.extend({ +      cellpadding: 'cellPadding', +      cellspacing: 'cellSpacing' +    }, Element._attributeTranslations.read.names), +    values: { +      checked: function(element, value) { +        element.checked = !!value; +      }, + +      style: function(element, value) { +        element.style.cssText = value ? value : ''; +      } +    } +  }; + +  Element._attributeTranslations.has = {}; + +  $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' + +      'encType maxLength readOnly longDesc frameBorder').each(function(attr) { +    Element._attributeTranslations.write.names[attr.toLowerCase()] = attr; +    Element._attributeTranslations.has[attr.toLowerCase()] = attr; +  }); + +  (function(v) { +    Object.extend(v, { +      href:        v._getAttr2, +      src:         v._getAttr2, +      type:        v._getAttr, +      action:      v._getAttrNode, +      disabled:    v._flag, +      checked:     v._flag, +      readonly:    v._flag, +      multiple:    v._flag, +      onload:      v._getEv, +      onunload:    v._getEv, +      onclick:     v._getEv, +      ondblclick:  v._getEv, +      onmousedown: v._getEv, +      onmouseup:   v._getEv, +      onmouseover: v._getEv, +      onmousemove: v._getEv, +      onmouseout:  v._getEv, +      onfocus:     v._getEv, +      onblur:      v._getEv, +      onkeypress:  v._getEv, +      onkeydown:   v._getEv, +      onkeyup:     v._getEv, +      onsubmit:    v._getEv, +      onreset:     v._getEv, +      onselect:    v._getEv, +      onchange:    v._getEv +    }); +  })(Element._attributeTranslations.read.values); + +  if (Prototype.BrowserFeatures.ElementExtensions) { +    (function() { +      function _descendants(element) { +        var nodes = element.getElementsByTagName('*'), results = []; +        for (var i = 0, node; node = nodes[i]; i++) +          if (node.tagName !== "!") // Filter out comment nodes. +            results.push(node); +        return results; +      } + +      Element.Methods.down = function(element, expression, index) { +        element = $(element); +        if (arguments.length == 1) return element.firstDescendant(); +        return Object.isNumber(expression) ? _descendants(element)[expression] : +          Element.select(element, expression)[index || 0]; +      } +    })(); +  } + +} + +else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) { +  Element.Methods.setOpacity = function(element, value) { +    element = $(element); +    element.style.opacity = (value == 1) ? 0.999999 : +      (value === '') ? '' : (value < 0.00001) ? 0 : value; +    return element; +  }; +} + +else if (Prototype.Browser.WebKit) { +  Element.Methods.setOpacity = function(element, value) { +    element = $(element); +    element.style.opacity = (value == 1 || value === '') ? '' : +      (value < 0.00001) ? 0 : value; + +    if (value == 1) +      if (element.tagName.toUpperCase() == 'IMG' && element.width) { +        element.width++; element.width--; +      } else try { +        var n = document.createTextNode(' '); +        element.appendChild(n); +        element.removeChild(n); +      } catch (e) { } + +    return element; +  }; +} + +if ('outerHTML' in document.documentElement) { +  Element.Methods.replace = function(element, content) { +    element = $(element); + +    if (content && content.toElement) content = content.toElement(); +    if (Object.isElement(content)) { +      element.parentNode.replaceChild(content, element); +      return element; +    } + +    content = Object.toHTML(content); +    var parent = element.parentNode, tagName = parent.tagName.toUpperCase(); + +    if (Element._insertionTranslations.tags[tagName]) { +      var nextSibling = element.next(), +          fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts()); +      parent.removeChild(element); +      if (nextSibling) +        fragments.each(function(node) { parent.insertBefore(node, nextSibling) }); +      else +        fragments.each(function(node) { parent.appendChild(node) }); +    } +    else element.outerHTML = content.stripScripts(); + +    content.evalScripts.bind(content).defer(); +    return element; +  }; +} + +Element._returnOffset = function(l, t) { +  var result = [l, t]; +  result.left = l; +  result.top = t; +  return result; +}; + +Element._getContentFromAnonymousElement = function(tagName, html, force) { +  var div = new Element('div'), +      t = Element._insertionTranslations.tags[tagName]; + +  var workaround = false; +  if (t) workaround = true; +  else if (force) { +    workaround = true; +    t = ['', '', 0]; +  } + +  if (workaround) { +    div.innerHTML = ' ' + t[0] + html + t[1]; +    div.removeChild(div.firstChild); +    for (var i = t[2]; i--; ) { +      div = div.firstChild; +    } +  } +  else { +    div.innerHTML = html; +  } +  return $A(div.childNodes); +}; + +Element._insertionTranslations = { +  before: function(element, node) { +    element.parentNode.insertBefore(node, element); +  }, +  top: function(element, node) { +    element.insertBefore(node, element.firstChild); +  }, +  bottom: function(element, node) { +    element.appendChild(node); +  }, +  after: function(element, node) { +    element.parentNode.insertBefore(node, element.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 tags = Element._insertionTranslations.tags; +  Object.extend(tags, { +    THEAD: tags.TBODY, +    TFOOT: tags.TBODY, +    TH:    tags.TD +  }); +})(); + +Element.Methods.Simulated = { +  hasAttribute: function(element, attribute) { +    attribute = Element._attributeTranslations.has[attribute] || attribute; +    var node = $(element).getAttributeNode(attribute); +    return !!(node && node.specified); +  } +}; + +Element.Methods.ByTag = { }; + +Object.extend(Element, Element.Methods); + +(function(div) { + +  if (!Prototype.BrowserFeatures.ElementExtensions && div['__proto__']) { +    window.HTMLElement = { }; +    window.HTMLElement.prototype = div['__proto__']; +    Prototype.BrowserFeatures.ElementExtensions = true; +  } + +  div = null; + +})(document.createElement('div')); + +Element.extend = (function() { + +  function checkDeficiency(tagName) { +    if (typeof window.Element != 'undefined') { +      var proto = window.Element.prototype; +      if (proto) { +        var id = '_' + (Math.random()+'').slice(2), +            el = document.createElement(tagName); +        proto[id] = 'x'; +        var isBuggy = (el[id] !== 'x'); +        delete proto[id]; +        el = null; +        return isBuggy; +      } +    } +    return false; +  } + +  function extendElementWith(element, methods) { +    for (var property in methods) { +      var value = methods[property]; +      if (Object.isFunction(value) && !(property in element)) +        element[property] = value.methodize(); +    } +  } + +  var HTMLOBJECTELEMENT_PROTOTYPE_BUGGY = checkDeficiency('object'); + +  if (Prototype.BrowserFeatures.SpecificElementExtensions) { +    if (HTMLOBJECTELEMENT_PROTOTYPE_BUGGY) { +      return function(element) { +        if (element && typeof element._extendedByPrototype == 'undefined') { +          var t = element.tagName; +          if (t && (/^(?:object|applet|embed)$/i.test(t))) { +            extendElementWith(element, Element.Methods); +            extendElementWith(element, Element.Methods.Simulated); +            extendElementWith(element, Element.Methods.ByTag[t.toUpperCase()]); +          } +        } +        return element; +      } +    } +    return Prototype.K; +  } + +  var Methods = { }, ByTag = Element.Methods.ByTag; + +  var extend = Object.extend(function(element) { +    if (!element || typeof element._extendedByPrototype != 'undefined' || +        element.nodeType != 1 || element == window) return element; + +    var methods = Object.clone(Methods), +        tagName = element.tagName.toUpperCase(); + +    if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]); + +    extendElementWith(element, methods); + +    element._extendedByPrototype = Prototype.emptyFunction; +    return element; + +  }, { +    refresh: function() { +      if (!Prototype.BrowserFeatures.ElementExtensions) { +        Object.extend(Methods, Element.Methods); +        Object.extend(Methods, Element.Methods.Simulated); +      } +    } +  }); + +  extend.refresh(); +  return extend; +})(); + +if (document.documentElement.hasAttribute) { +  Element.hasAttribute = function(element, attribute) { +    return element.hasAttribute(attribute); +  }; +} +else { +  Element.hasAttribute = Element.Methods.Simulated.hasAttribute; +} + +Element.addMethods = function(methods) { +  var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag; + +  if (!methods) { +    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), +      "BUTTON":   Object.clone(Form.Element.Methods) +    }); +  } + +  if (arguments.length == 2) { +    var tagName = methods; +    methods = arguments[1]; +  } + +  if (!tagName) Object.extend(Element.Methods, methods || { }); +  else { +    if (Object.isArray(tagName)) tagName.each(extend); +    else extend(tagName); +  } + +  function extend(tagName) { +    tagName = tagName.toUpperCase(); +    if (!Element.Methods.ByTag[tagName]) +      Element.Methods.ByTag[tagName] = { }; +    Object.extend(Element.Methods.ByTag[tagName], methods); +  } + +  function copy(methods, destination, onlyIfAbsent) { +    onlyIfAbsent = onlyIfAbsent || false; +    for (var property in methods) { +      var value = methods[property]; +      if (!Object.isFunction(value)) continue; +      if (!onlyIfAbsent || !(property in destination)) +        destination[property] = value.methodize(); +    } +  } + +  function findDOMClass(tagName) { +    var klass; +    var trans = { +      "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 (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element'; +    if (window[klass]) return window[klass]; +    klass = 'HTML' + tagName + 'Element'; +    if (window[klass]) return window[klass]; +    klass = 'HTML' + tagName.capitalize() + 'Element'; +    if (window[klass]) return window[klass]; + +    var element = document.createElement(tagName), +        proto = element['__proto__'] || element.constructor.prototype; + +    element = null; +    return proto; +  } + +  var elementPrototype = window.HTMLElement ? HTMLElement.prototype : +   Element.prototype; + +  if (F.ElementExtensions) { +    copy(Element.Methods, elementPrototype); +    copy(Element.Methods.Simulated, elementPrototype, true); +  } + +  if (F.SpecificElementExtensions) { +    for (var tag in Element.Methods.ByTag) { +      var klass = findDOMClass(tag); +      if (Object.isUndefined(klass)) continue; +      copy(T[tag], 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(viewport) { +  var B = Prototype.Browser, doc = document, element, property = {}; + +  function getRootElement() { +    if (B.WebKit && !doc.evaluate) +      return document; + +    if (B.Opera && window.parseFloat(window.opera.version()) < 9.5) +      return document.body; + +    return document.documentElement; +  } + +  function define(D) { +    if (!element) element = getRootElement(); + +    property[D] = 'client' + D; + +    viewport['get' + D] = function() { return element[property[D]] }; +    return viewport['get' + D](); +  } + +  viewport.getWidth  = define.curry('Width'); + +  viewport.getHeight = define.curry('Height'); +})(document.viewport); + + +Element.Storage = { +  UID: 1 +}; + +Element.addMethods({ +  getStorage: function(element) { +    if (!(element = $(element))) return; + +    var uid; +    if (element === window) { +      uid = 0; +    } else { +      if (typeof element._prototypeUID === "undefined") +        element._prototypeUID = Element.Storage.UID++; +      uid = element._prototypeUID; +    } + +    if (!Element.Storage[uid]) +      Element.Storage[uid] = $H(); + +    return Element.Storage[uid]; +  }, + +  store: function(element, key, value) { +    if (!(element = $(element))) return; + +    if (arguments.length === 2) { +      Element.getStorage(element).update(key); +    } else { +      Element.getStorage(element).set(key, value); +    } + +    return element; +  }, + +  retrieve: function(element, key, defaultValue) { +    if (!(element = $(element))) return; +    var hash = Element.getStorage(element), value = hash.get(key); + +    if (Object.isUndefined(value)) { +      hash.set(key, defaultValue); +      value = defaultValue; +    } + +    return value; +  }, + +  clone: function(element, deep) { +    if (!(element = $(element))) return; +    var clone = element.cloneNode(deep); +    clone._prototypeUID = void 0; +    if (deep) { +      var descendants = Element.select(clone, '*'), +          i = descendants.length; +      while (i--) { +        descendants[i]._prototypeUID = void 0; +      } +    } +    return Element.extend(clone); +  }, + +  purge: function(element) { +    if (!(element = $(element))) return; +    var purgeElement = Element._purgeElement; + +    purgeElement(element); + +    var descendants = element.getElementsByTagName('*'), +     i = descendants.length; + +    while (i--) purgeElement(descendants[i]); + +    return null; +  } +}); + +(function() { + +  function toDecimal(pctString) { +    var match = pctString.match(/^(\d+)%?$/i); +    if (!match) return null; +    return (Number(match[1]) / 100); +  } + +  function getPixelValue(value, property, context) { +    var element = null; +    if (Object.isElement(value)) { +      element = value; +      value = element.getStyle(property); +    } + +    if (value === null) { +      return null; +    } + +    if ((/^(?:-)?\d+(\.\d+)?(px)?$/i).test(value)) { +      return window.parseFloat(value); +    } + +    var isPercentage = value.include('%'), isViewport = (context === document.viewport); + +    if (/\d/.test(value) && element && element.runtimeStyle && !(isPercentage && isViewport)) { +      var style = element.style.left, rStyle = element.runtimeStyle.left; +      element.runtimeStyle.left = element.currentStyle.left; +      element.style.left = value || 0; +      value = element.style.pixelLeft; +      element.style.left = style; +      element.runtimeStyle.left = rStyle; + +      return value; +    } + +    if (element && isPercentage) { +      context = context || element.parentNode; +      var decimal = toDecimal(value); +      var whole = null; +      var position = element.getStyle('position'); + +      var isHorizontal = property.include('left') || property.include('right') || +       property.include('width'); + +      var isVertical =  property.include('top') || property.include('bottom') || +        property.include('height'); + +      if (context === document.viewport) { +        if (isHorizontal) { +          whole = document.viewport.getWidth(); +        } else if (isVertical) { +          whole = document.viewport.getHeight(); +        } +      } else { +        if (isHorizontal) { +          whole = $(context).measure('width'); +        } else if (isVertical) { +          whole = $(context).measure('height'); +        } +      } + +      return (whole === null) ? 0 : whole * decimal; +    } + +    return 0; +  } + +  function toCSSPixels(number) { +    if (Object.isString(number) && number.endsWith('px')) { +      return number; +    } +    return number + 'px'; +  } + +  function isDisplayed(element) { +    var originalElement = element; +    while (element && element.parentNode) { +      var display = element.getStyle('display'); +      if (display === 'none') { +        return false; +      } +      element = $(element.parentNode); +    } +    return true; +  } + +  var hasLayout = Prototype.K; +  if ('currentStyle' in document.documentElement) { +    hasLayout = function(element) { +      if (!element.currentStyle.hasLayout) { +        element.style.zoom = 1; +      } +      return element; +    }; +  } + +  function cssNameFor(key) { +    if (key.include('border')) key = key + '-width'; +    return key.camelize(); +  } + +  Element.Layout = Class.create(Hash, { +    initialize: function($super, element, preCompute) { +      $super(); +      this.element = $(element); + +      Element.Layout.PROPERTIES.each( function(property) { +        this._set(property, null); +      }, this); + +      if (preCompute) { +        this._preComputing = true; +        this._begin(); +        Element.Layout.PROPERTIES.each( this._compute, this ); +        this._end(); +        this._preComputing = false; +      } +    }, + +    _set: function(property, value) { +      return Hash.prototype.set.call(this, property, value); +    }, + +    set: function(property, value) { +      throw "Properties of Element.Layout are read-only."; +    }, + +    get: function($super, property) { +      var value = $super(property); +      return value === null ? this._compute(property) : value; +    }, + +    _begin: function() { +      if (this._prepared) return; + +      var element = this.element; +      if (isDisplayed(element)) { +        this._prepared = true; +        return; +      } + +      var originalStyles = { +        position:   element.style.position   || '', +        width:      element.style.width      || '', +        visibility: element.style.visibility || '', +        display:    element.style.display    || '' +      }; + +      element.store('prototype_original_styles', originalStyles); + +      var position = element.getStyle('position'), +       width = element.getStyle('width'); + +      if (width === "0px" || width === null) { +        element.style.display = 'block'; +        width = element.getStyle('width'); +      } + +      var context = (position === 'fixed') ? document.viewport : +       element.parentNode; + +      element.setStyle({ +        position:   'absolute', +        visibility: 'hidden', +        display:    'block' +      }); + +      var positionedWidth = element.getStyle('width'); + +      var newWidth; +      if (width && (positionedWidth === width)) { +        newWidth = getPixelValue(element, 'width', context); +      } else if (position === 'absolute' || position === 'fixed') { +        newWidth = getPixelValue(element, 'width', context); +      } else { +        var parent = element.parentNode, pLayout = $(parent).getLayout(); + +        newWidth = pLayout.get('width') - +         this.get('margin-left') - +         this.get('border-left') - +         this.get('padding-left') - +         this.get('padding-right') - +         this.get('border-right') - +         this.get('margin-right'); +      } + +      element.setStyle({ width: newWidth + 'px' }); + +      this._prepared = true; +    }, + +    _end: function() { +      var element = this.element; +      var originalStyles = element.retrieve('prototype_original_styles'); +      element.store('prototype_original_styles', null); +      element.setStyle(originalStyles); +      this._prepared = false; +    }, + +    _compute: function(property) { +      var COMPUTATIONS = Element.Layout.COMPUTATIONS; +      if (!(property in COMPUTATIONS)) { +        throw "Property not found."; +      } + +      return this._set(property, COMPUTATIONS[property].call(this, this.element)); +    }, + +    toObject: function() { +      var args = $A(arguments); +      var keys = (args.length === 0) ? Element.Layout.PROPERTIES : +       args.join(' ').split(' '); +      var obj = {}; +      keys.each( function(key) { +        if (!Element.Layout.PROPERTIES.include(key)) return; +        var value = this.get(key); +        if (value != null) obj[key] = value; +      }, this); +      return obj; +    }, + +    toHash: function() { +      var obj = this.toObject.apply(this, arguments); +      return new Hash(obj); +    }, + +    toCSS: function() { +      var args = $A(arguments); +      var keys = (args.length === 0) ? Element.Layout.PROPERTIES : +       args.join(' ').split(' '); +      var css = {}; + +      keys.each( function(key) { +        if (!Element.Layout.PROPERTIES.include(key)) return; +        if (Element.Layout.COMPOSITE_PROPERTIES.include(key)) return; + +        var value = this.get(key); +        if (value != null) css[cssNameFor(key)] = value + 'px'; +      }, this); +      return css; +    }, + +    inspect: function() { +      return "#<Element.Layout>"; +    } +  }); + +  Object.extend(Element.Layout, { +    PROPERTIES: $w('height width top left right bottom border-left border-right border-top border-bottom padding-left padding-right padding-top padding-bottom margin-top margin-bottom margin-left margin-right padding-box-width padding-box-height border-box-width border-box-height margin-box-width margin-box-height'), + +    COMPOSITE_PROPERTIES: $w('padding-box-width padding-box-height margin-box-width margin-box-height border-box-width border-box-height'), + +    COMPUTATIONS: { +      'height': function(element) { +        if (!this._preComputing) this._begin(); + +        var bHeight = this.get('border-box-height'); +        if (bHeight <= 0) { +          if (!this._preComputing) this._end(); +          return 0; +        } + +        var bTop = this.get('border-top'), +         bBottom = this.get('border-bottom'); + +        var pTop = this.get('padding-top'), +         pBottom = this.get('padding-bottom'); + +        if (!this._preComputing) this._end(); + +        return bHeight - bTop - bBottom - pTop - pBottom; +      }, + +      'width': function(element) { +        if (!this._preComputing) this._begin(); + +        var bWidth = this.get('border-box-width'); +        if (bWidth <= 0) { +          if (!this._preComputing) this._end(); +          return 0; +        } + +        var bLeft = this.get('border-left'), +         bRight = this.get('border-right'); + +        var pLeft = this.get('padding-left'), +         pRight = this.get('padding-right'); + +        if (!this._preComputing) this._end(); + +        return bWidth - bLeft - bRight - pLeft - pRight; +      }, + +      'padding-box-height': function(element) { +        var height = this.get('height'), +         pTop = this.get('padding-top'), +         pBottom = this.get('padding-bottom'); + +        return height + pTop + pBottom; +      }, + +      'padding-box-width': function(element) { +        var width = this.get('width'), +         pLeft = this.get('padding-left'), +         pRight = this.get('padding-right'); + +        return width + pLeft + pRight; +      }, + +      'border-box-height': function(element) { +        if (!this._preComputing) this._begin(); +        var height = element.offsetHeight; +        if (!this._preComputing) this._end(); +        return height; +      }, + +      'border-box-width': function(element) { +        if (!this._preComputing) this._begin(); +        var width = element.offsetWidth; +        if (!this._preComputing) this._end(); +        return width; +      }, + +      'margin-box-height': function(element) { +        var bHeight = this.get('border-box-height'), +         mTop = this.get('margin-top'), +         mBottom = this.get('margin-bottom'); + +        if (bHeight <= 0) return 0; + +        return bHeight + mTop + mBottom; +      }, + +      'margin-box-width': function(element) { +        var bWidth = this.get('border-box-width'), +         mLeft = this.get('margin-left'), +         mRight = this.get('margin-right'); + +        if (bWidth <= 0) return 0; + +        return bWidth + mLeft + mRight; +      }, + +      'top': function(element) { +        var offset = element.positionedOffset(); +        return offset.top; +      }, + +      'bottom': function(element) { +        var offset = element.positionedOffset(), +         parent = element.getOffsetParent(), +         pHeight = parent.measure('height'); + +        var mHeight = this.get('border-box-height'); + +        return pHeight - mHeight - offset.top; +      }, + +      'left': function(element) { +        var offset = element.positionedOffset(); +        return offset.left; +      }, + +      'right': function(element) { +        var offset = element.positionedOffset(), +         parent = element.getOffsetParent(), +         pWidth = parent.measure('width'); + +        var mWidth = this.get('border-box-width'); + +        return pWidth - mWidth - offset.left; +      }, + +      'padding-top': function(element) { +        return getPixelValue(element, 'paddingTop'); +      }, + +      'padding-bottom': function(element) { +        return getPixelValue(element, 'paddingBottom'); +      }, + +      'padding-left': function(element) { +        return getPixelValue(element, 'paddingLeft'); +      }, + +      'padding-right': function(element) { +        return getPixelValue(element, 'paddingRight'); +      }, + +      'border-top': function(element) { +        return getPixelValue(element, 'borderTopWidth'); +      }, + +      'border-bottom': function(element) { +        return getPixelValue(element, 'borderBottomWidth'); +      }, + +      'border-left': function(element) { +        return getPixelValue(element, 'borderLeftWidth'); +      }, + +      'border-right': function(element) { +        return getPixelValue(element, 'borderRightWidth'); +      }, + +      'margin-top': function(element) { +        return getPixelValue(element, 'marginTop'); +      }, + +      'margin-bottom': function(element) { +        return getPixelValue(element, 'marginBottom'); +      }, + +      'margin-left': function(element) { +        return getPixelValue(element, 'marginLeft'); +      }, + +      'margin-right': function(element) { +        return getPixelValue(element, 'marginRight'); +      } +    } +  }); + +  if ('getBoundingClientRect' in document.documentElement) { +    Object.extend(Element.Layout.COMPUTATIONS, { +      'right': function(element) { +        var parent = hasLayout(element.getOffsetParent()); +        var rect = element.getBoundingClientRect(), +         pRect = parent.getBoundingClientRect(); + +        return (pRect.right - rect.right).round(); +      }, + +      'bottom': function(element) { +        var parent = hasLayout(element.getOffsetParent()); +        var rect = element.getBoundingClientRect(), +         pRect = parent.getBoundingClientRect(); + +        return (pRect.bottom - rect.bottom).round(); +      } +    }); +  } + +  Element.Offset = Class.create({ +    initialize: function(left, top) { +      this.left = left.round(); +      this.top  = top.round(); + +      this[0] = this.left; +      this[1] = this.top; +    }, + +    relativeTo: function(offset) { +      return new Element.Offset( +        this.left - offset.left, +        this.top  - offset.top +      ); +    }, + +    inspect: function() { +      return "#<Element.Offset left: #{left} top: #{top}>".interpolate(this); +    }, + +    toString: function() { +      return "[#{left}, #{top}]".interpolate(this); +    }, + +    toArray: function() { +      return [this.left, this.top]; +    } +  }); + +  function getLayout(element, preCompute) { +    return new Element.Layout(element, preCompute); +  } + +  function measure(element, property) { +    return $(element).getLayout().get(property); +  } + +  function getDimensions(element) { +    element = $(element); +    var display = Element.getStyle(element, 'display'); + +    if (display && display !== 'none') { +      return { width: element.offsetWidth, height: element.offsetHeight }; +    } + +    var style = element.style; +    var originalStyles = { +      visibility: style.visibility, +      position:   style.position, +      display:    style.display +    }; + +    var newStyles = { +      visibility: 'hidden', +      display:    'block' +    }; + +    if (originalStyles.position !== 'fixed') +      newStyles.position = 'absolute'; + +    Element.setStyle(element, newStyles); + +    var dimensions = { +      width:  element.offsetWidth, +      height: element.offsetHeight +    }; + +    Element.setStyle(element, originalStyles); + +    return dimensions; +  } + +  function getOffsetParent(element) { +    element = $(element); + +    if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element)) +      return $(document.body); + +    var isInline = (Element.getStyle(element, 'display') === 'inline'); +    if (!isInline && element.offsetParent) return $(element.offsetParent); + +    while ((element = element.parentNode) && element !== document.body) { +      if (Element.getStyle(element, 'position') !== 'static') { +        return isHtml(element) ? $(document.body) : $(element); +      } +    } + +    return $(document.body); +  } + + +  function cumulativeOffset(element) { +    element = $(element); +    var valueT = 0, valueL = 0; +    if (element.parentNode) { +      do { +        valueT += element.offsetTop  || 0; +        valueL += element.offsetLeft || 0; +        element = element.offsetParent; +      } while (element); +    } +    return new Element.Offset(valueL, valueT); +  } + +  function positionedOffset(element) { +    element = $(element); + +    var layout = element.getLayout(); + +    var valueT = 0, valueL = 0; +    do { +      valueT += element.offsetTop  || 0; +      valueL += element.offsetLeft || 0; +      element = element.offsetParent; +      if (element) { +        if (isBody(element)) break; +        var p = Element.getStyle(element, 'position'); +        if (p !== 'static') break; +      } +    } while (element); + +    valueL -= layout.get('margin-top'); +    valueT -= layout.get('margin-left'); + +    return new Element.Offset(valueL, valueT); +  } + +  function cumulativeScrollOffset(element) { +    var valueT = 0, valueL = 0; +    do { +      valueT += element.scrollTop  || 0; +      valueL += element.scrollLeft || 0; +      element = element.parentNode; +    } while (element); +    return new Element.Offset(valueL, valueT); +  } + +  function viewportOffset(forElement) { +    element = $(element); +    var valueT = 0, valueL = 0, docBody = document.body; + +    var element = forElement; +    do { +      valueT += element.offsetTop  || 0; +      valueL += element.offsetLeft || 0; +      if (element.offsetParent == docBody && +        Element.getStyle(element, 'position') == 'absolute') break; +    } while (element = element.offsetParent); + +    element = forElement; +    do { +      if (element != docBody) { +        valueT -= element.scrollTop  || 0; +        valueL -= element.scrollLeft || 0; +      } +    } while (element = element.parentNode); +    return new Element.Offset(valueL, valueT); +  } + +  function absolutize(element) { +    element = $(element); + +    if (Element.getStyle(element, 'position') === 'absolute') { +      return element; +    } + +    var offsetParent = getOffsetParent(element); +    var eOffset = element.viewportOffset(), +     pOffset = offsetParent.viewportOffset(); + +    var offset = eOffset.relativeTo(pOffset); +    var layout = element.getLayout(); + +    element.store('prototype_absolutize_original_styles', { +      left:   element.getStyle('left'), +      top:    element.getStyle('top'), +      width:  element.getStyle('width'), +      height: element.getStyle('height') +    }); + +    element.setStyle({ +      position: 'absolute', +      top:    offset.top + 'px', +      left:   offset.left + 'px', +      width:  layout.get('width') + 'px', +      height: layout.get('height') + 'px' +    }); + +    return element; +  } + +  function relativize(element) { +    element = $(element); +    if (Element.getStyle(element, 'position') === 'relative') { +      return element; +    } + +    var originalStyles = +     element.retrieve('prototype_absolutize_original_styles'); + +    if (originalStyles) element.setStyle(originalStyles); +    return element; +  } + +  if (Prototype.Browser.IE) { +    getOffsetParent = getOffsetParent.wrap( +      function(proceed, element) { +        element = $(element); + +        if (isDocument(element) || isDetached(element) || isBody(element) || isHtml(element)) +          return $(document.body); + +        var position = element.getStyle('position'); +        if (position !== 'static') return proceed(element); + +        element.setStyle({ position: 'relative' }); +        var value = proceed(element); +        element.setStyle({ position: position }); +        return value; +      } +    ); + +    positionedOffset = positionedOffset.wrap(function(proceed, element) { +      element = $(element); +      if (!element.parentNode) return new Element.Offset(0, 0); +      var position = element.getStyle('position'); +      if (position !== 'static') return proceed(element); + +      var offsetParent = element.getOffsetParent(); +      if (offsetParent && offsetParent.getStyle('position') === 'fixed') +        hasLayout(offsetParent); + +      element.setStyle({ position: 'relative' }); +      var value = proceed(element); +      element.setStyle({ position: position }); +      return value; +    }); +  } else if (Prototype.Browser.Webkit) { +    cumulativeOffset = function(element) { +      element = $(element); +      var valueT = 0, valueL = 0; +      do { +        valueT += element.offsetTop  || 0; +        valueL += element.offsetLeft || 0; +        if (element.offsetParent == document.body) +          if (Element.getStyle(element, 'position') == 'absolute') break; + +        element = element.offsetParent; +      } while (element); + +      return new Element.Offset(valueL, valueT); +    }; +  } + + +  Element.addMethods({ +    getLayout:              getLayout, +    measure:                measure, +    getDimensions:          getDimensions, +    getOffsetParent:        getOffsetParent, +    cumulativeOffset:       cumulativeOffset, +    positionedOffset:       positionedOffset, +    cumulativeScrollOffset: cumulativeScrollOffset, +    viewportOffset:         viewportOffset, +    absolutize:             absolutize, +    relativize:             relativize +  }); + +  function isBody(element) { +    return element.nodeName.toUpperCase() === 'BODY'; +  } + +  function isHtml(element) { +    return element.nodeName.toUpperCase() === 'HTML'; +  } + +  function isDocument(element) { +    return element.nodeType === Node.DOCUMENT_NODE; +  } + +  function isDetached(element) { +    return element !== document.body && +     !Element.descendantOf(element, document.body); +  } + +  if ('getBoundingClientRect' in document.documentElement) { +    Element.addMethods({ +      viewportOffset: function(element) { +        element = $(element); +        if (isDetached(element)) return new Element.Offset(0, 0); + +        var rect = element.getBoundingClientRect(), +         docEl = document.documentElement; +        return new Element.Offset(rect.left - docEl.clientLeft, +         rect.top - docEl.clientTop); +      } +    }); +  } +})(); +window.$$ = function() { +  var expression = $A(arguments).join(', '); +  return Prototype.Selector.select(expression, document); +}; + +Prototype.Selector = (function() { + +  function select() { +    throw new Error('Method "Prototype.Selector.select" must be defined.'); +  } + +  function match() { +    throw new Error('Method "Prototype.Selector.match" must be defined.'); +  } + +  function find(elements, expression, index) { +    index = index || 0; +    var match = Prototype.Selector.match, length = elements.length, matchIndex = 0, i; + +    for (i = 0; i < length; i++) { +      if (match(elements[i], expression) && index == matchIndex++) { +        return Element.extend(elements[i]); +      } +    } +  } + +  function extendElements(elements) { +    for (var i = 0, length = elements.length; i < length; i++) { +      Element.extend(elements[i]); +    } +    return elements; +  } + + +  var K = Prototype.K; + +  return { +    select: select, +    match: match, +    find: find, +    extendElements: (Element.extend === K) ? K : extendElements, +    extendElement: Element.extend +  }; +})(); +Prototype._original_property = window.Sizzle; +/*! + * Sizzle CSS Selector Engine - v1.0 + *  Copyright 2009, The Dojo Foundation + *  Released under the MIT, BSD, and GPL Licenses. + *  More information: http://sizzlejs.com/ + */ +(function(){ + +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, +	done = 0, +	toString = Object.prototype.toString, +	hasDuplicate = false, +	baseHasDuplicate = true; + +[0, 0].sort(function(){ +	baseHasDuplicate = false; +	return 0; +}); + +var Sizzle = function(selector, context, results, seed) { +	results = results || []; +	var origContext = context = context || document; + +	if ( context.nodeType !== 1 && context.nodeType !== 9 ) { +		return []; +	} + +	if ( !selector || typeof selector !== "string" ) { +		return results; +	} + +	var parts = [], m, set, checkSet, check, mode, extra, prune = true, contextXML = isXML(context), +		soFar = selector; + +	while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) { +		soFar = m[3]; + +		parts.push( m[1] ); + +		if ( m[2] ) { +			extra = m[3]; +			break; +		} +	} + +	if ( parts.length > 1 && origPOS.exec( selector ) ) { +		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { +			set = posProcess( parts[0] + parts[1], context ); +		} else { +			set = Expr.relative[ parts[0] ] ? +				[ context ] : +				Sizzle( parts.shift(), context ); + +			while ( parts.length ) { +				selector = parts.shift(); + +				if ( Expr.relative[ selector ] ) +					selector += parts.shift(); + +				set = posProcess( selector, set ); +			} +		} +	} else { +		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML && +				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) { +			var ret = Sizzle.find( parts.shift(), context, contextXML ); +			context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0]; +		} + +		if ( context ) { +			var ret = seed ? +				{ expr: parts.pop(), set: makeArray(seed) } : +				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML ); +			set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set; + +			if ( parts.length > 0 ) { +				checkSet = makeArray(set); +			} else { +				prune = false; +			} + +			while ( parts.length ) { +				var cur = parts.pop(), pop = cur; + +				if ( !Expr.relative[ cur ] ) { +					cur = ""; +				} else { +					pop = parts.pop(); +				} + +				if ( pop == null ) { +					pop = context; +				} + +				Expr.relative[ cur ]( checkSet, pop, contextXML ); +			} +		} else { +			checkSet = parts = []; +		} +	} + +	if ( !checkSet ) { +		checkSet = set; +	} + +	if ( !checkSet ) { +		throw "Syntax error, unrecognized expression: " + (cur || selector); +	} + +	if ( toString.call(checkSet) === "[object Array]" ) { +		if ( !prune ) { +			results.push.apply( results, checkSet ); +		} else if ( context && context.nodeType === 1 ) { +			for ( var i = 0; checkSet[i] != null; i++ ) { +				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { +					results.push( set[i] ); +				} +			} +		} else { +			for ( var i = 0; checkSet[i] != null; i++ ) { +				if ( checkSet[i] && checkSet[i].nodeType === 1 ) { +					results.push( set[i] ); +				} +			} +		} +	} else { +		makeArray( checkSet, results ); +	} + +	if ( extra ) { +		Sizzle( extra, origContext, results, seed ); +		Sizzle.uniqueSort( results ); +	} + +	return results; +}; + +Sizzle.uniqueSort = function(results){ +	if ( sortOrder ) { +		hasDuplicate = baseHasDuplicate; +		results.sort(sortOrder); + +		if ( hasDuplicate ) { +			for ( var i = 1; i < results.length; i++ ) { +				if ( results[i] === results[i-1] ) { +					results.splice(i--, 1); +				} +			} +		} +	} + +	return results; +}; + +Sizzle.matches = function(expr, set){ +	return Sizzle(expr, null, null, set); +}; + +Sizzle.find = function(expr, context, isXML){ +	var set, match; + +	if ( !expr ) { +		return []; +	} + +	for ( var i = 0, l = Expr.order.length; i < l; i++ ) { +		var type = Expr.order[i], match; + +		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) { +			var left = match[1]; +			match.splice(1,1); + +			if ( left.substr( left.length - 1 ) !== "\\" ) { +				match[1] = (match[1] || "").replace(/\\/g, ""); +				set = Expr.find[ type ]( match, context, isXML ); +				if ( set != null ) { +					expr = expr.replace( Expr.match[ type ], "" ); +					break; +				} +			} +		} +	} + +	if ( !set ) { +		set = context.getElementsByTagName("*"); +	} + +	return {set: set, expr: expr}; +}; + +Sizzle.filter = function(expr, set, inplace, not){ +	var old = expr, result = [], curLoop = set, match, anyFound, +		isXMLFilter = set && set[0] && isXML(set[0]); + +	while ( expr && set.length ) { +		for ( var type in Expr.filter ) { +			if ( (match = Expr.match[ type ].exec( expr )) != null ) { +				var filter = Expr.filter[ type ], found, item; +				anyFound = false; + +				if ( curLoop == result ) { +					result = []; +				} + +				if ( Expr.preFilter[ type ] ) { +					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); + +					if ( !match ) { +						anyFound = found = true; +					} else if ( match === true ) { +						continue; +					} +				} + +				if ( match ) { +					for ( var i = 0; (item = curLoop[i]) != null; i++ ) { +						if ( item ) { +							found = filter( item, match, i, curLoop ); +							var pass = not ^ !!found; + +							if ( inplace && found != null ) { +								if ( pass ) { +									anyFound = true; +								} else { +									curLoop[i] = false; +								} +							} else if ( pass ) { +								result.push( item ); +								anyFound = true; +							} +						} +					} +				} + +				if ( found !== undefined ) { +					if ( !inplace ) { +						curLoop = result; +					} + +					expr = expr.replace( Expr.match[ type ], "" ); + +					if ( !anyFound ) { +						return []; +					} + +					break; +				} +			} +		} + +		if ( expr == old ) { +			if ( anyFound == null ) { +				throw "Syntax error, unrecognized expression: " + expr; +			} else { +				break; +			} +		} + +		old = expr; +	} + +	return curLoop; +}; + +var Expr = Sizzle.selectors = { +	order: [ "ID", "NAME", "TAG" ], +	match: { +		ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, +		CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/, +		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/, +		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, +		TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/, +		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, +		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, +		PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ +	}, +	leftMatch: {}, +	attrMap: { +		"class": "className", +		"for": "htmlFor" +	}, +	attrHandle: { +		href: function(elem){ +			return elem.getAttribute("href"); +		} +	}, +	relative: { +		"+": function(checkSet, part, isXML){ +			var isPartStr = typeof part === "string", +				isTag = isPartStr && !/\W/.test(part), +				isPartStrNotTag = isPartStr && !isTag; + +			if ( isTag && !isXML ) { +				part = part.toUpperCase(); +			} + +			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { +				if ( (elem = checkSet[i]) ) { +					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} + +					checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? +						elem || false : +						elem === part; +				} +			} + +			if ( isPartStrNotTag ) { +				Sizzle.filter( part, checkSet, true ); +			} +		}, +		">": function(checkSet, part, isXML){ +			var isPartStr = typeof part === "string"; + +			if ( isPartStr && !/\W/.test(part) ) { +				part = isXML ? part : part.toUpperCase(); + +				for ( var i = 0, l = checkSet.length; i < l; i++ ) { +					var elem = checkSet[i]; +					if ( elem ) { +						var parent = elem.parentNode; +						checkSet[i] = parent.nodeName === part ? parent : false; +					} +				} +			} else { +				for ( var i = 0, l = checkSet.length; i < l; i++ ) { +					var elem = checkSet[i]; +					if ( elem ) { +						checkSet[i] = isPartStr ? +							elem.parentNode : +							elem.parentNode === part; +					} +				} + +				if ( isPartStr ) { +					Sizzle.filter( part, checkSet, true ); +				} +			} +		}, +		"": function(checkSet, part, isXML){ +			var doneName = done++, checkFn = dirCheck; + +			if ( !/\W/.test(part) ) { +				var nodeCheck = part = isXML ? part : part.toUpperCase(); +				checkFn = dirNodeCheck; +			} + +			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); +		}, +		"~": function(checkSet, part, isXML){ +			var doneName = done++, checkFn = dirCheck; + +			if ( typeof part === "string" && !/\W/.test(part) ) { +				var nodeCheck = part = isXML ? part : part.toUpperCase(); +				checkFn = dirNodeCheck; +			} + +			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); +		} +	}, +	find: { +		ID: function(match, context, isXML){ +			if ( typeof context.getElementById !== "undefined" && !isXML ) { +				var m = context.getElementById(match[1]); +				return m ? [m] : []; +			} +		}, +		NAME: function(match, context, isXML){ +			if ( typeof context.getElementsByName !== "undefined" ) { +				var ret = [], results = context.getElementsByName(match[1]); + +				for ( var i = 0, l = results.length; i < l; i++ ) { +					if ( results[i].getAttribute("name") === match[1] ) { +						ret.push( results[i] ); +					} +				} + +				return ret.length === 0 ? null : ret; +			} +		}, +		TAG: function(match, context){ +			return context.getElementsByTagName(match[1]); +		} +	}, +	preFilter: { +		CLASS: function(match, curLoop, inplace, result, not, isXML){ +			match = " " + match[1].replace(/\\/g, "") + " "; + +			if ( isXML ) { +				return match; +			} + +			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { +				if ( elem ) { +					if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { +						if ( !inplace ) +							result.push( elem ); +					} else if ( inplace ) { +						curLoop[i] = false; +					} +				} +			} + +			return false; +		}, +		ID: function(match){ +			return match[1].replace(/\\/g, ""); +		}, +		TAG: function(match, curLoop){ +			for ( var i = 0; curLoop[i] === false; i++ ){} +			return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); +		}, +		CHILD: function(match){ +			if ( match[1] == "nth" ) { +				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( +					match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || +					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); + +				match[2] = (test[1] + (test[2] || 1)) - 0; +				match[3] = test[3] - 0; +			} + +			match[0] = done++; + +			return match; +		}, +		ATTR: function(match, curLoop, inplace, result, not, isXML){ +			var name = match[1].replace(/\\/g, ""); + +			if ( !isXML && Expr.attrMap[name] ) { +				match[1] = Expr.attrMap[name]; +			} + +			if ( match[2] === "~=" ) { +				match[4] = " " + match[4] + " "; +			} + +			return match; +		}, +		PSEUDO: function(match, curLoop, inplace, result, not){ +			if ( match[1] === "not" ) { +				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) { +					match[3] = Sizzle(match[3], null, null, curLoop); +				} else { +					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); +					if ( !inplace ) { +						result.push.apply( result, ret ); +					} +					return false; +				} +			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { +				return true; +			} + +			return match; +		}, +		POS: function(match){ +			match.unshift( true ); +			return match; +		} +	}, +	filters: { +		enabled: function(elem){ +			return elem.disabled === false && elem.type !== "hidden"; +		}, +		disabled: function(elem){ +			return elem.disabled === true; +		}, +		checked: function(elem){ +			return elem.checked === true; +		}, +		selected: function(elem){ +			elem.parentNode.selectedIndex; +			return elem.selected === true; +		}, +		parent: function(elem){ +			return !!elem.firstChild; +		}, +		empty: function(elem){ +			return !elem.firstChild; +		}, +		has: function(elem, i, match){ +			return !!Sizzle( match[3], elem ).length; +		}, +		header: function(elem){ +			return /h\d/i.test( elem.nodeName ); +		}, +		text: function(elem){ +			return "text" === elem.type; +		}, +		radio: function(elem){ +			return "radio" === elem.type; +		}, +		checkbox: function(elem){ +			return "checkbox" === elem.type; +		}, +		file: function(elem){ +			return "file" === elem.type; +		}, +		password: function(elem){ +			return "password" === elem.type; +		}, +		submit: function(elem){ +			return "submit" === elem.type; +		}, +		image: function(elem){ +			return "image" === elem.type; +		}, +		reset: function(elem){ +			return "reset" === elem.type; +		}, +		button: function(elem){ +			return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; +		}, +		input: function(elem){ +			return /input|select|textarea|button/i.test(elem.nodeName); +		} +	}, +	setFilters: { +		first: function(elem, i){ +			return i === 0; +		}, +		last: function(elem, i, match, array){ +			return i === array.length - 1; +		}, +		even: function(elem, i){ +			return i % 2 === 0; +		}, +		odd: function(elem, i){ +			return i % 2 === 1; +		}, +		lt: function(elem, i, match){ +			return i < match[3] - 0; +		}, +		gt: function(elem, i, match){ +			return i > match[3] - 0; +		}, +		nth: function(elem, i, match){ +			return match[3] - 0 == i; +		}, +		eq: function(elem, i, match){ +			return match[3] - 0 == i; +		} +	}, +	filter: { +		PSEUDO: function(elem, match, i, array){ +			var name = match[1], filter = Expr.filters[ name ]; + +			if ( filter ) { +				return filter( elem, i, match, array ); +			} else if ( name === "contains" ) { +				return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; +			} else if ( name === "not" ) { +				var not = match[3]; + +				for ( var i = 0, l = not.length; i < l; i++ ) { +					if ( not[i] === elem ) { +						return false; +					} +				} + +				return true; +			} +		}, +		CHILD: function(elem, match){ +			var type = match[1], node = elem; +			switch (type) { +				case 'only': +				case 'first': +					while ( (node = node.previousSibling) )  { +						if ( node.nodeType === 1 ) return false; +					} +					if ( type == 'first') return true; +					node = elem; +				case 'last': +					while ( (node = node.nextSibling) )  { +						if ( node.nodeType === 1 ) return false; +					} +					return true; +				case 'nth': +					var first = match[2], last = match[3]; + +					if ( first == 1 && last == 0 ) { +						return true; +					} + +					var doneName = match[0], +						parent = elem.parentNode; + +					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { +						var count = 0; +						for ( node = parent.firstChild; node; node = node.nextSibling ) { +							if ( node.nodeType === 1 ) { +								node.nodeIndex = ++count; +							} +						} +						parent.sizcache = doneName; +					} + +					var diff = elem.nodeIndex - last; +					if ( first == 0 ) { +						return diff == 0; +					} else { +						return ( diff % first == 0 && diff / first >= 0 ); +					} +			} +		}, +		ID: function(elem, match){ +			return elem.nodeType === 1 && elem.getAttribute("id") === match; +		}, +		TAG: function(elem, match){ +			return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; +		}, +		CLASS: function(elem, match){ +			return (" " + (elem.className || elem.getAttribute("class")) + " ") +				.indexOf( match ) > -1; +		}, +		ATTR: function(elem, match){ +			var name = match[1], +				result = Expr.attrHandle[ name ] ? +					Expr.attrHandle[ name ]( elem ) : +					elem[ name ] != null ? +						elem[ name ] : +						elem.getAttribute( name ), +				value = result + "", +				type = match[2], +				check = match[4]; + +			return result == null ? +				type === "!=" : +				type === "=" ? +				value === check : +				type === "*=" ? +				value.indexOf(check) >= 0 : +				type === "~=" ? +				(" " + value + " ").indexOf(check) >= 0 : +				!check ? +				value && result !== false : +				type === "!=" ? +				value != check : +				type === "^=" ? +				value.indexOf(check) === 0 : +				type === "$=" ? +				value.substr(value.length - check.length) === check : +				type === "|=" ? +				value === check || value.substr(0, check.length + 1) === check + "-" : +				false; +		}, +		POS: function(elem, match, i, array){ +			var name = match[2], filter = Expr.setFilters[ name ]; + +			if ( filter ) { +				return filter( elem, i, match, array ); +			} +		} +	} +}; + +var origPOS = Expr.match.POS; + +for ( var type in Expr.match ) { +	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); +	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source ); +} + +var makeArray = function(array, results) { +	array = Array.prototype.slice.call( array, 0 ); + +	if ( results ) { +		results.push.apply( results, array ); +		return results; +	} + +	return array; +}; + +try { +	Array.prototype.slice.call( document.documentElement.childNodes, 0 ); + +} catch(e){ +	makeArray = function(array, results) { +		var ret = results || []; + +		if ( toString.call(array) === "[object Array]" ) { +			Array.prototype.push.apply( ret, array ); +		} else { +			if ( typeof array.length === "number" ) { +				for ( var i = 0, l = array.length; i < l; i++ ) { +					ret.push( array[i] ); +				} +			} else { +				for ( var i = 0; array[i]; i++ ) { +					ret.push( array[i] ); +				} +			} +		} + +		return ret; +	}; +} + +var sortOrder; + +if ( document.documentElement.compareDocumentPosition ) { +	sortOrder = function( a, b ) { +		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) { +			if ( a == b ) { +				hasDuplicate = true; +			} +			return 0; +		} + +		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; +		if ( ret === 0 ) { +			hasDuplicate = true; +		} +		return ret; +	}; +} else if ( "sourceIndex" in document.documentElement ) { +	sortOrder = function( a, b ) { +		if ( !a.sourceIndex || !b.sourceIndex ) { +			if ( a == b ) { +				hasDuplicate = true; +			} +			return 0; +		} + +		var ret = a.sourceIndex - b.sourceIndex; +		if ( ret === 0 ) { +			hasDuplicate = true; +		} +		return ret; +	}; +} else if ( document.createRange ) { +	sortOrder = function( a, b ) { +		if ( !a.ownerDocument || !b.ownerDocument ) { +			if ( a == b ) { +				hasDuplicate = true; +			} +			return 0; +		} + +		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); +		aRange.setStart(a, 0); +		aRange.setEnd(a, 0); +		bRange.setStart(b, 0); +		bRange.setEnd(b, 0); +		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); +		if ( ret === 0 ) { +			hasDuplicate = true; +		} +		return ret; +	}; +} + +(function(){ +	var form = document.createElement("div"), +		id = "script" + (new Date).getTime(); +	form.innerHTML = "<a name='" + id + "'/>"; + +	var root = document.documentElement; +	root.insertBefore( form, root.firstChild ); + +	if ( !!document.getElementById( id ) ) { +		Expr.find.ID = function(match, context, isXML){ +			if ( typeof context.getElementById !== "undefined" && !isXML ) { +				var m = context.getElementById(match[1]); +				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; +			} +		}; + +		Expr.filter.ID = function(elem, match){ +			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); +			return elem.nodeType === 1 && node && node.nodeValue === match; +		}; +	} + +	root.removeChild( form ); +	root = form = null; // release memory in IE +})(); + +(function(){ + +	var div = document.createElement("div"); +	div.appendChild( document.createComment("") ); + +	if ( div.getElementsByTagName("*").length > 0 ) { +		Expr.find.TAG = function(match, context){ +			var results = context.getElementsByTagName(match[1]); + +			if ( match[1] === "*" ) { +				var tmp = []; + +				for ( var i = 0; results[i]; i++ ) { +					if ( results[i].nodeType === 1 ) { +						tmp.push( results[i] ); +					} +				} + +				results = tmp; +			} + +			return results; +		}; +	} + +	div.innerHTML = "<a href='#'></a>"; +	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && +			div.firstChild.getAttribute("href") !== "#" ) { +		Expr.attrHandle.href = function(elem){ +			return elem.getAttribute("href", 2); +		}; +	} + +	div = null; // release memory in IE +})(); + +if ( document.querySelectorAll ) (function(){ +	var oldSizzle = Sizzle, div = document.createElement("div"); +	div.innerHTML = "<p class='TEST'></p>"; + +	if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { +		return; +	} + +	Sizzle = function(query, context, extra, seed){ +		context = context || document; + +		if ( !seed && context.nodeType === 9 && !isXML(context) ) { +			try { +				return makeArray( context.querySelectorAll(query), extra ); +			} catch(e){} +		} + +		return oldSizzle(query, context, extra, seed); +	}; + +	for ( var prop in oldSizzle ) { +		Sizzle[ prop ] = oldSizzle[ prop ]; +	} + +	div = null; // release memory in IE +})(); + +if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ +	var div = document.createElement("div"); +	div.innerHTML = "<div class='test e'></div><div class='test'></div>"; + +	if ( div.getElementsByClassName("e").length === 0 ) +		return; + +	div.lastChild.className = "e"; + +	if ( div.getElementsByClassName("e").length === 1 ) +		return; + +	Expr.order.splice(1, 0, "CLASS"); +	Expr.find.CLASS = function(match, context, isXML) { +		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { +			return context.getElementsByClassName(match[1]); +		} +	}; + +	div = null; // release memory in IE +})(); + +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { +	var sibDir = dir == "previousSibling" && !isXML; +	for ( var i = 0, l = checkSet.length; i < l; i++ ) { +		var elem = checkSet[i]; +		if ( elem ) { +			if ( sibDir && elem.nodeType === 1 ){ +				elem.sizcache = doneName; +				elem.sizset = i; +			} +			elem = elem[dir]; +			var match = false; + +			while ( elem ) { +				if ( elem.sizcache === doneName ) { +					match = checkSet[elem.sizset]; +					break; +				} + +				if ( elem.nodeType === 1 && !isXML ){ +					elem.sizcache = doneName; +					elem.sizset = i; +				} + +				if ( elem.nodeName === cur ) { +					match = elem; +					break; +				} + +				elem = elem[dir]; +			} + +			checkSet[i] = match; +		} +	} +} + +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { +	var sibDir = dir == "previousSibling" && !isXML; +	for ( var i = 0, l = checkSet.length; i < l; i++ ) { +		var elem = checkSet[i]; +		if ( elem ) { +			if ( sibDir && elem.nodeType === 1 ) { +				elem.sizcache = doneName; +				elem.sizset = i; +			} +			elem = elem[dir]; +			var match = false; + +			while ( elem ) { +				if ( elem.sizcache === doneName ) { +					match = checkSet[elem.sizset]; +					break; +				} + +				if ( elem.nodeType === 1 ) { +					if ( !isXML ) { +						elem.sizcache = doneName; +						elem.sizset = i; +					} +					if ( typeof cur !== "string" ) { +						if ( elem === cur ) { +							match = true; +							break; +						} + +					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { +						match = elem; +						break; +					} +				} + +				elem = elem[dir]; +			} + +			checkSet[i] = match; +		} +	} +} + +var contains = document.compareDocumentPosition ?  function(a, b){ +	return a.compareDocumentPosition(b) & 16; +} : function(a, b){ +	return a !== b && (a.contains ? a.contains(b) : true); +}; + +var isXML = function(elem){ +	return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || +		!!elem.ownerDocument && elem.ownerDocument.documentElement.nodeName !== "HTML"; +}; + +var posProcess = function(selector, context){ +	var tmpSet = [], later = "", match, +		root = context.nodeType ? [context] : context; + +	while ( (match = Expr.match.PSEUDO.exec( selector )) ) { +		later += match[0]; +		selector = selector.replace( Expr.match.PSEUDO, "" ); +	} + +	selector = Expr.relative[selector] ? selector + "*" : selector; + +	for ( var i = 0, l = root.length; i < l; i++ ) { +		Sizzle( selector, root[i], tmpSet ); +	} + +	return Sizzle.filter( later, tmpSet ); +}; + + +window.Sizzle = Sizzle; + +})(); + +;(function(engine) { +  var extendElements = Prototype.Selector.extendElements; + +  function select(selector, scope) { +    return extendElements(engine(selector, scope || document)); +  } + +  function match(element, selector) { +    return engine.matches(selector, [element]).length == 1; +  } + +  Prototype.Selector.engine = engine; +  Prototype.Selector.select = select; +  Prototype.Selector.match = match; +})(Sizzle); + +window.Sizzle = Prototype._original_property; +delete Prototype._original_property; + +var Form = { +  reset: function(form) { +    form = $(form); +    form.reset(); +    return form; +  }, + +  serializeElements: function(elements, options) { +    if (typeof options != 'object') options = { hash: !!options }; +    else if (Object.isUndefined(options.hash)) options.hash = true; +    var key, value, submitted = false, submit = options.submit, accumulator, initial; + +    if (options.hash) { +      initial = {}; +      accumulator = function(result, key, value) { +        if (key in result) { +          if (!Object.isArray(result[key])) result[key] = [result[key]]; +          result[key].push(value); +        } else result[key] = value; +        return result; +      }; +    } else { +      initial = ''; +      accumulator = function(result, key, value) { +        return result + (result ? '&' : '') + encodeURIComponent(key) + '=' + encodeURIComponent(value); +      } +    } + +    return elements.inject(initial, function(result, element) { +      if (!element.disabled && element.name) { +        key = element.name; value = $(element).getValue(); +        if (value != null && element.type != 'file' && (element.type != 'submit' || (!submitted && +            submit !== false && (!submit || key == submit) && (submitted = true)))) { +          result = accumulator(result, key, value); +        } +      } +      return result; +    }); +  } +}; + +Form.Methods = { +  serialize: function(form, options) { +    return Form.serializeElements(Form.getElements(form), options); +  }, + +  getElements: function(form) { +    var elements = $(form).getElementsByTagName('*'), +        element, +        arr = [ ], +        serializers = Form.Element.Serializers; +    for (var i = 0; element = elements[i]; i++) { +      arr.push(element); +    } +    return arr.inject([], function(elements, child) { +      if (serializers[child.tagName.toLowerCase()]) +        elements.push(Element.extend(child)); +      return elements; +    }) +  }, + +  getInputs: function(form, typeName, name) { +    form = $(form); +    var inputs = form.getElementsByTagName('input'); + +    if (!typeName && !name) return $A(inputs).map(Element.extend); + +    for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) { +      var input = inputs[i]; +      if ((typeName && input.type != typeName) || (name && input.name != name)) +        continue; +      matchingInputs.push(Element.extend(input)); +    } + +    return matchingInputs; +  }, + +  disable: function(form) { +    form = $(form); +    Form.getElements(form).invoke('disable'); +    return form; +  }, + +  enable: function(form) { +    form = $(form); +    Form.getElements(form).invoke('enable'); +    return form; +  }, + +  findFirstElement: function(form) { +    var elements = $(form).getElements().findAll(function(element) { +      return 'hidden' != element.type && !element.disabled; +    }); +    var firstByIndex = elements.findAll(function(element) { +      return element.hasAttribute('tabIndex') && element.tabIndex >= 0; +    }).sortBy(function(element) { return element.tabIndex }).first(); + +    return firstByIndex ? firstByIndex : elements.find(function(element) { +      return /^(?:input|select|textarea)$/i.test(element.tagName); +    }); +  }, + +  focusFirstElement: function(form) { +    form = $(form); +    var element = form.findFirstElement(); +    if (element) element.activate(); +    return form; +  }, + +  request: function(form, options) { +    form = $(form), options = Object.clone(options || { }); + +    var params = options.parameters, action = form.readAttribute('action') || ''; +    if (action.blank()) action = window.location.href; +    options.parameters = form.serialize(true); + +    if (params) { +      if (Object.isString(params)) params = params.toQueryParams(); +      Object.extend(options.parameters, params); +    } + +    if (form.hasAttribute('method') && !options.method) +      options.method = form.method; + +    return new Ajax.Request(action, options); +  } +}; + +/*--------------------------------------------------------------------------*/ + + +Form.Element = { +  focus: function(element) { +    $(element).focus(); +    return element; +  }, + +  select: function(element) { +    $(element).select(); +    return element; +  } +}; + +Form.Element.Methods = { + +  serialize: function(element) { +    element = $(element); +    if (!element.disabled && element.name) { +      var value = element.getValue(); +      if (value != undefined) { +        var pair = { }; +        pair[element.name] = value; +        return Object.toQueryString(pair); +      } +    } +    return ''; +  }, + +  getValue: function(element) { +    element = $(element); +    var method = element.tagName.toLowerCase(); +    return Form.Element.Serializers[method](element); +  }, + +  setValue: function(element, value) { +    element = $(element); +    var method = element.tagName.toLowerCase(); +    Form.Element.Serializers[method](element, value); +    return element; +  }, + +  clear: function(element) { +    $(element).value = ''; +    return element; +  }, + +  present: function(element) { +    return $(element).value != ''; +  }, + +  activate: function(element) { +    element = $(element); +    try { +      element.focus(); +      if (element.select && (element.tagName.toLowerCase() != 'input' || +          !(/^(?:button|reset|submit)$/i.test(element.type)))) +        element.select(); +    } catch (e) { } +    return element; +  }, + +  disable: function(element) { +    element = $(element); +    element.disabled = true; +    return element; +  }, + +  enable: function(element) { +    element = $(element); +    element.disabled = false; +    return element; +  } +}; + +/*--------------------------------------------------------------------------*/ + +var Field = Form.Element; + +var $F = Form.Element.Methods.getValue; + +/*--------------------------------------------------------------------------*/ + +Form.Element.Serializers = (function() { +  function input(element, value) { +    switch (element.type.toLowerCase()) { +      case 'checkbox': +      case 'radio': +        return inputSelector(element, value); +      default: +        return valueSelector(element, value); +    } +  } + +  function inputSelector(element, value) { +    if (Object.isUndefined(value)) +      return element.checked ? element.value : null; +    else element.checked = !!value; +  } + +  function valueSelector(element, value) { +    if (Object.isUndefined(value)) return element.value; +    else element.value = value; +  } + +  function select(element, value) { +    if (Object.isUndefined(value)) +      return (element.type === 'select-one' ? selectOne : selectMany)(element); + +    var opt, currentValue, single = !Object.isArray(value); +    for (var i = 0, length = element.length; i < length; i++) { +      opt = element.options[i]; +      currentValue = this.optionValue(opt); +      if (single) { +        if (currentValue == value) { +          opt.selected = true; +          return; +        } +      } +      else opt.selected = value.include(currentValue); +    } +  } + +  function selectOne(element) { +    var index = element.selectedIndex; +    return index >= 0 ? optionValue(element.options[index]) : null; +  } + +  function selectMany(element) { +    var values, length = element.length; +    if (!length) return null; + +    for (var i = 0, values = []; i < length; i++) { +      var opt = element.options[i]; +      if (opt.selected) values.push(optionValue(opt)); +    } +    return values; +  } + +  function optionValue(opt) { +    return Element.hasAttribute(opt, 'value') ? opt.value : opt.text; +  } + +  return { +    input:         input, +    inputSelector: inputSelector, +    textarea:      valueSelector, +    select:        select, +    selectOne:     selectOne, +    selectMany:    selectMany, +    optionValue:   optionValue, +    button:        valueSelector +  }; +})(); + +/*--------------------------------------------------------------------------*/ + + +Abstract.TimedObserver = Class.create(PeriodicalExecuter, { +  initialize: function($super, element, frequency, callback) { +    $super(callback, frequency); +    this.element   = $(element); +    this.lastValue = this.getValue(); +  }, + +  execute: function() { +    var value = this.getValue(); +    if (Object.isString(this.lastValue) && Object.isString(value) ? +        this.lastValue != value : String(this.lastValue) != String(value)) { +      this.callback(this.element, value); +      this.lastValue = value; +    } +  } +}); + +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(element, callback) { +    this.element  = $(element); +    this.callback = callback; + +    this.lastValue = this.getValue(); +    if (this.element.tagName.toLowerCase() == 'form') +      this.registerFormCallbacks(); +    else +      this.registerCallback(this.element); +  }, + +  onElementEvent: function() { +    var value = this.getValue(); +    if (this.lastValue != value) { +      this.callback(this.element, value); +      this.lastValue = value; +    } +  }, + +  registerFormCallbacks: function() { +    Form.getElements(this.element).each(this.registerCallback, this); +  }, + +  registerCallback: function(element) { +    if (element.type) { +      switch (element.type.toLowerCase()) { +        case 'checkbox': +        case 'radio': +          Event.observe(element, 'click', this.onElementEvent.bind(this)); +          break; +        default: +          Event.observe(element, '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 Event = { +    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: {} +  }; + +  var docEl = document.documentElement; +  var MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED = 'onmouseenter' in docEl +    && 'onmouseleave' in docEl; + + + +  var isIELegacyEvent = function(event) { return false; }; + +  if (window.attachEvent) { +    if (window.addEventListener) { +      isIELegacyEvent = function(event) { +        return !(event instanceof window.Event); +      }; +    } else { +      isIELegacyEvent = function(event) { return true; }; +    } +  } + +  var _isButton; + +  function _isButtonForDOMEvents(event, code) { +    return event.which ? (event.which === code + 1) : (event.button === code); +  } + +  var legacyButtonMap = { 0: 1, 1: 4, 2: 2 }; +  function _isButtonForLegacyEvents(event, code) { +    return event.button === legacyButtonMap[code]; +  } + +  function _isButtonForWebKit(event, code) { +    switch (code) { +      case 0: return event.which == 1 && !event.metaKey; +      case 1: return event.which == 2 || (event.which == 1 && event.metaKey); +      case 2: return event.which == 3; +      default: return false; +    } +  } + +  if (window.attachEvent) { +    if (!window.addEventListener) { +      _isButton = _isButtonForLegacyEvents; +    } else { +      _isButton = function(event, code) { +        return isIELegacyEvent(event) ? _isButtonForLegacyEvents(event, code) : +         _isButtonForDOMEvents(event, code); +      } +    } +  } else if (Prototype.Browser.WebKit) { +    _isButton = _isButtonForWebKit; +  } else { +    _isButton = _isButtonForDOMEvents; +  } + +  function isLeftClick(event)   { return _isButton(event, 0) } + +  function isMiddleClick(event) { return _isButton(event, 1) } + +  function isRightClick(event)  { return _isButton(event, 2) } + +  function element(event) { +    event = Event.extend(event); + +    var node = event.target, type = event.type, +     currentTarget = event.currentTarget; + +    if (currentTarget && currentTarget.tagName) { +      if (type === 'load' || type === 'error' || +        (type === 'click' && currentTarget.tagName.toLowerCase() === 'input' +          && currentTarget.type === 'radio')) +            node = currentTarget; +    } + +    if (node.nodeType == Node.TEXT_NODE) +      node = node.parentNode; + +    return Element.extend(node); +  } + +  function findElement(event, expression) { +    var element = Event.element(event); + +    if (!expression) return element; +    while (element) { +      if (Object.isElement(element) && Prototype.Selector.match(element, expression)) { +        return Element.extend(element); +      } +      element = element.parentNode; +    } +  } + +  function pointer(event) { +    return { x: pointerX(event), y: pointerY(event) }; +  } + +  function pointerX(event) { +    var docElement = document.documentElement, +     body = document.body || { scrollLeft: 0 }; + +    return event.pageX || (event.clientX + +      (docElement.scrollLeft || body.scrollLeft) - +      (docElement.clientLeft || 0)); +  } + +  function pointerY(event) { +    var docElement = document.documentElement, +     body = document.body || { scrollTop: 0 }; + +    return  event.pageY || (event.clientY + +       (docElement.scrollTop || body.scrollTop) - +       (docElement.clientTop || 0)); +  } + + +  function stop(event) { +    Event.extend(event); +    event.preventDefault(); +    event.stopPropagation(); + +    event.stopped = true; +  } + + +  Event.Methods = { +    isLeftClick:   isLeftClick, +    isMiddleClick: isMiddleClick, +    isRightClick:  isRightClick, + +    element:     element, +    findElement: findElement, + +    pointer:  pointer, +    pointerX: pointerX, +    pointerY: pointerY, + +    stop: stop +  }; + +  var methods = Object.keys(Event.Methods).inject({ }, function(m, name) { +    m[name] = Event.Methods[name].methodize(); +    return m; +  }); + +  if (window.attachEvent) { +    function _relatedTarget(event) { +      var element; +      switch (event.type) { +        case 'mouseover': +        case 'mouseenter': +          element = event.fromElement; +          break; +        case 'mouseout': +        case 'mouseleave': +          element = event.toElement; +          break; +        default: +          return null; +      } +      return Element.extend(element); +    } + +    var additionalMethods = { +      stopPropagation: function() { this.cancelBubble = true }, +      preventDefault:  function() { this.returnValue = false }, +      inspect: function() { return '[object Event]' } +    }; + +    Event.extend = function(event, element) { +      if (!event) return false; + +      if (!isIELegacyEvent(event)) return event; + +      if (event._extendedByPrototype) return event; +      event._extendedByPrototype = Prototype.emptyFunction; + +      var pointer = Event.pointer(event); + +      Object.extend(event, { +        target: event.srcElement || element, +        relatedTarget: _relatedTarget(event), +        pageX:  pointer.x, +        pageY:  pointer.y +      }); + +      Object.extend(event, methods); +      Object.extend(event, additionalMethods); + +      return event; +    }; +  } else { +    Event.extend = Prototype.K; +  } + +  if (window.addEventListener) { +    Event.prototype = window.Event.prototype || document.createEvent('HTMLEvents').__proto__; +    Object.extend(Event.prototype, methods); +  } + +  function _createResponder(element, eventName, handler) { +    var registry = Element.retrieve(element, 'prototype_event_registry'); + +    if (Object.isUndefined(registry)) { +      CACHE.push(element); +      registry = Element.retrieve(element, 'prototype_event_registry', $H()); +    } + +    var respondersForEvent = registry.get(eventName); +    if (Object.isUndefined(respondersForEvent)) { +      respondersForEvent = []; +      registry.set(eventName, respondersForEvent); +    } + +    if (respondersForEvent.pluck('handler').include(handler)) return false; + +    var responder; +    if (eventName.include(":")) { +      responder = function(event) { +        if (Object.isUndefined(event.eventName)) +          return false; + +        if (event.eventName !== eventName) +          return false; + +        Event.extend(event, element); +        handler.call(element, event); +      }; +    } else { +      if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED && +       (eventName === "mouseenter" || eventName === "mouseleave")) { +        if (eventName === "mouseenter" || eventName === "mouseleave") { +          responder = function(event) { +            Event.extend(event, element); + +            var parent = event.relatedTarget; +            while (parent && parent !== element) { +              try { parent = parent.parentNode; } +              catch(e) { parent = element; } +            } + +            if (parent === element) return; + +            handler.call(element, event); +          }; +        } +      } else { +        responder = function(event) { +          Event.extend(event, element); +          handler.call(element, event); +        }; +      } +    } + +    responder.handler = handler; +    respondersForEvent.push(responder); +    return responder; +  } + +  function _destroyCache() { +    for (var i = 0, length = CACHE.length; i < length; i++) { +      Event.stopObserving(CACHE[i]); +      CACHE[i] = null; +    } +  } + +  var CACHE = []; + +  if (Prototype.Browser.IE) +    window.attachEvent('onunload', _destroyCache); + +  if (Prototype.Browser.WebKit) +    window.addEventListener('unload', Prototype.emptyFunction, false); + + +  var _getDOMEventName = Prototype.K, +      translations = { mouseenter: "mouseover", mouseleave: "mouseout" }; + +  if (!MOUSEENTER_MOUSELEAVE_EVENTS_SUPPORTED) { +    _getDOMEventName = function(eventName) { +      return (translations[eventName] || eventName); +    }; +  } + +  function observe(element, eventName, handler) { +    element = $(element); + +    var responder = _createResponder(element, eventName, handler); + +    if (!responder) return element; + +    if (eventName.include(':')) { +      if (element.addEventListener) +        element.addEventListener("dataavailable", responder, false); +      else { +        element.attachEvent("ondataavailable", responder); +        element.attachEvent("onlosecapture", responder); +      } +    } else { +      var actualEventName = _getDOMEventName(eventName); + +      if (element.addEventListener) +        element.addEventListener(actualEventName, responder, false); +      else +        element.attachEvent("on" + actualEventName, responder); +    } + +    return element; +  } + +  function stopObserving(element, eventName, handler) { +    element = $(element); + +    var registry = Element.retrieve(element, 'prototype_event_registry'); +    if (!registry) return element; + +    if (!eventName) { +      registry.each( function(pair) { +        var eventName = pair.key; +        stopObserving(element, eventName); +      }); +      return element; +    } + +    var responders = registry.get(eventName); +    if (!responders) return element; + +    if (!handler) { +      responders.each(function(r) { +        stopObserving(element, eventName, r.handler); +      }); +      return element; +    } + +    var i = responders.length, responder; +    while (i--) { +      if (responders[i].handler === handler) { +        responder = responders[i]; +        break; +      } +    } +    if (!responder) return element; + +    if (eventName.include(':')) { +      if (element.removeEventListener) +        element.removeEventListener("dataavailable", responder, false); +      else { +        element.detachEvent("ondataavailable", responder); +        element.detachEvent("onlosecapture", responder); +      } +    } else { +      var actualEventName = _getDOMEventName(eventName); +      if (element.removeEventListener) +        element.removeEventListener(actualEventName, responder, false); +      else +        element.detachEvent('on' + actualEventName, responder); +    } + +    registry.set(eventName, responders.without(responder)); + +    return element; +  } + +  function fire(element, eventName, memo, bubble) { +    element = $(element); + +    if (Object.isUndefined(bubble)) +      bubble = true; + +    if (element == document && document.createEvent && !element.dispatchEvent) +      element = document.documentElement; + +    var event; +    if (document.createEvent) { +      event = document.createEvent('HTMLEvents'); +      event.initEvent('dataavailable', bubble, true); +    } else { +      event = document.createEventObject(); +      event.eventType = bubble ? 'ondataavailable' : 'onlosecapture'; +    } + +    event.eventName = eventName; +    event.memo = memo || { }; + +    if (document.createEvent) +      element.dispatchEvent(event); +    else +      element.fireEvent(event.eventType, event); + +    return Event.extend(event); +  } + +  Event.Handler = Class.create({ +    initialize: function(element, eventName, selector, callback) { +      this.element   = $(element); +      this.eventName = eventName; +      this.selector  = selector; +      this.callback  = callback; +      this.handler   = this.handleEvent.bind(this); +    }, + +    start: function() { +      Event.observe(this.element, this.eventName, this.handler); +      return this; +    }, + +    stop: function() { +      Event.stopObserving(this.element, this.eventName, this.handler); +      return this; +    }, + +    handleEvent: function(event) { +      var element = Event.findElement(event, this.selector); +      if (element) this.callback.call(this.element, event, element); +    } +  }); + +  function on(element, eventName, selector, callback) { +    element = $(element); +    if (Object.isFunction(selector) && Object.isUndefined(callback)) { +      callback = selector, selector = null; +    } + +    return new Event.Handler(element, eventName, selector, callback).start(); +  } + +  Object.extend(Event, Event.Methods); + +  Object.extend(Event, { +    fire:          fire, +    observe:       observe, +    stopObserving: stopObserving, +    on:            on +  }); + +  Element.addMethods({ +    fire:          fire, + +    observe:       observe, + +    stopObserving: stopObserving, + +    on:            on +  }); + +  Object.extend(document, { +    fire:          fire.methodize(), + +    observe:       observe.methodize(), + +    stopObserving: stopObserving.methodize(), + +    on:            on.methodize(), + +    loaded:        false +  }); + +  if (window.Event) Object.extend(window.Event, Event); +  else window.Event = Event; +})(); + +(function() { +  /* Support for the DOMContentLoaded event is based on work by Dan Webb, +     Matthias Miller, Dean Edwards, John Resig, and Diego Perini. */ + +  var timer; + +  function fireContentLoadedEvent() { +    if (document.loaded) return; +    if (timer) window.clearTimeout(timer); +    document.loaded = true; +    document.fire('dom:loaded'); +  } + +  function checkReadyState() { +    if (document.readyState === 'complete') { +      document.stopObserving('readystatechange', checkReadyState); +      fireContentLoadedEvent(); +    } +  } + +  function pollDoScroll() { +    try { document.documentElement.doScroll('left'); } +    catch(e) { +      timer = pollDoScroll.defer(); +      return; +    } +    fireContentLoadedEvent(); +  } + +  if (document.addEventListener) { +    document.addEventListener('DOMContentLoaded', fireContentLoadedEvent, false); +  } else { +    document.observe('readystatechange', checkReadyState); +    if (window == top) +      timer = pollDoScroll.defer(); +  } + +  Event.observe(window, 'load', fireContentLoadedEvent); +})(); + +Element.addMethods(); + +/*------------------------------- DEPRECATED -------------------------------*/ + +Hash.toQueryString = Object.toQueryString; + +var Toggle = { display: Element.toggle }; + +Element.Methods.childOf = Element.Methods.descendantOf; + +var Insertion = { +  Before: function(element, content) { +    return Element.insert(element, {before:content}); +  }, + +  Top: function(element, content) { +    return Element.insert(element, {top:content}); +  }, + +  Bottom: function(element, content) { +    return Element.insert(element, {bottom:content}); +  }, + +  After: function(element, content) { +    return Element.insert(element, {after:content}); +  } +}; + +var $continue = new Error('"throw $continue" is deprecated, use "return" instead'); + +var 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(element, x, y) { +    if (this.includeScrollOffsets) +      return this.withinIncludingScrolloffsets(element, x, y); +    this.xcomp = x; +    this.ycomp = y; +    this.offset = Element.cumulativeOffset(element); + +    return (y >= this.offset[1] && +            y <  this.offset[1] + element.offsetHeight && +            x >= this.offset[0] && +            x <  this.offset[0] + element.offsetWidth); +  }, + +  withinIncludingScrolloffsets: function(element, x, y) { +    var offsetcache = Element.cumulativeScrollOffset(element); + +    this.xcomp = x + offsetcache[0] - this.deltaX; +    this.ycomp = y + offsetcache[1] - this.deltaY; +    this.offset = Element.cumulativeOffset(element); + +    return (this.ycomp >= this.offset[1] && +            this.ycomp <  this.offset[1] + element.offsetHeight && +            this.xcomp >= this.offset[0] && +            this.xcomp <  this.offset[0] + element.offsetWidth); +  }, + +  overlap: function(mode, element) { +    if (!mode) return 0; +    if (mode == 'vertical') +      return ((this.offset[1] + element.offsetHeight) - this.ycomp) / +        element.offsetHeight; +    if (mode == 'horizontal') +      return ((this.offset[0] + element.offsetWidth) - this.xcomp) / +        element.offsetWidth; +  }, + + +  cumulativeOffset: Element.Methods.cumulativeOffset, + +  positionedOffset: Element.Methods.positionedOffset, + +  absolutize: function(element) { +    Position.prepare(); +    return Element.absolutize(element); +  }, + +  relativize: function(element) { +    Position.prepare(); +    return Element.relativize(element); +  }, + +  realOffset: Element.Methods.cumulativeScrollOffset, + +  offsetParent: Element.Methods.getOffsetParent, + +  page: Element.Methods.viewportOffset, + +  clone: function(source, target, options) { +    options = options || { }; +    return Element.clonePosition(target, source, options); +  } +}; + +/*--------------------------------------------------------------------------*/ + +if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){ +  function iter(name) { +    return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]"; +  } + +  instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ? +  function(element, className) { +    className = className.toString().strip(); +    var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className); +    return cond ? document._getElementsByXPath('.//*' + cond, element) : []; +  } : function(element, className) { +    className = className.toString().strip(); +    var elements = [], classNames = (/\s/.test(className) ? $w(className) : null); +    if (!classNames && !className) return elements; + +    var nodes = $(element).getElementsByTagName('*'); +    className = ' ' + className + ' '; + +    for (var i = 0, child, cn; child = nodes[i]; i++) { +      if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) || +          (classNames && classNames.all(function(name) { +            return !name.toString().blank() && cn.include(' ' + name + ' '); +          })))) +        elements.push(Element.extend(child)); +    } +    return elements; +  }; + +  return function(className, parentElement) { +    return $(parentElement || document.body).getElementsByClassName(className); +  }; +}(Element.Methods); + +/*--------------------------------------------------------------------------*/ + +Element.ClassNames = Class.create(); +Element.ClassNames.prototype = { +  initialize: function(element) { +    this.element = $(element); +  }, + +  _each: function(iterator) { +    this.element.className.split(/\s+/).select(function(name) { +      return name.length > 0; +    })._each(iterator); +  }, + +  set: function(className) { +    this.element.className = className; +  }, + +  add: function(classNameToAdd) { +    if (this.include(classNameToAdd)) return; +    this.set($A(this).concat(classNameToAdd).join(' ')); +  }, + +  remove: function(classNameToRemove) { +    if (!this.include(classNameToRemove)) return; +    this.set($A(this).without(classNameToRemove).join(' ')); +  }, + +  toString: function() { +    return $A(this).join(' '); +  } +}; + +Object.extend(Element.ClassNames.prototype, Enumerable); + +/*--------------------------------------------------------------------------*/ + +(function() { +  window.Selector = Class.create({ +    initialize: function(expression) { +      this.expression = expression.strip(); +    }, + +    findElements: function(rootElement) { +      return Prototype.Selector.select(this.expression, rootElement); +    }, + +    match: function(element) { +      return Prototype.Selector.match(element, this.expression); +    }, + +    toString: function() { +      return this.expression; +    }, + +    inspect: function() { +      return "#<Selector: " + this.expression + ">"; +    } +  }); + +  Object.extend(Selector, { +    matchElements: function(elements, expression) { +      var match = Prototype.Selector.match, +          results = []; + +      for (var i = 0, length = elements.length; i < length; i++) { +        var element = elements[i]; +        if (match(element, expression)) { +          results.push(Element.extend(element)); +        } +      } +      return results; +    }, + +    findElement: function(elements, expression, index) { +      index = index || 0; +      var matchIndex = 0, element; +      for (var i = 0, length = elements.length; i < length; i++) { +        element = elements[i]; +        if (Prototype.Selector.match(element, expression) && index === matchIndex++) { +          return Element.extend(element); +        } +      } +    }, + +    findChildElements: function(element, expressions) { +      var selector = expressions.toArray().join(', '); +      return Prototype.Selector.select(selector, element || document); +    } +  }); +})(); diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/CHANGELOG b/framework/Web/Javascripts/source/scriptaculous-1.9.0/CHANGELOG index 5125cd1a..3925f1df 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/CHANGELOG +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/CHANGELOG @@ -1,3 +1,27 @@ +*V1.9.0* (December 23, 2010) + +* Update to Prototype 1.7 + +* Search for all script[src] occurrences rather than just within the head.  [pgib] + +* Fixed scrolling Sortables for Prototype 1.7  [fragility] + +*V1.8.3* (October 8, 2009) + +* Update to Prototype 1.6.1 + +* Effect.toggle to return effect (to be able to do Effect.toggle(element, 'appear', {sync: true});)  [RStankov] + +* Use element.identify() for fetching element.id in Sortable.create  [RStankov] + +* Fix deprecated usage of Position.cumulativeOffset. [#182 state:resolved]  [James Wheare] + +* Make loader work for application/xhtml+xml served documents.  Closes #95.  [Pavel Sedek] + +* Check for Windows Media plugin and RealPlayer plugin in Firefox on Windows to allow sound playback.  Closes #36, #86.  [Alexander Gavazov et al.] + +* Remove dead code in effects.js.  Closes #125.  [Confusioner] +  *V1.8.2* (November 18, 2008)  * Update to Prototype 1.6.0.3 diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/MIT-LICENSE b/framework/Web/Javascripts/source/scriptaculous-1.9.0/MIT-LICENSE index 3889631a..da26ff0a 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/MIT-LICENSE +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/MIT-LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)  Permission is hereby granted, free of charge, to any person obtaining  a copy of this software and associated documentation files (the diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/builder.js b/framework/Web/Javascripts/source/scriptaculous-1.9.0/builder.js index dba8beca..73250380 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/builder.js +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/builder.js @@ -1,6 +1,6 @@ -// script.aculo.us builder.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008 +// script.aculo.us builder.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)  //  // script.aculo.us is freely distributable under the terms of an MIT-style license.  // For details, see the script.aculo.us web site: http://script.aculo.us/ diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/controls.js b/framework/Web/Javascripts/source/scriptaculous-1.9.0/controls.js index c56ccb79..5137ab51 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/controls.js +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/controls.js @@ -1,8 +1,8 @@ -// script.aculo.us controls.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008 +// script.aculo.us controls.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -//           (c) 2005-2008 Ivan Krstic (http://blogs.law.harvard.edu/ivan) -//           (c) 2005-2008 Jon Tirsen (http://www.tirsen.com) +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +//           (c) 2005-2010 Ivan Krstic (http://blogs.law.harvard.edu/ivan) +//           (c) 2005-2010 Jon Tirsen (http://www.tirsen.com)  // Contributors:  //  Richard Livsey  //  Rahul Bhargava diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/dragdrop.js b/framework/Web/Javascripts/source/scriptaculous-1.9.0/dragdrop.js index 07c98e2b..9ebfe24d 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/dragdrop.js +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/dragdrop.js @@ -1,7 +1,6 @@ -// script.aculo.us dragdrop.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008 +// script.aculo.us dragdrop.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -//           (c) 2005-2008 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz) +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)  //  // script.aculo.us is freely distributable under the terms of an MIT-style license.  // For details, see the script.aculo.us web site: http://script.aculo.us/ @@ -313,7 +312,7 @@ var Draggable = Class.create({          tag_name=='TEXTAREA')) return;        var pointer = [Event.pointerX(event), Event.pointerY(event)]; -      var pos     = Position.cumulativeOffset(this.element); +      var pos     = this.element.cumulativeOffset();        this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });        Draggables.activate(this); @@ -375,7 +374,7 @@ var Draggable = Class.create({        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 = Position.page(this.options.scroll).toArray();          p[0] += this.options.scroll.scrollLeft + Position.deltaX;          p[1] += this.options.scroll.scrollTop + Position.deltaY;          p.push(p[0]+this.options.scroll.offsetWidth); @@ -456,7 +455,7 @@ var Draggable = Class.create({    },    draw: function(point) { -    var pos = Position.cumulativeOffset(this.element); +    var pos = this.element.cumulativeOffset();      if(this.options.ghosting) {        var r   = Position.realOffset(this.element);        pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY; @@ -732,7 +731,7 @@ var Sortable = {      }      // keep reference -    this.sortables[element.id] = options; +    this.sortables[element.identify()] = options;      // for onupdate      Draggables.addObserver(new SortableObserver(element, options.onUpdate)); @@ -827,7 +826,7 @@ var Sortable = {            hide().addClassName('dropmarker').setStyle({position:'absolute'});        document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);      } -    var offsets = Position.cumulativeOffset(dropon); +    var offsets = dropon.cumulativeOffset();      Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});      if(position=='after') diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/effects.js b/framework/Web/Javascripts/source/scriptaculous-1.9.0/effects.js index f31a81a0..860ddc09 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/effects.js +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/effects.js @@ -1,6 +1,6 @@ -// script.aculo.us effects.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008 +// script.aculo.us effects.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)  // Contributors:  //  Justin Palmer (http://encytemedia.com/)  //  Mark Pilgrim (http://diveintomark.org/) @@ -147,14 +147,13 @@ var Effect = {      'blind':  ['BlindDown','BlindUp'],      'appear': ['Appear','Fade']    }, -  toggle: function(element, effect) { +  toggle: function(element, effect, options) {      element = $(element); -    effect = (effect || 'appear').toLowerCase(); -    var options = Object.extend({ +    effect  = (effect || 'appear').toLowerCase(); +     +    return Effect[ Effect.PAIRS[ effect ][ element.visible() ? 1 : 0 ] ](element, Object.extend({        queue: { position:'end', scope:(element.id || 'global'), limit: 1 } -    }, arguments[2] || { }); -    Effect[element.visible() ? -      Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); +    }, options || {}));    }  }; @@ -230,12 +229,6 @@ Effect.Queue = Effect.Queues.get('global');  Effect.Base = Class.create({    position: null,    start: function(options) { -    function codeForEvent(options,eventName){ -      return ( -        (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') + -        (options[eventName] ? 'this.options.'+eventName+'(this);' : '') -      ); -    }      if (options && options.transition === false) options.transition = Effect.Transitions.linear;      this.options      = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });      this.currentFrame = 0; diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/scriptaculous.js b/framework/Web/Javascripts/source/scriptaculous-1.9.0/scriptaculous.js index 3e5543bd..0ea5c445 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/scriptaculous.js +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/scriptaculous.js @@ -1,6 +1,6 @@ -// script.aculo.us scriptaculous.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008 +// script.aculo.us scriptaculous.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)  //  // Permission is hereby granted, free of charge, to any person obtaining  // a copy of this software and associated documentation files (the @@ -24,10 +24,18 @@  // For details, see the script.aculo.us web site: http://script.aculo.us/  var Scriptaculous = { -  Version: '1.8.2', +  Version: '1.9.0',    require: function(libraryName) { -    // inserting via DOM fails in Safari 2.0, so brute force approach -    document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>'); +    try{ +      // inserting via DOM fails in Safari 2.0, so brute force approach +      document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>'); +    } catch(e) { +      // for xhtml+xml served content, fall back to DOM methods +      var script = document.createElement('script'); +      script.type = 'text/javascript'; +      script.src = libraryName; +      document.getElementsByTagName('head')[0].appendChild(script); +    }    },    REQUIRED_PROTOTYPE: '1.6.0.3',    load: function() { @@ -46,7 +54,7 @@ var Scriptaculous = {          Scriptaculous.REQUIRED_PROTOTYPE);      var js = /scriptaculous\.js(\?.*)?$/; -    $$('head script[src]').findAll(function(s) { +    $$('script[src]').findAll(function(s) {        return s.src.match(js);      }).each(function(s) {        var path = s.src.replace(js, ''), diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/slider.js b/framework/Web/Javascripts/source/scriptaculous-1.9.0/slider.js index 40b73711..438e6892 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/slider.js +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/slider.js @@ -1,6 +1,6 @@ -// script.aculo.us slider.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008 +// script.aculo.us slider.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 -// Copyright (c) 2005-2008 Marty Haught, Thomas Fuchs +// Copyright (c) 2005-2010 Marty Haught, Thomas Fuchs  //  // script.aculo.us is freely distributable under the terms of an MIT-style license.  // For details, see the script.aculo.us web site: http://script.aculo.us/ @@ -209,12 +209,12 @@ Control.Slider = Class.create({          var pointer  = [Event.pointerX(event), Event.pointerY(event)];          var track = handle;          if (track==this.track) { -          var offsets  = Position.cumulativeOffset(this.track); +          var offsets  = this.track.cumulativeOffset();            this.event = event;            this.setValue(this.translateToValue(             (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)            )); -          var offsets  = Position.cumulativeOffset(this.activeHandle); +          var offsets  = this.activeHandle.cumulativeOffset();            this.offsetX = (pointer[0] - offsets[0]);            this.offsetY = (pointer[1] - offsets[1]);          } else { @@ -227,7 +227,7 @@ Control.Slider = Class.create({              this.activeHandleIdx = this.handles.indexOf(this.activeHandle);              this.updateStyles(); -            var offsets  = Position.cumulativeOffset(this.activeHandle); +            var offsets  = this.activeHandle.cumulativeOffset();              this.offsetX = (pointer[0] - offsets[0]);              this.offsetY = (pointer[1] - offsets[1]);            } @@ -246,7 +246,7 @@ Control.Slider = Class.create({    },    draw: function(event) {      var pointer = [Event.pointerX(event), Event.pointerY(event)]; -    var offsets = Position.cumulativeOffset(this.track); +    var offsets = this.track.cumulativeOffset();      pointer[0] -= this.offsetX + offsets[0];      pointer[1] -= this.offsetY + offsets[1];      this.event = event; diff --git a/framework/Web/Javascripts/source/scriptaculous-1.8.2/sound.js b/framework/Web/Javascripts/source/scriptaculous-1.9.0/sound.js index e2487cde..d3f84646 100644 --- a/framework/Web/Javascripts/source/scriptaculous-1.8.2/sound.js +++ b/framework/Web/Javascripts/source/scriptaculous-1.9.0/sound.js @@ -1,6 +1,6 @@ -// script.aculo.us sound.js v1.8.2, Tue Nov 18 18:30:58 +0100 2008 +// script.aculo.us sound.js v1.9.0, Thu Dec 23 16:54:48 -0500 2010 -// Copyright (c) 2005-2008 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) +// Copyright (c) 2005-2010 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)  //  // Based on code created by Jules Gravinese (http://www.webveteran.com/)  // @@ -50,6 +50,10 @@ Sound = {  if(Prototype.Browser.Gecko && navigator.userAgent.indexOf("Win") > 0){    if(navigator.plugins && $A(navigator.plugins).detect(function(p){ return p.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(p){ return p.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(p){ return p.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(){}; -}
\ No newline at end of file +} 
\ No newline at end of file | 
