var Prototype = {
    Version: "1.6.0.2",
    Browser: {
        IE: !!(window.attachEvent && !window.opera),
        Opera: !!window.opera,
        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,
        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 (a) {
        return a
    }
};
if (Prototype.Browser.MobileSafari) {
    Prototype.BrowserFeatures.SpecificElementExtensions = false
}
var Class = {
    create: function () {
        var e = null,
            d = $A(arguments);
        if (Object.isFunction(d[0])) {
            e = d.shift()
        }
        function a() {
            this.initialize.apply(this, arguments)
        }
        Object.extend(a, Class.Methods);
        a.superclass = e;
        a.subclasses = [];
        if (e) {
            var b = function () {};
            b.prototype = e.prototype;
            a.prototype = new b;
            e.subclasses.push(a)
        }
        for (var c = 0;
        c < d.length; c++) {
            a.addMethods(d[c])
        }
        if (!a.prototype.initialize) {
            a.prototype.initialize = Prototype.emptyFunction
        }
        a.prototype.constructor = a;
        return a
    }
};
Class.Methods = {
    addMethods: function (g) {
        var c = this.superclass && this.superclass.prototype;
        var b = Object.keys(g);
        if (!Object.keys({
            toString: true
        }).length) {
            b.push("toString", "valueOf")
        }
        for (var a = 0, d = b.length; a < d; a++) {
            var f = b[a],
                e = g[f];
            if (c && Object.isFunction(e) && e.argumentNames().first() == "$super") {
                var h = e,
                    e = Object.extend((function (i) {
                    return function () {
                        return c[i].apply(this, arguments)
                    }
                })(f).wrap(h), {
                    valueOf: function () {
                        return h
                    },
                    toString: function () {
                        return h.toString()
                    }
                })
            }
            this.prototype[f] = e
        }
        return this
    }
};
var Abstract = {};
Object.extend = function (a, c) {
    for (var b in c) {
        a[b] = c[b]
    }
    return a
};
Object.extend(Object, {
    inspect: function (a) {
        try {
            if (Object.isUndefined(a)) {
                return "undefined"
            }
            if (a === null) {
                return "null"
            }
            return a.inspect ? a.inspect() : String(a)
        } catch(b) {
            if (b instanceof RangeError) {
                return "..."
            }
            throw b
        }
    },
    toJSON: function (a) {
        var c = typeof a;
        switch (c) {
        case "undefined":
        case "function":
        case "unknown":
            return;
        case "boolean":
            return a.toString()
        }
        if (a === null) {
            return "null"
        }
        if (a.toJSON) {
            return a.toJSON()
        }
        if (Object.isElement(a)) {
            return
        }
        var b = [];
        for (var e in a) {
            var d = Object.toJSON(a[e]);
            if (!Object.isUndefined(d)) {
                b.push(e.toJSON() + ": " + d)
            }
        }
        return "{" + b.join(", ") + "}"
    },
    toQueryString: function (a) {
        return $H(a).toQueryString()
    },
    toHTML: function (a) {
        return a && a.toHTML ? a.toHTML() : String.interpret(a)
    },
    keys: function (a) {
        var b = [];
        for (var c in a) {
            b.push(c)
        }
        return b
    },
    values: function (b) {
        var a = [];
        for (var c in b) {
            a.push(b[c])
        }
        return a
    },
    clone: function (a) {
        return Object.extend({},
        a)
    },
    isElement: function (a) {
        return a && a.nodeType == 1
    },
    isArray: function (a) {
        return a != null && typeof a == "object" && "splice" in a && "join" in a
    },
    isHash: function (a) {
        return a instanceof Hash
    },
    isFunction: function (a) {
        return typeof a == "function"
    },
    isString: function (a) {
        return typeof a == "string"
    },
    isNumber: function (a) {
        return typeof a == "number"
    },
    isUndefined: function (a) {
        return typeof a == "undefined"
    }
});
Object.extend(Function.prototype, {
    argumentNames: function () {
        var a = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
        return a.length == 1 && !a[0] ? [] : a
    },
    bind: function () {
        if (arguments.length < 2 && Object.isUndefined(arguments[0])) {
            return this
        }
        var a = this,
            c = $A(arguments),
            b = c.shift();
        return function () {
            return a.apply(b, c.concat($A(arguments)))
        }
    },
    bindAsEventListener: function () {
        var a = this,
            c = $A(arguments),
            b = c.shift();
        return function (d) {
            return a.apply(b, [d || window.event].concat(c))
        }
    },
    curry: function () {
        if (!arguments.length) {
            return this
        }
        var a = this,
            b = $A(arguments);
        return function () {
            return a.apply(this, b.concat($A(arguments)))
        }
    },
    delay: function () {
        var a = this,
            b = $A(arguments),
            c = b.shift() * 1000;
        return window.setTimeout(function () {
            return a.apply(a, b)
        },
        c)
    },
    wrap: function (b) {
        var a = this;
        return function () {
            return b.apply(this, [a.bind(this)].concat($A(arguments)))
        }
    },
    methodize: function () {
        if (this._methodized) {
            return this._methodized
        }
        var a = this;
        return this._methodized = function () {
            return a.apply(null, [this].concat($A(arguments)))
        }
    }
});
Function.prototype.defer = Function.prototype.delay.curry(0.01);
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 c;
        for (var b = 0, d = arguments.length; b < d; b++) {
            var a = arguments[b];
            try {
                c = a();
                break
            } catch(f) {}
        }
        return c
    }
};
RegExp.prototype.match = RegExp.prototype.test;
RegExp.escape = function (a) {
    return String(a).replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1")
};
var PeriodicalExecuter = Class.create({
    initialize: function (b, a) {
        this.callback = b;
        this.frequency = a;
        this.currentlyExecuting = false;
        this.registerCallback()
    },
    registerCallback: function () {
        this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000)
    },
    execute: function () {
        this.callback(this)
    },
    stop: function () {
        if (!this.timer) {
            return
        }
        clearInterval(this.timer);
        this.timer = null
    },
    onTimerEvent: function () {
        if (!this.currentlyExecuting) {
            try {
                this.currentlyExecuting = true;
                this.execute()
            } finally {
                this.currentlyExecuting = false
            }
        }
    }
});
Object.extend(String, {
    interpret: function (a) {
        return a == null ? "" : String(a)
    },
    specialChar: {
        "\b": "\\b",
        "\t": "\\t",
        "\n": "\\n",
        "\f": "\\f",
        "\r": "\\r",
        "\\": "\\\\"
    }
});
Object.extend(String.prototype, {
    gsub: function (e, c) {
        var a = "",
            d = this,
            b;
        c = arguments.callee.prepareReplacement(c);
        while (d.length > 0) {
            if (b = d.match(e)) {
                a += d.slice(0, b.index);
                a += String.interpret(c(b));
                d = d.slice(b.index + b[0].length)
            } else {
                a += d,
                d = ""
            }
        }
        return a
    },
    sub: function (c, a, b) {
        a = this.gsub.prepareReplacement(a);
        b = Object.isUndefined(b) ? 1 : b;
        return this.gsub(c, function (d) {
            if (--b < 0) {
                return d[0]
            }
            return a(d)
        })
    },
    scan: function (b, a) {
        this.gsub(b, a);
        return String(this)
    },
    truncate: function (b, a) {
        b = b || 30;
        a = Object.isUndefined(a) ? "..." : a;
        return this.length > b ? this.slice(0, b - a.length) + a : 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 b = new RegExp(Prototype.ScriptFragment, "img");
        var a = new RegExp(Prototype.ScriptFragment, "im");
        return (this.match(b) || []).map(function (c) {
            return (c.match(a) || ["", ""])[1]
        })
    },
    evalScripts: function () {
        return this.extractScripts().map(function (script) {
            return eval(script)
        })
    },
    escapeHTML: function () {
        var a = arguments.callee;
        a.text.data = this;
        return a.div.innerHTML
    },
    unescapeHTML: function () {
        var a = new Element("div");
        a.innerHTML = this.stripTags();
        return a.childNodes[0] ? (a.childNodes.length > 1 ? $A(a.childNodes).inject("", function (b, c) {
            return b + c.nodeValue
        }) : a.childNodes[0].nodeValue) : ""
    },
    toQueryParams: function (b) {
        var a = this.strip().match(/([^?#]*)(#.*)?$/);
        if (!a) {
            return {}
        }
        return a[1].split(b || "&").inject({},


        function (e, f) {
            if ((f = f.split("="))[0]) {
                var c = decodeURIComponent(f.shift());
                var d = f.length > 1 ? f.join("=") : f[0];
                if (d != undefined) {
                    d = decodeURIComponent(d)
                }
                if (c in e) {
                    if (!Object.isArray(e[c])) {
                        e[c] = [e[c]]
                    }
                    e[c].push(d)
                } else {
                    e[c] = d
                }
            }
            return e
        })
    },
    toArray: function () {
        return this.split("")
    },
    succ: function () {
        return this.slice(0, this.length - 1) + String.fromCharCode(this.charCodeAt(this.length - 1) + 1)
    },
    times: function (a) {
        return a < 1 ? "" : new Array(a + 1).join(this)
    },
    camelize: function () {
        var d = this.split("-"),
            a = d.length;
        if (a == 1) {
            return d[0]
        }
        var c = this.charAt(0) == "-" ? d[0].charAt(0).toUpperCase() + d[0].substring(1) : d[0];
        for (var b = 1; b < a; b++) {
            c += d[b].charAt(0).toUpperCase() + d[b].substring(1)
        }
        return c
    },
    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 (b) {
        var a = this.gsub(/[\x00-\x1f\\]/, function (c) {
            var d = String.specialChar[c[0]];
            return d ? d : "\\u00" + c[0].charCodeAt().toPaddedString(2, 16)
        });
        if (b) {
            return '"' + a.replace(/"/g, '\\"') + '"'
        }
        return "'" + a.replace(/'/g, "\\'") + "'"
    },
    toJSON: function () {
        return this.inspect(true)
    },
    unfilterJSON: function (a) {
        return this.sub(a || Prototype.JSONFilter, "#{1}")
    },
    isJSON: function () {
        var a = this;
        if (a.blank()) {
            return false
        }
        a = this.replace(/\\./g, "@").replace(/"[^"\\\n\r]*"/g, "");
        return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(a)
    },
    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 (a) {
        return this.indexOf(a) > -1
    },
    startsWith: function (a) {
        return this.indexOf(a) === 0
    },
    endsWith: function (a) {
        var b = this.length - a.length;
        return b >= 0 && this.lastIndexOf(a) === b
    },
    empty: function () {
        return this == ""
    },
    blank: function () {
        return /^\s*$/.test(this)
    },
    interpolate: function (a, b) {
        return new Template(this, b).evaluate(a)
    }
});
if (Prototype.Browser.WebKit || Prototype.Browser.IE) {
    Object.extend(String.prototype, {
        escapeHTML: function () {
            return this.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;")
        },
        unescapeHTML: function () {
            return this.replace(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">")
        }
    })
}
String.prototype.gsub.prepareReplacement = function (b) {
    if (Object.isFunction(b)) {
        return b
    }
    var a = new Template(b);
    return function (c) {
        return a.evaluate(c)
    }
};
String.prototype.parseQuery = String.prototype.toQueryParams;
Object.extend(String.prototype.escapeHTML, {
    div: document.createElement("div"),
    text: document.createTextNode("")
});
with(String.prototype.escapeHTML) {
    div.appendChild(text)
}
var Template = Class.create({
    initialize: function (a, b) {
        this.template = a.toString();
        this.pattern = b || Template.Pattern
    },
    evaluate: function (a) {
        if (Object.isFunction(a.toTemplateReplacements)) {
            a = a.toTemplateReplacements()
        }
        return this.template.gsub(this.pattern, function (d) {
            if (a == null) {
                return ""
            }
            var f = d[1] || "";
            if (f == "\\") {
                return d[2]
            }
            var b = a,
                g = d[3];
            var e = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
            d = e.exec(g);
            if (d == null) {
                return f
            }
            while (d != null) {
                var c = d[1].startsWith("[") ? d[2].gsub("\\\\]", "]") : d[1];
                b = b[c];
                if (null == b || "" == d[3]) {
                    break
                }
                g = g.substring("[" == d[3] ? d[1].length : d[0].length);
                d = e.exec(g)
            }
            return f + String.interpret(b)
        })
    }
});
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
var $break = {};
var Enumerable = {
    each: function (c, b) {
        var a = 0;
        c = c.bind(b);
        try {
            this._each(function (e) {
                c(e, a++)
            })
        } catch(d) {
            if (d != $break) {
                throw d
            }
        }
        return this
    },
    eachSlice: function (d, c, b) {
        c = c ? c.bind(b) : Prototype.K;
        var a = -d,
            e = [],
            f = this.toArray();
        while ((a += d) < f.length) {
            e.push(f.slice(a, a + d))
        }
        return e.collect(c, b)
    },
    all: function (c, b) {
        c = c ? c.bind(b) : Prototype.K;
        var a = true;
        this.each(function (e, d) {
            a = a && !!c(e, d);
            if (!a) {
                throw $break
            }
        });
        return a
    },
    any: function (c, b) {
        c = c ? c.bind(b) : Prototype.K;
        var a = false;
        this.each(function (e, d) {
            if (a = !!c(e, d)) {
                throw $break
            }
        });
        return a
    },
    collect: function (c, b) {
        c = c ? c.bind(b) : Prototype.K;
        var a = [];
        this.each(function (e, d) {
            a.push(c(e, d))
        });
        return a
    },
    detect: function (c, b) {
        c = c.bind(b);
        var a;
        this.each(function (e, d) {
            if (c(e, d)) {
                a = e;
                throw $break
            }
        });
        return a
    },
    findAll: function (c, b) {
        c = c.bind(b);
        var a = [];
        this.each(function (e, d) {
            if (c(e, d)) {
                a.push(e)
            }
        });
        return a
    },
    grep: function (d, c, b) {
        c = c ? c.bind(b) : Prototype.K;
        var a = [];
        if (Object.isString(d)) {
            d = new RegExp(d)
        }
        this.each(function (f, e) {
            if (d.match(f)) {
                a.push(c(f, e))
            }
        });
        return a
    },
    include: function (a) {
        if (Object.isFunction(this.indexOf)) {
            if (this.indexOf(a) != -1) {
                return true
            }
        }
        var b = false;
        this.each(function (c) {
            if (c == a) {
                b = true;
                throw $break
            }
        });
        return b
    },
    inGroupsOf: function (b, a) {
        a = Object.isUndefined(a) ? null : a;
        return this.eachSlice(b, function (c) {
            while (c.length < b) {
                c.push(a)
            }
            return c
        })
    },
    inject: function (a, c, b) {
        c = c.bind(b);
        this.each(function (e, d) {
            a = c(a, e, d)
        });
        return a
    },
    invoke: function (b) {
        var a = $A(arguments).slice(1);
        return this.map(function (c) {
            return c[b].apply(c, a)
        })
    },
    max: function (c, b) {
        c = c ? c.bind(b) : Prototype.K;
        var a;
        this.each(function (e, d) {
            e = c(e, d);
            if (a == null || e >= a) {
                a = e
            }
        });
        return a
    },
    min: function (c, b) {
        c = c ? c.bind(b) : Prototype.K;
        var a;
        this.each(function (e, d) {
            e = c(e, d);
            if (a == null || e < a) {
                a = e
            }
        });
        return a
    },
    partition: function (d, b) {
        d = d ? d.bind(b) : Prototype.K;
        var c = [],
            a = [];
        this.each(function (f, e) {
            (d(f, e) ? c : a).push(f)
        });
        return [c, a]
    },
    pluck: function (b) {
        var a = [];
        this.each(function (c) {
            a.push(c[b])
        });
        return a
    },
    reject: function (c, b) {
        c = c.bind(b);
        var a = [];
        this.each(function (e, d) {
            if (!c(e, d)) {
                a.push(e)
            }
        });
        return a
    },
    sortBy: function (b, a) {
        b = b.bind(a);
        return this.map(function (d, c) {
            return {
                value: d,
                criteria: b(d, c)
            }
        }).sort(function (f, e) {
            var d = f.criteria,
                c = e.criteria;
            return d < c ? -1 : d > c ? 1 : 0
        }).pluck("value")
    },
    toArray: function () {
        return this.map()
    },
    zip: function () {
        var b = Prototype.K,
            a = $A(arguments);
        if (Object.isFunction(a.last())) {
            b = a.pop()
        }
        var c = [this].concat(a).map($A);
        return this.map(function (e, d) {
            return b(c.pluck(d))
        })
    },
    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(c) {
    if (!c) {
        return []
    }
    if (c.toArray) {
        return c.toArray()
    }
    var b = c.length || 0,
        a = new Array(b);
    while (b--) {
        a[b] = c[b]
    }
    return a
}
if (Prototype.Browser.WebKit) {
    $A = function (c) {
        if (!c) {
            return []
        }
        if (! (Object.isFunction(c) && c == "[object NodeList]") && c.toArray) {
            return c.toArray()
        }
        var b = c.length || 0,
            a = new Array(b);
        while (b--) {
            a[b] = c[b]
        }
        return a
    }
}
Array.from = $A;
Object.extend(Array.prototype, Enumerable);
if (!Array.prototype._reverse) {
    Array.prototype._reverse = Array.prototype.reverse
}
Object.extend(Array.prototype, {
    _each: function (b) {
        for (var a = 0, c = this.length; a < c; a++) {
            b(this[a])
        }
    },
    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 (a) {
            return a != null
        })
    },
    flatten: function () {
        return this.inject([], function (b, a) {
            return b.concat(Object.isArray(a) ? a.flatten() : [a])
        })
    },
    without: function () {
        var a = $A(arguments);
        return this.select(function (b) {
            return !a.include(b)
        })
    },
    reverse: function (a) {
        return (a !== false ? this : this.toArray())._reverse()
    },
    reduce: function () {
        return this.length > 1 ? this : this[0]
    },
    uniq: function (a) {
        return this.inject([], function (d, c, b) {
            if (0 == b || (a ? d.last() != c : !d.include(c))) {
                d.push(c)
            }
            return d
        })
    },
    intersect: function (a) {
        return this.uniq().findAll(function (b) {
            return a.detect(function (c) {
                return b === c
            })
        })
    },
    clone: function () {
        return [].concat(this)
    },
    size: function () {
        return this.length
    },
    inspect: function () {
        return "[" + this.map(Object.inspect).join(", ") + "]"
    },
    toJSON: function () {
        var a = [];
        this.each(function (b) {
            var c = Object.toJSON(b);
            if (!Object.isUndefined(c)) {
                a.push(c)
            }
        });
        return "[" + a.join(", ") + "]"
    }
});
if (Object.isFunction(Array.prototype.forEach)) {
    Array.prototype._each = Array.prototype.forEach
}
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (c, a) {
        a || (a = 0);
        var b = this.length;
        if (a < 0) {
            a = b + a
        }
        for (; a < b; a++) {
            if (this[a] === c) {
                return a
            }
        }
        return -1
    }
}
if (!Array.prototype.lastIndexOf) {
    Array.prototype.lastIndexOf = function (b, a) {
        a = isNaN(a) ? this.length : (a < 0 ? this.length + a : a) + 1;
        var c = this.slice(0, a).reverse().indexOf(b);
        return (c < 0) ? c : a - c - 1
    }
}
Array.prototype.toArray = Array.prototype.clone;

function $w(a) {
    if (!Object.isString(a)) {
        return []
    }
    a = a.strip();
    return a ? a.split(/\s+/) : []
}
if (Prototype.Browser.Opera) {
    Array.prototype.concat = function () {
        var e = [];
        for (var b = 0, c = this.length; b < c; b++) {
            e.push(this[b])
        }
        for (var b = 0, c = arguments.length; b < c; b++) {
            if (Object.isArray(arguments[b])) {
                for (var a = 0, d = arguments[b].length; a < d; a++) {
                    e.push(arguments[b][a])
                }
            } else {
                e.push(arguments[b])
            }
        }
        return e
    }
}
Object.extend(Number.prototype, {
    toColorPart: function () {
        return this.toPaddedString(2, 16)
    },
    succ: function () {
        return this + 1
    },
    times: function (a) {
        $R(0, this, true).each(a);
        return this
    },
    toPaddedString: function (c, b) {
        var a = this.toString(b || 10);
        return "0".times(c - a.length) + a
    },
    toJSON: function () {
        return isFinite(this) ? this.toString() : "null"
    }
});
$w("abs round ceil floor").each(function (a) {
    Number.prototype[a] = Math[a].methodize()
});

function $H(a) {
    return new Hash(a)
}
var Hash = Class.create(Enumerable, (function () {
    function a(b, c) {
        if (Object.isUndefined(c)) {
            return b
        }
        return b + "=" + encodeURIComponent(String.interpret(c))
    }
    return {
        initialize: function (b) {
            this._object = Object.isHash(b) ? b.toObject() : Object.clone(b)
        },
        _each: function (c) {
            for (var b in this._object) {
                var d = this._object[b],
                    e = [b, d];
                e.key = b;
                e.value = d;
                c(e)
            }
        },
        set: function (b, c) {
            return this._object[b] = c
        },
        get: function (b) {
            return this._object[b]
        },
        unset: function (b) {
            var c = this._object[b];
            delete this._object[b];
            return c
        },
        toObject: function () {
            return Object.clone(this._object)
        },
        keys: function () {
            return this.pluck("key")
        },
        values: function () {
            return this.pluck("value")
        },
        index: function (c) {
            var b = this.detect(function (d) {
                return d.value === c
            });
            return b && b.key
        },
        merge: function (b) {
            return this.clone().update(b)
        },
        update: function (b) {
            return new Hash(b).inject(this, function (c, d) {
                c.set(d.key, d.value);
                return c
            })
        },
        toQueryString: function () {
            return this.map(function (d) {
                var c = encodeURIComponent(d.key),
                    b = d.value;
                if (b && typeof b == "object") {
                    if (Object.isArray(b)) {
                        return b.map(a.curry(c)).join("&")
                    }
                }
                return a(c, b)
            }).join("&")
        },
        inspect: function () {
            return "#<Hash:{" + this.map(function (b) {
                return b.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 (c, a, b) {
        this.start = c;
        this.end = a;
        this.exclusive = b
    },
    _each: function (a) {
        var b = this.start;
        while (this.include(b)) {
            a(b);
            b = b.succ()
        }
    },
    include: function (a) {
        if (a < this.start) {
            return false
        }
        if (this.exclusive) {
            return a < this.end
        }
        return a <= this.end
    }
});
var $R = function (c, a, b) {
    return new ObjectRange(c, a, b)
};
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 (a) {
        this.responders._each(a)
    },
    register: function (a) {
        if (!this.include(a)) {
            this.responders.push(a)
        }
    },
    unregister: function (a) {
        this.responders = this.responders.without(a)
    },
    dispatch: function (d, b, c, a) {
        this.each(function (f) {
            if (Object.isFunction(f[d])) {
                try {
                    f[d].apply(f, [b, c, a])
                } catch(g) {}
            }
        })
    }
};
Object.extend(Ajax.Responders, Enumerable);
Ajax.Responders.register({
    onCreate: function () {
        Ajax.activeRequestCount++
    },
    onComplete: function () {
        Ajax.activeRequestCount--
    }
});
Ajax.Base = Class.create({
    initialize: function (a) {
        this.options = {
            method: "post",
            asynchronous: true,
            contentType: "application/x-www-form-urlencoded",
            encoding: "UTF-8",
            parameters: "",
            evalJSON: true,
            evalJS: true
        };
        Object.extend(this.options, a || {});
        this.options.method = this.options.method.toLowerCase();
        if (Object.isString(this.options.parameters)) {
            this.options.parameters = this.options.parameters.toQueryParams()
        } else {
            if (Object.isHash(this.options.parameters)) {
                this.options.parameters = this.options.parameters.toObject()
            }
        }
    }
});
Ajax.Request = Class.create(Ajax.Base, {
    _complete: false,
    initialize: function ($super, b, a) {
        $super(a);
        this.transport = Ajax.getTransport();
        this.request(b)
    },
    request: function (b) {
        this.url = b;
        this.method = this.options.method;
        var d = Object.clone(this.options.parameters);
        if (! ["get", "post"].include(this.method)) {
            d._method = this.method;
            this.method = "post"
        }
        this.parameters = d;
        if (d = Object.toQueryString(d)) {
            if (this.method == "get") {
                this.url += (this.url.include("?") ? "&" : "?") + d
            } else {
                if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
                    d += "&_="
                }
            }
        }
        try {
            var a = new Ajax.Response(this);
            if (this.options.onCreate) {
                this.options.onCreate(a)
            }
            Ajax.Responders.dispatch("onCreate", this, a);
            this.transport.open(this.method.toUpperCase(), this.url, this.options.asynchronous);
            if (this.options.asynchronous) {
                this.respondToReadyState.bind(this).defer(1)
            }
            this.transport.onreadystatechange = this.onStateChange.bind(this);
            this.setRequestHeaders();
            this.body = this.method == "post" ? (this.options.postBody || d) : null;
            this.transport.send(this.body);
            if (!this.options.asynchronous && this.transport.overrideMimeType) {
                this.onStateChange()
            }
        } catch(c) {
            this.dispatchException(c)
        }
    },
    onStateChange: function () {
        var a = this.transport.readyState;
        if (a > 1 && !((a == 4) && this._complete)) {
            this.respondToReadyState(this.transport.readyState)
        }
    },
    setRequestHeaders: function () {
        var e = {
            "X-Requested-With": "XMLHttpRequest",
            "X-Prototype-Version": Prototype.Version,
            Accept: "text/javascript, text/html, application/xml, text/xml, */*"
        };
        if (this.method == "post") {
            e["Content-type"] = this.options.contentType + (this.options.encoding ? "; charset=" + this.options.encoding : "");
            if (this.transport.overrideMimeType && (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0, 2005])[1] < 2005) {
                e.Connection = "close"
            }
        }
        if (typeof this.options.requestHeaders == "object") {
            var c = this.options.requestHeaders;
            if (Object.isFunction(c.push)) {
                for (var b = 0, d = c.length; b < d; b += 2) {
                    e[c[b]] = c[b + 1]
                }
            } else {
                $H(c).each(function (f) {
                    e[f.key] = f.value
                })
            }
        }
        for (var a in e) {
            this.transport.setRequestHeader(a, e[a])
        }
    },
    success: function () {
        var a = this.getStatus();
        return !a || (a >= 200 && a < 300)
    },
    getStatus: function () {
        try {
            return this.transport.status || 0
        } catch(a) {
            return 0
        }
    },
    respondToReadyState: function (a) {
        var c = Ajax.Request.Events[a],
            b = new Ajax.Response(this);
        if (c == "Complete") {
            try {
                this._complete = true;
                (this.options["on" + b.status] || this.options["on" + (this.success() ? "Success" : "Failure")] || Prototype.emptyFunction)(b, b.headerJSON)
            } catch(d) {
                this.dispatchException(d)
            }
            var f = b.getHeader("Content-type");
            if (this.options.evalJS == "force" || (this.options.evalJS && this.isSameOrigin() && f && f.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i))) {
                this.evalResponse()
            }
        }
        try {
            (this.options["on" + c] || Prototype.emptyFunction)(b, b.headerJSON);
            Ajax.Responders.dispatch("on" + c, this, b, b.headerJSON)
        } catch(d) {
            this.dispatchException(d)
        }
        if (c == "Complete") {
            this.transport.onreadystatechange = Prototype.emptyFunction
        }
    },
    isSameOrigin: function () {
        var a = this.url.match(/^\s*https?:\/\/[^\/]*/);
        return !a || (a[0] == "#{protocol}//#{domain}#{port}".interpolate({
            protocol: location.protocol,
            domain: document.domain,
            port: location.port ? ":" + location.port : ""
        }))
    },
    getHeader: function (a) {
        try {
            return this.transport.getResponseHeader(a) || null
        } catch(b) {
            return null
        }
    },
    evalResponse: function () {
        try {
            return eval((this.transport.responseText || "").unfilterJSON())
        } catch(e) {
            this.dispatchException(e)
        }
    },
    dispatchException: function (a) {
        (this.options.onException || Prototype.emptyFunction)(this, a);
        Ajax.Responders.dispatch("onException", this, a)
    }
});
Ajax.Request.Events = ["Uninitialized", "Loading", "Loaded", "Interactive", "Complete"];
Ajax.Response = Class.create({
    initialize: function (c) {
        this.request = c;
        var d = this.transport = c.transport,
            a = this.readyState = d.readyState;
        if ((a > 2 && !Prototype.Browser.IE) || a == 4) {
            this.status = this.getStatus();
            this.statusText = this.getStatusText();
            this.responseText = String.interpret(d.responseText);
            this.headerJSON = this._getHeaderJSON()
        }
        if (a == 4) {
            var b = d.responseXML;
            this.responseXML = Object.isUndefined(b) ? null : b;
            this.responseJSON = this._getResponseJSON()
        }
    },
    status: 0,
    statusText: "",
    getStatus: Ajax.Request.prototype.getStatus,
    getStatusText: function () {
        try {
            return this.transport.statusText || ""
        } catch(a) {
            return ""
        }
    },
    getHeader: Ajax.Request.prototype.getHeader,
    getAllHeaders: function () {
        try {
            return this.getAllResponseHeaders()
        } catch(a) {
            return null
        }
    },
    getResponseHeader: function (a) {
        return this.transport.getResponseHeader(a)
    },
    getAllResponseHeaders: function () {
        return this.transport.getAllResponseHeaders()
    },
    _getHeaderJSON: function () {
        var a = this.getHeader("X-JSON");
        if (!a) {
            return null
        }
        a = decodeURIComponent(escape(a));
        try {
            return a.evalJSON(this.request.options.sanitizeJSON || !this.request.isSameOrigin())
        } catch(b) {
            this.request.dispatchException(b)
        }
    },
    _getResponseJSON: function () {
        var a = this.request.options;
        if (!a.evalJSON || (a.evalJSON != "force" && !(this.getHeader("Content-type") || "").include("application/json")) || this.responseText.blank()) {
            return null
        }
        try {
            return this.responseText.evalJSON(a.sanitizeJSON || !this.request.isSameOrigin())
        } catch(b) {
            this.request.dispatchException(b)
        }
    }
});
Ajax.Updater = Class.create(Ajax.Request, {
    initialize: function ($super, a, c, b) {
        this.container = {
            success: (a.success || a),
            failure: (a.failure || (a.success ? null : a))
        };
        b = Object.clone(b);
        var d = b.onComplete;
        b.onComplete = (function (e, f) {
            this.updateContent(e.responseText);
            if (Object.isFunction(d)) {
                d(e, f)
            }
        }).bind(this);
        $super(c, b)
    },
    updateContent: function (d) {
        var c = this.container[this.success() ? "success" : "failure"],
            a = this.options;
        if (!a.evalScripts) {
            d = d.stripScripts()
        }
        if (c = $(c)) {
            if (a.insertion) {
                if (Object.isString(a.insertion)) {
                    var b = {};
                    b[a.insertion] = d;
                    c.insert(b)
                } else {
                    a.insertion(c, d)
                }
            } else {
                c.update(d)
            }
        }
    }
});
Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
    initialize: function ($super, a, c, b) {
        $super(b);
        this.onComplete = this.options.onComplete;
        this.frequency = (this.options.frequency || 2);
        this.decay = (this.options.decay || 1);
        this.updater = {};
        this.container = a;
        this.url = c;
        this.start()
    },
    start: function () {
        this.options.onComplete = this.updateComplete.bind(this);
        this.onTimerEvent()
    },
    stop: function () {
        this.updater.options.onComplete = undefined;
        clearTimeout(this.timer);
        (this.onComplete || Prototype.emptyFunction).apply(this, arguments)
    },
    updateComplete: function (a) {
        if (this.options.decay) {
            this.decay = (a.responseText == this.lastText ? this.decay * this.options.decay : 1);
            this.lastText = a.responseText
        }
        this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency)
    },
    onTimerEvent: function () {
        this.updater = new Ajax.Updater(this.container, this.url, this.options)
    }
});

function $(b) {
    if (arguments.length > 1) {
        for (var a = 0, d = [], c = arguments.length; a < c; a++) {
            d.push($(arguments[a]))
        }
        return d
    }
    if (Object.isString(b)) {
        b = document.getElementById(b)
    }
    return Element.extend(b)
}
if (Prototype.BrowserFeatures.XPath) {
    document._getElementsByXPath = function (f, a) {
        var c = [];
        var e = document.evaluate(f, $(a) || document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
        for (var b = 0, d = e.snapshotLength;
        b < d; b++) {
            c.push(Element.extend(e.snapshotItem(b)))
        }
        return c
    }
}
if (!window.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 () {
    var a = this.Element;
    this.Element = function (d, c) {
        c = c || {};
        d = d.toLowerCase();
        var b = Element.cache;
        if (Prototype.Browser.IE && c.name) {
            d = "<" + d + ' name="' + c.name + '">';
            delete c.name;
            return Element.writeAttribute(document.createElement(d), c)
        }
        if (!b[d]) {
            b[d] = Element.extend(document.createElement(d))
        }
        return Element.writeAttribute(b[d].cloneNode(false), c)
    };
    Object.extend(this.Element, a || {})
}).call(window);
Element.cache = {};
Element.Methods = {
    visible: function (a) {
        return $(a).style.display != "none"
    },
    toggle: function (a) {
        a = $(a);
        Element[Element.visible(a) ? "hide" : "show"](a);
        return a
    },
    hide: function (a) {
        $(a).style.display = "none";
        return a
    },
    show: function (a) {
        $(a).style.display = "";
        return a
    },
    remove: function (a) {
        a = $(a);
        a.parentNode.removeChild(a);
        return a
    },
    update: function (a, b) {
        a = $(a);
        if (b && b.toElement) {
            b = b.toElement()
        }
        if (Object.isElement(b)) {
            return a.update().insert(b)
        }
        b = Object.toHTML(b);
        a.innerHTML = b.stripScripts();
        b.evalScripts.bind(b).defer();
        return a
    },
    replace: function (b, c) {
        b = $(b);
        if (c && c.toElement) {
            c = c.toElement()
        } else {
            if (!Object.isElement(c)) {
                c = Object.toHTML(c);
                var a = b.ownerDocument.createRange();
                a.selectNode(b);
                c.evalScripts.bind(c).defer();
                c = a.createContextualFragment(c.stripScripts())
            }
        }
        b.parentNode.replaceChild(c, b);
        return b
    },
    insert: function (c, e) {
        c = $(c);
        if (Object.isString(e) || Object.isNumber(e) || Object.isElement(e) || (e && (e.toElement || e.toHTML))) {
            e = {
                bottom: e
            }
        }
        var d, f, b, g;
        for (var a in e) {
            d = e[a];
            a = a.toLowerCase();
            f = Element._insertionTranslations[a];
            if (d && d.toElement) {
                d = d.toElement()
            }
            if (Object.isElement(d)) {
                f(c, d);
                continue
            }
            d = Object.toHTML(d);
            b = ((a == "before" || a == "after") ? c.parentNode : c).tagName.toUpperCase();
            g = Element._getContentFromAnonymousElement(b, d.stripScripts());
            if (a == "top" || a == "after") {
                g.reverse()
            }
            g.each(f.curry(c));
            d.evalScripts.bind(d).defer()
        }
        return c
    },
    wrap: function (b, c, a) {
        b = $(b);
        if (Object.isElement(c)) {
            $(c).writeAttribute(a || {})
        } else {
            if (Object.isString(c)) {
                c = new Element(c, a)
            } else {
                c = new Element("div", c)
            }
        }
        if (b.parentNode) {
            b.parentNode.replaceChild(c, b)
        }
        c.appendChild(b);
        return c
    },
    inspect: function (b) {
        b = $(b);
        var a = "<" + b.tagName.toLowerCase();
        $H({
            id: "id",
            className: "class"
        }).each(function (f) {
            var e = f.first(),
                c = f.last();
            var d = (b[e] || "").toString();
            if (d) {
                a += " " + c + "=" + d.inspect(true)
            }
        });
        return a + ">"
    },
    recursivelyCollect: function (a, c) {
        a = $(a);
        var b = [];
        while (a = a[c]) {
            if (a.nodeType == 1) {
                b.push(Element.extend(a))
            }
        }
        return b
    },
    ancestors: function (a) {
        return $(a).recursivelyCollect("parentNode")
    },
    descendants: function (a) {
        return $(a).select("*")
    },
    firstDescendant: function (a) {
        a = $(a).firstChild;
        while (a && a.nodeType != 1) {
            a = a.nextSibling
        }
        return $(a)
    },
    immediateDescendants: function (a) {
        if (! (a = $(a).firstChild)) {
            return []
        }
        while (a && a.nodeType != 1) {
            a = a.nextSibling
        }
        if (a) {
            return [a].concat($(a).nextSiblings())
        }
        return []
    },
    previousSiblings: function (a) {
        return $(a).recursivelyCollect("previousSibling")
    },
    nextSiblings: function (a) {
        return $(a).recursivelyCollect("nextSibling")
    },
    siblings: function (a) {
        a = $(a);
        return a.previousSiblings().reverse().concat(a.nextSiblings())
    },
    match: function (b, a) {
        if (Object.isString(a)) {
            a = new Selector(a)
        }
        return a.match($(b))
    },
    up: function (b, d, a) {
        b = $(b);
        if (arguments.length == 1) {
            return $(b.parentNode)
        }
        var c = b.ancestors();
        return Object.isNumber(d) ? c[d] : Selector.findElement(c, d, a)
    },
    down: function (b, c, a) {
        b = $(b);
        if (arguments.length == 1) {
            return b.firstDescendant()
        }
        return Object.isNumber(c) ? b.descendants()[c] : b.select(c)[a || 0]
    },
    previous: function (b, d, a) {
        b = $(b);
        if (arguments.length == 1) {
            return $(Selector.handlers.previousElementSibling(b))
        }
        var c = b.previousSiblings();
        return Object.isNumber(d) ? c[d] : Selector.findElement(c, d, a)
    },
    next: function (c, d, b) {
        c = $(c);
        if (arguments.length == 1) {
            return $(Selector.handlers.nextElementSibling(c))
        }
        var a = c.nextSiblings();
        return Object.isNumber(d) ? a[d] : Selector.findElement(a, d, b)
    },
    select: function () {
        var a = $A(arguments),
            b = $(a.shift());
        return Selector.findChildElements(b, a)
    },
    adjacent: function () {
        var a = $A(arguments),
            b = $(a.shift());
        return Selector.findChildElements(b.parentNode, a).without(b)
    },
    identify: function (b) {
        b = $(b);
        var c = b.readAttribute("id"),
            a = arguments.callee;
        if (c) {
            return c
        }
        do {
            c = "anonymous_element_" + a.counter++
        } while ($(c));
        b.writeAttribute("id", c);
        return c
    },
    readAttribute: function (c, a) {
        c = $(c);
        if (Prototype.Browser.IE) {
            var b = Element._attributeTranslations.read;
            if (b.values[a]) {
                return b.values[a](c, a)
            }
            if (b.names[a]) {
                a = b.names[a]
            }
            if (a.include(":")) {
                return (!c.attributes || !c.attributes[a]) ? null : c.attributes[a].value
            }
        }
        return c.getAttribute(a)
    },
    writeAttribute: function (e, c, f) {
        e = $(e);
        var b = {},
            d = Element._attributeTranslations.write;
        if (typeof c == "object") {
            b = c
        } else {
            b[c] = Object.isUndefined(f) ? true : f
        }
        for (var a in b) {
            c = d.names[a] || a;
            f = b[a];
            if (d.values[a]) {
                c = d.values[a](e, f)
            }
            if (f === false || f === null) {
                e.removeAttribute(c)
            } else {
                if (f === true) {
                    e.setAttribute(c, c)
                } else {
                    e.setAttribute(c, f)
                }
            }
        }
        return e
    },
    getHeight: function (a) {
        return $(a).getDimensions().height
    },
    getWidth: function (a) {
        return $(a).getDimensions().width
    },
    classNames: function (a) {
        return new Element.ClassNames(a)
    },
    hasClassName: function (a, b) {
        if (! (a = $(a))) {
            return
        }
        var c = a.className;
        return (c.length > 0 && (c == b || new RegExp("(^|\\s)" + b + "(\\s|$)").test(c)))
    },
    addClassName: function (a, b) {
        if (! (a = $(a))) {
            return
        }
        if (!a.hasClassName(b)) {
            a.className += (a.className ? " " : "") + b
        }
        return a
    },
    removeClassName: function (a, b) {
        if (! (a = $(a))) {
            return
        }
        a.className = a.className.replace(new RegExp("(^|\\s+)" + b + "(\\s+|$)"), " ").strip();
        return a
    },
    toggleClassName: function (a, b) {
        if (! (a = $(a))) {
            return
        }
        return a[a.hasClassName(b) ? "removeClassName" : "addClassName"](b)
    },
    cleanWhitespace: function (b) {
        b = $(b);
        var c = b.firstChild;
        while (c) {
            var a = c.nextSibling;
            if (c.nodeType == 3 && !/\S/.test(c.nodeValue)) {
                b.removeChild(c)
            }
            c = a
        }
        return b
    },
    empty: function (a) {
        return $(a).innerHTML.blank()
    },
    descendantOf: function (f, d) {
        f = $(f),
        d = $(d);
        var h = d;
        if (f.compareDocumentPosition) {
            return (f.compareDocumentPosition(d) & 8) === 8
        }
        if (f.sourceIndex && !Prototype.Browser.Opera) {
            var g = f.sourceIndex,
                c = d.sourceIndex,
                b = d.nextSibling;
            if (!b) {
                do {
                    d = d.parentNode
                } while (!(b = d.nextSibling) && d.parentNode)
            }
            if (b && b.sourceIndex) {
                return (g > c && g < b.sourceIndex)
            }
        }
        while (f = f.parentNode) {
            if (f == h) {
                return true
            }
        }
        return false
    },
    scrollTo: function (a) {
        a = $(a);
        var b = a.cumulativeOffset();
        window.scrollTo(b[0], b[1]);
        return a
    },
    getStyle: function (b, c) {
        b = $(b);
        c = c == "float" ? "cssFloat" : c.camelize();
        var d = b.style[c];
        if (!d) {
            var a = document.defaultView.getComputedStyle(b, null);
            d = a ? a[c] : null
        }
        if (c == "opacity") {
            return d ? parseFloat(d) : 1
        }
        return d == "auto" ? null : d
    },
    getOpacity: function (a) {
        return $(a).getStyle("opacity")
    },
    setStyle: function (b, c) {
        b = $(b);
        var e = b.style,
            a;
        if (Object.isString(c)) {
            b.style.cssText += ";" + c;
            return c.include("opacity") ? b.setOpacity(c.match(/opacity:\s*(\d?\.?\d*)/)[1]) : b
        }
        for (var d in c) {
            if (d == "opacity") {
                b.setOpacity(c[d])
            } else {
                e[(d == "float" || d == "cssFloat") ? (Object.isUndefined(e.styleFloat) ? "cssFloat" : "styleFloat") : d] = c[d]
            }
        }
        return b
    },
    setOpacity: function (a, b) {
        a = $(a);
        a.style.opacity = (b == 1 || b === "") ? "" : (b < 0.00001) ? 0 : b;
        return a
    },
    getDimensions: function (c) {
        c = $(c);
        var g = $(c).getStyle("display");
        if (g != "none" && g != null) {
            return {
                width: c.offsetWidth,
                height: c.offsetHeight
            }
        }
        var b = c.style;
        var f = b.visibility;
        var d = b.position;
        var a = b.display;
        b.visibility = "hidden";
        b.position = "absolute";
        b.display = "block";
        var h = c.clientWidth;
        var e = c.clientHeight;
        b.display = a;
        b.position = d;
        b.visibility = f;
        return {
            width: h,
            height: e
        }
    },
    makePositioned: function (a) {
        a = $(a);
        var b = Element.getStyle(a, "position");
        if (b == "static" || !b) {
            a._madePositioned = true;
            a.style.position = "relative";
            if (window.opera) {
                a.style.top = 0;
                a.style.left = 0
            }
        }
        return a
    },
    undoPositioned: function (a) {
        a = $(a);
        if (a._madePositioned) {
            a._madePositioned = undefined;
            a.style.position = a.style.top = a.style.left = a.style.bottom = a.style.right = ""
        }
        return a
    },
    makeClipping: function (a) {
        a = $(a);
        if (a._overflow) {
            return a
        }
        a._overflow = Element.getStyle(a, "overflow") || "auto";
        if (a._overflow !== "hidden") {
            a.style.overflow = "hidden"
        }
        return a
    },
    undoClipping: function (a) {
        a = $(a);
        if (!a._overflow) {
            return a
        }
        a.style.overflow = a._overflow == "auto" ? "" : a._overflow;
        a._overflow = null;
        return a
    },
    cumulativeOffset: function (b) {
        var a = 0,
            c = 0;
        do {
            a += b.offsetTop || 0;
            c += b.offsetLeft || 0;
            b = b.offsetParent
        } while (b);
        return Element._returnOffset(c, a)
    },
    positionedOffset: function (b) {
        var a = 0,
            d = 0;
        do {
            a += b.offsetTop || 0;
            d += b.offsetLeft || 0;
            b = b.offsetParent;
            if (b) {
                if (b.tagName == "BODY") {
                    break
                }
                var c = Element.getStyle(b, "position");
                if (c !== "static") {
                    break
                }
            }
        } while (b);
        return Element._returnOffset(d, a)
    },
    absolutize: function (b) {
        b = $(b);
        if (b.getStyle("position") == "absolute") {
            return
        }
        var d = b.positionedOffset();
        var f = d[1];
        var e = d[0];
        var c = b.clientWidth;
        var a = b.clientHeight;
        b._originalLeft = e - parseFloat(b.style.left || 0);
        b._originalTop = f - parseFloat(b.style.top || 0);
        b._originalWidth = b.style.width;
        b._originalHeight = b.style.height;
        b.style.position = "absolute";
        b.style.top = f + "px";
        b.style.left = e + "px";
        b.style.width = c + "px";
        b.style.height = a + "px";
        return b
    },
    relativize: function (a) {
        a = $(a);
        if (a.getStyle("position") == "relative") {
            return
        }
        a.style.position = "relative";
        var c = parseFloat(a.style.top || 0) - (a._originalTop || 0);
        var b = parseFloat(a.style.left || 0) - (a._originalLeft || 0);
        a.style.top = c + "px";
        a.style.left = b + "px";
        a.style.height = a._originalHeight;
        a.style.width = a._originalWidth;
        return a
    },
    cumulativeScrollOffset: function (b) {
        var a = 0,
            c = 0;
        do {
            a += b.scrollTop || 0;
            c += b.scrollLeft || 0;
            b = b.parentNode
        } while (b);
        return Element._returnOffset(c, a)
    },
    getOffsetParent: function (a) {
        if (a.offsetParent) {
            return $(a.offsetParent)
        }
        if (a == document.body) {
            return $(a)
        }
        while ((a = a.parentNode) && a != document.body) {
            if (Element.getStyle(a, "position") != "static") {
                return $(a)
            }
        }
        return $(document.body)
    },
    viewportOffset: function (d) {
        var a = 0,
            c = 0;
        var b = d;
        do {
            a += b.offsetTop || 0;
            c += b.offsetLeft || 0;
            if (b.offsetParent == document.body && Element.getStyle(b, "position") == "absolute") {
                break
            }
        } while (b = b.offsetParent);
        b = d;
        do {
            if (!Prototype.Browser.Opera || b.tagName == "BODY") {
                a -= b.scrollTop || 0;
                c -= b.scrollLeft || 0
            }
        } while (b = b.parentNode);
        return Element._returnOffset(c, a)
    },
    clonePosition: function (b, d) {
        var a = Object.extend({
            setLeft: true,
            setTop: true,
            setWidth: true,
            setHeight: true,
            offsetTop: 0,
            offsetLeft: 0
        },
        arguments[2] || {});
        d = $(d);
        var e = d.viewportOffset();
        b = $(b);
        var f = [0, 0];
        var c = null;
        if (Element.getStyle(b, "position") == "absolute") {
            c = b.getOffsetParent();
            f = c.viewportOffset()
        }
        if (c == document.body) {
            f[0] -= document.body.offsetLeft;
            f[1] -= document.body.offsetTop
        }
        if (a.setLeft) {
            b.style.left = (e[0] - f[0] + a.offsetLeft) + "px"
        }
        if (a.setTop) {
            b.style.top = (e[1] - f[1] + a.offsetTop) + "px"
        }
        if (a.setWidth) {
            b.style.width = d.offsetWidth + "px"
        }
        if (a.setHeight) {
            b.style.height = d.offsetHeight + "px"
        }
        return b
    }
};
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 (d, b, c) {
        switch (c) {
        case "left":
        case "top":
        case "right":
        case "bottom":
            if (d(b, "position") === "static") {
                return null
            }
        case "height":
        case "width":
            if (!Element.visible(b)) {
                return null
            }
            var e = parseInt(d(b, c), 10);
            if (e !== b["offset" + c.capitalize()]) {
                return e + "px"
            }
            var a;
            if (c === "height") {
                a = ["border-top-width", "padding-top", "padding-bottom", "border-bottom-width"]
            } else {
                a = ["border-left-width", "padding-left", "padding-right", "border-right-width"]
            }
            return a.inject(e, function (f, g) {
                var h = d(b, g);
                return h === null ? f : f - parseInt(h, 10)
            }) + "px";
        default:
            return d(b, c)
        }
    });
    Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(function (c, a, b) {
        if (b === "title") {
            return a.title
        }
        return c(a, b)
    })
} else {
    if (Prototype.Browser.IE) {
        Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(function (c, b) {
            b = $(b);
            var a = b.getStyle("position");
            if (a !== "static") {
                return c(b)
            }
            b.setStyle({
                position: "relative"
            });
            var d = c(b);
            b.setStyle({
                position: a
            });
            return d
        });
        $w("positionedOffset viewportOffset").each(function (a) {
            Element.Methods[a] = Element.Methods[a].wrap(function (e, c) {
                c = $(c);
                var b = c.getStyle("position");
                if (b !== "static") {
                    return e(c)
                }
                var d = c.getOffsetParent();
                if (d && d.getStyle("position") === "fixed") {
                    d.setStyle({
                        zoom: 1
                    })
                }
                c.setStyle({
                    position: "relative"
                });
                var f = e(c);
                c.setStyle({
                    position: b
                });
                return f
            })
        });
        Element.Methods.getStyle = function (a, b) {
            a = $(a);
            b = (b == "float" || b == "cssFloat") ? "styleFloat" : b.camelize();
            var c = a.style[b];
            if (!c && a.currentStyle) {
                c = a.currentStyle[b]
            }
            if (b == "opacity") {
                if (c = (a.getStyle("filter") || "").match(/alpha\(opacity=(.*)\)/)) {
                    if (c[1]) {
                        return parseFloat(c[1]) / 100
                    }
                }
                return 1
            }
            if (c == "auto") {
                if ((b == "width" || b == "height") && (a.getStyle("display") != "none")) {
                    return a["offset" + b.capitalize()] + "px"
                }
                return null
            }
            return c
        };
        Element.Methods.setOpacity = function (b, e) {
            function f(g) {
                return g.replace(/alpha\([^\)]*\)/gi, "")
            }
            b = $(b);
            var a = b.currentStyle;
            if ((a && !a.hasLayout) || (!a && b.style.zoom == "normal")) {
                b.style.zoom = 1
            }
            var d = b.getStyle("filter"),
                c = b.style;
            if (e == 1 || e === "") {
                (d = f(d)) ? c.filter = d : c.removeAttribute("filter");
                return b
            } else {
                if (e < 0.00001) {
                    e = 0
                }
            }
            c.filter = f(d) + "alpha(opacity=" + (e * 100) + ")";
            return b
        };
        Element._attributeTranslations = {
            read: {
                names: {
                    "class": "className",
                    "for": "htmlFor"
                },
                values: {
                    _getAttr: function (a, b) {
                        return a.getAttribute(b, 2)
                    },
                    _getAttrNode: function (a, c) {
                        var b = a.getAttributeNode(c);
                        return b ? b.value : ""
                    },
                    _getEv: function (a, b) {
                        b = a.getAttribute(b);
                        return b ? b.toString().slice(23, -2) : null
                    },
                    _flag: function (a, b) {
                        return $(a).hasAttribute(b) ? b : null
                    },
                    style: function (a) {
                        return a.style.cssText.toLowerCase()
                    },
                    title: function (a) {
                        return a.title
                    }
                }
            }
        };
        Element._attributeTranslations.write = {
            names: Object.extend({
                cellpadding: "cellPadding",
                cellspacing: "cellSpacing"
            },
            Element._attributeTranslations.read.names),
            values: {
                checked: function (a, b) {
                    a.checked = !!b
                },
                style: function (a, b) {
                    a.style.cssText = b ? b : ""
                }
            }
        };
        Element._attributeTranslations.has = {};
        $w("colSpan rowSpan vAlign dateTime accessKey tabIndex encType maxLength readOnly longDesc").each(function (a) {
            Element._attributeTranslations.write.names[a.toLowerCase()] = a;
            Element._attributeTranslations.has[a.toLowerCase()] = a
        });
        (function (a) {
            Object.extend(a, {
                href: a._getAttr,
                src: a._getAttr,
                type: a._getAttr,
                action: a._getAttrNode,
                disabled: a._flag,
                checked: a._flag,
                readonly: a._flag,
                multiple: a._flag,
                onload: a._getEv,
                onunload: a._getEv,
                onclick: a._getEv,
                ondblclick: a._getEv,
                onmousedown: a._getEv,
                onmouseup: a._getEv,
                onmouseover: a._getEv,
                onmousemove: a._getEv,
                onmouseout: a._getEv,
                onfocus: a._getEv,
                onblur: a._getEv,
                onkeypress: a._getEv,
                onkeydown: a._getEv,
                onkeyup: a._getEv,
                onsubmit: a._getEv,
                onreset: a._getEv,
                onselect: a._getEv,
                onchange: a._getEv
            })
        })(Element._attributeTranslations.read.values)
    } else {
        if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
            Element.Methods.setOpacity = function (a, b) {
                a = $(a);
                a.style.opacity = (b == 1) ? 0.999999 : (b === "") ? "" : (b < 0.00001) ? 0 : b;
                return a
            }
        } else {
            if (Prototype.Browser.WebKit) {
                Element.Methods.setOpacity = function (a, b) {
                    a = $(a);
                    a.style.opacity = (b == 1 || b === "") ? "" : (b < 0.00001) ? 0 : b;
                    if (b == 1) {
                        if (a.tagName == "IMG" && a.width) {
                            a.width++;
                            a.width--
                        } else {
                            try {
                                var d = document.createTextNode(" ");
                                a.appendChild(d);
                                a.removeChild(d)
                            } catch(c) {}
                        }
                    }
                    return a
                };
                Element.Methods.cumulativeOffset = function (b) {
                    var a = 0,
                        c = 0;
                    do {
                        a += b.offsetTop || 0;
                        c += b.offsetLeft || 0;
                        if (b.offsetParent == document.body) {
                            if (Element.getStyle(b, "position") == "absolute") {
                                break
                            }
                        }
                        b = b.offsetParent
                    } while (b);
                    return Element._returnOffset(c, a)
                }
            }
        }
    }
}
if (Prototype.Browser.IE || Prototype.Browser.Opera) {
    Element.Methods.update = function (b, c) {
        b = $(b);
        if (c && c.toElement) {
            c = c.toElement()
        }
        if (Object.isElement(c)) {
            return b.update().insert(c)
        }
        c = Object.toHTML(c);
        var a = b.tagName.toUpperCase();
        if (a in Element._insertionTranslations.tags) {
            $A(b.childNodes).each(function (d) {
                b.removeChild(d)
            });
            Element._getContentFromAnonymousElement(a, c.stripScripts()).each(function (d) {
                b.appendChild(d)
            })
        } else {
            b.innerHTML = c.stripScripts()
        }
        c.evalScripts.bind(c).defer();
        return b
    }
}
if ("outerHTML" in document.createElement("div")) {
    Element.Methods.replace = function (c, e) {
        c = $(c);
        if (e && e.toElement) {
            e = e.toElement()
        }
        if (Object.isElement(e)) {
            c.parentNode.replaceChild(e, c);
            return c
        }
        e = Object.toHTML(e);
        var d = c.parentNode,
            b = d.tagName.toUpperCase();
        if (Element._insertionTranslations.tags[b]) {
            var f = c.next();
            var a = Element._getContentFromAnonymousElement(b, e.stripScripts());
            d.removeChild(c);
            if (f) {
                a.each(function (g) {
                    d.insertBefore(g, f)
                })
            } else {
                a.each(function (g) {
                    d.appendChild(g)
                })
            }
        } else {
            c.outerHTML = e.stripScripts()
        }
        e.evalScripts.bind(e).defer();
        return c
    }
}
Element._returnOffset = function (b, c) {
    var a = [b, c];
    a.left = b;
    a.top = c;
    return a
};
Element._getContentFromAnonymousElement = function (c, b) {
    var d = new Element("div"),
        a = Element._insertionTranslations.tags[c];
    if (a) {
        d.innerHTML = a[0] + b + a[1];
        a[2].times(function () {
            d = d.firstChild
        })
    } else {
        d.innerHTML = b
    }
    return $A(d.childNodes)
};
Element._insertionTranslations = {
    before: function (a, b) {
        a.parentNode.insertBefore(b, a)
    },
    top: function (a, b) {
        a.insertBefore(b, a.firstChild)
    },
    bottom: function (a, b) {
        a.appendChild(b)
    },
    after: function (a, b) {
        a.parentNode.insertBefore(b, a.nextSibling)
    },
    tags: {
        TABLE: ["<table>", "</table>", 1],
        TBODY: ["<table><tbody>", "</tbody></table>", 2],
        TR: ["<table><tbody><tr>", "</tr></tbody></table>", 3],
        TD: ["<table><tbody><tr><td>", "</td></tr></tbody></table>", 4],
        SELECT: ["<select>", "</select>", 1]
    }
};
(function () {
    Object.extend(this.tags, {
        THEAD: this.tags.TBODY,
        TFOOT: this.tags.TBODY,
        TH: this.tags.TD
    })
}).call(Element._insertionTranslations);
Element.Methods.Simulated = {
    hasAttribute: function (a, c) {
        c = Element._attributeTranslations.has[c] || c;
        var b = $(a).getAttributeNode(c);
        return b && b.specified
    }
};
Element.Methods.ByTag = {};
Object.extend(Element, Element.Methods);
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 a = {},
        b = Element.Methods.ByTag;
    var c = Object.extend(function (f) {
        if (!f || f._extendedByPrototype || f.nodeType != 1 || f == window) {
            return f
        }
        var d = Object.clone(a),
            e = f.tagName,
            h, g;
        if (b[e]) {
            Object.extend(d, b[e])
        }
        for (h in d) {
            g = d[h];
            if (Object.isFunction(g) && !(h in f)) {
                f[h] = g.methodize()
            }
        }
        f._extendedByPrototype = Prototype.emptyFunction;
        return f
    },
    {
        refresh: function () {
            if (!Prototype.BrowserFeatures.ElementExtensions) {
                Object.extend(a, Element.Methods);
                Object.extend(a, Element.Methods.Simulated)
            }
        }
    });
    c.refresh();
    return c
})();
Element.hasAttribute = function (a, b) {
    if (a.hasAttribute) {
        return a.hasAttribute(b)
    }
    return Element.Methods.Simulated.hasAttribute(a, b)
};
Element.addMethods = function (c) {
    var h = Prototype.BrowserFeatures,
        d = Element.Methods.ByTag;
    if (!c) {
        Object.extend(Form, Form.Methods);
        Object.extend(Form.Element, Form.Element.Methods);
        Object.extend(Element.Methods.ByTag, {
            FORM: Object.clone(Form.Methods),
            INPUT: Object.clone(Form.Element.Methods),
            SELECT: Object.clone(Form.Element.Methods),
            TEXTAREA: Object.clone(Form.Element.Methods)
        })
    }
    if (arguments.length == 2) {
        var b = c;
        c = arguments[1]
    }
    if (!b) {
        Object.extend(Element.Methods, c || {})
    } else {
        if (Object.isArray(b)) {
            b.each(g)
        } else {
            g(b)
        }
    }
    function g(j) {
        j = j.toUpperCase();
        if (!Element.Methods.ByTag[j]) {
            Element.Methods.ByTag[j] = {}
        }
        Object.extend(Element.Methods.ByTag[j], c)
    }
    function a(l, k, j) {
        j = j || false;
        for (var n in l) {
            var m = l[n];
            if (!Object.isFunction(m)) {
                continue
            }
            if (!j || !(n in k)) {
                k[n] = m.methodize()
            }
        }
    }
    function e(l) {
        var j;
        var k = {
            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 (k[l]) {
            j = "HTML" + k[l] + "Element"
        }
        if (window[j]) {
            return window[j]
        }
        j = "HTML" + l + "Element";
        if (window[j]) {
            return window[j]
        }
        j = "HTML" + l.capitalize() + "Element";
        if (window[j]) {
            return window[j]
        }
        window[j] = {};
        window[j].prototype = document.createElement(l).__proto__;
        return window[j]
    }
    if (h.ElementExtensions) {
        a(Element.Methods, HTMLElement.prototype);
        a(Element.Methods.Simulated, HTMLElement.prototype, true)
    }
    if (h.SpecificElementExtensions) {
        for (var i in Element.Methods.ByTag) {
            var f = e(i);
            if (Object.isUndefined(f)) {
                continue
            }
            a(d[i], f.prototype)
        }
    }
    Object.extend(Element, Element.Methods);
    delete Element.ByTag;
    if (Element.extend.refresh) {
        Element.extend.refresh()
    }
    Element.cache = {}
};
document.viewport = {
    getDimensions: function () {
        var a = {};
        var b = Prototype.Browser;
        $w("width height").each(function (e) {
            var c = e.capitalize();
            a[e] = (b.WebKit && !document.evaluate) ? self["inner" + c] : (b.Opera) ? document.body["client" + c] : document.documentElement["client" + c]
        });
        return a
    },
    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)
    }
};
var Selector = Class.create({
    initialize: function (a) {
        this.expression = a.strip();
        this.compileMatcher()
    },
    shouldUseXPath: function () {
        if (!Prototype.BrowserFeatures.XPath) {
            return false
        }
        var a = this.expression;
        if (Prototype.Browser.WebKit && (a.include("-of-type") || a.include(":empty"))) {
            return false
        }
        if ((/(\[[\w-]*?:|:checked)/).test(this.expression)) {
            return false
        }
        return true
    },
    compileMatcher: function () {
        if (this.shouldUseXPath()) {
            return this.compileXPathMatcher()
        }
        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 f = this.expression,
            g = Selector.patterns,
            b = Selector.xpath,
            d, a;
        if (Selector._cache[f]) {
            this.xpath = Selector._cache[f];
            return
        }
        this.matcher = [".//*"];
        while (f && d != f && (/\S/).test(f)) {
            d = f;
            for (var c in g) {
                if (a = f.match(g[c])) {
                    this.matcher.push(Object.isFunction(b[c]) ? b[c](a) : new Template(b[c]).evaluate(a));
                    f = f.replace(a[0], "");
                    break
                }
            }
        }
        this.xpath = this.matcher.join("");
        Selector._cache[this.expression] = this.xpath
    },
    findElements: function (a) {
        a = a || document;
        if (this.xpath) {
            return document._getElementsByXPath(this.xpath, a)
        }
        return this.matcher(a)
    },
    match: function (j) {
        this.tokens = [];
        var o = this.expression,
            a = Selector.patterns,
            f = Selector.assertions;
        var b, d, g;
        while (o && b !== o && (/\S/).test(o)) {
            b = o;
            for (var k in a) {
                d = a[k];
                if (g = o.match(d)) {
                    if (f[k]) {
                        this.tokens.push([k, Object.clone(g)]);
                        o = o.replace(g[0], "")
                    } else {
                        return this.findElements(document).include(j)
                    }
                }
            }
        }
        var n = true,
            c, l;
        for (var k = 0, h; h = this.tokens[k]; k++) {
            c = h[0],
            l = h[1];
            if (!Selector.assertions[c](j, l)) {
                n = false;
                break
            }
        }
        return n
    },
    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 (a) {
            if (a[1] == "*") {
                return ""
            }
            return "[local-name()='" + a[1].toLowerCase() + "' or local-name()='" + a[1].toUpperCase() + "']"
        },
        className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
        id: "[@id='#{1}']",
        attrPresence: function (a) {
            a[1] = a[1].toLowerCase();
            return new Template("[@#{1}]").evaluate(a)
        },
        attr: function (a) {
            a[1] = a[1].toLowerCase();
            a[3] = a[5] || a[6];
            return new Template(Selector.xpath.operators[a[2]]).evaluate(a)
        },
        pseudo: function (a) {
            var b = Selector.xpath.pseudos[a[1]];
            if (!b) {
                return ""
            }
            if (Object.isFunction(b)) {
                return b(a)
            }
            return new Template(Selector.xpath.pseudos[a[1]]).evaluate(a)
        },
        operators: {
            "=": "[@#{1}='#{3}']",
            "!=": "[@#{1}!='#{3}']",
            "^=": "[starts-with(@#{1}, '#{3}')]",
            "$=": "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
            "*=": "[contains(@#{1}, '#{3}')]",
            "~=": "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
            "|=": "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
        },
        pseudos: {
            "first-child": "[not(preceding-sibling::*)]",
            "last-child": "[not(following-sibling::*)]",
            "only-child": "[not(preceding-sibling::* or following-sibling::*)]",
            empty: "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
            checked: "[@checked]",
            disabled: "[@disabled]",
            enabled: "[not(@disabled)]",
            not: function (b) {
                var j = b[6],
                    h = Selector.patterns,
                    a = Selector.xpath,
                    f, c;
                var g = [];
                while (j && f != j && (/\S/).test(j)) {
                    f = j;
                    for (var d in h) {
                        if (b = j.match(h[d])) {
                            c = Object.isFunction(a[d]) ? a[d](b) : new Template(a[d]).evaluate(b);
                            g.push("(" + c.substring(1, c.length - 1) + ")");
                            j = j.replace(b[0], "");
                            break
                        }
                    }
                }
                return "[not(" + g.join(" and ") + ")]"
            },
            "nth-child": function (a) {
                return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", a)
            },
            "nth-last-child": function (a) {
                return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", a)
            },
            "nth-of-type": function (a) {
                return Selector.xpath.pseudos.nth("position() ", a)
            },
            "nth-last-of-type": function (a) {
                return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", a)
            },
            "first-of-type": function (a) {
                a[6] = "1";
                return Selector.xpath.pseudos["nth-of-type"](a)
            },
            "last-of-type": function (a) {
                a[6] = "1";
                return Selector.xpath.pseudos["nth-last-of-type"](a)
            },
            "only-of-type": function (a) {
                var b = Selector.xpath.pseudos;
                return b["first-of-type"](a) + b["last-of-type"](a)
            },
            nth: function (g, e) {
                var h, i = e[6],
                    d;
                if (i == "even") {
                    i = "2n+0"
                }
                if (i == "odd") {
                    i = "2n+1"
                }
                if (h = i.match(/^(\d+)$/)) {
                    return "[" + g + "= " + h[1] + "]"
                }
                if (h = i.match(/^(-?\d*)?n(([+-])(\d+))?/)) {
                    if (h[1] == "-") {
                        h[1] = -1
                    }
                    var f = h[1] ? Number(h[1]) : 1;
                    var c = h[2] ? Number(h[2]) : 0;
                    d = "[((#{fragment} - #{b}) mod #{a} = 0) and ((#{fragment} - #{b}) div #{a} >= 0)]";
                    return new Template(d).evaluate({
                        fragment: g,
                        a: f,
                        b: c
                    })
                }
            }
        }
    },
    criteria: {
        tagName: 'n = h.tagName(n, r, "#{1}", c);      c = false;',
        className: 'n = h.className(n, r, "#{1}", c);    c = false;',
        id: 'n = h.id(n, r, "#{1}", c);           c = false;',
        attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
        attr: function (a) {
            a[3] = (a[5] || a[6]);
            return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(a)
        },
        pseudo: function (a) {
            if (a[6]) {
                a[6] = a[6].replace(/"/g, '\\"')
            }
            return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(a)
        },
        descendant: 'c = "descendant";',
        child: 'c = "child";',
        adjacent: 'c = "adjacent";',
        laterSibling: 'c = "laterSibling";'
    },
    patterns: {
        laterSibling: /^\s*~\s*/,
        child: /^\s*>\s*/,
        adjacent: /^\s*\+\s*/,
        descendant: /^\s/,
        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]+)\]/,
        attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
    },
    assertions: {
        tagName: function (a, b) {
            return b[1].toUpperCase() == a.tagName.toUpperCase()
        },
        className: function (a, b) {
            return Element.hasClassName(a, b[1])
        },
        id: function (a, b) {
            return a.id === b[1]
        },
        attrPresence: function (a, b) {
            return Element.hasAttribute(a, b[1])
        },
        attr: function (b, c) {
            var a = Element.readAttribute(b, c[1]);
            return a && Selector.operators[c[2]](a, c[5] || c[6])
        }
    },
    handlers: {
        concat: function (d, c) {
            for (var e = 0, f; f = c[e]; e++) {
                d.push(f)
            }
            return d
        },
        mark: function (a) {
            var d = Prototype.emptyFunction;
            for (var b = 0, c;
            c = a[b]; b++) {
                c._countedByPrototype = d
            }
            return a
        },
        unmark: function (a) {
            for (var b = 0, c; c = a[b]; b++) {
                c._countedByPrototype = undefined
            }
            return a
        },
        index: function (a, d, g) {
            a._countedByPrototype = Prototype.emptyFunction;
            if (d) {
                for (var b = a.childNodes, e = b.length - 1, c = 1; e >= 0; e--) {
                    var f = b[e];
                    if (f.nodeType == 1 && (!g || f._countedByPrototype)) {
                        f.nodeIndex = c++
                    }
                }
            } else {
                for (var e = 0, c = 1, b = a.childNodes; f = b[e]; e++) {
                    if (f.nodeType == 1 && (!g || f._countedByPrototype)) {
                        f.nodeIndex = c++
                    }
                }
            }
        },
        unique: function (b) {
            if (b.length == 0) {
                return b
            }
            var d = [],
                e;
            for (var c = 0, a = b.length; c < a; c++) {
                if (! (e = b[c])._countedByPrototype) {
                    e._countedByPrototype = Prototype.emptyFunction;
                    d.push(Element.extend(e))
                }
            }
            return Selector.handlers.unmark(d)
        },
        descendant: function (a) {
            var d = Selector.handlers;
            for (var c = 0, b = [], e; e = a[c]; c++) {
                d.concat(b, e.getElementsByTagName("*"))
            }
            return b
        },
        child: function (a) {
            var e = Selector.handlers;
            for (var d = 0, c = [], f; f = a[d]; d++) {
                for (var b = 0, g; g = f.childNodes[b]; b++) {
                    if (g.nodeType == 1 && g.tagName != "!") {
                        c.push(g)
                    }
                }
            }
            return c
        },
        adjacent: function (a) {
            for (var c = 0, b = [], e; e = a[c]; c++) {
                var d = this.nextElementSibling(e);
                if (d) {
                    b.push(d)
                }
            }
            return b
        },
        laterSibling: function (a) {
            var d = Selector.handlers;
            for (var c = 0, b = [], e; e = a[c]; c++) {
                d.concat(b, Element.nextSiblings(e))
            }
            return b
        },
        nextElementSibling: function (a) {
            while (a = a.nextSibling) {
                if (a.nodeType == 1) {
                    return a
                }
            }
            return null
        },
        previousElementSibling: function (a) {
            while (a = a.previousSibling) {
                if (a.nodeType == 1) {
                    return a
                }
            }
            return null
        },
        tagName: function (a, j, c, b) {
            var k = c.toUpperCase();
            var e = [],
                g = Selector.handlers;
            if (a) {
                if (b) {
                    if (b == "descendant") {
                        for (var f = 0, d; d = a[f]; f++) {
                            g.concat(e, d.getElementsByTagName(c))
                        }
                        return e
                    } else {
                        a = this[b](a)
                    }
                    if (c == "*") {
                        return a
                    }
                }
                for (var f = 0, d; d = a[f]; f++) {
                    if (d.tagName.toUpperCase() === k) {
                        e.push(d)
                    }
                }
                return e
            } else {
                return j.getElementsByTagName(c)
            }
        },
        id: function (b, a, j, f) {
            var g = $(j),
                d = Selector.handlers;
            if (!g) {
                return []
            }
            if (!b && a == document) {
                return [g]
            }
            if (b) {
                if (f) {
                    if (f == "child") {
                        for (var c = 0, e; e = b[c]; c++) {
                            if (g.parentNode == e) {
                                return [g]
                            }
                        }
                    } else {
                        if (f == "descendant") {
                            for (var c = 0, e; e = b[c]; c++) {
                                if (Element.descendantOf(g, e)) {
                                    return [g]
                                }
                            }
                        } else {
                            if (f == "adjacent") {
                                for (var c = 0, e; e = b[c]; c++) {
                                    if (Selector.handlers.previousElementSibling(g) == e) {
                                        return [g]
                                    }
                                }
                            } else {
                                b = d[f](b)
                            }
                        }
                    }
                }
                for (var c = 0, e; e = b[c]; c++) {
                    if (e == g) {
                        return [g]
                    }
                }
                return []
            }
            return (g && Element.descendantOf(g, a)) ? [g] : []
        },
        className: function (b, a, c, d) {
            if (b && d) {
                b = this[d](b)
            }
            return Selector.handlers.byClassName(b, a, c)
        },
        byClassName: function (c, b, f) {
            if (!c) {
                c = Selector.handlers.descendant([b])
            }
            var h = " " + f + " ";
            for (var e = 0, d = [], g, a; g = c[e]; e++) {
                a = g.className;
                if (a.length == 0) {
                    continue
                }
                if (a == f || (" " + a + " ").include(h)) {
                    d.push(g)
                }
            }
            return d
        },
        attrPresence: function (c, b, a, g) {
            if (!c) {
                c = b.getElementsByTagName("*")
            }
            if (c && g) {
                c = this[g](c)
            }
            var e = [];
            for (var d = 0, f; f = c[d]; d++) {
                if (Element.hasAttribute(f, a)) {
                    e.push(f)
                }
            }
            return e
        },
        attr: function (a, j, h, k, c, b) {
            if (!a) {
                a = j.getElementsByTagName("*")
            }
            if (a && b) {
                a = this[b](a)
            }
            var l = Selector.operators[c],
                f = [];
            for (var e = 0, d; d = a[e]; e++) {
                var g = Element.readAttribute(d, h);
                if (g === null) {
                    continue
                }
                if (l(g, k)) {
                    f.push(d)
                }
            }
            return f
        },
        pseudo: function (b, c, e, a, d) {
            if (b && d) {
                b = this[d](b)
            }
            if (!b) {
                b = a.getElementsByTagName("*")
            }
            return Selector.pseudos[c](b, e, a)
        }
    },
    pseudos: {
        "first-child": function (b, f, a) {
            for (var d = 0, c = [], e; e = b[d]; d++) {
                if (Selector.handlers.previousElementSibling(e)) {
                    continue
                }
                c.push(e)
            }
            return c
        },
        "last-child": function (b, f, a) {
            for (var d = 0, c = [], e; e = b[d]; d++) {
                if (Selector.handlers.nextElementSibling(e)) {
                    continue
                }
                c.push(e)
            }
            return c
        },
        "only-child": function (b, g, a) {
            var e = Selector.handlers;
            for (var d = 0, c = [], f; f = b[d]; d++) {
                if (!e.previousElementSibling(f) && !e.nextElementSibling(f)) {
                    c.push(f)
                }
            }
            return c
        },
        "nth-child": function (b, c, a) {
            return Selector.pseudos.nth(b, c, a)
        },
        "nth-last-child": function (b, c, a) {
            return Selector.pseudos.nth(b, c, a, true)
        },
        "nth-of-type": function (b, c, a) {
            return Selector.pseudos.nth(b, c, a, false, true)
        },
        "nth-last-of-type": function (b, c, a) {
            return Selector.pseudos.nth(b, c, a, true, true)
        },
        "first-of-type": function (b, c, a) {
            return Selector.pseudos.nth(b, "1", a, false, true)
        },
        "last-of-type": function (b, c, a) {
            return Selector.pseudos.nth(b, "1", a, true, true)
        },
        "only-of-type": function (b, d, a) {
            var c = Selector.pseudos;
            return c["last-of-type"](c["first-of-type"](b, d, a), d, a)
        },
        getIndices: function (d, c, e) {
            if (d == 0) {
                return c > 0 ? [c] : []
            }
            return $R(1, e).inject([], function (a, b) {
                if (0 == (b - c) % d && (b - c) / d >= 0) {
                    a.push(b)
                }
                return a
            })
        },
        nth: function (c, s, u, r, e) {
            if (c.length == 0) {
                return []
            }
            if (s == "even") {
                s = "2n+0"
            }
            if (s == "odd") {
                s = "2n+1"
            }
            var q = Selector.handlers,
                p = [],
                d = [],
                g;
            q.mark(c);
            for (var o = 0, f; f = c[o]; o++) {
                if (!f.parentNode._countedByPrototype) {
                    q.index(f.parentNode, r, e);
                    d.push(f.parentNode)
                }
            }
            if (s.match(/^\d+$/)) {
                s = Number(s);
                for (var o = 0, f; f = c[o]; o++) {
                    if (f.nodeIndex == s) {
                        p.push(f)
                    }
                }
            } else {
                if (g = s.match(/^(-?\d*)?n(([+-])(\d+))?/)) {
                    if (g[1] == "-") {
                        g[1] = -1
                    }
                    var v = g[1] ? Number(g[1]) : 1;
                    var t = g[2] ? Number(g[2]) : 0;
                    var w = Selector.pseudos.getIndices(v, t, c.length);
                    for (var o = 0, f, k = w.length; f = c[o]; o++) {
                        for (var n = 0; n < k; n++) {
                            if (f.nodeIndex == w[n]) {
                                p.push(f)
                            }
                        }
                    }
                }
            }
            q.unmark(c);
            q.unmark(d);
            return p
        },
        empty: function (b, f, a) {
            for (var d = 0, c = [], e; e = b[d]; d++) {
                if (e.tagName == "!" || (e.firstChild && !e.innerHTML.match(/^\s*$/))) {
                    continue
                }
                c.push(e)
            }
            return c
        },
        not: function (a, d, k) {
            var g = Selector.handlers,
                l, c;
            var j = new Selector(d).findElements(k);
            g.mark(j);
            for (var f = 0, e = [], b; b = a[f]; f++) {
                if (!b._countedByPrototype) {
                    e.push(b)
                }
            }
            g.unmark(j);
            return e
        },
        enabled: function (b, f, a) {
            for (var d = 0, c = [], e; e = b[d]; d++) {
                if (!e.disabled) {
                    c.push(e)
                }
            }
            return c
        },
        disabled: function (b, f, a) {
            for (var d = 0, c = [], e; e = b[d]; d++) {
                if (e.disabled) {
                    c.push(e)
                }
            }
            return c
        },
        checked: function (b, f, a) {
            for (var d = 0, c = [], e; e = b[d]; d++) {
                if (e.checked) {
                    c.push(e)
                }
            }
            return c
        }
    },
    operators: {
        "=": function (b, a) {
            return b == a
        },
        "!=": function (b, a) {
            return b != a
        },
        "^=": function (b, a) {
            return b.startsWith(a)
        },
        "$=": function (b, a) {
            return b.endsWith(a)
        },
        "*=": function (b, a) {
            return b.include(a)
        },
        "~=": function (b, a) {
            return (" " + b + " ").include(" " + a + " ")
        },
        "|=": function (b, a) {
            return ("-" + b.toUpperCase() + "-").include("-" + a.toUpperCase() + "-")
        }
    },
    split: function (b) {
        var a = [];
        b.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function (c) {
            a.push(c[1].strip())
        });
        return a
    },
    matchElements: function (f, g) {
        var e = $$(g),
            d = Selector.handlers;
        d.mark(e);
        for (var c = 0, b = [], a; a = f[c]; c++) {
            if (a._countedByPrototype) {
                b.push(a)
            }
        }
        d.unmark(e);
        return b
    },
    findElement: function (b, c, a) {
        if (Object.isNumber(c)) {
            a = c;
            c = false
        }
        return Selector.matchElements(b, c || "*")[a || 0]
    },
    findChildElements: function (e, g) {
        g = Selector.split(g.join(","));
        var d = [],
            f = Selector.handlers;
        for (var c = 0, b = g.length, a; c < b;
        c++) {
            a = new Selector(g[c].strip());
            f.concat(d, a.findElements(e))
        }
        return (b > 1) ? f.unique(d) : d
    }
});
if (Prototype.Browser.IE) {
    Object.extend(Selector.handlers, {
        concat: function (d, c) {
            for (var e = 0, f; f = c[e]; e++) {
                if (f.tagName !== "!") {
                    d.push(f)
                }
            }
            return d
        },
        unmark: function (a) {
            for (var b = 0, c; c = a[b]; b++) {
                c.removeAttribute("_countedByPrototype")
            }
            return a
        }
    })
}
function $$() {
    return Selector.findChildElements(document, $A(arguments))
}
var Form = {
    reset: function (a) {
        $(a).reset();
        return a
    },
    serializeElements: function (g, b) {
        if (typeof b != "object") {
            b = {
                hash: !!b
            }
        } else {
            if (Object.isUndefined(b.hash)) {
                b.hash = true
            }
        }
        var c, f, a = false,
            e = b.submit;
        var d = g.inject({},


        function (h, i) {
            if (!i.disabled && i.name) {
                c = i.name;
                f = $(i).getValue();
                if (f != null && (i.type != "submit" || (!a && e !== false && (!e || c == e) && (a = true)))) {
                    if (c in h) {
                        if (!Object.isArray(h[c])) {
                            h[c] = [h[c]]
                        }
                        h[c].push(f)
                    } else {
                        h[c] = f
                    }
                }
            }
            return h
        });
        return b.hash ? d : Object.toQueryString(d)
    }
};
Form.Methods = {
    serialize: function (b, a) {
        return Form.serializeElements(Form.getElements(b), a)
    },
    getElements: function (a) {
        return $A($(a).getElementsByTagName("*")).inject([], function (b, c) {
            if (Form.Element.Serializers[c.tagName.toLowerCase()]) {
                b.push(Element.extend(c))
            }
            return b
        })
    },
    getInputs: function (g, c, d) {
        g = $(g);
        var a = g.getElementsByTagName("input");
        if (!c && !d) {
            return $A(a).map(Element.extend)
        }
        for (var e = 0, h = [], f = a.length; e < f; e++) {
            var b = a[e];
            if ((c && b.type != c) || (d && b.name != d)) {
                continue
            }
            h.push(Element.extend(b))
        }
        return h
    },
    disable: function (a) {
        a = $(a);
        Form.getElements(a).invoke("disable");
        return a
    },
    enable: function (a) {
        a = $(a);
        Form.getElements(a).invoke("enable");
        return a
    },
    findFirstElement: function (b) {
        var c = $(b).getElements().findAll(function (d) {
            return "hidden" != d.type && !d.disabled
        });
        var a = c.findAll(function (d) {
            return d.hasAttribute("tabIndex") && d.tabIndex >= 0
        }).sortBy(function (d) {
            return d.tabIndex
        }).first();
        return a ? a : c.find(function (d) {
            return ["input", "select", "textarea"].include(d.tagName.toLowerCase())
        })
    },
    focusFirstElement: function (a) {
        a = $(a);
        a.findFirstElement().activate();
        return a
    },
    request: function (b, a) {
        b = $(b),
        a = Object.clone(a || {});
        var d = a.parameters,
            c = b.readAttribute("action") || "";
        if (c.blank()) {
            c = window.location.href
        }
        a.parameters = b.serialize(true);
        if (d) {
            if (Object.isString(d)) {
                d = d.toQueryParams()
            }
            Object.extend(a.parameters, d)
        }
        if (b.hasAttribute("method") && !a.method) {
            a.method = b.method
        }
        return new Ajax.Request(c, a)
    }
};
Form.Element = {
    focus: function (a) {
        $(a).focus();
        return a
    },
    select: function (a) {
        $(a).select();
        return a
    }
};
Form.Element.Methods = {
    serialize: function (a) {
        a = $(a);
        if (!a.disabled && a.name) {
            var b = a.getValue();
            if (b != undefined) {
                var c = {};
                c[a.name] = b;
                return Object.toQueryString(c)
            }
        }
        return ""
    },
    getValue: function (a) {
        a = $(a);
        var b = a.tagName.toLowerCase();
        return Form.Element.Serializers[b](a)
    },
    setValue: function (a, b) {
        a = $(a);
        var c = a.tagName.toLowerCase();
        Form.Element.Serializers[c](a, b);
        return a
    },
    clear: function (a) {
        $(a).value = "";
        return a
    },
    present: function (a) {
        return $(a).value != ""
    },
    activate: function (a) {
        a = $(a);
        try {
            a.focus();
            if (a.select && (a.tagName.toLowerCase() != "input" || !["button", "reset", "submit"].include(a.type))) {
                a.select()
            }
        } catch(b) {}
        return a
    },
    disable: function (a) {
        a = $(a);
        a.blur();
        a.disabled = true;
        return a
    },
    enable: function (a) {
        a = $(a);
        a.disabled = false;
        return a
    }
};
var Field = Form.Element;
var $F = Form.Element.Methods.getValue;
Form.Element.Serializers = {
    input: function (a, b) {
        switch (a.type.toLowerCase()) {
        case "checkbox":
        case "radio":
            return Form.Element.Serializers.inputSelector(a, b);
        default:
            return Form.Element.Serializers.textarea(a, b)
        }
    },
    inputSelector: function (a, b) {
        if (Object.isUndefined(b)) {
            return a.checked ? a.value : null
        } else {
            a.checked = !!b
        }
    },
    textarea: function (a, b) {
        if (Object.isUndefined(b)) {
            return a.value
        } else {
            a.value = b
        }
    },
    select: function (d, a) {
        if (Object.isUndefined(a)) {
            return this[d.type == "select-one" ? "selectOne" : "selectMany"](d)
        } else {
            var c, f, g = !Object.isArray(a);
            for (var b = 0, e = d.length;
            b < e; b++) {
                c = d.options[b];
                f = this.optionValue(c);
                if (g) {
                    if (f == a) {
                        c.selected = true;
                        return
                    }
                } else {
                    c.selected = a.include(f)
                }
            }
        }
    },
    selectOne: function (b) {
        var a = b.selectedIndex;
        return a >= 0 ? this.optionValue(b.options[a]) : null
    },
    selectMany: function (d) {
        var a, e = d.length;
        if (!e) {
            return null
        }
        for (var c = 0, a = []; c < e; c++) {
            var b = d.options[c];
            if (b.selected) {
                a.push(this.optionValue(b))
            }
        }
        return a
    },
    optionValue: function (a) {
        return Element.extend(a).hasAttribute("value") ? a.value : a.text
    }
};
Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
    initialize: function ($super, a, b, c) {
        $super(c, b);
        this.element = $(a);
        this.lastValue = this.getValue()
    },
    execute: function () {
        var a = this.getValue();
        if (Object.isString(this.lastValue) && Object.isString(a) ? this.lastValue != a : String(this.lastValue) != String(a)) {
            this.callback(this.element, a);
            this.lastValue = a
        }
    }
});
Form.Element.Observer = Class.create(Abstract.TimedObserver, {
    getValue: function () {
        return Form.Element.getValue(this.element)
    }
});
Form.Observer = Class.create(Abstract.TimedObserver, {
    getValue: function () {
        return Form.serialize(this.element)
    }
});
Abstract.EventObserver = Class.create({
    initialize: function (a, b) {
        this.element = $(a);
        this.callback = b;
        this.lastValue = this.getValue();
        if (this.element.tagName.toLowerCase() == "form") {
            this.registerFormCallbacks()
        } else {
            this.registerCallback(this.element)
        }
    },
    onElementEvent: function () {
        var a = this.getValue();
        if (this.lastValue != a) {
            this.callback(this.element, a);
            this.lastValue = a
        }
    },
    registerFormCallbacks: function () {
        Form.getElements(this.element).each(this.registerCallback, this)
    },
    registerCallback: function (a) {
        if (a.type) {
            switch (a.type.toLowerCase()) {
            case "checkbox":
            case "radio":
                Event.observe(a, "click", this.onElementEvent.bind(this));
                break;
            default:
                Event.observe(a, "change", this.onElementEvent.bind(this));
                break
            }
        }
    }
});
Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
    getValue: function () {
        return Form.Element.getValue(this.element)
    }
});
Form.EventObserver = Class.create(Abstract.EventObserver, {
    getValue: function () {
        return Form.serialize(this.element)
    }
});
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 (b) {
        var a;
        switch (b.type) {
        case "mouseover":
            a = b.fromElement;
            break;
        case "mouseout":
            a = b.toElement;
            break;
        default:
            return null
        }
        return Element.extend(a)
    }
});
Event.Methods = (function () {
    var a;
    if (Prototype.Browser.IE) {
        var b = {
            0: 1,
            1: 4,
            2: 2
        };
        a = function (d, c) {
            return d.button == b[c]
        }
    } else {
        if (Prototype.Browser.WebKit) {
            a = function (d, c) {
                switch (c) {
                case 0:
                    return d.which == 1 && !d.metaKey;
                case 1:
                    return d.which == 1 && d.metaKey;
                default:
                    return false
                }
            }
        } else {
            a = function (d, c) {
                return d.which ? (d.which === c + 1) : (d.button === c)
            }
        }
    }
    return {
        isLeftClick: function (c) {
            return a(c, 0)
        },
        isMiddleClick: function (c) {
            return a(c, 1)
        },
        isRightClick: function (c) {
            return a(c, 2)
        },
        element: function (d) {
            var c = Event.extend(d).target;
            return Element.extend(c.nodeType == Node.TEXT_NODE ? c.parentNode : c)
        },
        findElement: function (d, f) {
            var c = Event.element(d);
            if (!f) {
                return c
            }
            var e = [c].concat(c.ancestors());
            return Selector.findElement(e, f, 0)
        },
        pointer: function (c) {
            return {
                x: c.pageX || (c.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft)),
                y: c.pageY || (c.clientY + (document.documentElement.scrollTop || document.body.scrollTop))
            }
        },
        pointerX: function (c) {
            return Event.pointer(c).x
        },
        pointerY: function (c) {
            return Event.pointer(c).y
        },
        stop: function (c) {
            Event.extend(c);
            c.preventDefault();
            c.stopPropagation();
            c.stopped = true
        }
    }
})();
Event.extend = (function () {
    var a = Object.keys(Event.Methods).inject({},


    function (b, c) {
        b[c] = Event.Methods[c].methodize();
        return b
    });
    if (Prototype.Browser.IE) {
        Object.extend(a, {
            stopPropagation: function () {
                this.cancelBubble = true
            },
            preventDefault: function () {
                this.returnValue = false
            },
            inspect: function () {
                return "[object Event]"
            }
        });
        return function (b) {
            if (!b) {
                return false
            }
            if (b._extendedByPrototype) {
                return b
            }
            b._extendedByPrototype = Prototype.emptyFunction;
            var c = Event.pointer(b);
            Object.extend(b, {
                target: b.srcElement,
                relatedTarget: Event.relatedTarget(b),
                pageX: c.x,
                pageY: c.y
            });
            return Object.extend(b, a)
        }
    } else {
        Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
        Object.extend(Event.prototype, a);
        return Prototype.K
    }
})();
Object.extend(Event, (function () {
    var b = Event.cache;

    function c(j) {
        if (j._prototypeEventID) {
            return j._prototypeEventID[0]
        }
        arguments.callee.id = arguments.callee.id || 1;
        return j._prototypeEventID = [++arguments.callee.id]
    }
    function g(j) {
        if (j && j.include(":")) {
            return "dataavailable"
        }
        return j
    }
    function a(j) {
        return b[j] = b[j] || {}
    }
    function f(l, j) {
        var k = a(l);
        return k[j] = k[j] || []
    }
    function h(k, j, l) {
        var o = c(k);
        var n = f(o, j);
        if (n.pluck("handler").include(l)) {
            return false
        }
        var m = function (p) {
            if (!Event || !Event.extend || (p.eventName && p.eventName != j)) {
                return false
            }
            Event.extend(p);
            l.call(k, p)
        };
        m.handler = l;
        n.push(m);
        return m
    }
    function i(m, j, k) {
        var l = f(m, j);
        return l.find(function (n) {
            return n.handler == k
        })
    }
    function d(m, j, k) {
        var l = a(m);
        if (!l[j]) {
            return false
        }
        l[j] = l[j].without(i(m, j, k))
    }
    function e() {
        for (var k in b) {
            for (var j in b[k]) {
                b[k][j] = null
            }
        }
    }
    if (window.attachEvent) {
        window.attachEvent("onunload", e)
    }
    return {
        observe: function (l, j, m) {
            l = $(l);
            var k = g(j);
            var n = h(l, j, m);
            if (!n) {
                return l
            }
            if (l.addEventListener) {
                l.addEventListener(k, n, false)
            } else {
                l.attachEvent("on" + k, n)
            }
            return l
        },
        stopObserving: function (l, j, m) {
            l = $(l);
            var o = c(l),
                k = g(j);
            if (!m && j) {
                f(o, j).each(function (p) {
                    l.stopObserving(j, p.handler)
                });
                return l
            } else {
                if (!j) {
                    Object.keys(a(o)).each(function (p) {
                        l.stopObserving(p)
                    });
                    return l
                }
            }
            var n = i(o, j, m);
            if (!n) {
                return l
            }
            if (l.removeEventListener) {
                l.removeEventListener(k, n, false)
            } else {
                l.detachEvent("on" + k, n)
            }
            d(o, j, m);
            return l
        },
        fire: function (l, k, j) {
            l = $(l);
            if (l == document && document.createEvent && !l.dispatchEvent) {
                l = document.documentElement
            }
            var m;
            if (document.createEvent) {
                m = document.createEvent("HTMLEvents");
                m.initEvent("dataavailable", true, true)
            } else {
                m = document.createEventObject();
                m.eventType = "ondataavailable"
            }
            m.eventName = k;
            m.memo = j || {};
            if (document.createEvent) {
                l.dispatchEvent(m)
            } else {
                l.fireEvent(m.eventType, m)
            }
            return Event.extend(m)
        }
    }
})());
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 () {
    var b;

    function a() {
        if (document.loaded) {
            return
        }
        if (b) {
            window.clearInterval(b)
        }
        document.fire("dom:loaded");
        document.loaded = true
    }
    if (document.addEventListener) {
        if (Prototype.Browser.WebKit) {
            b = window.setInterval(function () {
                if (/loaded|complete/.test(document.readyState)) {
                    a()
                }
            },
            0);
            Event.observe(window, "load", a)
        } else {
            document.addEventListener("DOMContentLoaded", a, false)
        }
    } else {
        document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
        $("__onDOMContentLoaded").onreadystatechange = function () {
            if (this.readyState == "complete") {
                this.onreadystatechange = null;
                a()
            }
        }
    }
})();
Hash.toQueryString = Object.toQueryString;
var Toggle = {
    display: Element.toggle
};
Element.Methods.childOf = Element.Methods.descendantOf;
var Insertion = {
    Before: function (a, b) {
        return Element.insert(a, {
            before: b
        })
    },
    Top: function (a, b) {
        return Element.insert(a, {
            top: b
        })
    },
    Bottom: function (a, b) {
        return Element.insert(a, {
            bottom: b
        })
    },
    After: function (a, b) {
        return Element.insert(a, {
            after: b
        })
    }
};
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 (b, a, c) {
        if (this.includeScrollOffsets) {
            return this.withinIncludingScrolloffsets(b, a, c)
        }
        this.xcomp = a;
        this.ycomp = c;
        this.offset = Element.cumulativeOffset(b);
        return (c >= this.offset[1] && c < this.offset[1] + b.offsetHeight && a >= this.offset[0] && a < this.offset[0] + b.offsetWidth)
    },
    withinIncludingScrolloffsets: function (b, a, d) {
        var c = Element.cumulativeScrollOffset(b);
        this.xcomp = a + c[0] - this.deltaX;
        this.ycomp = d + c[1] - this.deltaY;
        this.offset = Element.cumulativeOffset(b);
        return (this.ycomp >= this.offset[1] && this.ycomp < this.offset[1] + b.offsetHeight && this.xcomp >= this.offset[0] && this.xcomp < this.offset[0] + b.offsetWidth)
    },
    overlap: function (b, a) {
        if (!b) {
            return 0
        }
        if (b == "vertical") {
            return ((this.offset[1] + a.offsetHeight) - this.ycomp) / a.offsetHeight
        }
        if (b == "horizontal") {
            return ((this.offset[0] + a.offsetWidth) - this.xcomp) / a.offsetWidth
        }
    },
    cumulativeOffset: Element.Methods.cumulativeOffset,
    positionedOffset: Element.Methods.positionedOffset,
    absolutize: function (a) {
        Position.prepare();
        return Element.absolutize(a)
    },
    relativize: function (a) {
        Position.prepare();
        return Element.relativize(a)
    },
    realOffset: Element.Methods.cumulativeScrollOffset,
    offsetParent: Element.Methods.getOffsetParent,
    page: Element.Methods.viewportOffset,
    clone: function (b, c, a) {
        a = a || {};
        return Element.clonePosition(c, b, a)
    }
};
if (!document.getElementsByClassName) {
    document.getElementsByClassName = function (b) {
        function a(c) {
            return c.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + c + " ')]"
        }
        b.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
        function (c, e) {
            e = e.toString().strip();
            var d = /\s/.test(e) ? $w(e).map(a).join("") : a(e);
            return d ? document._getElementsByXPath(".//*" + d, c) : []
        } : function (e, f) {
            f = f.toString().strip();
            var g = [],
                h = (/\s/.test(f) ? $w(f) : null);
            if (!h && !f) {
                return g
            }
            var c = $(e).getElementsByTagName("*");
            f = " " + f + " ";
            for (var d = 0, k, j; k = c[d]; d++) {
                if (k.className && (j = " " + k.className + " ") && (j.include(f) || (h && h.all(function (i) {
                    return !i.toString().blank() && j.include(" " + i + " ")
                })))) {
                    g.push(Element.extend(k))
                }
            }
            return g
        };
        return function (d, c) {
            return $(c || document.body).getElementsByClassName(d)
        }
    }(Element.Methods)
}
Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
    initialize: function (a) {
        this.element = $(a)
    },
    _each: function (a) {
        this.element.className.split(/\s+/).select(function (b) {
            return b.length > 0
        })._each(a)
    },
    set: function (a) {
        this.element.className = a
    },
    add: function (a) {
        if (this.include(a)) {
            return
        }
        this.set($A(this).concat(a).join(" "))
    },
    remove: function (a) {
        if (!this.include(a)) {
            return
        }
        this.set($A(this).without(a).join(" "))
    },
    toString: function () {
        return $A(this).join(" ")
    }
};
Object.extend(Element.ClassNames.prototype, Enumerable);
Element.addMethods();
var Window = Class.create();
Window.keepMultiModalWindow = false;
Window.hasEffectLib = (typeof Effect != "undefined");
Window.resizeEffectDuration = 0.4;
Window.prototype = {
    initialize: function () {
        var c;
        var b = 0;
        if (arguments.length > 0) {
            if (typeof arguments[0] == "string") {
                c = arguments[0];
                b = 1
            } else {
                c = arguments[0] ? arguments[0].id : null
            }
        }
        if (!c) {
            c = "window_" + new Date().getTime()
        }
        if ($(c)) {
            alert("Window " + c + " is already registered in the DOM! Make sure you use setDestroyOnClose() or destroyOnClose: true in the constructor")
        }
        this.options = Object.extend({
            className: "dialog",
            blurClassName: null,
            minWidth: 100,
            minHeight: 20,
            resizable: true,
            closable: true,
            minimizable: true,
            maximizable: true,
            draggable: true,
            userData: null,
            showEffect: (Window.hasEffectLib ? Effect.Appear : Element.show),
            hideEffect: (Window.hasEffectLib ? Effect.Fade : Element.hide),
            showEffectOptions: {},
            hideEffectOptions: {},
            effectOptions: null,
            parent: document.body,
            title: "&nbsp;",
            url: null,
            onload: Prototype.emptyFunction,
            width: 200,
            height: 300,
            opacity: 1,
            recenterAuto: true,
            wiredDrag: false,
            closeCallback: null,
            destroyOnClose: false,
            gridX: 1,
            gridY: 1
        },
        arguments[b] || {});
        if (this.options.blurClassName) {
            this.options.focusClassName = this.options.className
        }
        if (typeof this.options.top == "undefined" && typeof this.options.bottom == "undefined") {
            this.options.top = this._round(Math.random() * 500, this.options.gridY)
        }
        if (typeof this.options.left == "undefined" && typeof this.options.right == "undefined") {
            this.options.left = this._round(Math.random() * 500, this.options.gridX)
        }
        if (this.options.effectOptions) {
            Object.extend(this.options.hideEffectOptions, this.options.effectOptions);
            Object.extend(this.options.showEffectOptions, this.options.effectOptions);
            if (this.options.showEffect == Element.Appear) {
                this.options.showEffectOptions.to = this.options.opacity
            }
        }
        if (Window.hasEffectLib) {
            if (this.options.showEffect == Effect.Appear) {
                this.options.showEffectOptions.to = this.options.opacity
            }
            if (this.options.hideEffect == Effect.Fade) {
                this.options.hideEffectOptions.from = this.options.opacity
            }
        }
        if (this.options.hideEffect == Element.hide) {
            this.options.hideEffect = function () {
                Element.hide(this.element);
                if (this.options.destroyOnClose) {
                    this.destroy()
                }
            }.bind(this)
        }
        if (this.options.parent != document.body) {
            this.options.parent = $(this.options.parent)
        }
        this.element = this._createWindow(c);
        this.element.win = this;
        this.eventMouseDown = this._initDrag.bindAsEventListener(this);
        this.eventMouseUp = this._endDrag.bindAsEventListener(this);
        this.eventMouseMove = this._updateDrag.bindAsEventListener(this);
        this.eventOnLoad = this._getWindowBorderSize.bindAsEventListener(this);
        this.eventMouseDownContent = this.toFront.bindAsEventListener(this);
        this.eventResize = this._recenter.bindAsEventListener(this);
        this.topbar = $(this.element.id + "_top");
        this.bottombar = $(this.element.id + "_bottom");
        this.content = $(this.element.id + "_content");
        Event.observe(this.topbar, "mousedown", this.eventMouseDown);
        Event.observe(this.bottombar, "mousedown", this.eventMouseDown);
        Event.observe(this.content, "mousedown", this.eventMouseDownContent);
        Event.observe(window, "load", this.eventOnLoad);
        Event.observe(window, "resize", this.eventResize);
        Event.observe(window, "scroll", this.eventResize);
        Event.observe(this.options.parent, "scroll", this.eventResize);
        if (this.options.draggable) {
            var a = this;
            [this.topbar, this.topbar.up().previous(), this.topbar.up().next()].each(function (d) {
                d.observe("mousedown", a.eventMouseDown);
                d.addClassName("top_draggable")
            });
            [this.bottombar.up(), this.bottombar.up().previous(), this.bottombar.up().next()].each(function (d) {
                d.observe("mousedown", a.eventMouseDown);
                d.addClassName("bottom_draggable")
            })
        }
        if (this.options.resizable) {
            this.sizer = $(this.element.id + "_sizer");
            Event.observe(this.sizer, "mousedown", this.eventMouseDown)
        }
        this.useLeft = null;
        this.useTop = null;
        if (typeof this.options.left != "undefined") {
            this.element.setStyle({
                left: parseFloat(this.options.left) + "px"
            });
            this.useLeft = true
        } else {
            this.element.setStyle({
                right: parseFloat(this.options.right) + "px"
            });
            this.useLeft = false
        }
        if (typeof this.options.top != "undefined") {
            this.element.setStyle({
                top: parseFloat(this.options.top) + "px"
            });
            this.useTop = true
        } else {
            this.element.setStyle({
                bottom: parseFloat(this.options.bottom) + "px"
            });
            this.useTop = false
        }
        this.storedLocation = null;
        this.setOpacity(this.options.opacity);
        if (this.options.zIndex) {
            this.setZIndex(this.options.zIndex)
        }
        if (this.options.destroyOnClose) {
            this.setDestroyOnClose(true)
        }
        this._getWindowBorderSize();
        this.width = this.options.width;
        this.height = this.options.height;
        this.visible = false;
        this.constraint = false;
        this.constraintPad = {
            top: 0,
            left: 0,
            bottom: 0,
            right: 0
        };
        if (this.width && this.height) {
            this.setSize(this.options.width, this.options.height)
        }
        this.setTitle(this.options.title);
        Windows.register(this)
    },
    destroy: function () {
        this._notify("onDestroy");
        Event.stopObserving(this.topbar, "mousedown", this.eventMouseDown);
        Event.stopObserving(this.bottombar, "mousedown", this.eventMouseDown);
        Event.stopObserving(this.content, "mousedown", this.eventMouseDownContent);
        Event.stopObserving(window, "load", this.eventOnLoad);
        Event.stopObserving(window, "resize", this.eventResize);
        Event.stopObserving(window, "scroll", this.eventResize);
        Event.stopObserving(this.content, "load", this.options.onload);
        if (this._oldParent) {
            var c = this.getContent();
            var a = null;
            for (var b = 0; b < c.childNodes.length; b++) {
                a = c.childNodes[b];
                if (a.nodeType == 1) {
                    break
                }
                a = null
            }
            if (a) {
                this._oldParent.appendChild(a)
            }
            this._oldParent = null
        }
        if (this.sizer) {
            Event.stopObserving(this.sizer, "mousedown", this.eventMouseDown)
        }
        if (this.options.url) {
            this.content.src = null
        }
        if (this.iefix) {
            Element.remove(this.iefix)
        }
        Element.remove(this.element);
        Windows.unregister(this)
    },
    setCloseCallback: function (a) {
        this.options.closeCallback = a
    },
    getContent: function () {
        return this.content
    },
    setContent: function (h, g, b) {
        var a = $(h);
        if (null == a) {
            throw "Unable to find element '" + h + "' in DOM"
        }
        this._oldParent = a.parentNode;
        var f = null;
        var e = null;
        if (g) {
            f = Element.getDimensions(a)
        }
        if (b) {
            e = Position.cumulativeOffset(a)
        }
        var c = this.getContent();
        this.setHTMLContent("");
        c = this.getContent();
        c.appendChild(a);
        a.show();
        if (g) {
            this.setSize(f.width, f.height)
        }
        if (b) {
            this.setLocation(e[1] - this.heightN, e[0] - this.widthW)
        }
    },
    setHTMLContent: function (a) {
        if (this.options.url) {
            this.content.src = null;
            this.options.url = null;
            var b = '<div id="' + this.getId() + '_content" class="' + this.options.className + '_content"> </div>';
            $(this.getId() + "_table_content").innerHTML = b;
            this.content = $(this.element.id + "_content")
        }
        this.getContent().innerHTML = a
    },
    setAjaxContent: function (b, a, d, c) {
        this.showFunction = d ? "showCenter" : "show";
        this.showModal = c || false;
        a = a || {};
        this.setHTMLContent("");
        this.onComplete = a.onComplete;
        if (!this._onCompleteHandler) {
            this._onCompleteHandler = this._setAjaxContent.bind(this)
        }
        a.onComplete = this._onCompleteHandler;
        new Ajax.Request(b, a);
        a.onComplete = this.onComplete
    },
    _setAjaxContent: function (a) {
        Element.update(this.getContent(), a.responseText);
        if (this.onComplete) {
            this.onComplete(a)
        }
        this.onComplete = null;
        this[this.showFunction](this.showModal)
    },
    setURL: function (a) {
        if (this.options.url) {
            this.content.src = null
        }
        this.options.url = a;
        var b = "<iframe frameborder='0' name='" + this.getId() + "_content'  id='" + this.getId() + "_content' src='" + a + "' width='" + this.width + "' height='" + this.height + "'> </iframe>";
        $(this.getId() + "_table_content").innerHTML = b;
        this.content = $(this.element.id + "_content")
    },
    getURL: function () {
        return this.options.url ? this.options.url : null
    },
    refresh: function () {
        if (this.options.url) {
            $(this.element.getAttribute("id") + "_content").src = this.options.url
        }
    },
    setCookie: function (b, c, n, e, a) {
        b = b || this.element.id;
        this.cookie = [b, c, n, e, a];
        var l = WindowUtilities.getCookie(b);
        if (l) {
            var m = l.split(",");
            var j = m[0].split(":");
            var i = m[1].split(":");
            var k = parseFloat(m[2]),
                f = parseFloat(m[3]);
            var g = m[4];
            var d = m[5];
            this.setSize(k, f);
            if (g == "true") {
                this.doMinimize = true
            } else {
                if (d == "true") {
                    this.doMaximize = true
                }
            }
            this.useLeft = j[0] == "l";
            this.useTop = i[0] == "t";
            this.element.setStyle(this.useLeft ? {
                left: j[1]
            } : {
                right: j[1]
            });
            this.element.setStyle(this.useTop ? {
                top: i[1]
            } : {
                bottom: i[1]
            })
        }
    },
    getId: function () {
        return this.element.id
    },
    setDestroyOnClose: function () {
        this.options.destroyOnClose = true
    },
    setConstraint: function (a, b) {
        this.constraint = a;
        this.constraintPad = Object.extend(this.constraintPad, b || {});
        if (this.useTop && this.useLeft) {
            this.setLocation(parseFloat(this.element.style.top), parseFloat(this.element.style.left))
        }
    },
    _initDrag: function (b) {
        if (Event.element(b) == this.sizer && this.isMinimized()) {
            return
        }
        if (Event.element(b) != this.sizer && this.isMaximized()) {
            return
        }
        if (Prototype.Browser.IE && this.heightN == 0) {
            this._getWindowBorderSize()
        }
        this.pointer = [this._round(Event.pointerX(b), this.options.gridX), this._round(Event.pointerY(b), this.options.gridY)];
        if (this.options.wiredDrag) {
            this.currentDrag = this._createWiredElement()
        } else {
            this.currentDrag = this.element
        }
        if (Event.element(b) == this.sizer) {
            this.doResize = true;
            this.widthOrg = this.width;
            this.heightOrg = this.height;
            this.bottomOrg = parseFloat(this.element.getStyle("bottom"));
            this.rightOrg = parseFloat(this.element.getStyle("right"));
            this._notify("onStartResize")
        } else {
            this.doResize = false;
            var a = $(this.getId() + "_close");
            if (a && Position.within(a, this.pointer[0], this.pointer[1])) {
                this.currentDrag = null;
                return
            }
            this.toFront();
            if (!this.options.draggable) {
                return
            }
            this._notify("onStartMove")
        }
        Event.observe(document, "mouseup", this.eventMouseUp, false);
        Event.observe(document, "mousemove", this.eventMouseMove, false);
        WindowUtilities.disableScreen("__invisible__", "__invisible__", this.overlayOpacity);
        document.body.ondrag = function () {
            return false
        };
        document.body.onselectstart = function () {
            return false
        };
        this.currentDrag.show();
        Event.stop(b)
    },
    _round: function (b, a) {
        return a == 1 ? b : b = Math.floor(b / a) * a
    },
    _updateDrag: function (b) {
        var a = [this._round(Event.pointerX(b), this.options.gridX), this._round(Event.pointerY(b), this.options.gridY)];
        var k = a[0] - this.pointer[0];
        var j = a[1] - this.pointer[1];
        if (this.doResize) {
            var i = this.widthOrg + k;
            var d = this.heightOrg + j;
            k = this.width - this.widthOrg;
            j = this.height - this.heightOrg;
            if (this.useLeft) {
                i = this._updateWidthConstraint(i)
            } else {
                this.currentDrag.setStyle({
                    right: (this.rightOrg - k) + "px"
                })
            }
            if (this.useTop) {
                d = this._updateHeightConstraint(d)
            } else {
                this.currentDrag.setStyle({
                    bottom: (this.bottomOrg - j) + "px"
                })
            }
            this.setSize(i, d);
            this._notify("onResize")
        } else {
            this.pointer = a;
            if (this.useLeft) {
                var c = parseFloat(this.currentDrag.getStyle("left")) + k;
                var g = this._updateLeftConstraint(c);
                this.pointer[0] += g - c;
                this.currentDrag.setStyle({
                    left: g + "px"
                })
            } else {
                this.currentDrag.setStyle({
                    right: parseFloat(this.currentDrag.getStyle("right")) - k + "px"
                })
            }
            if (this.useTop) {
                var f = parseFloat(this.currentDrag.getStyle("top")) + j;
                var e = this._updateTopConstraint(f);
                this.pointer[1] += e - f;
                this.currentDrag.setStyle({
                    top: e + "px"
                })
            } else {
                this.currentDrag.setStyle({
                    bottom: parseFloat(this.currentDrag.getStyle("bottom")) - j + "px"
                })
            }
            this._notify("onMove")
        }
        if (this.iefix) {
            this._fixIEOverlapping()
        }
        this._removeStoreLocation();
        Event.stop(b)
    },
    _endDrag: function (a) {
        WindowUtilities.enableScreen("__invisible__");
        if (this.doResize) {
            this._notify("onEndResize")
        } else {
            this._notify("onEndMove")
        }
        Event.stopObserving(document, "mouseup", this.eventMouseUp, false);
        Event.stopObserving(document, "mousemove", this.eventMouseMove, false);
        Event.stop(a);
        this._hideWiredElement();
        this._saveCookie();
        document.body.ondrag = null;
        document.body.onselectstart = null
    },
    _updateLeftConstraint: function (b) {
        if (this.constraint && this.useLeft && this.useTop) {
            var a = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
            if (b < this.constraintPad.left) {
                b = this.constraintPad.left
            }
            if (b + this.width + this.widthE + this.widthW > a - this.constraintPad.right) {
                b = a - this.constraintPad.right - this.width - this.widthE - this.widthW
            }
        }
        return b
    },
    _updateTopConstraint: function (c) {
        if (this.constraint && this.useLeft && this.useTop) {
            var a = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
            var b = this.height + this.heightN + this.heightS;
            if (c < this.constraintPad.top) {
                c = this.constraintPad.top
            }
            if (c + b > a - this.constraintPad.bottom) {
                c = a - this.constraintPad.bottom - b
            }
        }
        return c
    },
    _updateWidthConstraint: function (a) {
        if (this.constraint && this.useLeft && this.useTop) {
            var b = this.options.parent == document.body ? WindowUtilities.getPageSize().windowWidth : this.options.parent.getDimensions().width;
            var c = parseFloat(this.element.getStyle("left"));
            if (c + a + this.widthE + this.widthW > b - this.constraintPad.right) {
                a = b - this.constraintPad.right - c - this.widthE - this.widthW
            }
        }
        return a
    },
    _updateHeightConstraint: function (b) {
        if (this.constraint && this.useLeft && this.useTop) {
            var a = this.options.parent == document.body ? WindowUtilities.getPageSize().windowHeight : this.options.parent.getDimensions().height;
            var c = parseFloat(this.element.getStyle("top"));
            if (c + b + this.heightN + this.heightS > a - this.constraintPad.bottom) {
                b = a - this.constraintPad.bottom - c - this.heightN - this.heightS
            }
        }
        return b
    },
    _createWindow: function (a) {
        var f = this.options.className;
        var d = document.createElement("div");
        d.setAttribute("id", a);
        d.className = "dialog";
        var e;
        if (this.options.url) {
            e = '<iframe frameborder="0" name="' + a + '_content"  id="' + a + '_content" src="' + this.options.url + '"> </iframe>'
        } else {
            e = '<div id="' + a + '_content" class="' + f + '_content"> </div>'
        }
        var g = this.options.closable ? "<div class='" + f + "_close' id='" + a + "_close' onclick='Windows.close(\"" + a + "\", event)'> </div>" : "";
        var h = this.options.minimizable ? "<div class='" + f + "_minimize' id='" + a + "_minimize' onclick='Windows.minimize(\"" + a + "\", event)'> </div>" : "";
        var i = this.options.maximizable ? "<div class='" + f + "_maximize' id='" + a + "_maximize' onclick='Windows.maximize(\"" + a + "\", event)'> </div>" : "";
        var c = this.options.resizable ? "class='" + f + "_sizer' id='" + a + "_sizer'" : "class='" + f + "_se'";
        var b = "..http://static.weblog.ro/themes/default/blank.v0.gif";
        d.innerHTML = g + h + i + "      <table id='" + a + "_row1' class=\"top table_window\">        <tr>          <td class='" + f + "_nw'></td>          <td class='" + f + "_n'><div id='" + a + "_top' class='" + f + "_title title_window'>" + this.options.title + "</div></td>          <td class='" + f + "_ne'></td>        </tr>      </table>      <table id='" + a + "_row2' class=\"mid table_window\">        <tr>          <td class='" + f + "_w'></td>            <td id='" + a + "_table_content' class='" + f + "_content' valign='top'>" + e + "</td>          <td class='" + f + "_e'></td>        </tr>      </table>        <table id='" + a + "_row3' class=\"bot table_window\">        <tr>          <td class='" + f + "_sw'></td>            <td class='" + f + "_s'><div id='" + a + "_bottom' class='status_bar'><span style='float:left; width:1px; height:1px'></span></div></td>            <td " + c + "></td>        </tr>      </table>    ";
        Element.hide(d);
        this.options.parent.insertBefore(d, this.options.parent.firstChild);
        Event.observe($(a + "_content"), "load", this.options.onload);
        return d
    },
    changeClassName: function (a) {
        var b = this.options.className;
        var c = this.getId();
        $A(["_close", "_minimize", "_maximize", "_sizer", "_content"]).each(function (d) {
            this._toggleClassName($(c + d), b + d, a + d)
        }.bind(this));
        this._toggleClassName($(c + "_top"), b + "_title", a + "_title");
        $$("#" + c + " td").each(function (d) {
            d.className = d.className.sub(b, a)
        });
        this.options.className = a
    },
    _toggleClassName: function (c, b, a) {
        if (c) {
            c.removeClassName(b);
            c.addClassName(a)
        }
    },
    setLocation: function (c, b) {
        c = this._updateTopConstraint(c);
        b = this._updateLeftConstraint(b);
        var a = this.currentDrag || this.element;
        a.setStyle({
            top: c + "px"
        });
        a.setStyle({
            left: b + "px"
        });
        this.useLeft = true;
        this.useTop = true
    },
    getLocation: function () {
        var a = {};
        if (this.useTop) {
            a = Object.extend(a, {
                top: this.element.getStyle("top")
            })
        } else {
            a = Object.extend(a, {
                bottom: this.element.getStyle("bottom")
            })
        }
        if (this.useLeft) {
            a = Object.extend(a, {
                left: this.element.getStyle("left")
            })
        } else {
            a = Object.extend(a, {
                right: this.element.getStyle("right")
            })
        }
        return a
    },
    getSize: function () {
        return {
            width: this.width,
            height: this.height
        }
    },
    setSize: function (c, b, a) {
        c = parseFloat(c);
        b = parseFloat(b);
        if (!this.minimized && c < this.options.minWidth) {
            c = this.options.minWidth
        }
        if (!this.minimized && b < this.options.minHeight) {
            b = this.options.minHeight
        }
        if (this.options.maxHeight && b > this.options.maxHeight) {
            b = this.options.maxHeight
        }
        if (this.options.maxWidth && c > this.options.maxWidth) {
            c = this.options.maxWidth
        }
        if (this.useTop && this.useLeft && Window.hasEffectLib && Effect.ResizeWindow && a) {
            new Effect.ResizeWindow(this, null, null, c, b, {
                duration: Window.resizeEffectDuration
            })
        } else {
            this.width = c;
            this.height = b;
            var f = this.currentDrag ? this.currentDrag : this.element;
            f.setStyle({
                width: c + this.widthW + this.widthE + "px"
            });
            f.setStyle({
                height: b + this.heightN + this.heightS + "px"
            });
            if (!this.currentDrag || this.currentDrag == this.element) {
                var d = $(this.element.id + "_content");
                d.setStyle({
                    height: b + "px"
                });
                d.setStyle({
                    width: c + "px"
                })
            }
        }
    },
    updateHeight: function () {
        this.setSize(this.width, this.content.scrollHeight, true)
    },
    updateWidth: function () {
        this.setSize(this.content.scrollWidth, this.height, true)
    },
    toFront: function () {
        if (this.element.style.zIndex < Windows.maxZIndex) {
            this.setZIndex(Windows.maxZIndex + 1)
        }
        if (this.iefix) {
            this._fixIEOverlapping()
        }
    },
    getBounds: function (b) {
        if (!this.width || !this.height || !this.visible) {
            this.computeBounds()
        }
        var a = this.width;
        var c = this.height;
        if (!b) {
            a += this.widthW + this.widthE;
            c += this.heightN + this.heightS
        }
        var d = Object.extend(this.getLocation(), {
            width: a + "px",
            height: c + "px"
        });
        return d
    },
    computeBounds: function () {
        if (!this.width || !this.height) {
            var a = WindowUtilities._computeSize(this.content.innerHTML, this.content.id, this.width, this.height, 0, this.options.className);
            if (this.height) {
                this.width = a + 5
            } else {
                this.height = a + 5
            }
        }
        this.setSize(this.width, this.height);
        if (this.centered) {
            this._center(this.centerTop, this.centerLeft)
        }
    },
    show: function (b) {
        this.visible = true;
        if (b) {
            if (typeof this.overlayOpacity == "undefined") {
                var a = this;
                setTimeout(function () {
                    a.show(b)
                },
                10);
                return
            }
            Windows.addModalWindow(this);
            this.modal = true;
            this.setZIndex(Windows.maxZIndex + 1);
            Windows.unsetOverflow(this)
        } else {
            if (!this.element.style.zIndex) {
                this.setZIndex(Windows.maxZIndex + 1)
            }
        }
        if (this.oldStyle) {
            this.getContent().setStyle({
                overflow: this.oldStyle
            })
        }
        this.computeBounds();
        this._notify("onBeforeShow");
        if (this.options.showEffect != Element.show && this.options.showEffectOptions) {
            this.options.showEffect(this.element, this.options.showEffectOptions)
        } else {
            this.options.showEffect(this.element)
        }
        this._checkIEOverlapping();
        WindowUtilities.focusedWindow = this;
        this._notify("onShow")
    },
    showCenter: function (a, c, b) {
        this.centered = true;
        this.centerTop = c;
        this.centerLeft = b;
        this.show(a)
    },
    isVisible: function () {
        return this.visible
    },
    _center: function (c, b) {
        var d = WindowUtilities.getWindowScroll(this.options.parent);
        var a = WindowUtilities.getPageSize(this.options.parent);
        if (typeof c == "undefined") {
            c = (a.windowHeight - (this.height + this.heightN + this.heightS)) / 2
        }
        c += d.top;
        if (typeof b == "undefined") {
            b = (a.windowWidth - (this.width + this.widthW + this.widthE)) / 2
        }
        b += d.left;
        this.setLocation(c, b);
        this.toFront()
    },
    _recenter: function (b) {
        if (this.centered) {
            var a = WindowUtilities.getPageSize(this.options.parent);
            var c = WindowUtilities.getWindowScroll(this.options.parent);
            if (this.pageSize && this.pageSize.windowWidth == a.windowWidth && this.pageSize.windowHeight == a.windowHeight && this.windowScroll.left == c.left && this.windowScroll.top == c.top) {
                return
            }
            this.pageSize = a;
            this.windowScroll = c;
            if ($("overlay_modal")) {
                $("overlay_modal").setStyle({
                    height: (a.pageHeight + "px")
                })
            }
            if (this.options.recenterAuto) {
                this._center(this.centerTop, this.centerLeft)
            }
        }
    },
    hide: function () {
        this.visible = false;
        if (this.modal) {
            Windows.removeModalWindow(this);
            Windows.resetOverflow()
        }
        this.oldStyle = this.getContent().getStyle("overflow") || "auto";
        this.getContent().setStyle({
            overflow: "hidden"
        });
        this.options.hideEffect(this.element, this.options.hideEffectOptions);
        if (this.iefix) {
            this.iefix.hide()
        }
        if (!this.doNotNotifyHide) {
            this._notify("onHide")
        }
    },
    close: function () {
        if (this.visible) {
            if (this.options.closeCallback && !this.options.closeCallback(this)) {
                return
            }
            if (this.options.destroyOnClose) {
                var a = this.destroy.bind(this);
                if (this.options.hideEffectOptions.afterFinish) {
                    var b = this.options.hideEffectOptions.afterFinish;
                    this.options.hideEffectOptions.afterFinish = function () {
                        b();
                        a()
                    }
                } else {
                    this.options.hideEffectOptions.afterFinish = function () {
                        a()
                    }
                }
            }
            Windows.updateFocusedWindow();
            this.doNotNotifyHide = true;
            this.hide();
            this.doNotNotifyHide = false;
            this._notify("onClose")
        }
    },
    minimize: function () {
        if (this.resizing) {
            return
        }
        var a = $(this.getId() + "_row2");
        if (!this.minimized) {
            this.minimized = true;
            var d = a.getDimensions().height;
            this.r2Height = d;
            var c = this.element.getHeight() - d;
            if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
                new Effect.ResizeWindow(this, null, null, null, this.height - d, {
                    duration: Window.resizeEffectDuration
                })
            } else {
                this.height -= d;
                this.element.setStyle({
                    height: c + "px"
                });
                a.hide()
            }
            if (!this.useTop) {
                var b = parseFloat(this.element.getStyle("bottom"));
                this.element.setStyle({
                    bottom: (b + d) + "px"
                })
            }
        } else {
            this.minimized = false;
            var d = this.r2Height;
            this.r2Height = null;
            if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
                new Effect.ResizeWindow(this, null, null, null, this.height + d, {
                    duration: Window.resizeEffectDuration
                })
            } else {
                var c = this.element.getHeight() + d;
                this.height += d;
                this.element.setStyle({
                    height: c + "px"
                });
                a.show()
            }
            if (!this.useTop) {
                var b = parseFloat(this.element.getStyle("bottom"));
                this.element.setStyle({
                    bottom: (b - d) + "px"
                })
            }
            this.toFront()
        }
        this._notify("onMinimize");
        this._saveCookie()
    },
    maximize: function () {
        if (this.isMinimized() || this.resizing) {
            return
        }
        if (Prototype.Browser.IE && this.heightN == 0) {
            this._getWindowBorderSize()
        }
        if (this.storedLocation != null) {
            this._restoreLocation();
            if (this.iefix) {
                this.iefix.hide()
            }
        } else {
            this._storeLocation();
            Windows.unsetOverflow(this);
            var g = WindowUtilities.getWindowScroll(this.options.parent);
            var b = WindowUtilities.getPageSize(this.options.parent);
            var f = g.left;
            var e = g.top;
            if (this.options.parent != document.body) {
                g = {
                    top: 0,
                    left: 0,
                    bottom: 0,
                    right: 0
                };
                var d = this.options.parent.getDimensions();
                b.windowWidth = d.width;
                b.windowHeight = d.height;
                e = 0;
                f = 0
            }
            if (this.constraint) {
                b.windowWidth -= Math.max(0, this.constraintPad.left) + Math.max(0, this.constraintPad.right);
                b.windowHeight -= Math.max(0, this.constraintPad.top) + Math.max(0, this.constraintPad.bottom);
                f += Math.max(0, this.constraintPad.left);
                e += Math.max(0, this.constraintPad.top)
            }
            var c = b.windowWidth - this.widthW - this.widthE;
            var a = b.windowHeight - this.heightN - this.heightS;
            if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
                new Effect.ResizeWindow(this, e, f, c, a, {
                    duration: Window.resizeEffectDuration
                })
            } else {
                this.setSize(c, a);
                this.element.setStyle(this.useLeft ? {
                    left: f
                } : {
                    right: f
                });
                this.element.setStyle(this.useTop ? {
                    top: e
                } : {
                    bottom: e
                })
            }
            this.toFront();
            if (this.iefix) {
                this._fixIEOverlapping()
            }
        }
        this._notify("onMaximize");
        this._saveCookie()
    },
    isMinimized: function () {
        return this.minimized
    },
    isMaximized: function () {
        return (this.storedLocation != null)
    },
    setOpacity: function (a) {
        if (Element.setOpacity) {
            Element.setOpacity(this.element, a)
        }
    },
    setZIndex: function (a) {
        this.element.setStyle({
            zIndex: a
        });
        Windows.updateZindex(a, this)
    },
    setTitle: function (a) {
        if (!a || a == "") {
            a = "&nbsp;"
        }
        Element.update(this.element.id + "_top", a)
    },
    getTitle: function () {
        return $(this.element.id + "_top").innerHTML
    },
    setStatusBar: function (b) {
        var a = $(this.getId() + "_bottom");
        if (typeof(b) == "object") {
            if (this.bottombar.firstChild) {
                this.bottombar.replaceChild(b, this.bottombar.firstChild)
            } else {
                this.bottombar.appendChild(b)
            }
        } else {
            this.bottombar.innerHTML = b
        }
    },
    _checkIEOverlapping: function () {
        if (!this.iefix && (navigator.appVersion.indexOf("MSIE") > 0) && (navigator.userAgent.indexOf("Opera") < 0) && (this.element.getStyle("position") == "absolute")) {
            new Insertion.After(this.element.id, '<iframe id="' + this.element.id + '_iefix" style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
            this.iefix = $(this.element.id + "_iefix")
        }
        if (this.iefix) {
            setTimeout(this._fixIEOverlapping.bind(this), 50)
        }
    },
    _fixIEOverlapping: function () {
        Position.clone(this.element, this.iefix);
        this.iefix.style.zIndex = this.element.style.zIndex - 1;
        this.iefix.show()
    },
    _getWindowBorderSize: function (b) {
        var c = this._createHiddenDiv(this.options.className + "_n");
        this.heightN = Element.getDimensions(c).height;
        c.parentNode.removeChild(c);
        var c = this._createHiddenDiv(this.options.className + "_s");
        this.heightS = Element.getDimensions(c).height;
        c.parentNode.removeChild(c);
        var c = this._createHiddenDiv(this.options.className + "_e");
        this.widthE = Element.getDimensions(c).width;
        c.parentNode.removeChild(c);
        var c = this._createHiddenDiv(this.options.className + "_w");
        this.widthW = Element.getDimensions(c).width;
        c.parentNode.removeChild(c);
        var c = document.createElement("div");
        c.className = "overlay_" + this.options.className;
        document.body.appendChild(c);
        var a = this;
        setTimeout(function () {
            a.overlayOpacity = ($(c).getStyle("opacity"));
            c.parentNode.removeChild(c)
        },
        10);
        if (Prototype.Browser.IE) {
            this.heightS = $(this.getId() + "_row3").getDimensions().height;
            this.heightN = $(this.getId() + "_row1").getDimensions().height
        }
        if (Prototype.Browser.WebKit && Prototype.Browser.WebKitVersion < 420) {
            this.setSize(this.width, this.height)
        }
        if (this.doMaximize) {
            this.maximize()
        }
        if (this.doMinimize) {
            this.minimize()
        }
    },
    _createHiddenDiv: function (b) {
        var a = document.body;
        var c = document.createElement("div");
        c.setAttribute("id", this.element.id + "_tmp");
        c.className = b;
        c.style.display = "none";
        c.innerHTML = "";
        a.insertBefore(c, a.firstChild);
        return c
    },
    _storeLocation: function () {
        if (this.storedLocation == null) {
            this.storedLocation = {
                useTop: this.useTop,
                useLeft: this.useLeft,
                top: this.element.getStyle("top"),
                bottom: this.element.getStyle("bottom"),
                left: this.element.getStyle("left"),
                right: this.element.getStyle("right"),
                width: this.width,
                height: this.height
            }
        }
    },
    _restoreLocation: function () {
        if (this.storedLocation != null) {
            this.useLeft = this.storedLocation.useLeft;
            this.useTop = this.storedLocation.useTop;
            if (this.useLeft && this.useTop && Window.hasEffectLib && Effect.ResizeWindow) {
                new Effect.ResizeWindow(this, this.storedLocation.top, this.storedLocation.left, this.storedLocation.width, this.storedLocation.height, {
                    duration: Window.resizeEffectDuration
                })
            } else {
                this.element.setStyle(this.useLeft ? {
                    left: this.storedLocation.left
                } : {
                    right: this.storedLocation.right
                });
                this.element.setStyle(this.useTop ? {
                    top: this.storedLocation.top
                } : {
                    bottom: this.storedLocation.bottom
                });
                this.setSize(this.storedLocation.width, this.storedLocation.height)
            }
            Windows.resetOverflow();
            this._removeStoreLocation()
        }
    },
    _removeStoreLocation: function () {
        this.storedLocation = null
    },
    _saveCookie: function () {
        if (this.cookie) {
            var a = "";
            if (this.useLeft) {
                a += "l:" + (this.storedLocation ? this.storedLocation.left : this.element.getStyle("left"))
            } else {
                a += "r:" + (this.storedLocation ? this.storedLocation.right : this.element.getStyle("right"))
            }
            if (this.useTop) {
                a += ",t:" + (this.storedLocation ? this.storedLocation.top : this.element.getStyle("top"))
            } else {
                a += ",b:" + (this.storedLocation ? this.storedLocation.bottom : this.element.getStyle("bottom"))
            }
            a += "," + (this.storedLocation ? this.storedLocation.width : this.width);
            a += "," + (this.storedLocation ? this.storedLocation.height : this.height);
            a += "," + this.isMinimized();
            a += "," + this.isMaximized();
            WindowUtilities.setCookie(a, this.cookie)
        }
    },
    _createWiredElement: function () {
        if (!this.wiredElement) {
            if (Prototype.Browser.IE) {
                this._getWindowBorderSize()
            }
            var b = document.createElement("div");
            b.className = "wired_frame " + this.options.className + "_wired_frame";
            b.style.position = "absolute";
            this.options.parent.insertBefore(b, this.options.parent.firstChild);
            this.wiredElement = $(b)
        }
        if (this.useLeft) {
            this.wiredElement.setStyle({
                left: this.element.getStyle("left")
            })
        } else {
            this.wiredElement.setStyle({
                right: this.element.getStyle("right")
            })
        }
        if (this.useTop) {
            this.wiredElement.setStyle({
                top: this.element.getStyle("top")
            })
        } else {
            this.wiredElement.setStyle({
                bottom: this.element.getStyle("bottom")
            })
        }
        var a = this.element.getDimensions();
        this.wiredElement.setStyle({
            width: a.width + "px",
            height: a.height + "px"
        });
        this.wiredElement.setStyle({
            zIndex: Windows.maxZIndex + 30
        });
        return this.wiredElement
    },
    _hideWiredElement: function () {
        if (!this.wiredElement || !this.currentDrag) {
            return
        }
        if (this.currentDrag == this.element) {
            this.currentDrag = null
        } else {
            if (this.useLeft) {
                this.element.setStyle({
                    left: this.currentDrag.getStyle("left")
                })
            } else {
                this.element.setStyle({
                    right: this.currentDrag.getStyle("right")
                })
            }
            if (this.useTop) {
                this.element.setStyle({
                    top: this.currentDrag.getStyle("top")
                })
            } else {
                this.element.setStyle({
                    bottom: this.currentDrag.getStyle("bottom")
                })
            }
            this.currentDrag.hide();
            this.currentDrag = null;
            if (this.doResize) {
                this.setSize(this.width, this.height)
            }
        }
    },
    _notify: function (a) {
        if (this.options[a]) {
            this.options[a](this)
        } else {
            Windows.notify(a, this)
        }
    }
};
var Windows = {
    windows: [],
    modalWindows: [],
    observers: [],
    focusedWindow: null,
    maxZIndex: 0,
    overlayShowEffectOptions: {
        duration: 0.5
    },
    overlayHideEffectOptions: {
        duration: 0.5
    },
    addObserver: function (a) {
        this.removeObserver(a);
        this.observers.push(a)
    },
    removeObserver: function (a) {
        this.observers = this.observers.reject(function (b) {
            return b == a
        })
    },
    notify: function (a, b) {
        this.observers.each(function (c) {
            if (c[a]) {
                c[a](a, b)
            }
        })
    },
    getWindow: function (a) {
        return this.windows.detect(function (b) {
            return b.getId() == a
        })
    },
    getFocusedWindow: function () {
        return this.focusedWindow
    },
    updateFocusedWindow: function () {
        this.focusedWindow = this.windows.length >= 2 ? this.windows[this.windows.length - 2] : null
    },
    register: function (a) {
        this.windows.push(a)
    },
    addModalWindow: function (a) {
        if (this.modalWindows.length == 0) {
            WindowUtilities.disableScreen(a.options.className, "overlay_modal", a.overlayOpacity, a.getId(), a.options.parent)
        } else {
            if (Window.keepMultiModalWindow) {
                $("overlay_modal").style.zIndex = Windows.maxZIndex + 1;
                Windows.maxZIndex += 1;
                WindowUtilities._hideSelect(this.modalWindows.last().getId())
            } else {
                this.modalWindows.last().element.hide()
            }
            WindowUtilities._showSelect(a.getId())
        }
        this.modalWindows.push(a)
    },
    removeModalWindow: function (a) {
        this.modalWindows.pop();
        if (this.modalWindows.length == 0) {
            WindowUtilities.enableScreen()
        } else {
            if (Window.keepMultiModalWindow) {
                this.modalWindows.last().toFront();
                WindowUtilities._showSelect(this.modalWindows.last().getId())
            } else {
                this.modalWindows.last().element.show()
            }
        }
    },
    register: function (a) {
        this.windows.push(a)
    },
    unregister: function (a) {
        this.windows = this.windows.reject(function (b) {
            return b == a
        })
    },
    closeAll: function () {
        this.windows.each(function (a) {
            Windows.close(a.getId())
        })
    },
    closeAllModalWindows: function () {
        WindowUtilities.enableScreen();
        this.modalWindows.each(function (a) {
            if (a) {
                a.close()
            }
        })
    },
    minimize: function (c, a) {
        var b = this.getWindow(c);
        if (b && b.visible) {
            b.minimize()
        }
        Event.stop(a)
    },
    maximize: function (c, a) {
        var b = this.getWindow(c);
        if (b && b.visible) {
            b.maximize()
        }
        Event.stop(a)
    },
    close: function (c, a) {
        var b = this.getWindow(c);
        if (b) {
            b.close()
        }
        if (a) {
            Event.stop(a)
        }
    },
    blur: function (b) {
        var a = this.getWindow(b);
        if (!a) {
            return
        }
        if (a.options.blurClassName) {
            a.changeClassName(a.options.blurClassName)
        }
        if (this.focusedWindow == a) {
            this.focusedWindow = null
        }
        a._notify("onBlur")
    },
    focus: function (b) {
        var a = this.getWindow(b);
        if (!a) {
            return
        }
        if (this.focusedWindow) {
            this.blur(this.focusedWindow.getId())
        }
        if (a.options.focusClassName) {
            a.changeClassName(a.options.focusClassName)
        }
        this.focusedWindow = a;
        a._notify("onFocus")
    },
    unsetOverflow: function (a) {
        this.windows.each(function (b) {
            b.oldOverflow = b.getContent().getStyle("overflow") || "auto";
            b.getContent().setStyle({
                overflow: "hidden"
            })
        });
        if (a && a.oldOverflow) {
            a.getContent().setStyle({
                overflow: a.oldOverflow
            })
        }
    },
    resetOverflow: function () {
        this.windows.each(function (a) {
            if (a.oldOverflow) {
                a.getContent().setStyle({
                    overflow: a.oldOverflow
                })
            }
        })
    },
    updateZindex: function (a, b) {
        if (a > this.maxZIndex) {
            this.maxZIndex = a;
            if (this.focusedWindow) {
                this.blur(this.focusedWindow.getId())
            }
        }
        this.focusedWindow = b;
        if (this.focusedWindow) {
            this.focus(this.focusedWindow.getId())
        }
    }
};
var Dialog = {
    dialogId: null,
    onCompleteFunc: null,
    callFunc: null,
    parameters: null,
    confirm: function (d, c) {
        if (d && typeof d != "string") {
            Dialog._runAjaxRequest(d, c, Dialog.confirm);
            return
        }
        d = d || "";
        c = c || {};
        var f = c.okLabel ? c.okLabel : "Ok";
        var a = c.cancelLabel ? c.cancelLabel : "Cancel";
        c = Object.extend(c, c.windowParameters || {});
        c.windowParameters = c.windowParameters || {};
        c.className = c.className || "alert";
        var b = "class ='" + (c.buttonClass ? c.buttonClass + " " : "") + " ok_button'";
        var e = "class ='" + (c.buttonClass ? c.buttonClass + " " : "") + " cancel_button'";
        var d = "      <div class='" + c.className + "_message'>" + d + "</div>        <div class='" + c.className + "_buttons'>          <input type='button' value='" + f + "' onclick='Dialog.okCallback()' " + b + "/>          <input type='button' value='" + a + "' onclick='Dialog.cancelCallback()' " + e + "/>        </div>    ";
        return this._openDialog(d, c)
    },
    alert: function (c, b) {
        if (c && typeof c != "string") {
            Dialog._runAjaxRequest(c, b, Dialog.alert);
            return
        }
        c = c || "";
        b = b || {};
        var d = b.okLabel ? b.okLabel : "Ok";
        b = Object.extend(b, b.windowParameters || {});
        b.windowParameters = b.windowParameters || {};
        b.className = b.className || "alert";
        var a = "class ='" + (b.buttonClass ? b.buttonClass + " " : "") + " ok_button'";
        var c = "      <div class='" + b.className + "_message'>" + c + "</div>        <div class='" + b.className + "_buttons'>          <input type='button' value='" + d + "' onclick='Dialog.okCallback()' " + a + "/>        </div>";
        return this._openDialog(c, b)
    },
    info: function (b, a) {
        if (b && typeof b != "string") {
            Dialog._runAjaxRequest(b, a, Dialog.info);
            return
        }
        b = b || "";
        a = a || {};
        a = Object.extend(a, a.windowParameters || {});
        a.windowParameters = a.windowParameters || {};
        a.className = a.className || "alert";
        var b = "<div id='modal_dialog_message' class='" + a.className + "_message'>" + b + "</div>";
        if (a.showProgress) {
            b += "<div id='modal_dialog_progress' class='" + a.className + "_progress'>  </div>"
        }
        a.ok = null;
        a.cancel = null;
        return this._openDialog(b, a)
    },
    setInfoMessage: function (a) {
        $("modal_dialog_message").update(a)
    },
    closeInfo: function () {
        Windows.close(this.dialogId)
    },
    _openDialog: function (e, d) {
        var c = d.className;
        if (!d.height && !d.width) {
            d.width = WindowUtilities.getPageSize(d.options.parent || document.body).pageWidth / 2
        }
        if (d.id) {
            this.dialogId = d.id
        } else {
            var b = new Date();
            this.dialogId = "modal_dialog_" + b.getTime();
            d.id = this.dialogId
        }
        if (!d.height || !d.width) {
            var a = WindowUtilities._computeSize(e, this.dialogId, d.width, d.height, 5, c);
            if (d.height) {
                d.width = a + 5
            } else {
                d.height = a + 5
            }
        }
        d.effectOptions = d.effectOptions;
        d.resizable = d.resizable || false;
        d.minimizable = d.minimizable || false;
        d.maximizable = d.maximizable || false;
        d.draggable = d.draggable || false;
        d.closable = d.closable || false;
        var f = new Window(d);
        f.getContent().innerHTML = e;
        f.showCenter(true, d.top, d.left);
        f.setDestroyOnClose();
        f.cancelCallback = d.onCancel || d.cancel;
        f.okCallback = d.onOk || d.ok;
        return f
    },
    _getAjaxContent: function (a) {
        Dialog.callFunc(a.responseText, Dialog.parameters)
    },
    _runAjaxRequest: function (c, b, a) {
        if (c.options == null) {
            c.options = {}
        }
        Dialog.onCompleteFunc = c.options.onComplete;
        Dialog.parameters = b;
        Dialog.callFunc = a;
        c.options.onComplete = Dialog._getAjaxContent;
        new Ajax.Request(c.url, c.options)
    },
    okCallback: function () {
        var a = Windows.focusedWindow;
        if (!a.okCallback || a.okCallback(a)) {
            $$("#" + a.getId() + " input").each(function (b) {
                b.onclick = null
            });
            a.close()
        }
    },
    cancelCallback: function () {
        var a = Windows.focusedWindow;
        $$("#" + a.getId() + " input").each(function (b) {
            b.onclick = null
        });
        a.close();
        if (a.cancelCallback) {
            a.cancelCallback(a)
        }
    }
};
if (Prototype.Browser.WebKit) {
    var array = navigator.userAgent.match(new RegExp(/AppleWebKit\/([\d\.\+]*)/));
    Prototype.Browser.WebKitVersion = parseFloat(array[1])
}
var WindowUtilities = {
    getWindowScroll: function (parent) {
        var T, L, W, H;
        parent = parent || document.body;
        if (parent != document.body) {
            T = parent.scrollTop;
            L = parent.scrollLeft;
            W = parent.scrollWidth;
            H = parent.scrollHeight
        } else {
            var w = window;
            with(w.document) {
                if (w.document.documentElement && documentElement.scrollTop) {
                    T = documentElement.scrollTop;
                    L = documentElement.scrollLeft
                } else {
                    if (w.document.body) {
                        T = body.scrollTop;
                        L = body.scrollLeft
                    }
                }
                if (w.innerWidth) {
                    W = w.innerWidth;
                    H = w.innerHeight
                } else {
                    if (w.document.documentElement && documentElement.clientWidth) {
                        W = documentElement.clientWidth;
                        H = documentElement.clientHeight
                    } else {
                        W = body.offsetWidth;
                        H = body.offsetHeight
                    }
                }
            }
        }
        return {
            top: T,
            left: L,
            width: W,
            height: H
        }
    },
    getPageSize: function (d) {
        d = d || document.body;
        var c, g;
        var e, b;
        if (d != document.body) {
            c = d.getWidth();
            g = d.getHeight();
            b = d.scrollWidth;
            e = d.scrollHeight
        } else {
            var f, a;
            if (window.innerHeight && window.scrollMaxY) {
                f = document.body.scrollWidth;
                a = window.innerHeight + window.scrollMaxY
            } else {
                if (document.body.scrollHeight > document.body.offsetHeight) {
                    f = document.body.scrollWidth;
                    a = document.body.scrollHeight
                } else {
                    f = document.body.offsetWidth;
                    a = document.body.offsetHeight
                }
            }
            if (self.innerHeight) {
                c = self.innerWidth;
                g = self.innerHeight
            } else {
                if (document.documentElement && document.documentElement.clientHeight) {
                    c = document.documentElement.clientWidth;
                    g = document.documentElement.clientHeight
                } else {
                    if (document.body) {
                        c = document.body.clientWidth;
                        g = document.body.clientHeight
                    }
                }
            }
            if (a < g) {
                e = g
            } else {
                e = a
            }
            if (f < c) {
                b = c
            } else {
                b = f
            }
        }
        return {
            pageWidth: b,
            pageHeight: e,
            windowWidth: c,
            windowHeight: g
        }
    },
    disableScreen: function (c, a, d, e, b) {
        WindowUtilities.initLightbox(a, c, function () {
            this._disableScreen(c, a, d, e)
        }.bind(this), b || document.body)
    },
    _disableScreen: function (c, b, e, f) {
        var d = $(b);
        var a = WindowUtilities.getPageSize(d.parentNode);
        if (f && Prototype.Browser.IE) {
            WindowUtilities._hideSelect();
            WindowUtilities._showSelect(f)
        }
        d.style.height = (a.pageHeight + "px");
        d.style.display = "none";
        if (b == "overlay_modal" && Window.hasEffectLib && Windows.overlayShowEffectOptions) {
            d.overlayOpacity = e;
            new Effect.Appear(d, Object.extend({
                from: 0,
                to: e
            },
            Windows.overlayShowEffectOptions))
        } else {
            d.style.display = "block"
        }
    },
    enableScreen: function (b) {
        b = b || "overlay_modal";
        var a = $(b);
        if (a) {
            if (b == "overlay_modal" && Window.hasEffectLib && Windows.overlayHideEffectOptions) {
                new Effect.Fade(a, Object.extend({
                    from: a.overlayOpacity,
                    to: 0
                },
                Windows.overlayHideEffectOptions))
            } else {
                a.style.display = "none";
                a.parentNode.removeChild(a)
            }
            if (b != "__invisible__") {
                WindowUtilities._showSelect()
            }
        }
    },
    _hideSelect: function (a) {
        if (Prototype.Browser.IE) {
            a = a == null ? "" : "#" + a + " ";
            $$(a + "select").each(function (b) {
                if (!WindowUtilities.isDefined(b.oldVisibility)) {
                    b.oldVisibility = b.style.visibility ? b.style.visibility : "visible";
                    b.style.visibility = "hidden"
                }
            })
        }
    },
    _showSelect: function (a) {
        if (Prototype.Browser.IE) {
            a = a == null ? "" : "#" + a + " ";
            $$(a + "select").each(function (b) {
                if (WindowUtilities.isDefined(b.oldVisibility)) {
                    try {
                        b.style.visibility = b.oldVisibility
                    } catch(c) {
                        b.style.visibility = "visible"
                    }
                    b.oldVisibility = null
                } else {
                    if (b.style.visibility) {
                        b.style.visibility = "visible"
                    }
                }
            })
        }
    },
    isDefined: function (a) {
        return typeof(a) != "undefined" && a != null
    },
    initLightbox: function (e, c, a, b) {
        if ($(e)) {
            Element.setStyle(e, {
                zIndex: Windows.maxZIndex + 1
            });
            Windows.maxZIndex++;
            a()
        } else {
            var d = document.createElement("div");
            d.setAttribute("id", e);
            d.className = "overlay_" + c;
            d.style.display = "none";
            d.style.position = "absolute";
            d.style.top = "0";
            d.style.left = "0";
            d.style.zIndex = Windows.maxZIndex + 1;
            Windows.maxZIndex++;
            d.style.width = "100%";
            b.insertBefore(d, b.firstChild);
            if (Prototype.Browser.WebKit && e == "overlay_modal") {
                setTimeout(function () {
                    a()
                },
                10)
            } else {
                a()
            }
        }
    },
    setCookie: function (b, a) {
        document.cookie = a[0] + "=" + escape(b) + ((a[1]) ? "; expires=" + a[1].toGMTString() : "") + ((a[2]) ? "; path=" + a[2] : "") + ((a[3]) ? "; domain=" + a[3] : "") + ((a[4]) ? "; secure" : "")
    },
    getCookie: function (c) {
        var b = document.cookie;
        var e = c + "=";
        var d = b.indexOf("; " + e);
        if (d == -1) {
            d = b.indexOf(e);
            if (d != 0) {
                return null
            }
        } else {
            d += 2
        }
        var a = document.cookie.indexOf(";", d);
        if (a == -1) {
            a = b.length
        }
        return unescape(b.substring(d + e.length, a))
    },
    _computeSize: function (e, a, b, g, d, f) {
        var i = document.body;
        var c = document.createElement("div");
        c.setAttribute("id", a);
        c.className = f + "_content";
        if (g) {
            c.style.height = g + "px"
        } else {
            c.style.width = b + "px"
        }
        c.style.position = "absolute";
        c.style.top = "0";
        c.style.left = "0";
        c.style.display = "none";
        c.innerHTML = e;
        i.insertBefore(c, i.firstChild);
        var h;
        if (g) {
            h = $(c).getDimensions().width + d
        } else {
            h = $(c).getDimensions().height + d
        }
        i.removeChild(c);
        return h
    }
};
Ajax.Responders.register({
    ajaxOverlayer: null,
    onCreate: onCreate,
    onComplete: onComplete
});

function onCreate(d) {
    if (!Object.isUndefined(d.options.overlayer)) {
        var b = d.options.overlayer.color || "#b6edfb";
        var c = d.options.overlayer.opacity || 0.5;
        var a = d.options.overlayer.id || document.body.identify();
        var e = d.options.overlayer.zIndex || 10;
        if (!this.ajaxOverlayer) {
            this.ajaxOverlayer = new Loader(a, {
                color: b,
                opacity: c,
                zIndex: e,
                src: "http://static.weblog.ro/modules/default/img/overlayerLoader.v0.gif",
                container: $(document.body).identify()
            })
        }
        this.ajaxOverlayer.show()
    }
    if (!Object.isUndefined(d.options.message)) {
        setDefaultMessageIcon();
        $("loadingMessage").update(d.options.message);
        $("loading").style.display = "block"
    }
}
function onComplete(g, f, c) {
    try {
        if (c && c.update) {
            var e = null;
            if (c.dataProvider == "response") {
                e = f.responseText.evalJSON()
            } else {
                e = c
            }
            ModifyDom.processAjaxHelperData(e)
        }
    } catch(b) {
        console.log(b)
    }
    var d;
    var a = true;
    if (!Object.isUndefined(g.options.overlayer)) {
        this.ajaxOverlayer.hide()
    }
    if (Object.isUndefined(g.options.messageTimeout)) {
        d = 1000
    } else {
        if (! (d = g.options.messageTimeout)) {
            a = false
        }
    }
    if (a) {
        if (window.messageTimeoutAjax) {
            clearTimeout(window.messageTimeoutAjax)
        }
        window.messageTimeoutAjax = setTimeout(function () {
            $("loading").hide()
        },
        d)
    }
}
function setDefaultMessageIcon() {
    var a = $("loadingIcon");
    if (!a) {
        return
    }
    if (!window.oldIcon) {
        window.oldIcon = {
            src: "http://static.weblog.ro/modules/default/img/misc/loading.v0.gif",
            width: 16,
            height: 16
        }
    }
    a.src = window.oldIcon.src;
    a.width = window.oldIcon.width;
    a.height = window.oldIcon.height
}
function UIMessage(c, b, a) {
    var d = $("loadingIcon");
    switch (b) {
    case "warning":
        d.src = "http://static.weblog.ro/modules/default/img/misc/_warning.v0.png";
        d.width = 14;
        d.height = 14;
        break;
    case "error":
        d.src = "http://static.weblog.ro/modules/default/img/misc/_error.v0.png";
        d.width = 14;
        d.height = 14;
        break;
    case "done":
        d.src = "http://static.weblog.ro/modules/default/img/misc/_done.v0.png";
        d.width = 14;
        d.height = 14;
        break;
    case "help":
        d.src = "http://static.weblog.ro/modules/default/img/misc/_help.v0.png";
        d.width = 14;
        d.height = 14;
        break;
    case "loading":
        setDefaultMessageIcon();
        break;
    case "info":
    default:
        d.src = "http://static.weblog.ro/modules/default/img/misc/_info.v0.png";
        d.width = 14;
        d.height = 14;
        break
    }
    $("loadingMessage").update(c);
    $("loading").style.display = "block";
    setTimeout(function () {
        $("loading").hide()
    },
    (a ? a : 1000))
}
function setCookie(c, d, f, e) {
    if (Object.isUndefined("path")) {
        throw ("Path parameter is required!")
    }
    if (f) {
        var b = new Date();
        b.setTime(b.getTime() + (f * 24 * 60 * 60 * 1000));
        var a = "; expires=" + b.toGMTString()
    } else {
        var a = ""
    }
    document.cookie = c + "=" + d + a + "; path=" + e
}
function readCookie(b) {
    var e = b + "=";
    var a = document.cookie.split(";");
    for (var d = 0; d < a.length; d++) {
        var f = a[d];
        while (f.charAt(0) == " ") {
            f = f.substring(1, f.length)
        }
        if (f.indexOf(e) == 0) {
            return f.substring(e.length, f.length)
        }
    }
    return null
}
function fireEvent(c, a) {
    var d = c;
    if (document.createEvent) {
        var b = document.createEvent("MouseEvents");
        b.initEvent(a, true, false);
        d.dispatchEvent(b)
    } else {
        if (document.createEventObject) {
            d.fireEvent("on" + a)
        }
    }
}
function showAbuseForm(c, b, d, a) {
    Dialog.Confirm.ajax("/abuse?context=" + c, {
        modal: true,
        title: null,
        zindex: 2,
        width: 600,
        height: 310,
        id: "abuseWindow",
        onSuccess: function () {
            Abuse.context = c;
            Abuse.targetUserid = b;
            Abuse.targetUsername = d;
            Abuse.refference = a;
            if (!Abuse.send()) {
                return false
            }
            Abuse.displayConfirmation();
            return false
        },
        onFailure: function () {
            Abuse.cancel()
        }
    })
}
function togglecontactForm() {
    if ($("contactForm").getWidth() < 200) {
        $("contactForm").morph("width:407px;");
        $("contactFormContainer").morph("width:450px;");
        $("submitcontactForm").show();
        $("contactButton").morph("right:398px;");
        $("contactButtonLink").addClassName("buttonOff")
    } else {
        $("contactForm").morph("width:0px;");
        $("contactFormContainer").morph("width:50px;");
        $("submitcontactForm").hide();
        $("contactButton").morph("right:-9px;");
        $("contactButtonLink").removeClassName("buttonOff")
    }
    return false
}
document.observe("dom:loaded", function () {
    if ($("showTutorialLink")) {
        $("showTutorialLink").observe("click", function (a) {
            a.stop();
            showTutorial()
        })
    }
});

function showTutorial() {
    var a = "<div>";
    a += $("tutorialContent").innerHTML;
    a += "</div>";
    Dialog.Confirm.show(a, {
        title: null,
        height: 440,
        width: 580,
        zIndex: 1000
    })
}
Object.extend(Event, (function () {
    var a = {};
    return {
        delegate: function (d, c) {
            if (arguments[3]) {
                var g = {};
                g[arguments[2]] = arguments[3]
            } else {
                var g = Object.extend({},
                arguments[2])
            }
            var e = $(d),
                f = c,
                h = e.identify ? e.identify() : "document";
            if (!a[h]) {
                a[h] = {
                    "$observer": function (n) {
                        var m = n.element();
                        if (a[h][n.type]) {
                            for (var l = 0, k = a[h][n.type].length; l < k; l++) {
                                for (var j in a[h][n.type][l]) {
                                    if (a[h][n.type][l][j][1].match(m)) {
                                        a[h][n.type][l][j][0](n)
                                    }
                                }
                            }
                        }
                    }
                }
            }
            if (!a[h][f]) {
                a[h][f] = [];
                e.observe(f, a[h]["$observer"])
            }
            for (var b in g) {
                g[b] = [g[b], new Selector(b)]
            }
            a[h][f].push(g);
            return e
        },
        stopDelegating: function (f, h) {
            if (f === undefined) {
                for (var b in a) {
                    Event.stopDelegating(b == "$document" ? document : b)
                }
                a = {};
                return true
            }
            if (Object.isString(arguments[2])) {
                var l = {};
                l[arguments[2]] = true
            } else {
                if (arguments[2]) {
                    var l = arguments[2]
                } else {
                    var l = false
                }
            }
            var d = $(f),
                k = h,
                b = d.identify ? d.identify() : "$document";
            if (a[b]) {
                if (k && a[b][k]) {
                    for (var g = 0, j = a[b][k].length; g < j; g++) {
                        if (l) {
                            for (var e in l) {
                                delete a[b][k][g][e]
                            }
                        }
                        if (!l || $H(a[b][k][g]).size() == 0) {
                            d.stopObserving(k, a[b]["$observer"]);
                            a[b][k][g] = "r"
                        }
                    }
                    a[b][k] = a[b][k].without("r")
                } else {
                    for (var c in a[b]) {
                        if (c != "$observer") {
                            d.stopObserving(c, a[b]["$observer"])
                        }
                    }
                    delete a[b]
                }
            }
            return d
        }
    }
})());
Element.addMethods({
    delegate: Event.delegate,
    stopDelegating: Event.stopDelegating
});
document.delegate = Event.delegate.curry(document);
document.stopDelegating = Event.stopDelegating.curry(document);
Event.observe(window, "unload", Event.stopDelegating);
if (Object.isUndefined(Dialog)) {
    var Dialog = {}
}
Dialog.Confirm = {
    instance: null,
    content: null,
    contentPrevContainer: null,
    data: null,
    handlerAccept: null,
    handlerDeny: null,
    templatesCache: new Hash(),
    templateSyntax: /(^|.|\r|\n|\/)(#\[\s*(\w+)\s*\])/,
    show: function (d, b, a, c) {
        b = b || {};
        var f = Object.extend({
            className: "messenger-dialog",
            destroyOnClose: false,
            width: 360,
            height: 100,
            maximizable: false,
            resizable: false,
            minimizable: false,
            draggable: false,
            zIndex: 5
        },
        b);
        if (Dialog.Confirm.instance) {
            Dialog.Confirm.destroy()
        }
        Dialog.Confirm.data = b.data;
        Dialog.Confirm.handlerAccept = b.onSuccess;
        Dialog.Confirm.handlerDeny = b.onFailure;
        Dialog.Confirm.content = d;
        Dialog.Confirm.instance = new Window(f);
        if (Object.isFunction(b.onFailure)) {
            Dialog.Confirm.instance.setCloseCallback(function () {
                b.onFailure();
                return true
            })
        }
        if (a) {
            if (Object.isUndefined(this.templatesCache.get(d))) {
                var e = $(d).innerHTML;
                e = e.gsub("#%5B", "#[");
                e = e.gsub("%5D", "]");
                this.templatesCache.set(d, new Template(e, this.templateSyntax))
            }
            Dialog.Confirm.instance.getContent().insert(this.templatesCache.get(d).evaluate(c))
        } else {
            if ($(d)) {
                this.contentPrevContainer = $(d).up();
                Dialog.Confirm.instance.getContent().insert($(d))
            } else {
                Dialog.Confirm.instance.getContent().update(d)
            }
        }
        this._setDelegates();
        Dialog.Confirm.instance.showCenter(b.modal || false, f.top, f.left)
    },
    _setDelegates: function () {
        if (document.delegate) {
            Dialog.Confirm.instance.getContent().identify();
            Dialog.Confirm.instance.getContent().delegate("click", {
                ".dialog-accept *": Dialog.Confirm.accept,
                ".dialog-deny *": Dialog.Confirm.deny
            })
        }
    },
    _removeDelegates: function () {
        if (document.delegate) {
            Dialog.Confirm.instance.getContent().stopDelegating()
        }
    },
    template: function (c, a, b) {
        this.show(c, a, true, b)
    },
    ajax: function (d, c, f) {
        Dialog.Confirm.show(null, c);
        Dialog.Confirm.instance.showCenter();
        var b = {
            method: "get",
            asynchronous: (!Object.isUndefined(c.asynchronous) ? c.asynchronous : true)
        };
        if (typeof(f) == "object") {
            b = Object.extend(b, f)
        }
        var a = new Loader(Dialog.Confirm.instance.getContent().identify());
        var e = b.onComplete;
        b.onComplete = function (h) {
            a.remove();
            delete a;
            Dialog.Confirm.instance.getContent().update(h.responseText);
            if (e) {
                try {
                    e(h)
                } catch(g) {
                    console.log(g)
                }
            }
            e = null
        };
        new Ajax.Request(d, b)
    },
    deny: function (a) {
        if (a) {
            a.stop()
        }
        if (Dialog.Confirm.handlerDeny) {
            Dialog.Confirm.handlerDeny(Dialog.Confirm.data)
        }
        Dialog.Confirm.destroy()
    },
    accept: function (a) {
        if (a) {
            a.stop()
        }
        if (Dialog.Confirm.handlerAccept) {
            if (Dialog.Confirm.handlerAccept(Dialog.Confirm.data) === false) {
                return
            }
        }
        Dialog.Confirm.destroy()
    },
    destroy: function () {
        Dialog.Confirm.instance.close();
        if (Dialog.Confirm.contentPrevContainer && $(Dialog.Confirm.content)) {
            Dialog.Confirm.contentPrevContainer.insert($(Dialog.Confirm.content));
            Dialog.Confirm.contentPrevContainer = null
        }
        Dialog.Confirm.instance.destroy();
        Dialog.Confirm.instance = null;
        Dialog.Confirm.handlerAccept = null;
        Dialog.Confirm.handlerDeny = null;
        Dialog.Confirm.data = null
    }
};
var Loader = Class.create({
    DEFAULT_LOADER: "http://static.weblog.ro/modules/default/img/dialogLoader.v0.gif",
    initialize: function (a, b) {
        this.options = Object.extend({
            color: "transparent",
            opacity: 0,
            src: this.DEFAULT_LOADER,
            zIndex: 10,
            top: null,
            left: null
        },
        b);
        this.setContainer(a)
    },
    setContainer: function (a) {
        this.parent = a;
        this._createOverlayer();
        this._position()
    },
    show: function () {
        if (this.exists()) {
            $(this.loader).show()
        }
    },
    hide: function () {
        if (this.exists()) {
            $(this.loader).hide()
        }
    },
    remove: function () {
        if (this.exists()) {
            $(this.loader).remove()
        }
    },
    exists: function () {
        return $(this.loader) != null
    },
    _createOverlayer: function () {
        var b = new Element("div").setStyle({
            backgroundColor: this.options.color,
            zIndex: this.options.zIndex,
            textAlign: "left",
            position: "absolute"
        });
        var a = new Element("img", {
            src: this.options.src,
            alt: "Loading..."
        });
        b.insert(a);
        if (this.options.opacity) {
            b.setOpacity(this.options.opacity)
        }
        $(this.options.container || this.parent).insert({
            top: b
        });
        this.loader = b.identify()
    },
    _position: function () {
        var d = $(this.parent);
        var c = d.getWidth();
        var a = d.getHeight();
        var b = $(this.loader).down();
        if (Prototype.Browser.IE) {
            $(this.loader).absolutize();
            var f = d.cumulativeOffset();
            var e = d.getDimensions();
            $(this.loader).setStyle({
                top: f.top + "px",
                left: f.left + "px",
                width: e.width + "px",
                height: e.height + "px"
            })
        } else {
            $(this.loader).clonePosition(d)
        }
        b.style.paddingLeft = (this.options.left || ((c >> 1) - (b.getWidth() >> 1))) + "px";
        b.style.paddingTop = (this.options.top || (a >> 2)) + "px"
    }
});
var ModifyDom = {
    insert: function (a) {
        $H(a).each(function (g) {
            var d = g.key;
            if ($(d)) {
                d = "#" + d
            }
            var c = g.value[0];
            var b = g.value[1];
            var e = g.value[2];
            var f = ModifyDom.createElement(b, e);
            if (!f) {
                return
            }
            var h = new Object();
            h[c] = f;
            $$(d).invoke("insert", h)
        })
    },
    createElement: function (c, a) {
        if (a.id && $(a.id)) {
            return false
        }
        var b = new Element(c);
        if (a.content) {
            b.update(a.content);
            delete a.content
        }
        if (a.contentFrom) {
            if (Object.isArray(a.contentFrom)) {
                if ($(a.contentFrom[0])) {
                    var d = $(a.contentFrom[0]).readAttribute(a.contentFrom[1]);
                    b.update(d)
                }
            } else {
                b.update($(a.contentFrom).innerHTML)
            }
            delete a.contentFrom
        }
        b.writeAttribute(a);
        return b
    },
    replace: function (a) {
        $H(a).each(function (b) {
            if ($(b.key)) {
                $(b.key).replace(b.value)
            }
        })
    },
    remove: function (a) {
        if ($(a)) {
            $(a).remove();
            return
        }
        $$(a).invoke("remove")
    },
    addScript: function (c) {
        var b = c;
        if (c.charAt(0) != "/") {
            c = c.substr(c.indexOf("/", 7))
        }
        var a = $$("script").find(function (d) {
            if (d.src.indexOf(c) != -1) {
                return true
            }
        });
        if (a) {
            $(document.body).fire("script:loaded", a.identify())
        } else {
            a = new Element("script", {
                type: "text/javascript",
                src: b
            });
            $(document.body).insert(a);
            a.observe("load", function () {
                $(document.body).fire("script:loaded", a.identify())
            });
            a.observe("readystatechange", function () {
                if (a.readyState == "complete" || a.readyState == "loaded") {
                    $(document.body).fire("script:loaded", a.identify())
                }
            })
        }
    },
    addStyle: function (b) {
        if (!$$("link").pluck("href").include(b)) {
            var a = new Element("link", {
                href: b,
                rel: "stylesheet",
                type: "text/css"
            });
            $$("head")[0].insert(a)
        }
    },
    highlight: function (a) {
        if ($(a)) {
            new Effect.Highlight(a, {
                startcolor: "#ffff99",
                endcolor: "#ffffff",
                keepBackgroundImage: true
            });
            return
        }
        $$(a).each(function (b) {
            new Effect.Highlight(b, {
                startcolor: "#ffff99",
                endcolor: "#ffffff",
                keepBackgroundImage: true
            })
        })
    },
    appear: function (a) {
        if ($(a)) {
            new Effect.Appear(a);
            return
        }
        $$(a).each(function (b) {
            new Effect.Appear(b)
        })
    },
    fade: function (a) {
        if ($(a)) {
            new Effect.Fade(a);
            return
        }
        $$(a).each(function (b) {
            new Effect.Fade(b)
        })
    },
    show: function (a) {
        if ($(a)) {
            $(a).show();
            return
        }
        $$(a).each(function (b) {
            b.show()
        })
    },
    hide: function (a) {
        if ($(a)) {
            $(a).hide()
        }
        $$(a).each(function (b) {
            b.hide()
        })
    },
    update: function (a) {
        $H(a).each(function (b) {
            if ($(b.key)) {
                $(b.key).update(b.value)
            } else {
                $$(b.key).invoke("update", b.value)
            }
        })
    },
    attr: function (a) {
        $H(a).each(function (b) {
            if ($(b.key)) {
                if (b.value[0] == "class") {
                    $(b.key).className = b.value[1]
                } else {
                    $(b.key).setAttribute(b.value[0], b.value[1])
                }
            } else {
                $$(b.key).each(function (c) {
                    if (this.value[0] == "class") {
                        c.className = this.value[1]
                    } else {
                        c.setAttribute(this.value[0], this.value[1])
                    }
                }.bind(b))
            }
        })
    },
    fire: function (a) {
        $H(a).each(function (b) {
            document.fire(b.key, b.value)
        })
    },
    processAjaxHelperData: function (b) {
        try {
            $H(b).each(function (e) {
                var c = Object.keys(e.value).first();
                var d = e.value[c];
                if (ModifyDom[c]) {
                    ModifyDom[c](d)
                }
            })
        } catch(a) {
            alert(a.message);
            if (window.console) {
                window.console.log(a)
            }
        }
    }
};
String.prototype.parseColor = function () {
    var a = "#";
    if (this.slice(0, 4) == "rgb(") {
        var c = this.slice(4, this.length - 1).split(",");
        var b = 0;
        do {
            a += parseInt(c[b]).toColorPart()
        } while (++b < 3)
    } else {
        if (this.slice(0, 1) == "#") {
            if (this.length == 4) {
                for (var b = 1; b < 4; b++) {
                    a += (this.charAt(b) + this.charAt(b)).toLowerCase()
                }
            }
            if (this.length == 7) {
                a = this.toLowerCase()
            }
        }
    }
    return (a.length == 7 ? a : (arguments[0] || this))
};
Element.collectTextNodes = function (a) {
    return $A($(a).childNodes).collect(function (b) {
        return (b.nodeType == 3 ? b.nodeValue : (b.hasChildNodes() ? Element.collectTextNodes(b) : ""))
    }).flatten().join("")
};
Element.collectTextNodesIgnoreClass = function (a, b) {
    return $A($(a).childNodes).collect(function (c) {
        return (c.nodeType == 3 ? c.nodeValue : ((c.hasChildNodes() && !Element.hasClassName(c, b)) ? Element.collectTextNodesIgnoreClass(c, b) : ""))
    }).flatten().join("")
};
Element.setContentZoom = function (a, b) {
    a = $(a);
    a.setStyle({
        fontSize: (b / 100) + "em"
    });
    if (Prototype.Browser.WebKit) {
        window.scrollBy(0, 0)
    }
    return a
};
Element.getInlineOpacity = function (a) {
    return $(a).style.opacity || ""
};
Element.forceRerendering = function (a) {
    try {
        a = $(a);
        var c = document.createTextNode(" ");
        a.appendChild(c);
        a.removeChild(c)
    } catch(b) {}
};
var Effect = {
    _elementDoesNotExistError: {
        name: "ElementDoesNotExistError",
        message: "The specified DOM element does not exist, but is required for this effect to operate"
    },
    Transitions: {
        linear: Prototype.K,
        sinoidal: function (a) {
            return (-Math.cos(a * Math.PI) / 2) + 0.5
        },
        reverse: function (a) {
            return 1 - a
        },
        flicker: function (a) {
            var a = ((-Math.cos(a * Math.PI) / 4) + 0.75) + Math.random() / 4;
            return a > 1 ? 1 : a
        },
        wobble: function (a) {
            return (-Math.cos(a * Math.PI * (9 * a)) / 2) + 0.5
        },
        pulse: function (b, a) {
            a = a || 5;
            return (((b % (1 / a)) * a).round() == 0 ? ((b * a * 2) - (b * a * 2).floor()) : 1 - ((b * a * 2) - (b * a * 2).floor()))
        },
        spring: function (a) {
            return 1 - (Math.cos(a * 4.5 * Math.PI) * Math.exp(-a * 6))
        },
        none: function (a) {
            return 0
        },
        full: function (a) {
            return 1
        }
    },
    DefaultOptions: {
        duration: 1,
        fps: 100,
        sync: false,
        from: 0,
        to: 1,
        delay: 0,
        queue: "parallel"
    },
    tagifyText: function (a) {
        var b = "position:relative";
        if (Prototype.Browser.IE) {
            b += ";zoom:1"
        }
        a = $(a);
        $A(a.childNodes).each(function (c) {
            if (c.nodeType == 3) {
                c.nodeValue.toArray().each(function (d) {
                    a.insertBefore(new Element("span", {
                        style: b
                    }).update(d == " " ? String.fromCharCode(160) : d), c)
                });
                Element.remove(c)
            }
        })
    },
    multiple: function (b, c) {
        var e;
        if (((typeof b == "object") || Object.isFunction(b)) && (b.length)) {
            e = b
        } else {
            e = $(b).childNodes
        }
        var a = Object.extend({
            speed: 0.1,
            delay: 0
        },
        arguments[2] || {});
        var d = a.delay;
        $A(e).each(function (g, f) {
            new c(g, Object.extend(a, {
                delay: f * a.speed + d
            }))
        })
    },
    PAIRS: {
        slide: ["SlideDown", "SlideUp"],
        blind: ["BlindDown", "BlindUp"],
        appear: ["Appear", "Fade"]
    },
    toggle: function (b, c) {
        b = $(b);
        c = (c || "appear").toLowerCase();
        var a = Object.extend({
            queue: {
                position: "end",
                scope: (b.id || "global"),
                limit: 1
            }
        },
        arguments[2] || {});
        Effect[b.visible() ? Effect.PAIRS[c][1] : Effect.PAIRS[c][0]](b, a)
    }
};
Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
Effect.ScopedQueue = Class.create(Enumerable, {
    initialize: function () {
        this.effects = [];
        this.interval = null
    },
    _each: function (a) {
        this.effects._each(a)
    },
    add: function (b) {
        var c = new Date().getTime();
        var a = Object.isString(b.options.queue) ? b.options.queue : b.options.queue.position;
        switch (a) {
        case "front":
            this.effects.findAll(function (d) {
                return d.state == "idle"
            }).each(function (d) {
                d.startOn += b.finishOn;
                d.finishOn += b.finishOn
            });
            break;
        case "with-last":
            c = this.effects.pluck("startOn").max() || c;
            break;
        case "end":
            c = this.effects.pluck("finishOn").max() || c;
            break
        }
        b.startOn += c;
        b.finishOn += c;
        if (!b.options.queue.limit || (this.effects.length < b.options.queue.limit)) {
            this.effects.push(b)
        }
        if (!this.interval) {
            this.interval = setInterval(this.loop.bind(this), 15)
        }
    },
    remove: function (a) {
        this.effects = this.effects.reject(function (b) {
            return b == a
        });
        if (this.effects.length == 0) {
            clearInterval(this.interval);
            this.interval = null
        }
    },
    loop: function () {
        var c = new Date().getTime();
        for (var b = 0, a = this.effects.length; b < a; b++) {
            this.effects[b] && this.effects[b].loop(c)
        }
    }
});
Effect.Queues = {
    instances: $H(),
    get: function (a) {
        if (!Object.isString(a)) {
            return a
        }
        return this.instances.get(a) || this.instances.set(a, new Effect.ScopedQueue())
    }
};
Effect.Queue = Effect.Queues.get("global");
Effect.Base = Class.create({
    position: null,
    start: function (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;
        this.state = "idle";
        this.startOn = this.options.delay * 1000;
        this.finishOn = this.startOn + (this.options.duration * 1000);
        this.fromToDelta = this.options.to - this.options.from;
        this.totalTime = this.finishOn - this.startOn;
        this.totalFrames = this.options.fps * this.options.duration;
        eval('this.render = function(pos){ if (this.state=="idle"){this.state="running";' + codeForEvent(this.options, "beforeSetup") + (this.setup ? "this.setup();" : "") + codeForEvent(this.options, "afterSetup") + '};if (this.state=="running"){pos=this.options.transition(pos)*' + this.fromToDelta + "+" + this.options.from + ";this.position=pos;" + codeForEvent(this.options, "beforeUpdate") + (this.update ? "this.update(pos);" : "") + codeForEvent(this.options, "afterUpdate") + "}}");
        this.event("beforeStart");
        if (!this.options.sync) {
            Effect.Queues.get(Object.isString(this.options.queue) ? "global" : this.options.queue.scope).add(this)
        }
    },
    loop: function (c) {
        if (c >= this.startOn) {
            if (c >= this.finishOn) {
                this.render(1);
                this.cancel();
                this.event("beforeFinish");
                if (this.finish) {
                    this.finish()
                }
                this.event("afterFinish");
                return
            }
            var b = (c - this.startOn) / this.totalTime,
                a = (b * this.totalFrames).round();
            if (a > this.currentFrame) {
                this.render(b);
                this.currentFrame = a
            }
        }
    },
    cancel: function () {
        if (!this.options.sync) {
            Effect.Queues.get(Object.isString(this.options.queue) ? "global" : this.options.queue.scope).remove(this)
        }
        this.state = "finished"
    },
    event: function (a) {
        if (this.options[a + "Internal"]) {
            this.options[a + "Internal"](this)
        }
        if (this.options[a]) {
            this.options[a](this)
        }
    },
    inspect: function () {
        var a = $H();
        for (property in this) {
            if (!Object.isFunction(this[property])) {
                a.set(property, this[property])
            }
        }
        return "#<Effect:" + a.inspect() + ",options:" + $H(this.options).inspect() + ">"
    }
});
Effect.Parallel = Class.create(Effect.Base, {
    initialize: function (a) {
        this.effects = a || [];
        this.start(arguments[1])
    },
    update: function (a) {
        this.effects.invoke("render", a)
    },
    finish: function (a) {
        this.effects.each(function (b) {
            b.render(1);
            b.cancel();
            b.event("beforeFinish");
            if (b.finish) {
                b.finish(a)
            }
            b.event("afterFinish")
        })
    }
});
Effect.Tween = Class.create(Effect.Base, {
    initialize: function (c, f, e) {
        c = Object.isString(c) ? $(c) : c;
        var b = $A(arguments),
            d = b.last(),
            a = b.length == 5 ? b[3] : null;
        this.method = Object.isFunction(d) ? d.bind(c) : Object.isFunction(c[d]) ? c[d].bind(c) : function (g) {
            c[d] = g
        };
        this.start(Object.extend({
            from: f,
            to: e
        },
        a || {}))
    },
    update: function (a) {
        this.method(a)
    }
});
Effect.Event = Class.create(Effect.Base, {
    initialize: function () {
        this.start(Object.extend({
            duration: 0
        },
        arguments[0] || {}))
    },
    update: Prototype.emptyFunction
});
Effect.Opacity = Class.create(Effect.Base, {
    initialize: function (b) {
        this.element = $(b);
        if (!this.element) {
            throw (Effect._elementDoesNotExistError)
        }
        if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) {
            this.element.setStyle({
                zoom: 1
            })
        }
        var a = Object.extend({
            from: this.element.getOpacity() || 0,
            to: 1
        },
        arguments[1] || {});
        this.start(a)
    },
    update: function (a) {
        this.element.setOpacity(a)
    }
});
Effect.Move = Class.create(Effect.Base, {
    initialize: function (b) {
        this.element = $(b);
        if (!this.element) {
            throw (Effect._elementDoesNotExistError)
        }
        var a = Object.extend({
            x: 0,
            y: 0,
            mode: "relative"
        },
        arguments[1] || {});
        this.start(a)
    },
    setup: function () {
        this.element.makePositioned();
        this.originalLeft = parseFloat(this.element.getStyle("left") || "0");
        this.originalTop = parseFloat(this.element.getStyle("top") || "0");
        if (this.options.mode == "absolute") {
            this.options.x = this.options.x - this.originalLeft;
            this.options.y = this.options.y - this.originalTop
        }
    },
    update: function (a) {
        this.element.setStyle({
            left: (this.options.x * a + this.originalLeft).round() + "px",
            top: (this.options.y * a + this.originalTop).round() + "px"
        })
    }
});
Effect.MoveBy = function (b, a, c) {
    return new Effect.Move(b, Object.extend({
        x: c,
        y: a
    },
    arguments[3] || {}))
};
Effect.Scale = Class.create(Effect.Base, {
    initialize: function (b, c) {
        this.element = $(b);
        if (!this.element) {
            throw (Effect._elementDoesNotExistError)
        }
        var a = Object.extend({
            scaleX: true,
            scaleY: true,
            scaleContent: true,
            scaleFromCenter: false,
            scaleMode: "box",
            scaleFrom: 100,
            scaleTo: c
        },
        arguments[2] || {});
        this.start(a)
    },
    setup: function () {
        this.restoreAfterFinish = this.options.restoreAfterFinish || false;
        this.elementPositioning = this.element.getStyle("position");
        this.originalStyle = {};
        ["top", "left", "width", "height", "fontSize"].each(function (b) {
            this.originalStyle[b] = this.element.style[b]
        }.bind(this));
        this.originalTop = this.element.offsetTop;
        this.originalLeft = this.element.offsetLeft;
        var a = this.element.getStyle("font-size") || "100%";
        ["em", "px", "%", "pt"].each(function (b) {
            if (a.indexOf(b) > 0) {
                this.fontSize = parseFloat(a);
                this.fontSizeType = b
            }
        }.bind(this));
        this.factor = (this.options.scaleTo - this.options.scaleFrom) / 100;
        this.dims = null;
        if (this.options.scaleMode == "box") {
            this.dims = [this.element.offsetHeight, this.element.offsetWidth]
        }
        if (/^content/.test(this.options.scaleMode)) {
            this.dims = [this.element.scrollHeight, this.element.scrollWidth]
        }
        if (!this.dims) {
            this.dims = [this.options.scaleMode.originalHeight, this.options.scaleMode.originalWidth]
        }
    },
    update: function (a) {
        var b = (this.options.scaleFrom / 100) + (this.factor * a);
        if (this.options.scaleContent && this.fontSize) {
            this.element.setStyle({
                fontSize: this.fontSize * b + this.fontSizeType
            })
        }
        this.setDimensions(this.dims[0] * b, this.dims[1] * b)
    },
    finish: function (a) {
        if (this.restoreAfterFinish) {
            this.element.setStyle(this.originalStyle)
        }
    },
    setDimensions: function (a, e) {
        var f = {};
        if (this.options.scaleX) {
            f.width = e.round() + "px"
        }
        if (this.options.scaleY) {
            f.height = a.round() + "px"
        }
        if (this.options.scaleFromCenter) {
            var c = (a - this.dims[0]) / 2;
            var b = (e - this.dims[1]) / 2;
            if (this.elementPositioning == "absolute") {
                if (this.options.scaleY) {
                    f.top = this.originalTop - c + "px"
                }
                if (this.options.scaleX) {
                    f.left = this.originalLeft - b + "px"
                }
            } else {
                if (this.options.scaleY) {
                    f.top = -c + "px"
                }
                if (this.options.scaleX) {
                    f.left = -b + "px"
                }
            }
        }
        this.element.setStyle(f)
    }
});
Effect.Highlight = Class.create(Effect.Base, {
    initialize: function (b) {
        this.element = $(b);
        if (!this.element) {
            throw (Effect._elementDoesNotExistError)
        }
        var a = Object.extend({
            startcolor: "#ffff99"
        },
        arguments[1] || {});
        this.start(a)
    },
    setup: function () {
        if (this.element.getStyle("display") == "none") {
            this.cancel();
            return
        }
        this.oldStyle = {};
        if (!this.options.keepBackgroundImage) {
            this.oldStyle.backgroundImage = this.element.getStyle("background-image");
            this.element.setStyle({
                backgroundImage: "none"
            })
        }
        if (!this.options.endcolor) {
            this.options.endcolor = this.element.getStyle("background-color").parseColor("#ffffff")
        }
        if (!this.options.restorecolor) {
            this.options.restorecolor = this.element.getStyle("background-color")
        }
        this._base = $R(0, 2).map(function (a) {
            return parseInt(this.options.startcolor.slice(a * 2 + 1, a * 2 + 3), 16)
        }.bind(this));
        this._delta = $R(0, 2).map(function (a) {
            return parseInt(this.options.endcolor.slice(a * 2 + 1, a * 2 + 3), 16) - this._base[a]
        }.bind(this))
    },
    update: function (a) {
        this.element.setStyle({
            backgroundColor: $R(0, 2).inject("#", function (b, c, d) {
                return b + ((this._base[d] + (this._delta[d] * a)).round().toColorPart())
            }.bind(this))
        })
    },
    finish: function () {
        this.element.setStyle(Object.extend(this.oldStyle, {
            backgroundColor: this.options.restorecolor
        }))
    }
});
Effect.ScrollTo = function (d) {
    var c = arguments[1] || {},
        b = document.viewport.getScrollOffsets(),
        e = $(d).cumulativeOffset(),
        a = (window.height || document.body.scrollHeight) - document.viewport.getHeight();
    if (c.offset) {
        e[1] += c.offset
    }
    return new Effect.Tween(null, b.top, e[1] > a ? a : e[1], c, function (f) {
        scrollTo(b.left, f.round())
    })
};
Effect.Fade = function (c) {
    c = $(c);
    var a = c.getInlineOpacity();
    var b = Object.extend({
        from: c.getOpacity() || 1,
        to: 0,
        afterFinishInternal: function (d) {
            if (d.options.to != 0) {
                return
            }
            d.element.hide().setStyle({
                opacity: a
            })
        }
    },
    arguments[1] || {});
    return new Effect.Opacity(c, b)
};
Effect.Appear = function (b) {
    b = $(b);
    var a = Object.extend({
        from: (b.getStyle("display") == "none" ? 0 : b.getOpacity() || 0),
        to: 1,
        afterFinishInternal: function (c) {
            c.element.forceRerendering()
        },
        beforeSetup: function (c) {
            c.element.setOpacity(c.options.from).show()
        }
    },
    arguments[1] || {});
    return new Effect.Opacity(b, a)
};
Effect.Puff = function (b) {
    b = $(b);
    var a = {
        opacity: b.getInlineOpacity(),
        position: b.getStyle("position"),
        top: b.style.top,
        left: b.style.left,
        width: b.style.width,
        height: b.style.height
    };
    return new Effect.Parallel([new Effect.Scale(b, 200, {
        sync: true,
        scaleFromCenter: true,
        scaleContent: true,
        restoreAfterFinish: true
    }), new Effect.Opacity(b, {
        sync: true,
        to: 0
    })], Object.extend({
        duration: 1,
        beforeSetupInternal: function (c) {
            Position.absolutize(c.effects[0].element)
        },
        afterFinishInternal: function (c) {
            c.effects[0].element.hide().setStyle(a)
        }
    },
    arguments[1] || {}))
};
Effect.BlindUp = function (a) {
    a = $(a);
    a.makeClipping();
    return new Effect.Scale(a, 0, Object.extend({
        scaleContent: false,
        scaleX: false,
        restoreAfterFinish: true,
        afterFinishInternal: function (b) {
            b.element.hide().undoClipping()
        }
    },
    arguments[1] || {}))
};
Effect.BlindDown = function (b) {
    b = $(b);
    var a = b.getDimensions();
    return new Effect.Scale(b, 100, Object.extend({
        scaleContent: false,
        scaleX: false,
        scaleFrom: 0,
        scaleMode: {
            originalHeight: a.height,
            originalWidth: a.width
        },
        restoreAfterFinish: true,
        afterSetup: function (c) {
            c.element.makeClipping().setStyle({
                height: "0px"
            }).show()
        },
        afterFinishInternal: function (c) {
            c.element.undoClipping()
        }
    },
    arguments[1] || {}))
};
Effect.SwitchOff = function (b) {
    b = $(b);
    var a = b.getInlineOpacity();
    return new Effect.Appear(b, Object.extend({
        duration: 0.4,
        from: 0,
        transition: Effect.Transitions.flicker,
        afterFinishInternal: function (c) {
            new Effect.Scale(c.element, 1, {
                duration: 0.3,
                scaleFromCenter: true,
                scaleX: false,
                scaleContent: false,
                restoreAfterFinish: true,
                beforeSetup: function (d) {
                    d.element.makePositioned().makeClipping()
                },
                afterFinishInternal: function (d) {
                    d.element.hide().undoClipping().undoPositioned().setStyle({
                        opacity: a
                    })
                }
            })
        }
    },
    arguments[1] || {}))
};
Effect.DropOut = function (b) {
    b = $(b);
    var a = {
        top: b.getStyle("top"),
        left: b.getStyle("left"),
        opacity: b.getInlineOpacity()
    };
    return new Effect.Parallel([new Effect.Move(b, {
        x: 0,
        y: 100,
        sync: true
    }), new Effect.Opacity(b, {
        sync: true,
        to: 0
    })], Object.extend({
        duration: 0.5,
        beforeSetup: function (c) {
            c.effects[0].element.makePositioned()
        },
        afterFinishInternal: function (c) {
            c.effects[0].element.hide().undoPositioned().setStyle(a)
        }
    },
    arguments[1] || {}))
};
Effect.Shake = function (d) {
    d = $(d);
    var b = Object.extend({
        distance: 20,
        duration: 0.5
    },
    arguments[1] || {});
    var e = parseFloat(b.distance);
    var c = parseFloat(b.duration) / 10;
    var a = {
        top: d.getStyle("top"),
        left: d.getStyle("left")
    };
    return new Effect.Move(d, {
        x: e,
        y: 0,
        duration: c,
        afterFinishInternal: function (f) {
            new Effect.Move(f.element, {
                x: -e * 2,
                y: 0,
                duration: c * 2,
                afterFinishInternal: function (g) {
                    new Effect.Move(g.element, {
                        x: e * 2,
                        y: 0,
                        duration: c * 2,
                        afterFinishInternal: function (h) {
                            new Effect.Move(h.element, {
                                x: -e * 2,
                                y: 0,
                                duration: c * 2,
                                afterFinishInternal: function (i) {
                                    new Effect.Move(i.element, {
                                        x: e * 2,
                                        y: 0,
                                        duration: c * 2,
                                        afterFinishInternal: function (j) {
                                            new Effect.Move(j.element, {
                                                x: -e,
                                                y: 0,
                                                duration: c,
                                                afterFinishInternal: function (k) {
                                                    k.element.undoPositioned().setStyle(a)
                                                }
                                            })
                                        }
                                    })
                                }
                            })
                        }
                    })
                }
            })
        }
    })
};
Effect.SlideDown = function (c) {
    c = $(c).cleanWhitespace();
    var a = c.down().getStyle("bottom");
    var b = c.getDimensions();
    return new Effect.Scale(c, 100, Object.extend({
        scaleContent: false,
        scaleX: false,
        scaleFrom: window.opera ? 0 : 1,
        scaleMode: {
            originalHeight: b.height,
            originalWidth: b.width
        },
        restoreAfterFinish: true,
        afterSetup: function (d) {
            d.element.makePositioned();
            d.element.down().makePositioned();
            if (window.opera) {
                d.element.setStyle({
                    top: ""
                })
            }
            d.element.makeClipping().setStyle({
                height: "0px"
            }).show()
        },
        afterUpdateInternal: function (d) {
            d.element.down().setStyle({
                bottom: (d.dims[0] - d.element.clientHeight) + "px"
            })
        },
        afterFinishInternal: function (d) {
            d.element.undoClipping().undoPositioned();
            d.element.down().undoPositioned().setStyle({
                bottom: a
            })
        }
    },
    arguments[1] || {}))
};
Effect.SlideUp = function (c) {
    c = $(c).cleanWhitespace();
    var a = c.down().getStyle("bottom");
    var b = c.getDimensions();
    return new Effect.Scale(c, window.opera ? 0 : 1, Object.extend({
        scaleContent: false,
        scaleX: false,
        scaleMode: "box",
        scaleFrom: 100,
        scaleMode: {
            originalHeight: b.height,
            originalWidth: b.width
        },
        restoreAfterFinish: true,
        afterSetup: function (d) {
            d.element.makePositioned();
            d.element.down().makePositioned();
            if (window.opera) {
                d.element.setStyle({
                    top: ""
                })
            }
            d.element.makeClipping().show()
        },
        afterUpdateInternal: function (d) {
            d.element.down().setStyle({
                bottom: (d.dims[0] - d.element.clientHeight) + "px"
            })
        },
        afterFinishInternal: function (d) {
            d.element.hide().undoClipping().undoPositioned();
            d.element.down().undoPositioned().setStyle({
                bottom: a
            })
        }
    },
    arguments[1] || {}))
};
Effect.Squish = function (a) {
    return new Effect.Scale(a, window.opera ? 1 : 0, {
        restoreAfterFinish: true,
        beforeSetup: function (b) {
            b.element.makeClipping()
        },
        afterFinishInternal: function (b) {
            b.element.hide().undoClipping()
        }
    })
};
Effect.Grow = function (c) {
    c = $(c);
    var b = Object.extend({
        direction: "center",
        moveTransition: Effect.Transitions.sinoidal,
        scaleTransition: Effect.Transitions.sinoidal,
        opacityTransition: Effect.Transitions.full
    },
    arguments[1] || {});
    var a = {
        top: c.style.top,
        left: c.style.left,
        height: c.style.height,
        width: c.style.width,
        opacity: c.getInlineOpacity()
    };
    var g = c.getDimensions();
    var h, f;
    var e, d;
    switch (b.direction) {
    case "top-left":
        h = f = e = d = 0;
        break;
    case "top-right":
        h = g.width;
        f = d = 0;
        e = -g.width;
        break;
    case "bottom-left":
        h = e = 0;
        f = g.height;
        d = -g.height;
        break;
    case "bottom-right":
        h = g.width;
        f = g.height;
        e = -g.width;
        d = -g.height;
        break;
    case "center":
        h = g.width / 2;
        f = g.height / 2;
        e = -g.width / 2;
        d = -g.height / 2;
        break
    }
    return new Effect.Move(c, {
        x: h,
        y: f,
        duration: 0.01,
        beforeSetup: function (i) {
            i.element.hide().makeClipping().makePositioned()
        },
        afterFinishInternal: function (i) {
            new Effect.Parallel([new Effect.Opacity(i.element, {
                sync: true,
                to: 1,
                from: 0,
                transition: b.opacityTransition
            }), new Effect.Move(i.element, {
                x: e,
                y: d,
                sync: true,
                transition: b.moveTransition
            }), new Effect.Scale(i.element, 100, {
                scaleMode: {
                    originalHeight: g.height,
                    originalWidth: g.width
                },
                sync: true,
                scaleFrom: window.opera ? 1 : 0,
                transition: b.scaleTransition,
                restoreAfterFinish: true
            })], Object.extend({
                beforeSetup: function (j) {
                    j.effects[0].element.setStyle({
                        height: "0px"
                    }).show()
                },
                afterFinishInternal: function (j) {
                    j.effects[0].element.undoClipping().undoPositioned().setStyle(a)
                }
            },
            b))
        }
    })
};
Effect.Shrink = function (c) {
    c = $(c);
    var b = Object.extend({
        direction: "center",
        moveTransition: Effect.Transitions.sinoidal,
        scaleTransition: Effect.Transitions.sinoidal,
        opacityTransition: Effect.Transitions.none
    },
    arguments[1] || {});
    var a = {
        top: c.style.top,
        left: c.style.left,
        height: c.style.height,
        width: c.style.width,
        opacity: c.getInlineOpacity()
    };
    var f = c.getDimensions();
    var e, d;
    switch (b.direction) {
    case "top-left":
        e = d = 0;
        break;
    case "top-right":
        e = f.width;
        d = 0;
        break;
    case "bottom-left":
        e = 0;
        d = f.height;
        break;
    case "bottom-right":
        e = f.width;
        d = f.height;
        break;
    case "center":
        e = f.width / 2;
        d = f.height / 2;
        break
    }
    return new Effect.Parallel([new Effect.Opacity(c, {
        sync: true,
        to: 0,
        from: 1,
        transition: b.opacityTransition
    }), new Effect.Scale(c, window.opera ? 1 : 0, {
        sync: true,
        transition: b.scaleTransition,
        restoreAfterFinish: true
    }), new Effect.Move(c, {
        x: e,
        y: d,
        sync: true,
        transition: b.moveTransition
    })], Object.extend({
        beforeStartInternal: function (g) {
            g.effects[0].element.makePositioned().makeClipping()
        },
        afterFinishInternal: function (g) {
            g.effects[0].element.hide().undoClipping().undoPositioned().setStyle(a)
        }
    },
    b))
};
Effect.Pulsate = function (c) {
    c = $(c);
    var b = arguments[1] || {};
    var a = c.getInlineOpacity();
    var e = b.transition || Effect.Transitions.sinoidal;
    var d = function (f) {
        return e(1 - Effect.Transitions.pulse(f, b.pulses))
    };
    d.bind(e);
    return new Effect.Opacity(c, Object.extend(Object.extend({
        duration: 2,
        from: 0,
        afterFinishInternal: function (f) {
            f.element.setStyle({
                opacity: a
            })
        }
    },
    b), {
        transition: d
    }))
};
Effect.Fold = function (b) {
    b = $(b);
    var a = {
        top: b.style.top,
        left: b.style.left,
        width: b.style.width,
        height: b.style.height
    };
    b.makeClipping();
    return new Effect.Scale(b, 5, Object.extend({
        scaleContent: false,
        scaleX: false,
        afterFinishInternal: function (c) {
            new Effect.Scale(b, 1, {
                scaleContent: false,
                scaleY: false,
                afterFinishInternal: function (d) {
                    d.element.hide().undoClipping().setStyle(a)
                }
            })
        }
    },
    arguments[1] || {}))
};
Effect.Morph = Class.create(Effect.Base, {
    initialize: function (c) {
        this.element = $(c);
        if (!this.element) {
            throw (Effect._elementDoesNotExistError)
        }
        var a = Object.extend({
            style: {}
        },
        arguments[1] || {});
        if (!Object.isString(a.style)) {
            this.style = $H(a.style)
        } else {
            if (a.style.include(":")) {
                this.style = a.style.parseStyle()
            } else {
                this.element.addClassName(a.style);
                this.style = $H(this.element.getStyles());
                this.element.removeClassName(a.style);
                var b = this.element.getStyles();
                this.style = this.style.reject(function (d) {
                    return d.value == b[d.key]
                });
                a.afterFinishInternal = function (d) {
                    d.element.addClassName(d.options.style);
                    d.transforms.each(function (e) {
                        d.element.style[e.style] = ""
                    })
                }
            }
        }
        this.start(a)
    },
    setup: function () {
        function a(b) {
            if (!b || ["rgba(0, 0, 0, 0)", "transparent"].include(b)) {
                b = "#ffffff"
            }
            b = b.parseColor();
            return $R(0, 2).map(function (c) {
                return parseInt(b.slice(c * 2 + 1, c * 2 + 3), 16)
            })
        }
        this.transforms = this.style.map(function (g) {
            var f = g[0],
                e = g[1],
                d = null;
            if (e.parseColor("#zzzzzz") != "#zzzzzz") {
                e = e.parseColor();
                d = "color"
            } else {
                if (f == "opacity") {
                    e = parseFloat(e);
                    if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout)) {
                        this.element.setStyle({
                            zoom: 1
                        })
                    }
                } else {
                    if (Element.CSS_LENGTH.test(e)) {
                        var c = e.match(/^([\+\-]?[0-9\.]+)(.*)$/);
                        e = parseFloat(c[1]);
                        d = (c.length == 3) ? c[2] : null
                    }
                }
            }
            var b = this.element.getStyle(f);
            return {
                style: f.camelize(),
                originalValue: d == "color" ? a(b) : parseFloat(b || 0),
                targetValue: d == "color" ? a(e) : e,
                unit: d
            }
        }.bind(this)).reject(function (b) {
            return ((b.originalValue == b.targetValue) || (b.unit != "color" && (isNaN(b.originalValue) || isNaN(b.targetValue))))
        })
    },
    update: function (a) {
        var d = {},
            b, c = this.transforms.length;
        while (c--) {
            d[(b = this.transforms[c]).style] = b.unit == "color" ? "#" + (Math.round(b.originalValue[0] + (b.targetValue[0] - b.originalValue[0]) * a)).toColorPart() + (Math.round(b.originalValue[1] + (b.targetValue[1] - b.originalValue[1]) * a)).toColorPart() + (Math.round(b.originalValue[2] + (b.targetValue[2] - b.originalValue[2]) * a)).toColorPart() : (b.originalValue + (b.targetValue - b.originalValue) * a).toFixed(3) + (b.unit === null ? "" : b.unit)
        }
        this.element.setStyle(d, true)
    }
});
Effect.Transform = Class.create({
    initialize: function (a) {
        this.tracks = [];
        this.options = arguments[1] || {};
        this.addTracks(a)
    },
    addTracks: function (a) {
        a.each(function (b) {
            b = $H(b);
            var c = b.values().first();
            this.tracks.push($H({
                ids: b.keys().first(),
                effect: Effect.Morph,
                options: {
                    style: c
                }
            }))
        }.bind(this));
        return this
    },
    play: function () {
        return new Effect.Parallel(this.tracks.map(function (a) {
            var d = a.get("ids"),
                c = a.get("effect"),
                b = a.get("options");
            var e = [$(d) || $$(d)].flatten();
            return e.map(function (f) {
                return new c(f, Object.extend({
                    sync: true
                },
                b))
            })
        }).flatten(), this.options)
    }
});
Element.CSS_PROPERTIES = $w("backgroundColor backgroundPosition borderBottomColor borderBottomStyle borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth borderRightColor borderRightStyle borderRightWidth borderSpacing borderTopColor borderTopStyle borderTopWidth bottom clip color fontSize fontWeight height left letterSpacing lineHeight marginBottom marginLeft marginRight marginTop markerOffset maxHeight maxWidth minHeight minWidth opacity outlineColor outlineOffset outlineWidth paddingBottom paddingLeft paddingRight paddingTop right textIndent top width wordSpacing zIndex");
Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
String.__parseStyleElement = document.createElement("div");
String.prototype.parseStyle = function () {
    var b, a = $H();
    if (Prototype.Browser.WebKit) {
        b = new Element("div", {
            style: this
        }).style
    } else {
        String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
        b = String.__parseStyleElement.childNodes[0].style
    }
    Element.CSS_PROPERTIES.each(function (c) {
        if (b[c]) {
            a.set(c, b[c])
        }
    });
    if (Prototype.Browser.IE && this.include("opacity")) {
        a.set("opacity", this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1])
    }
    return a
};
if (document.defaultView && document.defaultView.getComputedStyle) {
    Element.getStyles = function (b) {
        var a = document.defaultView.getComputedStyle($(b), null);
        return Element.CSS_PROPERTIES.inject({},


        function (c, d) {
            c[d] = a[d];
            return c
        })
    }
} else {
    Element.getStyles = function (b) {
        b = $(b);
        var a = b.currentStyle,
            c;
        c = Element.CSS_PROPERTIES.inject({},


        function (d, e) {
            d[e] = a[e];
            return d
        });
        if (!c.opacity) {
            c.opacity = b.getOpacity()
        }
        return c
    }
}
Effect.Methods = {
    morph: function (a, b) {
        a = $(a);
        new Effect.Morph(a, Object.extend({
            style: b
        },
        arguments[2] || {}));
        return a
    },
    visualEffect: function (c, e, b) {
        c = $(c);
        var d = e.dasherize().camelize(),
            a = d.charAt(0).toUpperCase() + d.substring(1);
        new Effect[a](c, b);
        return c
    },
    highlight: function (b, a) {
        b = $(b);
        new Effect.Highlight(b, a);
        return b
    }
};
$w("fade appear grow shrink fold blindUp blindDown slideUp slideDown pulsate shake puff squish switchOff dropOut").each(function (a) {
    Effect.Methods[a] = function (c, b) {
        c = $(c);
        Effect[a.charAt(0).toUpperCase() + a.substring(1)](c, b);
        return c
    }
});
$w("getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles").each(function (a) {
    Effect.Methods[a] = Element[a]
});
Element.addMethods(Effect.Methods);

////Campuri obligatorii
function Verifica() {
	
	// Email
	if (document.FormularContact.email.value == "Email")
	{
		alert("Scrieti adresa dvs de e-mail");
		document.FormularContact.email.focus();
		return false;
	}
	// Subiect
	if (document.FormularContact.subiect.value == "Subiect") 
	{
		alert("Scrieti va rog subiectul");
		document.FormularContact.subiect.focus();
		return false;
	}
	// Mesaj
	if ((document.FormularContact.mesaj.value == "")||(document.FormularContact.mesaj.value == "Mesaj"))
	{
		alert("Va rugam sa scrieti un mesaj");
		document.FormularContact.mesaj.focus();
		document.FormularContact.mesaj.select();
		return false;
	}
}
