
function changeImages() {
    if (document.images && (preloadFlag == true)) {
        for (var A = 0; A < changeImages.arguments.length; A += 2) {
            document[changeImages.arguments[A]].src = changeImages.arguments[A + 1]
        }
    }
}
function newImage(A) {
    if (document.images) {
        rslt = new Image();
        rslt.src = A;
        return rslt
    }
}
var preloadFlag = false;

function preloadImages() {
    if (document.images) {
        logo_over = newImage("./img/top/logo_over.gif");
        preloadFlag = true
    }
}
var tjs_delai = 1;
var tjs_max = 5;
var tjs_mode = 0;
var tjs_hauteur = 0;
var id_div = "";

function PrintCalque(A, B) {
    document.getElementById(B).style.display = "none";
    calculePos = false;
    tjs_hauteur = A;
    id_div = B;
    setTimeout("Start()", tjs_delai)
}
function calculePosition() {
    haut_de_page = calculeOffsetProto($("topOfPub"));
    bas_de_page = calculeOffsetProto($("bottomOfPub"));
    if (haut_de_page == -1 || bas_de_page == -1) {
        calculePos = false
    } else {
        calculePos = true
    }
}
function calculeOffsetProto(A) {
    offset = A.cumulativeOffset();
    return offset[1]
}
function calculeOffset(B) {
    var A = 0;
    while (B) {
        A += B["offsetTop"];
        B = B.offsetParent
    }
    return A
}
function Start() {
    if (calculePos == false) {
        calculePosition();
        if (haut_de_page + tjs_hauteur < bas_de_page) {
            document.getElementById(id_div).style.display = "";
            MoveLayer(id_div, GetTop(id_div));
            setTimeout("Start()", tjs_delai)
        }
    } else {
        if (calculePos == true && haut_de_page + tjs_hauteur < bas_de_page) {
            MoveLayer(id_div, GetTop(id_div));
            setTimeout("Start()", tjs_delai)
        }
    }
}
function MoveLayer(A, B) {
    if (document.getElementById) {
        document.getElementById(A).style.top = B
    }
    if ((document.all) && (!document.getElementById)) {
        document.all[A].style.top = B
    }
    if (document.layers) {
        document.layers[A].top = B
    }
}
function GetTop(A) {
    D = $(A).cumulativeOffset()[1];
    var G = calculeOffsetProto($(A));
    var B = document.viewport.getScrollOffsets()[1];
    var F = document.documentElement;
    var C = window.innerHeight || self.innerHeight || (F && F.clientHeight) || document.body.clientHeight;
    if (tjs_mode == 0) {
        var E = Math.ceil((G - B) / 3);
        if (E > tjs_max) {
            E = tjs_max
        }
        if (E < tjs_max * -1) {
            E = tjs_max * -1
        }
        var D = G - E
    }
    if (tjs_mode == 1) {
        var E = Math.ceil((G - (B + C - tjs_hauteur)));
        if (E > tjs_max) {
            E = tjs_max
        }
        if (E < tjs_max * -1) {
            E = tjs_max * -1
        }
        var D = G - E
    }
    if (D > bas_de_page - tjs_hauteur) {
        D = bas_de_page - tjs_hauteur
    }
    if (D < haut_de_page) {
        D = haut_de_page
    }
    return D
}
var oldText = "";

function pasteControl(B, A) {
    var C = document.getElementById(B).value;
    if (C.length > (oldText.length + 6)) {
        document.getElementById(B).value = oldText;
        alert(A)
    } else {
        oldText = C
    }
}
function isNumericInt(B) {
    var D = "0123456789";
    var C = true;
    var A;
    for (i = 0; i < B.length && C == true; i++) {
        A = B.charAt(i);
        if (D.indexOf(A) == -1) {
            C = false
        }
    }
    return C
}
function addslashes(A) {
    A = A.replace(/\'/g, "\\'");
    A = A.replace(/\"/g, '\\"');
    return A
}
function pngFixForIE() {
    for (i = 0; i < document.images.length; i++) {
        img = document.images[i];
        imgExt = img.src.substring(img.src.length - 3, img.src.length);
        imgExt = imgExt.toUpperCase();
        if (imgExt == "PNG") {
            imgID = (img.id) ? "id='" + img.id + "' " : "";
            imgClass = (img.className) ? "class='" + img.className + "' " : "";
            imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' ";
            imgStyle = "display:inline-block;" + img.style.cssText;
            if (img.align == "left") {
                imgStyle = "float:left;" + imgStyle
            } else {
                if (img.align == "right") {
                    imgStyle = "float:right;" + imgStyle
                }
            }
            if (img.parentElement.href) {
                imgStyle = "cursor:hand;" + imgStyle
            }
            imgWidth = img.width == 0 ? 120 : img.width;
            imgHeight = img.height == 0 ? 90 : img.height;
            strNewHTML = "<span " + imgID + imgClass + imgTitle + ' style="width:' + imgWidth + "px; height:" + imgHeight + "px;" + imgStyle + ";" + "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + img.src + "', sizingMethod='scale');\"></span>";
            img.outerHTML = strNewHTML;
            i = i - 1
        }
    }
}
function startNewsticker() {
    setTimeout("newsticker()", 10000)
}
function newsticker() {
    if (stopNewsTicker == false) {
        $("newsticker" + idnewsticker).hide();
        ++idnewsticker;
        if (idnewsticker > maxidnewsticker) {
            idnewsticker = 1
        }
        $("newsticker" + idnewsticker).show();
        startNewsticker()
    }
}
function expandNewsTicker() {
    if (typeof(expanded) == "undefined") {
        expanded = false
    }
    if (expanded == true) {
        expanded = false;
        stopNewsTicker = false;
        $("boxnewsticker").className = "newsticker";
        for (i = 1; i <= maxidnewsticker; i++) {
            $("newsticker" + i).hide()
        }
        $("newsticker" + idnewsticker).show();
        startNewsticker()
    } else {
        expanded = true;
        stopNewsTicker = true;
        $("boxnewsticker").className = "newstickerexpanded";
        $("newsticker" + idnewsticker).hide();
        for (i = 1; i <= maxidnewsticker; i++) {
            $("newsticker" + i).show()
        }
    }
}
function starttopStory() {
    setTimeout("topStory()", 4000)
}
function topStory() {
    if (defile == true) {
        $("numeditohot" + idtopStory).className = "box-header-topstory";
        $("editohot" + idtopStory).hide();
        ++idtopStory;
        if (idtopStory > maxidtopStory) {
            idtopStory = 1
        }
        $("numeditohot" + idtopStory).className = "box-header-topstory-active";
        $("editohot" + idtopStory).show();
        starttopStory()
    }
}
function changeTopStory(A) {
    defile = false;
    $("numeditohot" + idtopStory).className = "box-header-topstory";
    $("editohot" + idtopStory).hide();
    idtopStory = A;
    $("numeditohot" + idtopStory).className = "box-header-topstory-active";
    $("editohot" + idtopStory).show()
}
function activateTopStory(A) {
    defile = false;
    $("numeditohot" + idtopStory).className = "box-header-topstory";
    $("editohot" + idtopStory).hide();
    idtopStory = A;
    if (idtopStory > maxidtopStory) {
        idtopStory = 1
    } else {
        if (idtopStory < 1) {
            idtopStory = maxidtopStory
        }
    }
    $("numeditohot" + idtopStory).className = "box-header-topstory-active";
    $("editohot" + idtopStory).show();
    return false
}
function rate(A, C, B) {
    new Ajax.Request("./index.php?p=rating&a=vote&type=" + A + "&id=" + C + "&val=" + B, {
        onSuccess: function (E) {
            var D = E.responseText.evalJSON();
            $("ratingresult").innerHTML = D["val"] + "/5";
            $("ratingvotant").innerHTML = D["nb"];
            if (D["nb"] > 1) {
                $("ratingpluriel").show()
            }
        }
    })
}
function voteQuickSond() {
    var B = "";
    var A = $("mainformqsond").childElements();
    A.each(function (C) {
        if (C.type == "radio") {
            if ($(C.id).checked === true) {
                B = C.value
            }
        }
    });
    new Ajax.Request("./index.php?p=sondage&a=voteqs&id=" + $("idqsond").value + "&vote=" + B, {
        onSuccess: function (C) {
            $("maindivqsond").innerHTML = C.responseText.evalJSON();
            $("bar_sondage1").morph("width: 100%;");
            $("bar_sondage2").morph("width: 100%;");
            $("bar_sondage3").morph("width: 100%;")
        }
    })
}
function sendReporterForm() {
    var A = "name=" + encodeURI($("namesub").value);
    A += "&firstname=" + encodeURI($("firstnamesub").value);
    A += "&age=" + encodeURI($("agesub").value);
    A += "&profession=" + encodeURI($("professionsub").value);
    A += "&email=" + encodeURI($("emailsub").value);
    A += "&gsm=" + encodeURI($("gsmsub").value);
    A += "&address=" + encodeURI($("addresssub").value);
    A += "&intro=" + encodeURI($("introsub").value);
    A += "&reporter=" + encodeURI($("reportersub").value);
    new Ajax.Request("./index.php?p=membre&a=reporter", {
        method: "post",
        parameters: A,
        onLoading: function (B) {
            Element.show("reporter-form-loading")
        },
        onSuccess: function (B) {
            $("reporter-form-box").innerHTML = B.responseText.evalJSON()
        },
        onComplete: function (B) {
            Element.hide("reporter-form-loading")
        }
    })
}
function initLoginbox() {
    $("loginbox").morph("width:16px;", {
        beforeStart: function () {
            $("shadow-loginbox-right").setStyle({
                display: "none"
            });
            $("shadow-loginbox-left").setStyle({
                display: "none"
            });
            $("loginbox-arrow").className = "loginbox-arrow-bg";
            $("hide-loginbox").hide();
            $("loginbox-arrow").innerHTML = "<"
        },
        afterFinish: function () {
            etat = 0
        }
    })
}
function startDynImage() {
    setTimeout("dynImage()", 3000)
}
function dynImage() {
    $("dynimage" + idDynImage).hide();
    if (++idDynImage > maxIdDynImage) {
        idDynImage = 1
    }
    $("dynimage" + idDynImage).show();
    startDynImage()
}
function show_ssmenu(A) {
    document.getElementById(A).style.display = "block";
    return true
}
function hide_ssmenu(A) {
    document.getElementById(A).style.display = "none";
    return true
}
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 (E) {}
        }
        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 (E) {
            if (Object.isFunction(E[D])) {
                try {
                    E[D].apply(E, [B, C, A])
                } catch (F) {}
            }
        })
    }
};
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 E = B.getHeader("Content-type");
            if (this.options.evalJS == "force" || (this.options.evalJS && this.isSameOrigin() && E && E.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 (D, C) {
        D = $(D), C = $(C);
        var F = C;
        if (D.compareDocumentPosition) {
            return (D.compareDocumentPosition(C) & 8) === 8
        }
        if (D.sourceIndex && !Prototype.Browser.Opera) {
            var E = D.sourceIndex,
                B = C.sourceIndex,
                A = C.nextSibling;
            if (!A) {
                do {
                    C = C.parentNode
                } while (!(A = C.nextSibling) && C.parentNode)
            }
            if (A && A.sourceIndex) {
                return (E > B && E < A.sourceIndex)
            }
        }
        while (D = D.parentNode) {
            if (D == F) {
                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 I = 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(H)
        } else {
            H(B)
        }
    }
    function H(F) {
        F = F.toUpperCase();
        if (!Element.Methods.ByTag[F]) {
            Element.Methods.ByTag[F] = {}
        }
        Object.extend(Element.Methods.ByTag[F], C)
    }
    function A(L, K, F) {
        F = F || false;
        for (var N in L) {
            var M = L[N];
            if (!Object.isFunction(M)) {
                continue
            }
            if (!F || !(N in K)) {
                K[N] = M.methodize()
            }
        }
    }
    function E(L) {
        var F;
        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]) {
            F = "HTML" + K[L] + "Element"
        }
        if (window[F]) {
            return window[F]
        }
        F = "HTML" + L + "Element";
        if (window[F]) {
            return window[F]
        }
        F = "HTML" + L.capitalize() + "Element";
        if (window[F]) {
            return window[F]
        }
        window[F] = {};
        window[F].prototype = document.createElement(L).__proto__;
        return window[F]
    }
    if (I.ElementExtensions) {
        A(Element.Methods, HTMLElement.prototype);
        A(Element.Methods.Simulated, HTMLElement.prototype, true)
    }
    if (I.SpecificElementExtensions) {
        for (var J in Element.Methods.ByTag) {
            var G = E(J);
            if (Object.isUndefined(G)) {
                continue
            }
            A(D[J], G.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 C = Prototype.Browser;
        $w("width height").each(function (E) {
            var B = E.capitalize();
            A[E] = (C.WebKit && !document.evaluate) ? self["inner" + B] : (C.Opera) ? document.body["client" + B] : document.documentElement["client" + B]
        });
        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 E = this.expression,
            F = Selector.patterns,
            B = Selector.xpath,
            D, A;
        if (Selector._cache[E]) {
            this.xpath = Selector._cache[E];
            return
        }
        this.matcher = [".//*"];
        while (E && D != E && (/\S/).test(E)) {
            D = E;
            for (var C in F) {
                if (A = E.match(F[C])) {
                    this.matcher.push(Object.isFunction(B[C]) ? B[C](A) : new Template(B[C]).evaluate(A));
                    E = E.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 (H) {
        this.tokens = [];
        var L = this.expression,
            A = Selector.patterns,
            E = Selector.assertions;
        var B, D, F;
        while (L && B !== L && (/\S/).test(L)) {
            B = L;
            for (var I in A) {
                D = A[I];
                if (F = L.match(D)) {
                    if (E[I]) {
                        this.tokens.push([I, Object.clone(F)]);
                        L = L.replace(F[0], "")
                    } else {
                        return this.findElements(document).include(H)
                    }
                }
            }
        }
        var K = true,
            C, J;
        for (var I = 0, G; G = this.tokens[I]; I++) {
            C = G[0], J = G[1];
            if (!Selector.assertions[C](H, J)) {
                K = false;
                break
            }
        }
        return K
    },
    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 H = B[6],
                    G = Selector.patterns,
                    A = Selector.xpath,
                    E, C;
                var F = [];
                while (H && E != H && (/\S/).test(H)) {
                    E = H;
                    for (var D in G) {
                        if (B = H.match(G[D])) {
                            C = Object.isFunction(A[D]) ? A[D](B) : new Template(A[D]).evaluate(B);
                            F.push("(" + C.substring(1, C.length - 1) + ")");
                            H = H.replace(B[0], "");
                            break
                        }
                    }
                }
                return "[not(" + F.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 (E, C) {
                var F, G = C[6],
                    B;
                if (G == "even") {
                    G = "2n+0"
                }
                if (G == "odd") {
                    G = "2n+1"
                }
                if (F = G.match(/^(\d+)$/)) {
                    return "[" + E + "= " + F[1] + "]"
                }
                if (F = G.match(/^(-?\d*)?n(([+-])(\d+))?/)) {
                    if (F[1] == "-") {
                        F[1] = -1
                    }
                    var D = F[1] ? Number(F[1]) : 1;
                    var A = F[2] ? Number(F[2]) : 0;
                    B = "[((#{fragment} - #{b}) mod #{a} = 0) and " + "((#{fragment} - #{b}) div #{a} >= 0)]";
                    return new Template(B).evaluate({
                        fragment: E,
                        a: D,
                        b: A
                    })
                }
            }
        }
    },
    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 (B, A) {
            for (var C = 0, D; D = A[C]; C++) {
                B.push(D)
            }
            return B
        },
        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, H, C, B) {
            var I = 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() === I) {
                        E.push(D)
                    }
                }
                return E
            } else {
                return H.getElementsByTagName(C)
            }
        },
        id: function (B, A, H, F) {
            var G = $(H),
                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, I, H, J, C, B) {
            if (!A) {
                A = I.getElementsByTagName("*")
            }
            if (A && B) {
                A = this[B](A)
            }
            var K = Selector.operators[C],
                F = [];
            for (var E = 0, D; D = A[E]; E++) {
                var G = Element.readAttribute(D, H);
                if (G === null) {
                    continue
                }
                if (K(G, J)) {
                    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 (B, A, C) {
            if (B == 0) {
                return A > 0 ? [A] : []
            }
            return $R(1, C).inject([], function (D, E) {
                if (0 == (E - A) % B && (E - A) / B >= 0) {
                    D.push(E)
                }
                return D
            })
        },
        nth: function (A, L, N, K, C) {
            if (A.length == 0) {
                return []
            }
            if (L == "even") {
                L = "2n+0"
            }
            if (L == "odd") {
                L = "2n+1"
            }
            var J = Selector.handlers,
                I = [],
                B = [],
                E;
            J.mark(A);
            for (var H = 0, D; D = A[H]; H++) {
                if (!D.parentNode._countedByPrototype) {
                    J.index(D.parentNode, K, C);
                    B.push(D.parentNode)
                }
            }
            if (L.match(/^\d+$/)) {
                L = Number(L);
                for (var H = 0, D; D = A[H]; H++) {
                    if (D.nodeIndex == L) {
                        I.push(D)
                    }
                }
            } else {
                if (E = L.match(/^(-?\d*)?n(([+-])(\d+))?/)) {
                    if (E[1] == "-") {
                        E[1] = -1
                    }
                    var O = E[1] ? Number(E[1]) : 1;
                    var M = E[2] ? Number(E[2]) : 0;
                    var P = Selector.pseudos.getIndices(O, M, A.length);
                    for (var H = 0, D, F = P.length; D = A[H]; H++) {
                        for (var G = 0; G < F; G++) {
                            if (D.nodeIndex == P[G]) {
                                I.push(D)
                            }
                        }
                    }
                }
            }
            J.unmark(A);
            J.unmark(B);
            return I
        },
        "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, I) {
            var G = Selector.handlers,
                J, C;
            var H = new Selector(D).findElements(I);
            G.mark(H);
            for (var F = 0, E = [], B; B = A[F]; F++) {
                if (!B._countedByPrototype) {
                    E.push(B)
                }
            }
            G.unmark(H);
            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 (B, A) {
            for (var C = 0, D; D = A[C]; C++) {
                if (D.tagName !== "!") {
                    B.push(D)
                }
            }
            return B
        },
        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, J, I; J = C[D]; D++) {
                if (J.className && (I = " " + J.className + " ") && (I.include(F) || (H && H.all(function (K) {
                    return !K.toString().blank() && I.include(" " + K + " ")
                })))) {
                    G.push(Element.extend(J))
                }
            }
            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();
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, D) {
        var E = {};
        if (this.options.scaleX) {
            E.width = D.round() + "px"
        }
        if (this.options.scaleY) {
            E.height = A.round() + "px"
        }
        if (this.options.scaleFromCenter) {
            var C = (A - this.dims[0]) / 2;
            var B = (D - this.dims[1]) / 2;
            if (this.elementPositioning == "absolute") {
                if (this.options.scaleY) {
                    E.top = this.originalTop - C + "px"
                }
                if (this.options.scaleX) {
                    E.left = this.originalLeft - B + "px"
                }
            } else {
                if (this.options.scaleY) {
                    E.top = -C + "px"
                }
                if (this.options.scaleX) {
                    E.left = -B + "px"
                }
            }
        }
        this.element.setStyle(E)
    }
});
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);
Glider = Class.create();
Object.extend(Object.extend(Glider.prototype, Abstract.prototype), {
    initialize: function (B, A) {
        this.scrolling = false;
        this.wrapper = $(B);
        this.scroller = this.wrapper.down("div.scroller");
        this.sections = this.wrapper.getElementsBySelector("div.section");
        this.options = Object.extend({
            controlsEvent: "click",
            duration: 1,
            frequency: 3
        }, A || {});
        this.sections.each(function (D, C) {
            D._index = C
        });
        this.events = {
            click: this.click.bind(this)
        };
        this.addObservers();
        if (this.options.initialSection) {
            this.moveTo(this.options.initialSection, this.scroller, {
                duration: this.options.duration
            })
        }
        if (this.options.autoGlide) {
            this.start()
        }
    },
    addObservers: function () {
        this.controls = this.wrapper.getElementsBySelector(".controls a");
        this.controls.invoke("observe", this.options.controlsEvent, this.events.click)
    },
    click: function (B) {
        this.stop();
        var A = Event.findElement(B, "a");
        if (this.scrolling) {
            this.scrolling.cancel()
        }
        moveTo = this.wrapper.down("#" + A.href.split("#")[1]);
        this.moveTo(moveTo, this.scroller, {
            duration: this.options.duration
        });
        Event.stop(B);
        this.controls.each(function (C) {
            if (C == A) {
                C.addClassName("active")
            } else {
                C.removeClassName("active")
            }
        })
    },
    moveTo: function (D, A, C) {
        this.current = $(D);
        Position.prepare();
        var E = Position.cumulativeOffset(A),
            B = Position.cumulativeOffset($(D));
        this.scrolling = new Effect.SmoothScroll(A, {
            duration: C.duration,
            x: (B[0] - E[0]),
            y: (B[1] - E[1])
        });
        return false
    },
    next: function () {
        if (this.current) {
            var B = this.current._index;
            var A = (this.sections.length - 1 == B) ? 0 : B + 1
        } else {
            var A = 1
        }
        this.moveTo(this.sections[A], this.scroller, {
            duration: this.options.duration
        })
    },
    previous: function () {
        if (this.current) {
            var A = this.current._index;
            var B = (A == 0) ? this.sections.length - 1 : A - 1
        } else {
            var B = this.sections.length - 1
        }
        this.moveTo(this.sections[B], this.scroller, {
            duration: this.options.duration
        })
    },
    stop: function () {
        clearTimeout(this.timer)
    },
    start: function () {
        this.periodicallyUpdate()
    },
    periodicallyUpdate: function () {
        if (this.timer != null) {
            clearTimeout(this.timer);
            this.next()
        }
        this.timer = setTimeout(this.periodicallyUpdate.bind(this), this.options.frequency * 1000)
    }
});
Effect.SmoothScroll = Class.create();
Object.extend(Object.extend(Effect.SmoothScroll.prototype, Effect.Base.prototype), {
    initialize: function (B) {
        this.element = $(B);
        var A = Object.extend({
            x: 0,
            y: 0,
            mode: "absolute"
        }, arguments[1] || {});
        this.start(A)
    },
    setup: function () {
        if (this.options.continuous && !this.element._ext) {
            this.element.cleanWhitespace();
            this.element._ext = true;
            this.element.appendChild(this.element.firstChild)
        }
        this.originalLeft = this.element.scrollLeft;
        this.originalTop = this.element.scrollTop;
        if (this.options.mode == "absolute") {
            this.options.x -= this.originalLeft;
            this.options.y -= this.originalTop
        }
    },
    update: function (A) {
        this.element.scrollLeft = this.options.x * A + this.originalLeft;
        this.element.scrollTop = this.options.y * A + this.originalTop
    }
});
if (typeof Effect == "undefined") {
    throw ("controls.js requires including script.aculo.us' effects.js library")
}
var Autocompleter = {};
Autocompleter.Base = Class.create({
    baseInitialize: function (B, C, A) {
        B = $(B);
        this.element = B;
        this.update = $(C);
        this.hasFocus = false;
        this.changed = false;
        this.active = false;
        this.index = 0;
        this.entryCount = 0;
        this.oldElementValue = this.element.value;
        if (this.setOptions) {
            this.setOptions(A)
        } else {
            this.options = A || {}
        }
        this.options.paramName = this.options.paramName || this.element.name;
        this.options.tokens = this.options.tokens || [];
        this.options.frequency = this.options.frequency || 0.4;
        this.options.minChars = this.options.minChars || 1;
        this.options.onShow = this.options.onShow ||
        function (D, E) {
            if (!E.style.position || E.style.position == "absolute") {
                E.style.position = "absolute";
                Position.clone(D, E, {
                    setHeight: false,
                    offsetTop: D.offsetHeight
                })
            }
            Effect.Appear(E, {
                duration: 0.15
            })
        };
        this.options.onHide = this.options.onHide ||
        function (D, E) {
            new Effect.Fade(E, {
                duration: 0.15
            })
        };
        if (typeof(this.options.tokens) == "string") {
            this.options.tokens = new Array(this.options.tokens)
        }
        if (!this.options.tokens.include("\n")) {
            this.options.tokens.push("\n")
        }
        this.observer = null;
        this.element.setAttribute("autocomplete", "off");
        Element.hide(this.update);
        Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
        Event.observe(this.element, "keydown", this.onKeyPress.bindAsEventListener(this))
    },
    show: function () {
        if (Element.getStyle(this.update, "display") == "none") {
            this.options.onShow(this.element, this.update)
        }
        if (!this.iefix && (Prototype.Browser.IE) && (Element.getStyle(this.update, "position") == "absolute")) {
            new Insertion.After(this.update, '<iframe id="' + this.update.id + '_iefix" ' + 'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' + 'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
            this.iefix = $(this.update.id + "_iefix")
        }
        if (this.iefix) {
            setTimeout(this.fixIEOverlapping.bind(this), 50)
        }
    },
    fixIEOverlapping: function () {
        Position.clone(this.update, this.iefix, {
            setTop: (!this.update.style.height)
        });
        this.iefix.style.zIndex = 1;
        this.update.style.zIndex = 2;
        Element.show(this.iefix)
    },
    hide: function () {
        this.stopIndicator();
        if (Element.getStyle(this.update, "display") != "none") {
            this.options.onHide(this.element, this.update)
        }
        if (this.iefix) {
            Element.hide(this.iefix)
        }
    },
    startIndicator: function () {
        if (this.options.indicator) {
            Element.show(this.options.indicator)
        }
    },
    stopIndicator: function () {
        if (this.options.indicator) {
            Element.hide(this.options.indicator)
        }
    },
    onKeyPress: function (A) {
        if (this.active) {
            switch (A.keyCode) {
            case Event.KEY_TAB:
            case Event.KEY_RETURN:
                this.selectEntry();
                Event.stop(A);
            case Event.KEY_ESC:
                this.hide();
                this.active = false;
                Event.stop(A);
                return;
            case Event.KEY_LEFT:
            case Event.KEY_RIGHT:
                return;
            case Event.KEY_UP:
                this.markPrevious();
                this.render();
                Event.stop(A);
                return;
            case Event.KEY_DOWN:
                this.markNext();
                this.render();
                Event.stop(A);
                return
            }
        } else {
            if (A.keyCode == Event.KEY_TAB || A.keyCode == Event.KEY_RETURN || (Prototype.Browser.WebKit > 0 && A.keyCode == 0)) {
                return
            }
        }
        this.changed = true;
        this.hasFocus = true;
        if (this.observer) {
            clearTimeout(this.observer)
        }
        this.observer = setTimeout(this.onObserverEvent.bind(this), this.options.frequency * 1000)
    },
    activate: function () {
        this.changed = false;
        this.hasFocus = true;
        this.getUpdatedChoices()
    },
    onHover: function (B) {
        var A = Event.findElement(B, "LI");
        if (this.index != A.autocompleteIndex) {
            this.index = A.autocompleteIndex;
            this.render()
        }
        Event.stop(B)
    },
    onClick: function (B) {
        var A = Event.findElement(B, "LI");
        this.index = A.autocompleteIndex;
        this.selectEntry();
        this.hide()
    },
    onBlur: function (A) {
        setTimeout(this.hide.bind(this), 250);
        this.hasFocus = false;
        this.active = false
    },
    render: function () {
        if (this.entryCount > 0) {
            for (var A = 0; A < this.entryCount; A++) {
                this.index == A ? Element.addClassName(this.getEntry(A), "selected") : Element.removeClassName(this.getEntry(A), "selected")
            }
            if (this.hasFocus) {
                this.show();
                this.active = true
            }
        } else {
            this.active = false;
            this.hide()
        }
    },
    markPrevious: function () {
        if (this.index > 0) {
            this.index--
        } else {
            this.index = this.entryCount - 1
        }
        this.getEntry(this.index).scrollIntoView(true)
    },
    markNext: function () {
        if (this.index < this.entryCount - 1) {
            this.index++
        } else {
            this.index = 0
        }
        this.getEntry(this.index).scrollIntoView(false)
    },
    getEntry: function (A) {
        return this.update.firstChild.childNodes[A]
    },
    getCurrentEntry: function () {
        return this.getEntry(this.index)
    },
    selectEntry: function () {
        this.active = false;
        this.updateElement(this.getCurrentEntry())
    },
    updateElement: function (F) {
        if (this.options.updateElement) {
            this.options.updateElement(F);
            return
        }
        var D = "";
        if (this.options.select) {
            var A = $(F).select("." + this.options.select) || [];
            if (A.length > 0) {
                D = Element.collectTextNodes(A[0], this.options.select)
            }
        } else {
            D = Element.collectTextNodesIgnoreClass(F, "informal")
        }
        var C = this.getTokenBounds();
        if (C[0] != -1) {
            var E = this.element.value.substr(0, C[0]);
            var B = this.element.value.substr(C[0]).match(/^\s+/);
            if (B) {
                E += B[0]
            }
            this.element.value = E + D + this.element.value.substr(C[1])
        } else {
            this.element.value = D
        }
        this.oldElementValue = this.element.value;
        this.element.focus();
        if (this.options.afterUpdateElement) {
            this.options.afterUpdateElement(this.element, F)
        }
    },
    updateChoices: function (C) {
        if (!this.changed && this.hasFocus) {
            this.update.innerHTML = C;
            Element.cleanWhitespace(this.update);
            Element.cleanWhitespace(this.update.down());
            if (this.update.firstChild && this.update.down().childNodes) {
                this.entryCount = this.update.down().childNodes.length;
                for (var A = 0; A < this.entryCount; A++) {
                    var B = this.getEntry(A);
                    B.autocompleteIndex = A;
                    this.addObservers(B)
                }
            } else {
                this.entryCount = 0
            }
            this.stopIndicator();
            this.index = 0;
            if (this.entryCount == 1 && this.options.autoSelect) {
                this.selectEntry();
                this.hide()
            } else {
                this.render()
            }
        }
    },
    addObservers: function (A) {
        Event.observe(A, "mouseover", this.onHover.bindAsEventListener(this));
        Event.observe(A, "click", this.onClick.bindAsEventListener(this))
    },
    onObserverEvent: function () {
        this.changed = false;
        this.tokenBounds = null;
        if (this.getToken().length >= this.options.minChars) {
            this.getUpdatedChoices()
        } else {
            this.active = false;
            this.hide()
        }
        this.oldElementValue = this.element.value
    },
    getToken: function () {
        var A = this.getTokenBounds();
        return this.element.value.substring(A[0], A[1]).strip()
    },
    getTokenBounds: function () {
        if (null != this.tokenBounds) {
            return this.tokenBounds
        }
        var E = this.element.value;
        if (E.strip().empty()) {
            return [-1, 0]
        }
        var F = arguments.callee.getFirstDifferencePos(E, this.oldElementValue);
        var H = (F == this.oldElementValue.length ? 1 : 0);
        var D = -1,
            C = E.length;
        var G;
        for (var B = 0, A = this.options.tokens.length; B < A; ++B) {
            G = E.lastIndexOf(this.options.tokens[B], F + H - 1);
            if (G > D) {
                D = G
            }
            G = E.indexOf(this.options.tokens[B], F + H);
            if (-1 != G && G < C) {
                C = G
            }
        }
        return (this.tokenBounds = [D + 1, C])
    }
});
Autocompleter.Base.prototype.getTokenBounds.getFirstDifferencePos = function (C, A) {
    var D = Math.min(C.length, A.length);
    for (var B = 0; B < D; ++B) {
        if (C[B] != A[B]) {
            return B
        }
    }
    return D
};
Ajax.Autocompleter = Class.create(Autocompleter.Base, {
    initialize: function (C, D, B, A) {
        this.baseInitialize(C, D, A);
        this.options.asynchronous = true;
        this.options.onComplete = this.onComplete.bind(this);
        this.options.defaultParams = this.options.parameters || null;
        this.url = B
    },
    getUpdatedChoices: function () {
        this.startIndicator();
        var A = encodeURIComponent(this.options.paramName) + "=" + encodeURIComponent(this.getToken());
        this.options.parameters = this.options.callback ? this.options.callback(this.element, A) : A;
        if (this.options.defaultParams) {
            this.options.parameters += "&" + this.options.defaultParams
        }
        new Ajax.Request(this.url, this.options)
    },
    onComplete: function (A) {
        this.updateChoices(A.responseText)
    }
});
Autocompleter.Local = Class.create(Autocompleter.Base, {
    initialize: function (B, D, C, A) {
        this.baseInitialize(B, D, A);
        this.options.array = C
    },
    getUpdatedChoices: function () {
        this.updateChoices(this.options.selector(this))
    },
    setOptions: function (A) {
        this.options = Object.extend({
            choices: 10,
            partialSearch: true,
            partialChars: 2,
            ignoreCase: true,
            fullSearch: false,
            selector: function (B) {
                var D = [];
                var C = [];
                var H = B.getToken();
                var G = 0;
                for (var E = 0; E < B.options.array.length && D.length < B.options.choices; E++) {
                    var F = B.options.array[E];
                    var I = B.options.ignoreCase ? F.toLowerCase().indexOf(H.toLowerCase()) : F.indexOf(H);
                    while (I != -1) {
                        if (I == 0 && F.length != H.length) {
                            D.push("<li><strong>" + F.substr(0, H.length) + "</strong>" + F.substr(H.length) + "</li>");
                            break
                        } else {
                            if (H.length >= B.options.partialChars && B.options.partialSearch && I != -1) {
                                if (B.options.fullSearch || /\s/.test(F.substr(I - 1, 1))) {
                                    C.push("<li>" + F.substr(0, I) + "<strong>" + F.substr(I, H.length) + "</strong>" + F.substr(I + H.length) + "</li>");
                                    break
                                }
                            }
                        }
                        I = B.options.ignoreCase ? F.toLowerCase().indexOf(H.toLowerCase(), I + 1) : F.indexOf(H, I + 1)
                    }
                }
                if (C.length) {
                    D = D.concat(C.slice(0, B.options.choices - D.length))
                }
                return "<ul>" + D.join("") + "</ul>"
            }
        }, A || {})
    }
});
Field.scrollFreeActivate = function (A) {
    setTimeout(function () {
        Field.activate(A)
    }, 1)
};
Ajax.InPlaceEditor = Class.create({
    initialize: function (C, B, A) {
        this.url = B;
        this.element = C = $(C);
        this.prepareOptions();
        this._controls = {};
        arguments.callee.dealWithDeprecatedOptions(A);
        Object.extend(this.options, A || {});
        if (!this.options.formId && this.element.id) {
            this.options.formId = this.element.id + "-inplaceeditor";
            if ($(this.options.formId)) {
                this.options.formId = ""
            }
        }
        if (this.options.externalControl) {
            this.options.externalControl = $(this.options.externalControl)
        }
        if (!this.options.externalControl) {
            this.options.externalControlOnly = false
        }
        this._originalBackground = this.element.getStyle("background-color") || "transparent";
        this.element.title = this.options.clickToEditText;
        this._boundCancelHandler = this.handleFormCancellation.bind(this);
        this._boundComplete = (this.options.onComplete || Prototype.emptyFunction).bind(this);
        this._boundFailureHandler = this.handleAJAXFailure.bind(this);
        this._boundSubmitHandler = this.handleFormSubmission.bind(this);
        this._boundWrapperHandler = this.wrapUp.bind(this);
        this.registerListeners()
    },
    checkForEscapeOrReturn: function (A) {
        if (!this._editing || A.ctrlKey || A.altKey || A.shiftKey) {
            return
        }
        if (Event.KEY_ESC == A.keyCode) {
            this.handleFormCancellation(A)
        } else {
            if (Event.KEY_RETURN == A.keyCode) {
                this.handleFormSubmission(A)
            }
        }
    },
    createControl: function (G, C, B) {
        var E = this.options[G + "Control"];
        var F = this.options[G + "Text"];
        if ("button" == E) {
            var A = document.createElement("input");
            A.type = "submit";
            A.value = F;
            A.className = "editor_" + G + "_button";
            if ("cancel" == G) {
                A.onclick = this._boundCancelHandler
            }
            this._form.appendChild(A);
            this._controls[G] = A
        } else {
            if ("link" == E) {
                var D = document.createElement("a");
                D.href = "#";
                D.appendChild(document.createTextNode(F));
                D.onclick = "cancel" == G ? this._boundCancelHandler : this._boundSubmitHandler;
                D.className = "editor_" + G + "_link";
                if (B) {
                    D.className += " " + B
                }
                this._form.appendChild(D);
                this._controls[G] = D
            }
        }
    },
    createEditField: function () {
        var C = (this.options.loadTextURL ? this.options.loadingText : this.getText());
        var B;
        if (1 >= this.options.rows && !/\r|\n/.test(this.getText())) {
            B = document.createElement("input");
            B.type = "text";
            var A = this.options.size || this.options.cols || 0;
            if (0 < A) {
                B.size = A
            }
        } else {
            B = document.createElement("textarea");
            B.rows = (1 >= this.options.rows ? this.options.autoRows : this.options.rows);
            B.cols = this.options.cols || 40
        }
        B.name = this.options.paramName;
        B.value = C;
        B.className = "editor_field";
        if (this.options.submitOnBlur) {
            B.onblur = this._boundSubmitHandler
        }
        this._controls.editor = B;
        if (this.options.loadTextURL) {
            this.loadExternalText()
        }
        this._form.appendChild(this._controls.editor)
    },
    createForm: function () {
        var B = this;

        function A(D, E) {
            var C = B.options["text" + D + "Controls"];
            if (!C || E === false) {
                return
            }
            B._form.appendChild(document.createTextNode(C))
        }
        this._form = $(document.createElement("form"));
        this._form.id = this.options.formId;
        this._form.addClassName(this.options.formClassName);
        this._form.onsubmit = this._boundSubmitHandler;
        this.createEditField();
        if ("textarea" == this._controls.editor.tagName.toLowerCase()) {
            this._form.appendChild(document.createElement("br"))
        }
        if (this.options.onFormCustomization) {
            this.options.onFormCustomization(this, this._form)
        }
        A("Before", this.options.okControl || this.options.cancelControl);
        this.createControl("ok", this._boundSubmitHandler);
        A("Between", this.options.okControl && this.options.cancelControl);
        this.createControl("cancel", this._boundCancelHandler, "editor_cancel");
        A("After", this.options.okControl || this.options.cancelControl)
    },
    destroy: function () {
        if (this._oldInnerHTML) {
            this.element.innerHTML = this._oldInnerHTML
        }
        this.leaveEditMode();
        this.unregisterListeners()
    },
    enterEditMode: function (A) {
        if (this._saving || this._editing) {
            return
        }
        this._editing = true;
        this.triggerCallback("onEnterEditMode");
        if (this.options.externalControl) {
            this.options.externalControl.hide()
        }
        this.element.hide();
        this.createForm();
        this.element.parentNode.insertBefore(this._form, this.element);
        if (!this.options.loadTextURL) {
            this.postProcessEditField()
        }
        if (A) {
            Event.stop(A)
        }
    },
    enterHover: function (A) {
        if (this.options.hoverClassName) {
            this.element.addClassName(this.options.hoverClassName)
        }
        if (this._saving) {
            return
        }
        this.triggerCallback("onEnterHover")
    },
    getText: function () {
        return this.element.innerHTML
    },
    handleAJAXFailure: function (A) {
        this.triggerCallback("onFailure", A);
        if (this._oldInnerHTML) {
            this.element.innerHTML = this._oldInnerHTML;
            this._oldInnerHTML = null
        }
    },
    handleFormCancellation: function (A) {
        this.wrapUp();
        if (A) {
            Event.stop(A)
        }
    },
    handleFormSubmission: function (D) {
        var B = this._form;
        var C = $F(this._controls.editor);
        this.prepareSubmission();
        var E = this.options.callback(B, C) || "";
        if (Object.isString(E)) {
            E = E.toQueryParams()
        }
        E.editorId = this.element.id;
        if (this.options.htmlResponse) {
            var A = Object.extend({
                evalScripts: true
            }, this.options.ajaxOptions);
            Object.extend(A, {
                parameters: E,
                onComplete: this._boundWrapperHandler,
                onFailure: this._boundFailureHandler
            });
            new Ajax.Updater({
                success: this.element
            }, this.url, A)
        } else {
            var A = Object.extend({
                method: "get"
            }, this.options.ajaxOptions);
            Object.extend(A, {
                parameters: E,
                onComplete: this._boundWrapperHandler,
                onFailure: this._boundFailureHandler
            });
            new Ajax.Request(this.url, A)
        }
        if (D) {
            Event.stop(D)
        }
    },
    leaveEditMode: function () {
        this.element.removeClassName(this.options.savingClassName);
        this.removeForm();
        this.leaveHover();
        this.element.style.backgroundColor = this._originalBackground;
        this.element.show();
        if (this.options.externalControl) {
            this.options.externalControl.show()
        }
        this._saving = false;
        this._editing = false;
        this._oldInnerHTML = null;
        this.triggerCallback("onLeaveEditMode")
    },
    leaveHover: function (A) {
        if (this.options.hoverClassName) {
            this.element.removeClassName(this.options.hoverClassName)
        }
        if (this._saving) {
            return
        }
        this.triggerCallback("onLeaveHover")
    },
    loadExternalText: function () {
        this._form.addClassName(this.options.loadingClassName);
        this._controls.editor.disabled = true;
        var A = Object.extend({
            method: "get"
        }, this.options.ajaxOptions);
        Object.extend(A, {
            parameters: "editorId=" + encodeURIComponent(this.element.id),
            onComplete: Prototype.emptyFunction,
            onSuccess: function (C) {
                this._form.removeClassName(this.options.loadingClassName);
                var B = C.responseText;
                if (this.options.stripLoadedTextTags) {
                    B = B.stripTags()
                }
                this._controls.editor.value = B;
                this._controls.editor.disabled = false;
                this.postProcessEditField()
            }.bind(this),
            onFailure: this._boundFailureHandler
        });
        new Ajax.Request(this.options.loadTextURL, A)
    },
    postProcessEditField: function () {
        var A = this.options.fieldPostCreation;
        if (A) {
            $(this._controls.editor)["focus" == A ? "focus" : "activate"]()
        }
    },
    prepareOptions: function () {
        this.options = Object.clone(Ajax.InPlaceEditor.DefaultOptions);
        Object.extend(this.options, Ajax.InPlaceEditor.DefaultCallbacks);
        [this._extraDefaultOptions].flatten().compact().each(function (A) {
            Object.extend(this.options, A)
        }.bind(this))
    },
    prepareSubmission: function () {
        this._saving = true;
        this.removeForm();
        this.leaveHover();
        this.showSaving()
    },
    registerListeners: function () {
        this._listeners = {};
        var A;
        $H(Ajax.InPlaceEditor.Listeners).each(function (B) {
            A = this[B.value].bind(this);
            this._listeners[B.key] = A;
            if (!this.options.externalControlOnly) {
                this.element.observe(B.key, A)
            }
            if (this.options.externalControl) {
                this.options.externalControl.observe(B.key, A)
            }
        }.bind(this))
    },
    removeForm: function () {
        if (!this._form) {
            return
        }
        this._form.remove();
        this._form = null;
        this._controls = {}
    },
    showSaving: function () {
        this._oldInnerHTML = this.element.innerHTML;
        this.element.innerHTML = this.options.savingText;
        this.element.addClassName(this.options.savingClassName);
        this.element.style.backgroundColor = this._originalBackground;
        this.element.show()
    },
    triggerCallback: function (B, A) {
        if ("function" == typeof this.options[B]) {
            this.options[B](this, A)
        }
    },
    unregisterListeners: function () {
        $H(this._listeners).each(function (A) {
            if (!this.options.externalControlOnly) {
                this.element.stopObserving(A.key, A.value)
            }
            if (this.options.externalControl) {
                this.options.externalControl.stopObserving(A.key, A.value)
            }
        }.bind(this))
    },
    wrapUp: function (A) {
        this.leaveEditMode();
        this._boundComplete(A, this.element)
    }
});
Object.extend(Ajax.InPlaceEditor.prototype, {
    dispose: Ajax.InPlaceEditor.prototype.destroy
});
Ajax.InPlaceCollectionEditor = Class.create(Ajax.InPlaceEditor, {
    initialize: function ($super, C, B, A) {
        this._extraDefaultOptions = Ajax.InPlaceCollectionEditor.DefaultOptions;
        $super(C, B, A)
    },
    createEditField: function () {
        var A = document.createElement("select");
        A.name = this.options.paramName;
        A.size = 1;
        this._controls.editor = A;
        this._collection = this.options.collection || [];
        if (this.options.loadCollectionURL) {
            this.loadCollection()
        } else {
            this.checkForExternalText()
        }
        this._form.appendChild(this._controls.editor)
    },
    loadCollection: function () {
        this._form.addClassName(this.options.loadingClassName);
        this.showLoadingText(this.options.loadingCollectionText);
        var options = Object.extend({
            method: "get"
        }, this.options.ajaxOptions);
        Object.extend(options, {
            parameters: "editorId=" + encodeURIComponent(this.element.id),
            onComplete: Prototype.emptyFunction,
            onSuccess: function (transport) {
                var js = transport.responseText.strip();
                if (!/^\[.*\]$/.test(js)) {
                    throw "Server returned an invalid collection representation."
                }
                this._collection = eval(js);
                this.checkForExternalText()
            }.bind(this),
            onFailure: this.onFailure
        });
        new Ajax.Request(this.options.loadCollectionURL, options)
    },
    showLoadingText: function (B) {
        this._controls.editor.disabled = true;
        var A = this._controls.editor.firstChild;
        if (!A) {
            A = document.createElement("option");
            A.value = "";
            this._controls.editor.appendChild(A);
            A.selected = true
        }
        A.update((B || "").stripScripts().stripTags())
    },
    checkForExternalText: function () {
        this._text = this.getText();
        if (this.options.loadTextURL) {
            this.loadExternalText()
        } else {
            this.buildOptionList()
        }
    },
    loadExternalText: function () {
        this.showLoadingText(this.options.loadingText);
        var A = Object.extend({
            method: "get"
        }, this.options.ajaxOptions);
        Object.extend(A, {
            parameters: "editorId=" + encodeURIComponent(this.element.id),
            onComplete: Prototype.emptyFunction,
            onSuccess: function (B) {
                this._text = B.responseText.strip();
                this.buildOptionList()
            }.bind(this),
            onFailure: this.onFailure
        });
        new Ajax.Request(this.options.loadTextURL, A)
    },
    buildOptionList: function () {
        this._form.removeClassName(this.options.loadingClassName);
        this._collection = this._collection.map(function (D) {
            return 2 === D.length ? D : [D, D].flatten()
        });
        var B = ("value" in this.options) ? this.options.value : this._text;
        var A = this._collection.any(function (D) {
            return D[0] == B
        }.bind(this));
        this._controls.editor.update("");
        var C;
        this._collection.each(function (E, D) {
            C = document.createElement("option");
            C.value = E[0];
            C.selected = A ? E[0] == B : 0 == D;
            C.appendChild(document.createTextNode(E[1]));
            this._controls.editor.appendChild(C)
        }.bind(this));
        this._controls.editor.disabled = false;
        Field.scrollFreeActivate(this._controls.editor)
    }
});
Ajax.InPlaceEditor.prototype.initialize.dealWithDeprecatedOptions = function (A) {
    if (!A) {
        return
    }
    function B(C, D) {
        if (C in A || D === undefined) {
            return
        }
        A[C] = D
    }
    B("cancelControl", (A.cancelLink ? "link" : (A.cancelButton ? "button" : A.cancelLink == A.cancelButton == false ? false : undefined)));
    B("okControl", (A.okLink ? "link" : (A.okButton ? "button" : A.okLink == A.okButton == false ? false : undefined)));
    B("highlightColor", A.highlightcolor);
    B("highlightEndColor", A.highlightendcolor)
};
Object.extend(Ajax.InPlaceEditor, {
    DefaultOptions: {
        ajaxOptions: {},
        autoRows: 3,
        cancelControl: "link",
        cancelText: "cancel",
        clickToEditText: "Click to edit",
        externalControl: null,
        externalControlOnly: false,
        fieldPostCreation: "activate",
        formClassName: "inplaceeditor-form",
        formId: null,
        highlightColor: "#ffff99",
        highlightEndColor: "#ffffff",
        hoverClassName: "",
        htmlResponse: true,
        loadingClassName: "inplaceeditor-loading",
        loadingText: "Loading...",
        okControl: "button",
        okText: "ok",
        paramName: "value",
        rows: 1,
        savingClassName: "inplaceeditor-saving",
        savingText: "Saving...",
        size: 0,
        stripLoadedTextTags: false,
        submitOnBlur: false,
        textAfterControls: "",
        textBeforeControls: "",
        textBetweenControls: ""
    },
    DefaultCallbacks: {
        callback: function (A) {
            return Form.serialize(A)
        },
        onComplete: function (B, A) {
            new Effect.Highlight(A, {
                startcolor: this.options.highlightColor,
                keepBackgroundImage: true
            })
        },
        onEnterEditMode: null,
        onEnterHover: function (A) {
            A.element.style.backgroundColor = A.options.highlightColor;
            if (A._effect) {
                A._effect.cancel()
            }
        },
        onFailure: function (B, A) {
            alert("Error communication with the server: " + B.responseText.stripTags())
        },
        onFormCustomization: null,
        onLeaveEditMode: null,
        onLeaveHover: function (A) {
            A._effect = new Effect.Highlight(A.element, {
                startcolor: A.options.highlightColor,
                endcolor: A.options.highlightEndColor,
                restorecolor: A._originalBackground,
                keepBackgroundImage: true
            })
        }
    },
    Listeners: {
        click: "enterEditMode",
        keydown: "checkForEscapeOrReturn",
        mouseover: "enterHover",
        mouseout: "leaveHover"
    }
});
Ajax.InPlaceCollectionEditor.DefaultOptions = {
    loadingCollectionText: "Loading options..."
};
Form.Element.DelayedObserver = Class.create({
    initialize: function (B, A, C) {
        this.delay = A || 0.5;
        this.element = $(B);
        this.callback = C;
        this.timer = null;
        this.lastValue = $F(this.element);
        Event.observe(this.element, "keyup", this.delayedListener.bindAsEventListener(this))
    },
    delayedListener: function (A) {
        if (this.lastValue == $F(this.element)) {
            return
        }
        if (this.timer) {
            clearTimeout(this.timer)
        }
        this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
        this.lastValue = $F(this.element)
    },
    onTimerEvent: function () {
        this.timer = null;
        this.callback(this.element, $F(this.element))
    }
});
if (!Control) {
    var Control = {}
}
Control.Slider = Class.create({
    initialize: function (D, A, B) {
        var C = this;
        if (Object.isArray(D)) {
            this.handles = D.collect(function (E) {
                return $(E)
            })
        } else {
            this.handles = [$(D)]
        }
        this.track = $(A);
        this.options = B || {};
        this.axis = this.options.axis || "horizontal";
        this.increment = this.options.increment || 1;
        this.step = parseInt(this.options.step || "1");
        this.range = this.options.range || $R(0, 1);
        this.value = 0;
        this.values = this.handles.map(function () {
            return 0
        });
        this.spans = this.options.spans ? this.options.spans.map(function (E) {
            return $(E)
        }) : false;
        this.options.startSpan = $(this.options.startSpan || null);
        this.options.endSpan = $(this.options.endSpan || null);
        this.restricted = this.options.restricted || false;
        this.maximum = this.options.maximum || this.range.end;
        this.minimum = this.options.minimum || this.range.start;
        this.alignX = parseInt(this.options.alignX || "0");
        this.alignY = parseInt(this.options.alignY || "0");
        this.trackLength = this.maximumOffset() - this.minimumOffset();
        this.handleLength = this.isVertical() ? (this.handles[0].offsetHeight != 0 ? this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/, "")) : (this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth : this.handles[0].style.width.replace(/px$/, ""));
        this.active = false;
        this.dragging = false;
        this.disabled = false;
        if (this.options.disabled) {
            this.setDisabled()
        }
        this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
        if (this.allowedValues) {
            this.minimum = this.allowedValues.min();
            this.maximum = this.allowedValues.max()
        }
        this.eventMouseDown = this.startDrag.bindAsEventListener(this);
        this.eventMouseUp = this.endDrag.bindAsEventListener(this);
        this.eventMouseMove = this.update.bindAsEventListener(this);
        this.handles.each(function (F, E) {
            E = C.handles.length - 1 - E;
            C.setValue(parseFloat((Object.isArray(C.options.sliderValue) ? C.options.sliderValue[E] : C.options.sliderValue) || C.range.start), E);
            F.makePositioned().observe("mousedown", C.eventMouseDown)
        });
        this.track.observe("mousedown", this.eventMouseDown);
        document.observe("mouseup", this.eventMouseUp);
        document.observe("mousemove", this.eventMouseMove);
        this.initialized = true
    },
    dispose: function () {
        var A = this;
        Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
        Event.stopObserving(document, "mouseup", this.eventMouseUp);
        Event.stopObserving(document, "mousemove", this.eventMouseMove);
        this.handles.each(function (B) {
            Event.stopObserving(B, "mousedown", A.eventMouseDown)
        })
    },
    setDisabled: function () {
        this.disabled = true
    },
    setEnabled: function () {
        this.disabled = false
    },
    getNearestValue: function (A) {
        if (this.allowedValues) {
            if (A >= this.allowedValues.max()) {
                return (this.allowedValues.max())
            }
            if (A <= this.allowedValues.min()) {
                return (this.allowedValues.min())
            }
            var C = Math.abs(this.allowedValues[0] - A);
            var B = this.allowedValues[0];
            this.allowedValues.each(function (D) {
                var E = Math.abs(D - A);
                if (E <= C) {
                    B = D;
                    C = E
                }
            });
            return B
        }
        if (A > this.range.end) {
            return this.range.end
        }
        if (A < this.range.start) {
            return this.range.start
        }
        return A
    },
    setValue: function (B, A) {
        if (!this.active) {
            this.activeHandleIdx = A || 0;
            this.activeHandle = this.handles[this.activeHandleIdx];
            this.updateStyles()
        }
        A = A || this.activeHandleIdx || 0;
        if (this.initialized && this.restricted) {
            if ((A > 0) && (B < this.values[A - 1])) {
                B = this.values[A - 1]
            }
            if ((A < (this.handles.length - 1)) && (B > this.values[A + 1])) {
                B = this.values[A + 1]
            }
        }
        B = this.getNearestValue(B);
        this.values[A] = B;
        this.value = this.values[0];
        this.handles[A].style[this.isVertical() ? "top" : "left"] = this.translateToPx(B);
        this.drawSpans();
        if (!this.dragging || !this.event) {
            this.updateFinished()
        }
    },
    setValueBy: function (B, A) {
        this.setValue(this.values[A || this.activeHandleIdx || 0] + B, A || this.activeHandleIdx || 0)
    },
    translateToPx: function (A) {
        return Math.round(((this.trackLength - this.handleLength) / (this.range.end - this.range.start)) * (A - this.range.start)) + "px"
    },
    translateToValue: function (A) {
        return ((A / (this.trackLength - this.handleLength) * (this.range.end - this.range.start)) + this.range.start)
    },
    getRange: function (B) {
        var A = this.values.sortBy(Prototype.K);
        B = B || 0;
        return $R(A[B], A[B + 1])
    },
    minimumOffset: function () {
        return (this.isVertical() ? this.alignY : this.alignX)
    },
    maximumOffset: function () {
        return (this.isVertical() ? (this.track.offsetHeight != 0 ? this.track.offsetHeight : this.track.style.height.replace(/px$/, "")) - this.alignY : (this.track.offsetWidth != 0 ? this.track.offsetWidth : this.track.style.width.replace(/px$/, "")) - this.alignX)
    },
    isVertical: function () {
        return (this.axis == "vertical")
    },
    drawSpans: function () {
        var A = this;
        if (this.spans) {
            $R(0, this.spans.length - 1).each(function (B) {
                A.setSpan(A.spans[B], A.getRange(B))
            })
        }
        if (this.options.startSpan) {
            this.setSpan(this.options.startSpan, $R(0, this.values.length > 1 ? this.getRange(0).min() : this.value))
        }
        if (this.options.endSpan) {
            this.setSpan(this.options.endSpan, $R(this.values.length > 1 ? this.getRange(this.spans.length - 1).max() : this.value, this.maximum))
        }
    },
    setSpan: function (B, A) {
        if (this.isVertical()) {
            B.style.top = this.translateToPx(A.start);
            B.style.height = this.translateToPx(A.end - A.start + this.range.start)
        } else {
            B.style.left = this.translateToPx(A.start);
            B.style.width = this.translateToPx(A.end - A.start + this.range.start)
        }
    },
    updateStyles: function () {
        this.handles.each(function (A) {
            Element.removeClassName(A, "selected")
        });
        Element.addClassName(this.activeHandle, "selected")
    },
    startDrag: function (C) {
        if (Event.isLeftClick(C)) {
            if (!this.disabled) {
                this.active = true;
                var D = Event.element(C);
                var E = [Event.pointerX(C), Event.pointerY(C)];
                var A = D;
                if (A == this.track) {
                    var B = Position.cumulativeOffset(this.track);
                    this.event = C;
                    this.setValue(this.translateToValue((this.isVertical() ? E[1] - B[1] : E[0] - B[0]) - (this.handleLength / 2)));
                    var B = Position.cumulativeOffset(this.activeHandle);
                    this.offsetX = (E[0] - B[0]);
                    this.offsetY = (E[1] - B[1])
                } else {
                    while ((this.handles.indexOf(D) == -1) && D.parentNode) {
                        D = D.parentNode
                    }
                    if (this.handles.indexOf(D) != -1) {
                        this.activeHandle = D;
                        this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
                        this.updateStyles();
                        var B = Position.cumulativeOffset(this.activeHandle);
                        this.offsetX = (E[0] - B[0]);
                        this.offsetY = (E[1] - B[1])
                    }
                }
            }
            Event.stop(C)
        }
    },
    update: function (A) {
        if (this.active) {
            if (!this.dragging) {
                this.dragging = true
            }
            this.draw(A);
            if (Prototype.Browser.WebKit) {
                window.scrollBy(0, 0)
            }
            Event.stop(A)
        }
    },
    draw: function (B) {
        var C = [Event.pointerX(B), Event.pointerY(B)];
        var A = Position.cumulativeOffset(this.track);
        C[0] -= this.offsetX + A[0];
        C[1] -= this.offsetY + A[1];
        this.event = B;
        this.setValue(this.translateToValue(this.isVertical() ? C[1] : C[0]));
        if (this.initialized && this.options.onSlide) {
            this.options.onSlide(this.values.length > 1 ? this.values : this.value, this)
        }
    },
    endDrag: function (A) {
        if (this.active && this.dragging) {
            this.finishDrag(A, true);
            Event.stop(A)
        }
        this.active = false;
        this.dragging = false
    },
    finishDrag: function (A, B) {
        this.active = false;
        this.dragging = false;
        this.updateFinished()
    },
    updateFinished: function () {
        if (this.initialized && this.options.onChange) {
            this.options.onChange(this.values.length > 1 ? this.values : this.value, this)
        }
        this.event = null
    }
});
Calendar = function (D, C, F, A) {
    this.activeDiv = null;
    this.currentDateEl = null;
    this.getDateStatus = null;
    this.getDateToolTip = null;
    this.getDateText = null;
    this.timeout = null;
    this.onSelected = F || null;
    this.onClose = A || null;
    this.dragging = false;
    this.hidden = false;
    this.minYear = 1970;
    this.maxYear = 2050;
    this.dateFormat = Calendar._TT["DEF_DATE_FORMAT"];
    this.ttDateFormat = Calendar._TT["TT_DATE_FORMAT"];
    this.isPopup = true;
    this.weekNumbers = true;
    this.firstDayOfWeek = typeof D == "number" ? D : Calendar._FD;
    this.showsOtherMonths = false;
    this.dateStr = C;
    this.ar_days = null;
    this.showsTime = false;
    this.time24 = true;
    this.yearStep = 2;
    this.hiliteToday = true;
    this.multiple = null;
    this.table = null;
    this.element = null;
    this.tbody = null;
    this.firstdayname = null;
    this.monthsCombo = null;
    this.yearsCombo = null;
    this.hilitedMonth = null;
    this.activeMonth = null;
    this.hilitedYear = null;
    this.activeYear = null;
    this.dateClicked = false;
    if (typeof Calendar._SDN == "undefined") {
        if (typeof Calendar._SDN_len == "undefined") {
            Calendar._SDN_len = 3
        }
        var B = new Array();
        for (var E = 8; E > 0;) {
            B[--E] = Calendar._DN[E].substr(0, Calendar._SDN_len)
        }
        Calendar._SDN = B;
        if (typeof Calendar._SMN_len == "undefined") {
            Calendar._SMN_len = 3
        }
        B = new Array();
        for (var E = 12; E > 0;) {
            B[--E] = Calendar._MN[E].substr(0, Calendar._SMN_len)
        }
        Calendar._SMN = B
    }
};
Calendar._C = null;
Calendar.is_ie = (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent));
Calendar.is_ie5 = (Calendar.is_ie && /msie 5\.0/i.test(navigator.userAgent));
Calendar.is_opera = /opera/i.test(navigator.userAgent);
Calendar.is_khtml = /Konqueror|Safari|KHTML/i.test(navigator.userAgent);
Calendar.getAbsolutePos = function (E) {
    var A = 0,
        D = 0;
    var C = /^div$/i.test(E.tagName);
    if (C && E.scrollLeft) {
        A = E.scrollLeft
    }
    if (C && E.scrollTop) {
        D = E.scrollTop
    }
    var F = {
        x: E.offsetLeft - A,
        y: E.offsetTop - D
    };
    if (E.offsetParent) {
        var B = this.getAbsolutePos(E.offsetParent);
        F.x += B.x;
        F.y += B.y
    }
    return F
};
Calendar.isRelated = function (C, A) {
    var D = A.relatedTarget;
    if (!D) {
        var B = A.type;
        if (B == "mouseover") {
            D = A.fromElement
        } else {
            if (B == "mouseout") {
                D = A.toElement
            }
        }
    }
    while (D) {
        if (D == C) {
            return true
        }
        D = D.parentNode
    }
    return false
};
Calendar.removeClass = function (E, D) {
    if (!(E && E.className)) {
        return
    }
    var A = E.className.split(" ");
    var B = new Array();
    for (var C = A.length; C > 0;) {
        if (A[--C] != D) {
            B[B.length] = A[C]
        }
    }
    E.className = B.join(" ")
};
Calendar.addClass = function (B, A) {
    Calendar.removeClass(B, A);
    B.className += " " + A
};
Calendar.getElement = function (A) {
    var B = Calendar.is_ie ? window.event.srcElement : A.currentTarget;
    while (B.nodeType != 1 || /^div$/i.test(B.tagName)) {
        B = B.parentNode
    }
    return B
};
Calendar.getTargetElement = function (A) {
    var B = Calendar.is_ie ? window.event.srcElement : A.target;
    while (B.nodeType != 1) {
        B = B.parentNode
    }
    return B
};
Calendar.stopEvent = function (A) {
    A || (A = window.event);
    if (Calendar.is_ie) {
        A.cancelBubble = true;
        A.returnValue = false
    } else {
        A.preventDefault();
        A.stopPropagation()
    }
    return false
};
Calendar.addEvent = function (A, C, B) {
    if (A.attachEvent) {
        A.attachEvent("on" + C, B)
    } else {
        if (A.addEventListener) {
            A.addEventListener(C, B, true)
        } else {
            A["on" + C] = B
        }
    }
};
Calendar.removeEvent = function (A, C, B) {
    if (A.detachEvent) {
        A.detachEvent("on" + C, B)
    } else {
        if (A.removeEventListener) {
            A.removeEventListener(C, B, true)
        } else {
            A["on" + C] = null
        }
    }
};
Calendar.createElement = function (C, B) {
    var A = null;
    if (document.createElementNS) {
        A = document.createElementNS("http://www.w3.org/1999/xhtml", C)
    } else {
        A = document.createElement(C)
    }
    if (typeof B != "undefined") {
        B.appendChild(A)
    }
    return A
};
Calendar._add_evs = function (el) {
    with(Calendar) {
        addEvent(el, "mouseover", dayMouseOver);
        addEvent(el, "mousedown", dayMouseDown);
        addEvent(el, "mouseout", dayMouseOut);
        if (is_ie) {
            addEvent(el, "dblclick", dayMouseDblClick);
            el.setAttribute("unselectable", true)
        }
    }
};
Calendar.findMonth = function (A) {
    if (typeof A.month != "undefined") {
        return A
    } else {
        if (typeof A.parentNode.month != "undefined") {
            return A.parentNode
        }
    }
    return null
};
Calendar.findYear = function (A) {
    if (typeof A.year != "undefined") {
        return A
    } else {
        if (typeof A.parentNode.year != "undefined") {
            return A.parentNode
        }
    }
    return null
};
Calendar.showMonthsCombo = function () {
    var E = Calendar._C;
    if (!E) {
        return false
    }
    var E = E;
    var F = E.activeDiv;
    var D = E.monthsCombo;
    if (E.hilitedMonth) {
        Calendar.removeClass(E.hilitedMonth, "hilite")
    }
    if (E.activeMonth) {
        Calendar.removeClass(E.activeMonth, "active")
    }
    var C = E.monthsCombo.getElementsByTagName("div")[E.date.getMonth()];
    Calendar.addClass(C, "active");
    E.activeMonth = C;
    var B = D.style;
    B.display = "block";
    if (F.navtype < 0) {
        B.left = F.offsetLeft + "px"
    } else {
        var A = D.offsetWidth;
        if (typeof A == "undefined") {
            A = 50
        }
        B.left = (F.offsetLeft + F.offsetWidth - A) + "px"
    }
    B.top = (F.offsetTop + F.offsetHeight) + "px"
};
Calendar.showYearsCombo = function (D) {
    var A = Calendar._C;
    if (!A) {
        return false
    }
    var A = A;
    var C = A.activeDiv;
    var F = A.yearsCombo;
    if (A.hilitedYear) {
        Calendar.removeClass(A.hilitedYear, "hilite")
    }
    if (A.activeYear) {
        Calendar.removeClass(A.activeYear, "active")
    }
    A.activeYear = null;
    var B = A.date.getFullYear() + (D ? 1 : -1);
    var I = F.firstChild;
    var H = false;
    for (var E = 12; E > 0; --E) {
        if (B >= A.minYear && B <= A.maxYear) {
            I.innerHTML = B;
            I.year = B;
            I.style.display = "block";
            H = true
        } else {
            I.style.display = "none"
        }
        I = I.nextSibling;
        B += D ? A.yearStep : -A.yearStep
    }
    if (H) {
        var J = F.style;
        J.display = "block";
        if (C.navtype < 0) {
            J.left = C.offsetLeft + "px"
        } else {
            var G = F.offsetWidth;
            if (typeof G == "undefined") {
                G = 50
            }
            J.left = (C.offsetLeft + C.offsetWidth - G) + "px"
        }
        J.top = (C.offsetTop + C.offsetHeight) + "px"
    }
};
Calendar.tableMouseUp = function (ev) {
    var cal = Calendar._C;
    if (!cal) {
        return false
    }
    if (cal.timeout) {
        clearTimeout(cal.timeout)
    }
    var el = cal.activeDiv;
    if (!el) {
        return false
    }
    var target = Calendar.getTargetElement(ev);
    ev || (ev = window.event);
    Calendar.removeClass(el, "active");
    if (target == el || target.parentNode == el) {
        Calendar.cellClick(el, ev)
    }
    var mon = Calendar.findMonth(target);
    var date = null;
    if (mon) {
        date = new Date(cal.date);
        if (mon.month != date.getMonth()) {
            date.setMonth(mon.month);
            cal.setDate(date);
            cal.dateClicked = false;
            cal.callHandler()
        }
    } else {
        var year = Calendar.findYear(target);
        if (year) {
            date = new Date(cal.date);
            if (year.year != date.getFullYear()) {
                date.setFullYear(year.year);
                cal.setDate(date);
                cal.dateClicked = false;
                cal.callHandler()
            }
        }
    }
    with(Calendar) {
        removeEvent(document, "mouseup", tableMouseUp);
        removeEvent(document, "mouseover", tableMouseOver);
        removeEvent(document, "mousemove", tableMouseOver);
        cal._hideCombos();
        _C = null;
        return stopEvent(ev)
    }
};
Calendar.tableMouseOver = function (M) {
    var A = Calendar._C;
    if (!A) {
        return
    }
    var C = A.activeDiv;
    var I = Calendar.getTargetElement(M);
    if (I == C || I.parentNode == C) {
        Calendar.addClass(C, "hilite active");
        Calendar.addClass(C.parentNode, "rowhilite")
    } else {
        if (typeof C.navtype == "undefined" || (C.navtype != 50 && (C.navtype == 0 || Math.abs(C.navtype) > 2))) {
            Calendar.removeClass(C, "active")
        }
        Calendar.removeClass(C, "hilite");
        Calendar.removeClass(C.parentNode, "rowhilite")
    }
    M || (M = window.event);
    if (C.navtype == 50 && I != C) {
        var L = Calendar.getAbsolutePos(C);
        var O = C.offsetWidth;
        var N = M.clientX;
        var P;
        var K = true;
        if (N > L.x + O) {
            P = N - L.x - O;
            K = false
        } else {
            P = L.x - N
        }
        if (P < 0) {
            P = 0
        }
        var F = C._range;
        var H = C._current;
        var G = Math.floor(P / 10) % F.length;
        for (var E = F.length; --E >= 0;) {
            if (F[E] == H) {
                break
            }
        }
        while (G-- > 0) {
            if (K) {
                if (--E < 0) {
                    E = F.length - 1
                }
            } else {
                if (++E >= F.length) {
                    E = 0
                }
            }
        }
        var B = F[E];
        C.innerHTML = B;
        A.onUpdateTime()
    }
    var D = Calendar.findMonth(I);
    if (D) {
        if (D.month != A.date.getMonth()) {
            if (A.hilitedMonth) {
                Calendar.removeClass(A.hilitedMonth, "hilite")
            }
            Calendar.addClass(D, "hilite");
            A.hilitedMonth = D
        } else {
            if (A.hilitedMonth) {
                Calendar.removeClass(A.hilitedMonth, "hilite")
            }
        }
    } else {
        if (A.hilitedMonth) {
            Calendar.removeClass(A.hilitedMonth, "hilite")
        }
        var J = Calendar.findYear(I);
        if (J) {
            if (J.year != A.date.getFullYear()) {
                if (A.hilitedYear) {
                    Calendar.removeClass(A.hilitedYear, "hilite")
                }
                Calendar.addClass(J, "hilite");
                A.hilitedYear = J
            } else {
                if (A.hilitedYear) {
                    Calendar.removeClass(A.hilitedYear, "hilite")
                }
            }
        } else {
            if (A.hilitedYear) {
                Calendar.removeClass(A.hilitedYear, "hilite")
            }
        }
    }
    return Calendar.stopEvent(M)
};
Calendar.tableMouseDown = function (A) {
    if (Calendar.getTargetElement(A) == Calendar.getElement(A)) {
        return Calendar.stopEvent(A)
    }
};
Calendar.calDragIt = function (B) {
    var C = Calendar._C;
    if (!(C && C.dragging)) {
        return false
    }
    var E;
    var D;
    if (Calendar.is_ie) {
        D = window.event.clientY + document.body.scrollTop;
        E = window.event.clientX + document.body.scrollLeft
    } else {
        E = B.pageX;
        D = B.pageY
    }
    C.hideShowCovered();
    var A = C.element.style;
    A.left = (E - C.xOffs) + "px";
    A.top = (D - C.yOffs) + "px";
    return Calendar.stopEvent(B)
};
Calendar.calDragEnd = function (ev) {
    var cal = Calendar._C;
    if (!cal) {
        return false
    }
    cal.dragging = false;
    with(Calendar) {
        removeEvent(document, "mousemove", calDragIt);
        removeEvent(document, "mouseup", calDragEnd);
        tableMouseUp(ev)
    }
    cal.hideShowCovered()
};
Calendar.dayMouseDown = function (ev) {
    var el = Calendar.getElement(ev);
    if (el.disabled) {
        return false
    }
    var cal = el.calendar;
    cal.activeDiv = el;
    Calendar._C = cal;
    if (el.navtype != 300) {
        with(Calendar) {
            if (el.navtype == 50) {
                el._current = el.innerHTML;
                addEvent(document, "mousemove", tableMouseOver)
            } else {
                addEvent(document, Calendar.is_ie5 ? "mousemove" : "mouseover", tableMouseOver)
            }
            addClass(el, "hilite active");
            addEvent(document, "mouseup", tableMouseUp)
        }
    } else {
        if (cal.isPopup) {
            cal._dragStart(ev)
        }
    }
    if (el.navtype == -1 || el.navtype == 1) {
        if (cal.timeout) {
            clearTimeout(cal.timeout)
        }
        cal.timeout = setTimeout("Calendar.showMonthsCombo()", 250)
    } else {
        if (el.navtype == -2 || el.navtype == 2) {
            if (cal.timeout) {
                clearTimeout(cal.timeout)
            }
            cal.timeout = setTimeout((el.navtype > 0) ? "Calendar.showYearsCombo(true)" : "Calendar.showYearsCombo(false)", 250)
        } else {
            cal.timeout = null
        }
    }
    return Calendar.stopEvent(ev)
};
Calendar.dayMouseDblClick = function (A) {
    Calendar.cellClick(Calendar.getElement(A), A || window.event);
    if (Calendar.is_ie) {
        document.selection.empty()
    }
};
Calendar.dayMouseOver = function (B) {
    var A = Calendar.getElement(B);
    if (Calendar.isRelated(A, B) || Calendar._C || A.disabled) {
        return false
    }
    if (A.ttip) {
        if (A.ttip.substr(0, 1) == "_") {
            A.ttip = A.caldate.print(A.calendar.ttDateFormat) + A.ttip.substr(1)
        }
        A.calendar.tooltips.innerHTML = A.ttip
    }
    if (A.navtype != 300) {
        Calendar.addClass(A, "hilite");
        if (A.caldate) {
            Calendar.addClass(A.parentNode, "rowhilite")
        }
    }
    return Calendar.stopEvent(B)
};
Calendar.dayMouseOut = function (ev) {
    with(Calendar) {
        var el = getElement(ev);
        if (isRelated(el, ev) || _C || el.disabled) {
            return false
        }
        removeClass(el, "hilite");
        if (el.caldate) {
            removeClass(el.parentNode, "rowhilite")
        }
        if (el.calendar) {
            el.calendar.tooltips.innerHTML = _TT["SEL_DATE"]
        }
        return stopEvent(ev)
    }
};
Calendar.cellClick = function (E, N) {
    var C = E.calendar;
    var H = false;
    var K = false;
    var F = null;
    if (typeof E.navtype == "undefined") {
        if (C.currentDateEl) {
            Calendar.removeClass(C.currentDateEl, "selected");
            Calendar.addClass(E, "selected");
            H = (C.currentDateEl == E);
            if (!H) {
                C.currentDateEl = E
            }
        }
        C.date.setDateOnly(E.caldate);
        F = C.date;
        var B = !(C.dateClicked = !E.otherMonth);
        if (!B && !C.currentDateEl) {
            C._toggleMultipleDate(new Date(F))
        } else {
            K = !E.disabled
        }
        if (B) {
            C._init(C.firstDayOfWeek, F)
        }
    } else {
        if (E.navtype == 200) {
            Calendar.removeClass(E, "hilite");
            C.callCloseHandler();
            return
        }
        F = new Date(C.date);
        if (E.navtype == 0) {
            F.setDateOnly(new Date())
        }
        C.dateClicked = false;
        var M = F.getFullYear();
        var G = F.getMonth();

        function A(Q) {
            var R = F.getDate();
            var P = F.getMonthDays(Q);
            if (R > P) {
                F.setDate(P)
            }
            F.setMonth(Q)
        }
        switch (E.navtype) {
        case 400:
            Calendar.removeClass(E, "hilite");
            var O = Calendar._TT["ABOUT"];
            if (typeof O != "undefined") {
                O += C.showsTime ? Calendar._TT["ABOUT_TIME"] : ""
            } else {
                O = "Help and about box text is not translated into this language.\n" + "If you know this language and you feel generous please update\n" + 'the corresponding file in "lang" subdir to match calendar-en.js\n' + "and send it back to <mihai_bazon@yahoo.com> to get it into the distribution  ;-)\n\n" + "Thank you!\n" + "http://dynarch.com/mishoo/calendar.epl\n"
            }
            alert(O);
            return;
        case -2:
            if (M > C.minYear) {
                F.setFullYear(M - 1)
            }
            break;
        case -1:
            if (G > 0) {
                A(G - 1)
            } else {
                if (M-- > C.minYear) {
                    F.setFullYear(M);
                    A(11)
                }
            }
            break;
        case 1:
            if (G < 11) {
                A(G + 1)
            } else {
                if (M < C.maxYear) {
                    F.setFullYear(M + 1);
                    A(0)
                }
            }
            break;
        case 2:
            if (M < C.maxYear) {
                F.setFullYear(M + 1)
            }
            break;
        case 100:
            C.setFirstDayOfWeek(E.fdow);
            return;
        case 50:
            var J = E._range;
            var L = E.innerHTML;
            for (var I = J.length; --I >= 0;) {
                if (J[I] == L) {
                    break
                }
            }
            if (N && N.shiftKey) {
                if (--I < 0) {
                    I = J.length - 1
                }
            } else {
                if (++I >= J.length) {
                    I = 0
                }
            }
            var D = J[I];
            E.innerHTML = D;
            C.onUpdateTime();
            return;
        case 0:
            if ((typeof C.getDateStatus == "function") && C.getDateStatus(F, F.getFullYear(), F.getMonth(), F.getDate())) {
                return false
            }
            break
        }
        if (!F.equalsTo(C.date)) {
            C.setDate(F);
            K = true
        } else {
            if (E.navtype == 0) {
                K = H = true
            }
        }
    }
    if (K) {
        N && C.callHandler()
    }
    if (H) {
        Calendar.removeClass(E, "hilite");
        N && C.callCloseHandler()
    }
};
Calendar.prototype.create = function (L) {
    var K = null;
    if (!L) {
        K = document.getElementsByTagName("body")[0];
        this.isPopup = true
    } else {
        K = L;
        this.isPopup = false
    }
    this.date = this.dateStr ? new Date(this.dateStr) : new Date();
    var O = Calendar.createElement("table");
    this.table = O;
    O.cellSpacing = 0;
    O.cellPadding = 0;
    O.calendar = this;
    Calendar.addEvent(O, "mousedown", Calendar.tableMouseDown);
    var A = Calendar.createElement("div");
    this.element = A;
    A.className = "calendar";
    if (this.isPopup) {
        A.style.position = "absolute";
        A.style.display = "none"
    }
    A.appendChild(O);
    var I = Calendar.createElement("thead", O);
    var M = null;
    var P = null;
    var B = this;
    var E = function (S, R, Q) {
        M = Calendar.createElement("td", P);
        M.colSpan = R;
        M.className = "button";
        if (Q != 0 && Math.abs(Q) <= 2) {
            M.className += " nav"
        }
        Calendar._add_evs(M);
        M.calendar = B;
        M.navtype = Q;
        M.innerHTML = "<div unselectable='on'>" + S + "</div>";
        return M
    };
    P = Calendar.createElement("tr", I);
    var C = 6;
    (this.isPopup) && --C;
    (this.weekNumbers) && ++C;
    E("?", 1, 400).ttip = Calendar._TT["INFO"];
    this.title = E("", C, 300);
    this.title.className = "title";
    if (this.isPopup) {
        this.title.ttip = Calendar._TT["DRAG_TO_MOVE"];
        this.title.style.cursor = "move";
        E("&#x00d7;", 1, 200).ttip = Calendar._TT["CLOSE"]
    }
    P = Calendar.createElement("tr", I);
    P.className = "headrow";
    this._nav_py = E("&#x00ab;", 1, -2);
    this._nav_py.ttip = Calendar._TT["PREV_YEAR"];
    this._nav_pm = E("&#x2039;", 1, -1);
    this._nav_pm.ttip = Calendar._TT["PREV_MONTH"];
    this._nav_now = E(Calendar._TT["TODAY"], this.weekNumbers ? 4 : 3, 0);
    this._nav_now.ttip = Calendar._TT["GO_TODAY"];
    this._nav_nm = E("&#x203a;", 1, 1);
    this._nav_nm.ttip = Calendar._TT["NEXT_MONTH"];
    this._nav_ny = E("&#x00bb;", 1, 2);
    this._nav_ny.ttip = Calendar._TT["NEXT_YEAR"];
    P = Calendar.createElement("tr", I);
    P.className = "daynames";
    if (this.weekNumbers) {
        M = Calendar.createElement("td", P);
        M.className = "name wn";
        M.innerHTML = Calendar._TT["WK"]
    }
    for (var H = 7; H > 0; --H) {
        M = Calendar.createElement("td", P);
        if (!H) {
            M.navtype = 100;
            M.calendar = this;
            Calendar._add_evs(M)
        }
    }
    this.firstdayname = (this.weekNumbers) ? P.firstChild.nextSibling : P.firstChild;
    this._displayWeekdays();
    var G = Calendar.createElement("tbody", O);
    this.tbody = G;
    for (H = 6; H > 0; --H) {
        P = Calendar.createElement("tr", G);
        if (this.weekNumbers) {
            M = Calendar.createElement("td", P)
        }
        for (var F = 7; F > 0; --F) {
            M = Calendar.createElement("td", P);
            M.calendar = this;
            Calendar._add_evs(M)
        }
    }
    if (this.showsTime) {
        P = Calendar.createElement("tr", G);
        P.className = "time";
        M = Calendar.createElement("td", P);
        M.className = "time";
        M.colSpan = 2;
        M.innerHTML = Calendar._TT["TIME"] || "&nbsp;";
        M = Calendar.createElement("td", P);
        M.className = "time";
        M.colSpan = this.weekNumbers ? 4 : 3;
        (function () {
            function T(c, e, d, f) {
                var a = Calendar.createElement("span", M);
                a.className = c;
                a.innerHTML = e;
                a.calendar = B;
                a.ttip = Calendar._TT["TIME_PART"];
                a.navtype = 50;
                a._range = [];
                if (typeof d != "number") {
                    a._range = d
                } else {
                    for (var b = d; b <= f; ++b) {
                        var Z;
                        if (b < 10 && f >= 10) {
                            Z = "0" + b
                        } else {
                            Z = "" + b
                        }
                        a._range[a._range.length] = Z
                    }
                }
                Calendar._add_evs(a);
                return a
            }
            var X = B.date.getHours();
            var Q = B.date.getMinutes();
            var Y = !B.time24;
            var R = (X > 12);
            if (Y && R) {
                X -= 12
            }
            var V = T("hour", X, Y ? 1 : 0, Y ? 12 : 23);
            var U = Calendar.createElement("span", M);
            U.innerHTML = ":";
            U.className = "colon";
            var S = T("minute", Q, 0, 59);
            var W = null;
            M = Calendar.createElement("td", P);
            M.className = "time";
            M.colSpan = 2;
            if (Y) {
                W = T("ampm", R ? "pm" : "am", ["am", "pm"])
            } else {
                M.innerHTML = "&nbsp;"
            }
            B.onSetTime = function () {
                var a, Z = this.date.getHours(),
                    b = this.date.getMinutes();
                if (Y) {
                    a = (Z >= 12);
                    if (a) {
                        Z -= 12
                    }
                    if (Z == 0) {
                        Z = 12
                    }
                    W.innerHTML = a ? "pm" : "am"
                }
                V.innerHTML = (Z < 10) ? ("0" + Z) : Z;
                S.innerHTML = (b < 10) ? ("0" + b) : b
            };
            B.onUpdateTime = function () {
                var a = this.date;
                var b = parseInt(V.innerHTML, 10);
                if (Y) {
                    if (/pm/i.test(W.innerHTML) && b < 12) {
                        b += 12
                    } else {
                        if (/am/i.test(W.innerHTML) && b == 12) {
                            b = 0
                        }
                    }
                }
                var c = a.getDate();
                var Z = a.getMonth();
                var e = a.getFullYear();
                a.setHours(b);
                a.setMinutes(parseInt(S.innerHTML, 10));
                a.setFullYear(e);
                a.setMonth(Z);
                a.setDate(c);
                this.dateClicked = false;
                this.callHandler()
            }
        })()
    } else {
        this.onSetTime = this.onUpdateTime = function () {}
    }
    var J = Calendar.createElement("tfoot", O);
    P = Calendar.createElement("tr", J);
    P.className = "footrow";
    M = E(Calendar._TT["SEL_DATE"], this.weekNumbers ? 8 : 7, 300);
    M.className = "ttip";
    if (this.isPopup) {
        M.ttip = Calendar._TT["DRAG_TO_MOVE"];
        M.style.cursor = "move"
    }
    this.tooltips = M;
    A = Calendar.createElement("div", this.element);
    this.monthsCombo = A;
    A.className = "combo";
    for (H = 0; H < Calendar._MN.length; ++H) {
        var D = Calendar.createElement("div");
        D.className = Calendar.is_ie ? "label-IEfix" : "label";
        D.month = H;
        D.innerHTML = Calendar._SMN[H];
        A.appendChild(D)
    }
    A = Calendar.createElement("div", this.element);
    this.yearsCombo = A;
    A.className = "combo";
    for (H = 12; H > 0; --H) {
        var N = Calendar.createElement("div");
        N.className = Calendar.is_ie ? "label-IEfix" : "label";
        A.appendChild(N)
    }
    this._init(this.firstDayOfWeek, this.date);
    K.appendChild(this.element)
};
Calendar._keyEvent = function (L) {
    var A = window._dynarch_popupCalendar;
    if (!A || A.multiple) {
        return false
    }(Calendar.is_ie) && (L = window.event);
    var I = (Calendar.is_ie || L.type == "keypress"),
        M = L.keyCode;
    if (L.ctrlKey) {
        switch (M) {
        case 37:
            I && Calendar.cellClick(A._nav_pm);
            break;
        case 38:
            I && Calendar.cellClick(A._nav_py);
            break;
        case 39:
            I && Calendar.cellClick(A._nav_nm);
            break;
        case 40:
            I && Calendar.cellClick(A._nav_ny);
            break;
        default:
            return false
        }
    } else {
        switch (M) {
        case 32:
            Calendar.cellClick(A._nav_now);
            break;
        case 27:
            I && A.callCloseHandler();
            break;
        case 37:
        case 38:
        case 39:
        case 40:
            if (I) {
                var E, N, J, G, C, D;
                E = M == 37 || M == 38;
                D = (M == 37 || M == 39) ? 1 : 7;

                function B() {
                    C = A.currentDateEl;
                    var K = C.pos;
                    N = K & 15;
                    J = K >> 4;
                    G = A.ar_days[J][N]
                }
                B();

                function F() {
                    var K = new Date(A.date);
                    K.setDate(K.getDate() - D);
                    A.setDate(K)
                }
                function H() {
                    var K = new Date(A.date);
                    K.setDate(K.getDate() + D);
                    A.setDate(K)
                }
                while (1) {
                    switch (M) {
                    case 37:
                        if (--N >= 0) {
                            G = A.ar_days[J][N]
                        } else {
                            N = 6;
                            M = 38;
                            continue
                        }
                        break;
                    case 38:
                        if (--J >= 0) {
                            G = A.ar_days[J][N]
                        } else {
                            F();
                            B()
                        }
                        break;
                    case 39:
                        if (++N < 7) {
                            G = A.ar_days[J][N]
                        } else {
                            N = 0;
                            M = 40;
                            continue
                        }
                        break;
                    case 40:
                        if (++J < A.ar_days.length) {
                            G = A.ar_days[J][N]
                        } else {
                            H();
                            B()
                        }
                        break
                    }
                    break
                }
                if (G) {
                    if (!G.disabled) {
                        Calendar.cellClick(G)
                    } else {
                        if (E) {
                            F()
                        } else {
                            H()
                        }
                    }
                }
            }
            break;
        case 13:
            if (I) {
                Calendar.cellClick(A.currentDateEl, L)
            }
            break;
        default:
            return false
        }
    }
    return Calendar.stopEvent(L)
};
Calendar.prototype._init = function (L, V) {
    var U = new Date(),
        P = U.getFullYear(),
        X = U.getMonth(),
        B = U.getDate();
    this.table.style.visibility = "hidden";
    var H = V.getFullYear();
    if (H < this.minYear) {
        H = this.minYear;
        V.setFullYear(H)
    } else {
        if (H > this.maxYear) {
            H = this.maxYear;
            V.setFullYear(H)
        }
    }
    this.firstDayOfWeek = L;
    this.date = new Date(V);
    var W = V.getMonth();
    var Z = V.getDate();
    var Y = V.getMonthDays();
    V.setDate(1);
    var Q = (V.getDay() - this.firstDayOfWeek) % 7;
    if (Q < 0) {
        Q += 7
    }
    V.setDate(-Q);
    V.setDate(V.getDate() + 1);
    var E = this.tbody.firstChild;
    var J = Calendar._SMN[W];
    var N = this.ar_days = new Array();
    var M = Calendar._TT["WEEKEND"];
    var D = this.multiple ? (this.datesCells = {}) : null;
    for (var S = 0; S < 6; ++S, E = E.nextSibling) {
        var A = E.firstChild;
        if (this.weekNumbers) {
            A.className = "day wn";
            A.innerHTML = V.getWeekNumber();
            A = A.nextSibling
        }
        E.className = "daysrow";
        var T = false,
            F, C = N[S] = [];
        for (var R = 0; R < 7; ++R, A = A.nextSibling, V.setDate(F + 1)) {
            F = V.getDate();
            var G = V.getDay();
            A.className = "day";
            A.pos = S << 4 | R;
            C[R] = A;
            var K = (V.getMonth() == W);
            if (!K) {
                if (this.showsOtherMonths) {
                    A.className += " othermonth";
                    A.otherMonth = true
                } else {
                    A.className = "emptycell";
                    A.innerHTML = "&nbsp;";
                    A.disabled = true;
                    continue
                }
            } else {
                A.otherMonth = false;
                T = true
            }
            A.disabled = false;
            A.innerHTML = this.getDateText ? this.getDateText(V, F) : F;
            if (D) {
                D[V.print("%Y%m%d")] = A
            }
            if (this.getDateStatus) {
                var O = this.getDateStatus(V, H, W, F);
                if (this.getDateToolTip) {
                    var I = this.getDateToolTip(V, H, W, F);
                    if (I) {
                        A.title = I
                    }
                }
                if (O === true) {
                    A.className += " disabled";
                    A.disabled = true
                } else {
                    if (/disabled/i.test(O)) {
                        A.disabled = true
                    }
                    A.className += " " + O
                }
            }
            if (!A.disabled) {
                A.caldate = new Date(V);
                A.ttip = "_";
                if (!this.multiple && K && F == Z && this.hiliteToday) {
                    A.className += " selected";
                    this.currentDateEl = A
                }
                if (V.getFullYear() == P && V.getMonth() == X && F == B) {
                    A.className += " today";
                    A.ttip += Calendar._TT["PART_TODAY"]
                }
                if (M.indexOf(G.toString()) != -1) {
                    A.className += A.otherMonth ? " oweekend" : " weekend"
                }
            }
        }
        if (!(T || this.showsOtherMonths)) {
            E.className = "emptyrow"
        }
    }
    this.title.innerHTML = Calendar._MN[W] + ", " + H;
    this.onSetTime();
    this.table.style.visibility = "visible";
    this._initMultipleDates()
};
Calendar.prototype._initMultipleDates = function () {
    if (this.multiple) {
        for (var B in this.multiple) {
            var A = this.datesCells[B];
            var C = this.multiple[B];
            if (!C) {
                continue
            }
            if (A) {
                A.className += " selected"
            }
        }
    }
};
Calendar.prototype._toggleMultipleDate = function (B) {
    if (this.multiple) {
        var C = B.print("%Y%m%d");
        var A = this.datesCells[C];
        if (A) {
            var D = this.multiple[C];
            if (!D) {
                Calendar.addClass(A, "selected");
                this.multiple[C] = B
            } else {
                Calendar.removeClass(A, "selected");
                delete this.multiple[C]
            }
        }
    }
};
Calendar.prototype.setDateToolTipHandler = function (A) {
    this.getDateToolTip = A
};
Calendar.prototype.setDate = function (A) {
    if (!A.equalsTo(this.date)) {
        this._init(this.firstDayOfWeek, A)
    }
};
Calendar.prototype.refresh = function () {
    this._init(this.firstDayOfWeek, this.date)
};
Calendar.prototype.setFirstDayOfWeek = function (A) {
    this._init(A, this.date);
    this._displayWeekdays()
};
Calendar.prototype.setDateStatusHandler = Calendar.prototype.setDisabledHandler = function (A) {
    this.getDateStatus = A
};
Calendar.prototype.setRange = function (A, B) {
    this.minYear = A;
    this.maxYear = B
};
Calendar.prototype.callHandler = function () {
    if (this.onSelected) {
        this.onSelected(this, this.date.print(this.dateFormat))
    }
};
Calendar.prototype.callCloseHandler = function () {
    if (this.onClose) {
        this.onClose(this)
    }
    this.hideShowCovered()
};
Calendar.prototype.destroy = function () {
    var A = this.element.parentNode;
    A.removeChild(this.element);
    Calendar._C = null;
    window._dynarch_popupCalendar = null
};
Calendar.prototype.reparent = function (B) {
    var A = this.element;
    A.parentNode.removeChild(A);
    B.appendChild(A)
};
Calendar._checkCalendar = function (B) {
    var C = window._dynarch_popupCalendar;
    if (!C) {
        return false
    }
    var A = Calendar.is_ie ? Calendar.getElement(B) : Calendar.getTargetElement(B);
    for (; A != null && A != C.element; A = A.parentNode) {}
    if (A == null) {
        window._dynarch_popupCalendar.callCloseHandler();
        return Calendar.stopEvent(B)
    }
};
Calendar.prototype.show = function () {
    var E = this.table.getElementsByTagName("tr");
    for (var D = E.length; D > 0;) {
        var F = E[--D];
        Calendar.removeClass(F, "rowhilite");
        var C = F.getElementsByTagName("td");
        for (var B = C.length; B > 0;) {
            var A = C[--B];
            Calendar.removeClass(A, "hilite");
            Calendar.removeClass(A, "active")
        }
    }
    this.element.style.display = "block";
    this.hidden = false;
    if (this.isPopup) {
        window._dynarch_popupCalendar = this;
        Calendar.addEvent(document, "keydown", Calendar._keyEvent);
        Calendar.addEvent(document, "keypress", Calendar._keyEvent);
        Calendar.addEvent(document, "mousedown", Calendar._checkCalendar)
    }
    this.hideShowCovered()
};
Calendar.prototype.hide = function () {
    if (this.isPopup) {
        Calendar.removeEvent(document, "keydown", Calendar._keyEvent);
        Calendar.removeEvent(document, "keypress", Calendar._keyEvent);
        Calendar.removeEvent(document, "mousedown", Calendar._checkCalendar)
    }
    this.element.style.display = "none";
    this.hidden = true;
    this.hideShowCovered()
};
Calendar.prototype.showAt = function (A, C) {
    var B = this.element.style;
    B.left = A + "px";
    B.top = C + "px";
    this.show()
};
Calendar.prototype.showAtElement = function (C, D) {
    var A = this;
    var E = Calendar.getAbsolutePos(C);
    if (!D || typeof D != "string") {
        this.showAt(E.x, E.y + C.offsetHeight);
        return true
    }
    function B(I) {
        if (I.x < 0) {
            I.x = 0
        }
        if (I.y < 0) {
            I.y = 0
        }
        var J = document.createElement("div");
        var H = J.style;
        H.position = "absolute";
        H.right = H.bottom = H.width = H.height = "0px";
        document.body.appendChild(J);
        var G = Calendar.getAbsolutePos(J);
        document.body.removeChild(J);
        if (Calendar.is_ie) {
            G.y += document.body.scrollTop;
            G.x += document.body.scrollLeft
        } else {
            G.y += window.scrollY;
            G.x += window.scrollX
        }
        var F = I.x + I.width - G.x;
        if (F > 0) {
            I.x -= F
        }
        F = I.y + I.height - G.y;
        if (F > 0) {
            I.y -= F
        }
    }
    this.element.style.display = "block";
    Calendar.continuation_for_the_fucking_khtml_browser = function () {
        var F = A.element.offsetWidth;
        var H = A.element.offsetHeight;
        A.element.style.display = "none";
        var G = D.substr(0, 1);
        var I = "l";
        if (D.length > 1) {
            I = D.substr(1, 1)
        }
        switch (G) {
        case "T":
            E.y -= H;
            break;
        case "B":
            E.y += C.offsetHeight;
            break;
        case "C":
            E.y += (C.offsetHeight - H) / 2;
            break;
        case "t":
            E.y += C.offsetHeight - H;
            break;
        case "b":
            break
        }
        switch (I) {
        case "L":
            E.x -= F;
            break;
        case "R":
            E.x += C.offsetWidth;
            break;
        case "C":
            E.x += (C.offsetWidth - F) / 2;
            break;
        case "l":
            E.x += C.offsetWidth - F;
            break;
        case "r":
            break
        }
        E.width = F;
        E.height = H + 40;
        A.monthsCombo.style.display = "none";
        B(E);
        A.showAt(E.x, E.y)
    };
    if (Calendar.is_khtml) {
        setTimeout("Calendar.continuation_for_the_fucking_khtml_browser()", 10)
    } else {
        Calendar.continuation_for_the_fucking_khtml_browser()
    }
};
Calendar.prototype.setDateFormat = function (A) {
    this.dateFormat = A
};
Calendar.prototype.setTtDateFormat = function (A) {
    this.ttDateFormat = A
};
Calendar.prototype.parseDate = function (B, A) {
    if (!A) {
        A = this.dateFormat
    }
    this.setDate(Date.parseDate(B, A))
};
Calendar.prototype.hideShowCovered = function () {
    if (!Calendar.is_ie && !Calendar.is_opera) {
        return
    }
    function B(R) {
        var Q = R.style.visibility;
        if (!Q) {
            if (document.defaultView && typeof(document.defaultView.getComputedStyle) == "function") {
                if (!Calendar.is_khtml) {
                    Q = document.defaultView.getComputedStyle(R, "").getPropertyValue("visibility")
                } else {
                    Q = ""
                }
            } else {
                if (R.currentStyle) {
                    Q = R.currentStyle.visibility
                } else {
                    Q = ""
                }
            }
        }
        return Q
    }
    var P = new Array("applet", "iframe", "select");
    var C = this.element;
    var A = Calendar.getAbsolutePos(C);
    var F = A.x;
    var D = C.offsetWidth + F;
    var O = A.y;
    var N = C.offsetHeight + O;
    for (var H = P.length; H > 0;) {
        var G = document.getElementsByTagName(P[--H]);
        var E = null;
        for (var J = G.length; J > 0;) {
            E = G[--J];
            A = Calendar.getAbsolutePos(E);
            var M = A.x;
            var L = E.offsetWidth + M;
            var K = A.y;
            var I = E.offsetHeight + K;
            if (this.hidden || (M > D) || (L < F) || (K > N) || (I < O)) {
                if (!E.__msh_save_visibility) {
                    E.__msh_save_visibility = B(E)
                }
                E.style.visibility = E.__msh_save_visibility
            } else {
                if (!E.__msh_save_visibility) {
                    E.__msh_save_visibility = B(E)
                }
                E.style.visibility = "hidden"
            }
        }
    }
};
Calendar.prototype._displayWeekdays = function () {
    var B = this.firstDayOfWeek;
    var A = this.firstdayname;
    var D = Calendar._TT["WEEKEND"];
    for (var C = 0; C < 7; ++C) {
        A.className = "day name";
        var E = (C + B) % 7;
        if (C) {
            A.ttip = Calendar._TT["DAY_FIRST"].replace("%s", Calendar._DN[E]);
            A.navtype = 100;
            A.calendar = this;
            A.fdow = E;
            Calendar._add_evs(A)
        }
        if (D.indexOf(E.toString()) != -1) {
            Calendar.addClass(A, "weekend")
        }
        A.innerHTML = Calendar._SDN[(C + B) % 7];
        A = A.nextSibling
    }
};
Calendar.prototype._hideCombos = function () {
    this.monthsCombo.style.display = "none";
    this.yearsCombo.style.display = "none"
};
Calendar.prototype._dragStart = function (ev) {
    if (this.dragging) {
        return
    }
    this.dragging = true;
    var posX;
    var posY;
    if (Calendar.is_ie) {
        posY = window.event.clientY + document.body.scrollTop;
        posX = window.event.clientX + document.body.scrollLeft
    } else {
        posY = ev.clientY + window.scrollY;
        posX = ev.clientX + window.scrollX
    }
    var st = this.element.style;
    this.xOffs = posX - parseInt(st.left);
    this.yOffs = posY - parseInt(st.top);
    with(Calendar) {
        addEvent(document, "mousemove", calDragIt);
        addEvent(document, "mouseup", calDragEnd)
    }
};
Date._MD = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
Date.SECOND = 1000;
Date.MINUTE = 60 * Date.SECOND;
Date.HOUR = 60 * Date.MINUTE;
Date.DAY = 24 * Date.HOUR;
Date.WEEK = 7 * Date.DAY;
Date.parseDate = function (G, A) {
    var H = new Date();
    var I = 0;
    var B = -1;
    var F = 0;
    var K = G.split(/\W+/);
    var J = A.match(/%./g);
    var E = 0,
        D = 0;
    var L = 0;
    var C = 0;
    for (E = 0; E < K.length; ++E) {
        if (!K[E]) {
            continue
        }
        switch (J[E]) {
        case "%d":
        case "%e":
            F = parseInt(K[E], 10);
            break;
        case "%m":
            B = parseInt(K[E], 10) - 1;
            break;
        case "%Y":
        case "%y":
            I = parseInt(K[E], 10);
            (I < 100) && (I += (I > 29) ? 1900 : 2000);
            break;
        case "%b":
        case "%B":
            for (D = 0; D < 12; ++D) {
                if (Calendar._MN[D].substr(0, K[E].length).toLowerCase() == K[E].toLowerCase()) {
                    B = D;
                    break
                }
            }
            break;
        case "%H":
        case "%I":
        case "%k":
        case "%l":
            L = parseInt(K[E], 10);
            break;
        case "%P":
        case "%p":
            if (/pm/i.test(K[E]) && L < 12) {
                L += 12
            } else {
                if (/am/i.test(K[E]) && L >= 12) {
                    L -= 12
                }
            }
            break;
        case "%M":
            C = parseInt(K[E], 10);
            break
        }
    }
    if (isNaN(I)) {
        I = H.getFullYear()
    }
    if (isNaN(B)) {
        B = H.getMonth()
    }
    if (isNaN(F)) {
        F = H.getDate()
    }
    if (isNaN(L)) {
        L = H.getHours()
    }
    if (isNaN(C)) {
        C = H.getMinutes()
    }
    if (I != 0 && B != -1 && F != 0) {
        return new Date(I, B, F, L, C, 0)
    }
    I = 0;
    B = -1;
    F = 0;
    for (E = 0; E < K.length; ++E) {
        if (K[E].search(/[a-zA-Z]+/) != -1) {
            var M = -1;
            for (D = 0; D < 12; ++D) {
                if (Calendar._MN[D].substr(0, K[E].length).toLowerCase() == K[E].toLowerCase()) {
                    M = D;
                    break
                }
            }
            if (M != -1) {
                if (B != -1) {
                    F = B + 1
                }
                B = M
            }
        } else {
            if (parseInt(K[E], 10) <= 12 && B == -1) {
                B = K[E] - 1
            } else {
                if (parseInt(K[E], 10) > 31 && I == 0) {
                    I = parseInt(K[E], 10);
                    (I < 100) && (I += (I > 29) ? 1900 : 2000)
                } else {
                    if (F == 0) {
                        F = K[E]
                    }
                }
            }
        }
    }
    if (I == 0) {
        I = H.getFullYear()
    }
    if (B != -1 && F != 0) {
        return new Date(I, B, F, L, C, 0)
    }
    return H
};
Date.prototype.getMonthDays = function (B) {
    var A = this.getFullYear();
    if (typeof B == "undefined") {
        B = this.getMonth()
    }
    if (((0 == (A % 4)) && ((0 != (A % 100)) || (0 == (A % 400)))) && B == 1) {
        return 29
    } else {
        return Date._MD[B]
    }
};
Date.prototype.getDayOfYear = function () {
    var A = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
    var C = new Date(this.getFullYear(), 0, 0, 0, 0, 0);
    var B = A - C;
    return Math.floor(B / Date.DAY)
};
Date.prototype.getWeekNumber = function () {
    var C = new Date(this.getFullYear(), this.getMonth(), this.getDate(), 0, 0, 0);
    var B = C.getDay();
    C.setDate(C.getDate() - (B + 6) % 7 + 3);
    var A = C.valueOf();
    C.setMonth(0);
    C.setDate(4);
    return Math.round((A - C.valueOf()) / (7 * 86400000)) + 1
};
Date.prototype.equalsTo = function (A) {
    return ((this.getFullYear() == A.getFullYear()) && (this.getMonth() == A.getMonth()) && (this.getDate() == A.getDate()) && (this.getHours() == A.getHours()) && (this.getMinutes() == A.getMinutes()))
};
Date.prototype.setDateOnly = function (A) {
    var B = new Date(A);
    this.setDate(1);
    this.setFullYear(B.getFullYear());
    this.setMonth(B.getMonth());
    this.setDate(B.getDate())
};
Date.prototype.print = function (I) {
    var A = this.getMonth();
    var H = this.getDate();
    var J = this.getFullYear();
    var L = this.getWeekNumber();
    var M = this.getDay();
    var Q = {};
    var N = this.getHours();
    var B = (N >= 12);
    var F = (B) ? (N - 12) : N;
    var P = this.getDayOfYear();
    if (F == 0) {
        F = 12
    }
    var C = this.getMinutes();
    var G = this.getSeconds();
    Q["%a"] = Calendar._SDN[M];
    Q["%A"] = Calendar._DN[M];
    Q["%b"] = Calendar._SMN[A];
    Q["%B"] = Calendar._MN[A];
    Q["%C"] = 1 + Math.floor(J / 100);
    Q["%d"] = (H < 10) ? ("0" + H) : H;
    Q["%e"] = H;
    Q["%H"] = (N < 10) ? ("0" + N) : N;
    Q["%I"] = (F < 10) ? ("0" + F) : F;
    Q["%j"] = (P < 100) ? ((P < 10) ? ("00" + P) : ("0" + P)) : P;
    Q["%k"] = N;
    Q["%l"] = F;
    Q["%m"] = (A < 9) ? ("0" + (1 + A)) : (1 + A);
    Q["%M"] = (C < 10) ? ("0" + C) : C;
    Q["%n"] = "\n";
    Q["%p"] = B ? "PM" : "AM";
    Q["%P"] = B ? "pm" : "am";
    Q["%s"] = Math.floor(this.getTime() / 1000);
    Q["%S"] = (G < 10) ? ("0" + G) : G;
    Q["%t"] = "\t";
    Q["%U"] = Q["%W"] = Q["%V"] = (L < 10) ? ("0" + L) : L;
    Q["%u"] = M + 1;
    Q["%w"] = M;
    Q["%y"] = ("" + J).substr(2, 2);
    Q["%Y"] = J;
    Q["%%"] = "%";
    var O = /%./g;
    if (!Calendar.is_ie5 && !Calendar.is_khtml) {
        return I.replace(O, function (R) {
            return Q[R] || R
        })
    }
    var K = I.match(O);
    for (var E = 0; E < K.length; E++) {
        var D = Q[K[E]];
        if (D) {
            O = new RegExp(K[E], "g");
            I = I.replace(O, D)
        }
    }
    return I
};
Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear;
Date.prototype.setFullYear = function (B) {
    var A = new Date(this);
    A.__msh_oldSetFullYear(B);
    if (A.getMonth() != this.getMonth()) {
        this.setDate(28)
    }
    this.__msh_oldSetFullYear(B)
};
window._dynarch_popupCalendar = null;
if (siteLang == "fr") {
    Calendar._DN = new Array("Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche");
    Calendar._SDN = new Array("Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim");
    Calendar._MN = new Array("Janvier", "FÃ©vrier", "Mars", "Avril", "Mai", "Juin", "Juillet", "AoÃ»t", "Septembre", "Octobre", "Novembre", "DÃ©cembre");
    Calendar._FD = 1;
    Calendar._SMN = new Array("Jan", "Fev", "Mar", "Avr", "Mai", "Juin", "Juil", "Aout", "Sep", "Oct", "Nov", "Dec");
    Calendar._TT = {};
    Calendar._TT["INFO"] = "A propos du calendrier";
    Calendar._TT["ABOUT"] = "DHTML Date/Heure Selecteur\n" + "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + "Pour la derniere version visitez : http://www.dynarch.com/projects/calendar/\n" + "DistribuÃ© par GNU LGPL.  Voir http://gnu.org/licenses/lgpl.html pour les details." + "\n\n" + "Selection de la date :\n" + "- Utiliser les bouttons \xab, \xbb  pour selectionner l'annee\n" + "- Utiliser les bouttons " + String.fromCharCode(8249) + ", " + String.fromCharCode(8250) + " pour selectionner les mois\n" + "- Garder la souris sur n'importe quels boutons pour une selection plus rapide";
    Calendar._TT["ABOUT_TIME"] = "\n\n" + "Selection de l'heure :\n" + "- Cliquer sur heures ou minutes pour incrementer\n" + "- ou Maj-clic pour decrementer\n" + "- ou clic et glisser-deplacer pour une selection plus rapide";
    Calendar._TT["PREV_YEAR"] = "AnnÃ©e prÃ©c. (maintenir pour menu)";
    Calendar._TT["PREV_MONTH"] = "Mois prÃ©c. (maintenir pour menu)";
    Calendar._TT["GO_TODAY"] = "Atteindre la date du jour";
    Calendar._TT["NEXT_MONTH"] = "Mois suiv. (maintenir pour menu)";
    Calendar._TT["NEXT_YEAR"] = "AnnÃ©e suiv. (maintenir pour menu)";
    Calendar._TT["SEL_DATE"] = "SÃ©lectionner une date";
    Calendar._TT["DRAG_TO_MOVE"] = "DÃ©placer";
    Calendar._TT["PART_TODAY"] = " (Aujourd'hui)";
    Calendar._TT["DAY_FIRST"] = "Afficher %s en premier";
    Calendar._TT["WEEKEND"] = "0,6";
    Calendar._TT["CLOSE"] = "Fermer";
    Calendar._TT["TODAY"] = "Aujourd'hui";
    Calendar._TT["TIME_PART"] = "(Maj-)Clic ou glisser pour modifier la valeur";
    Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
    Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
    Calendar._TT["WK"] = "Sem.";
    Calendar._TT["TIME"] = "Heure :"
} else {
    if (siteLang == "de") {
        Calendar._DN = new Array("Sonntag", "Montag", "Dienstag", "Mitwoch", "Donnerstag", "Freitag", "Sastag", "Sonntag");
        Calendar._SDN = new Array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");
        Calendar._MN = new Array("Januar", "Februar", "MÃ¤rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");
        Calendar._FD = 1;
        Calendar._SMN = new Array("Jan", "Feb", "MÃ¤rz", "Apr", "Mai", "Juni", "Juli", "Aug", "Sep", "Okt", "Nov", "Dez");
        Calendar._TT = {};
        Calendar._TT["INFO"] = "*";
        Calendar._TT["ABOUT"] = "DHTML Datum/Uhrzeit Wahlhilfe\n" + "(c) dynarch.com 2002-2005 / Autor: Mihai Bazon\n" + "Letzte version: http://www.dynarch.com/projects/calendar/\n" + "Lizenz GNU LGPL ; http://gnu.org/licenses/lgpl.html." + "\n\n" + "Datum auswÃ¤hlen:\n" + "- Buttons betÃ¤tigen \xab, \xbb  zur Jahresauswahl\n" + "- Buttons betÃ¤tigen " + String.fromCharCode(8249) + ", " + String.fromCharCode(8250) + " zur Monatsauswahl\n" + "- Mauspfeil lÃ¤nger auf dem Button lassen um Datum schneller auszuwÃ¤hlen";
        Calendar._TT["ABOUT_TIME"] = "\n\n" + "Uhrzeit auswÃ¤hlen:\n" + "- Auf Stunde/Minuten klicken = nach oben\n" + "- oder CAPS-Klick = nach unten\n" + "- oder klicken und ziehen um schneller auszuwÃ¤hlen";
        Calendar._TT["PREV_YEAR"] = "Vorheriges Jahr. (maintenir pour menu)";
        Calendar._TT["PREV_MONTH"] = "Vorheriger Monat. (maintenir pour menu)";
        Calendar._TT["GO_TODAY"] = "Heute";
        Calendar._TT["NEXT_MONTH"] = "NÃ¤chster Monat. (maintenir pour menu)";
        Calendar._TT["NEXT_YEAR"] = "NÃ¤chstes Jahr. (maintenir pour menu)";
        Calendar._TT["SEL_DATE"] = "Datum auswÃ¤hlen";
        Calendar._TT["DRAG_TO_MOVE"] = "Bewegen";
        Calendar._TT["PART_TODAY"] = " (Heute)";
        Calendar._TT["DAY_FIRST"] = "Tag %s zuerst";
        Calendar._TT["WEEKEND"] = "0,6";
        Calendar._TT["CLOSE"] = "Schliessen";
        Calendar._TT["TODAY"] = "Heute";
        Calendar._TT["TIME_PART"] = "(CAPS-)Klick oder neuen Wert reinziehen";
        Calendar._TT["DEF_DATE_FORMAT"] = "%d/%m/%Y";
        Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
        Calendar._TT["WK"] = "Woche";
        Calendar._TT["TIME"] = "Stunde:"
    } else {
        if (siteLang == "en") {
            Calendar._DN = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday");
            Calendar._SDN = new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun");
            Calendar._MN = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
            Calendar._FD = 1;
            Calendar._SMN = new Array("Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec");
            Calendar._TT = {};
            Calendar._TT["INFO"] = "About Calendar";
            Calendar._TT["ABOUT"] = "DHTML Date/Hour Selector\n" + "(c) dynarch.com 2002-2005 / Author: Mihai Bazon\n" + "Pour la derniere version visitez : http://www.dynarch.com/projects/calendar/\n" + "DistribuÃ© par GNU LGPL.  Voir http://gnu.org/licenses/lgpl.html pour les details." + "\n\n" + "Selection de la date :\n" + "- Utiliser les bouttons \xab, \xbb  pour selectionner l'annee\n" + "- Utiliser les bouttons " + String.fromCharCode(8249) + ", " + String.fromCharCode(8250) + " pour selectionner les mois\n" + "- Garder la souris sur n'importe quels boutons pour une selection plus rapide";
            Calendar._TT["ABOUT_TIME"] = "\n\n" + "Selection de l'heure :\n" + "- Cliquer sur heures ou minutes pour incrementer\n" + "- ou Maj-clic pour decrementer\n" + "- ou clic et glisser-deplacer pour une selection plus rapide";
            Calendar._TT["PREV_YEAR"] = "Previous Year. (maintenir pour menu)";
            Calendar._TT["PREV_MONTH"] = "Previous Month. (maintenir pour menu)";
            Calendar._TT["GO_TODAY"] = "Go Today";
            Calendar._TT["NEXT_MONTH"] = "Next Month. (maintenir pour menu)";
            Calendar._TT["NEXT_YEAR"] = "Next Year. (maintenir pour menu)";
            Calendar._TT["SEL_DATE"] = "Select date";
            Calendar._TT["DRAG_TO_MOVE"] = "Drag to move";
            Calendar._TT["PART_TODAY"] = " (Today)";
            Calendar._TT["DAY_FIRST"] = "Afficher %s en premier";
            Calendar._TT["WEEKEND"] = "0,6";
            Calendar._TT["CLOSE"] = "Close";
            Calendar._TT["TODAY"] = "Today";
            Calendar._TT["TIME_PART"] = "(Maj-)Clic ou glisser pour modifier la valeur";
            Calendar._TT["DEF_DATE_FORMAT"] = "%m/%d/%Y";
            Calendar._TT["TT_DATE_FORMAT"] = "%a, %b %e";
            Calendar._TT["WK"] = "Week.";
            Calendar._TT["TIME"] = "Hour :"
        }
    }
}
Calendar.setup = function (G) {
    function F(H, I) {
        if (typeof G[H] == "undefined") {
            G[H] = I
        }
    }
    F("inputField", null);
    F("displayArea", null);
    F("button", null);
    F("eventName", "click");
    F("ifFormat", "%Y/%m/%d");
    F("daFormat", "%Y/%m/%d");
    F("singleClick", true);
    F("disableFunc", null);
    F("dateStatusFunc", G["disableFunc"]);
    F("dateText", null);
    F("firstDay", null);
    F("align", "Br");
    F("range", [1900, 2999]);
    F("weekNumbers", true);
    F("flat", null);
    F("flatCallback", null);
    F("onSelect", null);
    F("onClose", null);
    F("onUpdate", null);
    F("date", null);
    F("showsTime", false);
    F("timeFormat", "24");
    F("electric", true);
    F("step", 2);
    F("position", null);
    F("cache", false);
    F("showOthers", false);
    F("multiple", null);
    var C = ["inputField", "displayArea", "button"];
    for (var B in C) {
        if (typeof G[C[B]] == "string") {
            G[C[B]] = document.getElementById(G[C[B]])
        }
    }
    if (!(G.flat || G.multiple || G.inputField || G.displayArea || G.button)) {
        alert("Calendar.setup:\n  Nothing to setup (no fields found).  Please check your code");
        return false
    }
    function A(I) {
        var H = I.params;
        var J = (I.dateClicked || H.electric);
        if (J && H.inputField) {
            H.inputField.value = I.date.print(H.ifFormat);
            if (typeof H.inputField.onchange == "function") {
                H.inputField.onchange()
            }
        }
        if (J && H.displayArea) {
            H.displayArea.innerHTML = I.date.print(H.daFormat)
        }
        if (J && typeof H.onUpdate == "function") {
            H.onUpdate(I)
        }
        if (J && H.flat) {
            if (typeof H.flatCallback == "function") {
                H.flatCallback(I)
            }
        }
        if (J && H.singleClick && I.dateClicked) {
            I.callCloseHandler()
        }
    }
    if (G.flat != null) {
        if (typeof G.flat == "string") {
            G.flat = document.getElementById(G.flat)
        }
        if (!G.flat) {
            alert("Calendar.setup:\n  Flat specified but can't find parent.");
            return false
        }
        var E = new Calendar(G.firstDay, G.date, G.onSelect || A);
        E.showsOtherMonths = G.showOthers;
        E.showsTime = G.showsTime;
        E.time24 = (G.timeFormat == "24");
        E.params = G;
        E.weekNumbers = G.weekNumbers;
        E.setRange(G.range[0], G.range[1]);
        E.setDateStatusHandler(G.dateStatusFunc);
        E.getDateText = G.dateText;
        if (G.ifFormat) {
            E.setDateFormat(G.ifFormat)
        }
        if (G.inputField && typeof G.inputField.value == "string") {
            E.parseDate(G.inputField.value)
        }
        E.create(G.flat);
        E.show();
        return false
    }
    var D = G.button || G.displayArea || G.inputField;
    D["on" + G.eventName] = function () {
        var H = G.inputField || G.displayArea;
        var J = G.inputField ? G.ifFormat : G.daFormat;
        var N = false;
        var L = window.calendar;
        if (H) {
            G.date = Date.parseDate(H.value || H.innerHTML, J)
        }
        if (!(L && G.cache)) {
            window.calendar = L = new Calendar(G.firstDay, G.date, G.onSelect || A, G.onClose ||
            function (O) {
                O.hide()
            });
            L.showsTime = G.showsTime;
            L.time24 = (G.timeFormat == "24");
            L.weekNumbers = G.weekNumbers;
            N = true
        } else {
            if (G.date) {
                L.setDate(G.date)
            }
            L.hide()
        }
        if (G.multiple) {
            L.multiple = {};
            for (var I = G.multiple.length; --I >= 0;) {
                var M = G.multiple[I];
                var K = M.print("%Y%m%d");
                L.multiple[K] = M
            }
        }
        L.showsOtherMonths = G.showOthers;
        L.yearStep = G.step;
        L.setRange(G.range[0], G.range[1]);
        L.params = G;
        L.setDateStatusHandler(G.dateStatusFunc);
        L.getDateText = G.dateText;
        L.setDateFormat(J);
        if (N) {
            L.create()
        }
        L.refresh();
        if (!G.position) {
            L.showAtElement(G.button || G.displayArea || G.inputField, G.align)
        } else {
            L.showAt(G.position[0], G.position[1])
        }
        return false
    };
    return E
};
var arrSmilies = new Array();
arrSmilies["cool"] = new Array();
arrSmilies["cool"][0] = '<span onclick="insertSmilie(\'beard\');" class="consLink"><img src="./images/divers/forum_smilies/beard.gif" alt="" /></span>';
arrSmilies["cool"][1] = '<span onclick="insertSmilie(\'boogie\');" class="consLink"><img src="./images/divers/forum_smilies/boogie.gif" alt="" /></span>';
arrSmilies["cool"][2] = '<span onclick="insertSmilie(\'peace\');" class="consLink"><img src="./images/divers/forum_smilies/peace.gif" alt="" /></span>';
arrSmilies["cool"][3] = '<span onclick="insertSmilie(\'pirate\');" class="consLink"><img src="./images/divers/forum_smilies/pirate.gif" alt="" /></span>';
arrSmilies["cool"][4] = '<span onclick="insertSmilie(\'rasta\');" class="consLink"><img src="./images/divers/forum_smilies/rasta.gif" alt="" /></span>';
arrSmilies["cool"][5] = '<span onclick="insertSmilie(\'shades\');" class="consLink"><img src="./images/divers/forum_smilies/shades.gif" alt="" /></span>';
arrSmilies["cool"][6] = '<span onclick="insertSmilie(\'smoking\');" class="consLink"><img src="./images/divers/forum_smilies/smoking.gif" alt="" /></span>';
arrSmilies["cool"][7] = '<span onclick="insertSmilie(\'surfing\');" class="consLink"><img src="./images/divers/forum_smilies/surfing.gif" alt="" /></span>';
arrSmilies["cool"][8] = '<span onclick="insertSmilie(\'trompet\');" class="consLink"><img src="./images/divers/forum_smilies/trompet.gif" alt="" /></span>';
arrSmilies["happy"] = new Array();
arrSmilies["happy"][0] = '<span onclick="insertSmilie(\'cheer\');" class="consLink"><img src="./images/divers/forum_smilies/cheer.gif" alt="" /></span>';
arrSmilies["happy"][1] = '<span onclick="insertSmilie(\'clap\');" class="consLink"><img src="./images/divers/forum_smilies/clap.gif" alt="" /></span>';
arrSmilies["happy"][2] = '<span onclick="insertSmilie(\'crazy\');" class="consLink"><img src="./images/divers/forum_smilies/crazy.gif" alt="" /></span>';
arrSmilies["happy"][3] = '<span onclick="insertSmilie(\'jumping\');" class="consLink"><img src="./images/divers/forum_smilies/jumping.gif" alt="" /></span>';
arrSmilies["happy"][4] = '<span onclick="insertSmilie(\'peace\');" class="consLink"><img src="./images/divers/forum_smilies/peace.gif" alt="" /></span>';
arrSmilies["happy"][5] = '<span onclick="insertSmilie(\'rolling\');" class="consLink"><img src="./images/divers/forum_smilies/rolling.gif" alt="" /></span>';
arrSmilies["happy"][6] = '<span onclick="insertSmilie(\'swingin\');" class="consLink"><img src="./images/divers/forum_smilies/swingin.gif" alt="" /></span>';
arrSmilies["happy"][7] = '<span onclick="insertSmilie(\'thumbup\');" class="consLink"><img src="./images/divers/forum_smilies/thumbup.gif" alt="" /></span>';
arrSmilies["happy"][8] = '<span onclick="insertSmilie(\'tooth\');" class="consLink"><img src="./images/divers/forum_smilies/tooth.gif" alt="" /></span>';
arrSmilies["love"] = new Array();
arrSmilies["love"][0] = '<span onclick="insertSmilie(\'brokenheart\');" class="consLink"><img src="./images/divers/forum_smilies/brokenheart.gif" alt="" /></span>';
arrSmilies["love"][1] = '<span onclick="insertSmilie(\'crush\');" class="consLink"><img src="./images/divers/forum_smilies/crush.gif" alt="" /></span>';
arrSmilies["love"][2] = '<span onclick="insertSmilie(\'dinner\');" class="consLink"><img src="./images/divers/forum_smilies/dinner.gif" alt="" /></span>';
arrSmilies["love"][3] = '<span onclick="insertSmilie(\'flowers\');" class="consLink"><img src="./images/divers/forum_smilies/flowers.gif" alt="" /></span>';
arrSmilies["love"][4] = '<span onclick="insertSmilie(\'grouphug\');" class="consLink"><img src="./images/divers/forum_smilies/grouphug.gif" alt="" /></span>';
arrSmilies["love"][5] = '<span onclick="insertSmilie(\'heart\');" class="consLink"><img src="./images/divers/forum_smilies/heart.gif" alt="" /></span>';
arrSmilies["love"][6] = '<span onclick="insertSmilie(\'heartbounce\');" class="consLink"><img src="./images/divers/forum_smilies/heartbounce.gif" alt="" /></span>';
arrSmilies["love"][7] = '<span onclick="insertSmilie(\'heartsabove\');" class="consLink"><img src="./images/divers/forum_smilies/heartsabove.gif" alt="" /></span>';
arrSmilies["love"][8] = '<span onclick="insertSmilie(\'hugging\');" class="consLink"><img src="./images/divers/forum_smilies/hugging.gif" alt="" /></span>';
arrSmilies["love"][9] = '<span onclick="insertSmilie(\'kiss\');" class="consLink"><img src="./images/divers/forum_smilies/kiss.gif" alt="" /></span>';
arrSmilies["love"][10] = '<span onclick="insertSmilie(\'kissing\');" class="consLink"><img src="./images/divers/forum_smilies/kissing.gif" alt="" /></span>';
arrSmilies["love"][11] = '<span onclick="insertSmilie(\'rainbow\');" class="consLink"><img src="./images/divers/forum_smilies/rainbow.gif" alt="" /></span>';
arrSmilies["love"][12] = '<span onclick="insertSmilie(\'threesome\');" class="consLink"><img src="./images/divers/forum_smilies/threesome.gif" alt="" /></span>';
arrSmilies["love"][13] = '<span onclick="insertSmilie(\'twosome\');" class="consLink"><img src="./images/divers/forum_smilies/twosome.gif" alt="" /></span>';
arrSmilies["love"][14] = '<span onclick="insertSmilie(\'whorship\');" class="consLink"><img src="./images/divers/forum_smilies/whorship.gif" alt="" /></span>';
arrSmilies["love"][15] = '<span onclick="insertSmilie(\'winkkiss\');" class="consLink"><img src="./images/divers/forum_smilies/winkkiss.gif" alt="" /></span>';
arrSmilies["standard"] = new Array();
arrSmilies["standard"][0] = '<span onclick="insertSmilie(\'angry\');" class="consLink"><img src="./images/divers/forum_smilies/angry.gif" alt="" /></span>';
arrSmilies["standard"][1] = '<span onclick="insertSmilie(\'bigsmile\');" class="consLink"><img src="./images/divers/forum_smilies/bigsmile.gif" alt="" /></span>';
arrSmilies["standard"][2] = '<span onclick="insertSmilie(\'confused\');" class="consLink"><img src="./images/divers/forum_smilies/confused.gif" alt="" /></span>';
arrSmilies["standard"][3] = '<span onclick="insertSmilie(\'cool\');" class="consLink"><img src="./images/divers/forum_smilies/cool.gif" alt="" /></span>';
arrSmilies["standard"][4] = '<span onclick="insertSmilie(\'cry\');" class="consLink"><img src="./images/divers/forum_smilies/cry.gif" alt="" /></span>';
arrSmilies["standard"][5] = '<span onclick="insertSmilie(\'devil\');" class="consLink"><img src="./images/divers/forum_smilies/devil.gif" alt="" /></span>';
arrSmilies["standard"][6] = '<span onclick="insertSmilie(\'neutral\');" class="consLink"><img src="./images/divers/forum_smilies/neutral.gif" alt="" /></span>';
arrSmilies["standard"][7] = '<span onclick="insertSmilie(\'sad\');" class="consLink"><img src="./images/divers/forum_smilies/sad.gif" alt="" /></span>';
arrSmilies["standard"][8] = '<span onclick="insertSmilie(\'shamed\');" class="consLink"><img src="./images/divers/forum_smilies/shamed.gif" alt="" /></span>';
arrSmilies["standard"][9] = '<span onclick="insertSmilie(\'shocked\');" class="consLink"><img src="./images/divers/forum_smilies/shocked.gif" alt="" /></span>';
arrSmilies["standard"][10] = '<span onclick="insertSmilie(\'smile\');" class="consLink"><img src="./images/divers/forum_smilies/smile.gif" alt="" /></span>';
arrSmilies["standard"][11] = '<span onclick="insertSmilie(\'surprised\');" class="consLink"><img src="./images/divers/forum_smilies/surprised.gif" alt="" /></span>';
arrSmilies["standard"][12] = '<span onclick="insertSmilie(\'tongue\');" class="consLink"><img src="./images/divers/forum_smilies/tongue.gif" alt="" /></span>';
arrSmilies["standard"][13] = '<span onclick="insertSmilie(\'wink\');" class="consLink"><img src="./images/divers/forum_smilies/wink.gif" alt="" /></span>';
arrSmilies["tongue"] = new Array();
arrSmilies["tongue"][0] = '<span onclick="insertSmilie(\'fierce\');" class="consLink"><img src="../images/divers/forum_smilies/fierce.gif" alt="" /></span>';
arrSmilies["tongue"][1] = '<span onclick="insertSmilie(\'fingersear\');" class="consLink"><img src="../images/divers/forum_smilies/fingersear.gif" alt="" /></span>';
arrSmilies["tongue"][2] = '<span onclick="insertSmilie(\'hungry\');" class="consLink"><img src="../images/divers/forum_smilies/hungry.gif" alt="" /></span>';
arrSmilies["tongue"][3] = '<span onclick="insertSmilie(\'middlefinger\');" class="consLink"><img src="../images/divers/forum_smilies/middlefinger.gif" alt="" /></span>';
arrSmilies["tongue"][4] = '<span onclick="insertSmilie(\'sleepout\');" class="consLink"><img src="../images/divers/forum_smilies/sleepout.gif" alt="" /></span>';
arrSmilies["tongue"][5] = '<span onclick="insertSmilie(\'updown\');" class="consLink"><img src="../images/divers/forum_smilies/updown.gif" alt="" /></span>';

function changeSmilies(B) {
    var A = "<ul>";
    for (i = 0; i < arrSmilies[B].length; i++) {
        A = A + "<li>" + arrSmilies[B][i] + "</li>"
    }
    A = A + "</ul>";
    $("consSmilies").innerHTML = A
}
function insertSmilie(A) {
    var B = $("CommentBox");
    B.value = B.value + ":" + A + ":"
}
function toggleCommentBox(A, B) {
    if ($("CommentBox").className == "LargeCommentBox") {
        $("CommentBox").className = "SmallCommentBox";
        $("CommentBoxController").innerHTML = B
    } else {
        $("CommentBox").className = "LargeCommentBox";
        $("CommentBoxController").innerHTML = A
    }
}
function forumCiter(B, A) {
    while (B.indexOf("<br />") > 0) {
        B = B.replace("<br />", "\n")
    }
    if ($("CommentBox").value != "") {
        $("CommentBox").value = $("CommentBox").value + "\n[quote=" + A + "]" + B + "[/quote]"
    } else {
        $("CommentBox").value = $("CommentBox").value + "[quote=" + A + "]" + B + "[/quote]"
    }
}
var SuperBoxClass = Class.create();
SuperBoxClass.prototype = {
    loadImage: "./img/main/superboxloading.gif",
    widthParam: "sbw",
    heightParam: "sbh",
    addUrlParams: "spbox=1",
    ajaxOptions: {},
    selector: "a.thickbox",
    cb_show: [],
    cb_remove: [],
    initialize: function () {
        this.register(this.selector)
    },
    getCloseWord: function () {
        switch (siteLang) {
        default:
        case "fr":
            return "Fermer";
            break;
        case "en":
            return "Close";
            break;
        case "de":
            return "Schlieï¿½en";
            break
        }
    },
    reset: function () {
        this.w = 0;
        this.h = 0;
        this.t = "";
        this.s = false
    },
    registerNow: function (A, B) {
        $$(A).each(function (C) {
            SuperBox.registerElt(C, B)
        })
    },
    register: function (A, B) {
        Event.observe(window, "load", function () {
            window._loaded = true
        });
        if (window._loaded) {
            this.registerNow(A, B)
        } else {
            Event.observe(window, "load", function () {
                this.registerNow(A, B)
            }.bind(this))
        }
    },
    registerElt: function (B, A) {
        B.onclick = function () {
            return false
        }.bindAsEventListener(B);
        Event.observe(B, "click", function () {
            var C = this.title || this.innerHTML || this.href;
            SuperBox.call(C, A || this.href);
            this.blur()
        }.bindAsEventListener(B))
    },
    call: function (A, B) {
        try {
            this.reset();
            this.caption = A;
            this.url = B;
            this.baseinsert();
            if (/MSIE/.test(navigator.userAgent)) {
                $$("select").each(function (F) {
                    Element.hide(F)
                })
            }
            if (window.opera) {
                $$("iframe").each(function (F) {
                    Element.hide(F)
                })
            }
            this.wro = this.position.bindAsEventListener(this);
            this.position();
            Event.observe(window, "resize", this.wro);
            if (this.url.toLowerCase().match(/\.jpg|\.jpeg|\.png|\.gif|\.bmp/g)) {
                this.t = "img";
                this.img = new Image();
                this.img.onload = this.show.bindAsEventListener(this);
                this.img.src = this.url
            } else {
                this.t = "html";
                var E = B.replace(/^[^\?]+\??/, "");
                var D = this.parseQuery(E);
                if (D[this.widthParam]) {
                    this.setDim(D[this.widthParam], D[this.heightParam], true)
                }
                this.htmlinsert();
                $("SuperBox_closeWindowButton").onclick = this.remove.bindAsEventListener(this);
                new Ajax.Updater("SuperBox_ajaxContent", this.urlcat(this.url, this.addUrlParams), Object.extend({
                    evalScripts: true,
                    onFailure: this.remove.bind(this),
                    onSuccess: this.show.bind(this),
                    method: "get"
                }, this.ajaxOptions))
            }
        } catch (C) {
            alert(C)
        }
    },
    urlcat: function (A, B) {
        if (A.indexOf("?") < 0) {
            return A + "?" + B
        } else {
            return A + "&" + B
        }
    },
    baseinsert: function () {
        return new Insertion.Bottom($$("body")[0], "<div id='SuperBox_global'><div id='SuperBox_overlay' onclick='return SuperBox.remove();'></div><div id='SuperBox_window' style='display:none;'></div><div id='SuperBox_load' onclick='return SuperBox.remove();'><div id='SuperBox_loadContent'><img src='" + this.loadImage + "' /></div></div></div>")
    },
    htmlinsert: function () {
        return new Insertion.Bottom("SuperBox_window", "<div id='SuperBox_headerAjaxWindow'><div id='SuperBox_title'>" + this.caption + "</div><div id='SuperBox_closeWindowButton'><a href='#'>" + this.getCloseWord() + "</a></div></div><div id='SuperBox_ajaxContent'></div>")
    },
    imginsert: function () {
        try {
            $("SuperBox_Img").remove()
        } catch (A) {}
        return new Insertion.Bottom("SuperBox_window", "<div id='SuperBox_Img'><a href='' onclick='return SuperBox.remove();' id='SuperBox_ImageOff' title='Close'><img id='SuperBox_Image' src='" + this.url + "' style='" + this.ciw + "px;height:" + this.cih + "px' alt='" + this.caption + "'/></a><div id='SuperBox_caption'>" + this.caption + "</div><div id='SuperBox_closeWindow' onclick='return SuperBox.remove();'><a href='#' id='SuperBox_closeWindowButton'>" + this.getCloseWord() + "</a></div></div>")
    },
    show: function () {
        this.s = true;
        if (this.t == "img") {
            this.iw = this.img.width;
            this.ih = this.img.height;
            this.position();
            this.imginsert()
        } else {
            this.position()
        }
        if (this.w > 0) {
            $("SuperBox_load").hide();
            $("SuperBox_window").show()
        }
        this.cb_show.each(function (A) {
            A()
        })
    },
    remove: function () {
        this.cb_remove.each(function (A) {
            A()
        });
        Event.stopObserving(window, "resize", this.wro);
        $("SuperBox_global").remove();
        if (/MSIE/.test(navigator.userAgent)) {
            $$("select").each(function (A) {
                Element.show(A)
            })
        }
        if (window.opera) {
            $$("iframe").each(function (A) {
                Element.show(A)
            })
        }
        return false
    },
    position: function () {
        var B = this.getPageSize();
        if (window.innerHeight && window.scrollMaxY) {
            yScroll = window.innerHeight + window.scrollMaxY
        } else {
            if (document.body.scrollHeight > document.body.offsetHeight) {
                yScroll = document.body.scrollHeight
            } else {
                yScroll = document.body.offsetHeight
            }
        }
        var A = this.getPageScrollTop();
        if (this.t == "img") {
            this.imgsize();
            this.imginsert()
        } else {
            if (this.t == "html") {
                $("SuperBox_ajaxContent").setStyle({
                    width: (this.w) + "px",
                    height: (this.h - 31) + "px"
                })
            }
        }
        $("SuperBox_window").setStyle({
            width: this.w + "px",
            height: this.h + "px",
            left: ((B[0] - this.w) / 2) + "px",
            top: (A[1] + ((B[1] - this.h) / 2)) + "px"
        });
        $("SuperBox_load").setStyle({
            top: (A[1] + 40 + ((B[1]) / 2)) + "px"
        });
        $("SuperBox_overlay").setStyle({
            "height": yScroll + "px"
        })
    },
    setDim: function (A, B, C) {
        this.w = A * 1 + 30;
        this.h = B * 1 + 40;
        if (this.s && !C) {
            this.show()
        }
    },
    imgsize: function () {
        var B = this.getPageSize();
        var A = B[0] - 100;
        var C = B[1] - 100;
        this.ciw = this.iw;
        this.cih = this.ih;
        (2).times(function () {
            if (this.ciw > A) {
                this.cih = this.cih * (A / this.ciw);
                this.ciw = A
            }
            if (this.cih > C) {
                this.ciw = this.ciw * (C / this.cih);
                this.cih = C
            }
        }.bind(this));
        this.w = this.ciw + 30;
        this.h = this.cih + 60
    },
    getPageScrollTop: function () {
        var B;
        var A = document.documentElement;
        if (self.pageYOffset) {
            B = self.pageYOffset
        } else {
            if (A && A.scrollTop) {
                B = A.scrollTop
            } else {
                if (document.body) {
                    B = document.body.scrollTop
                }
            }
        }
        arrayPageScroll = new Array("", B);
        return arrayPageScroll
    },
    getPageSize: function () {
        var C = document.documentElement;
        var A = self.innerWidth || (C && C.clientWidth) || document.body.clientWidth;
        var B = self.innerHeight || (C && C.clientHeight) || document.body.clientHeight;
        arrayPageSize = new Array(A, B);
        return arrayPageSize
    },
    parseQuery: function (D) {
        var E = new Object();
        if (!D) {
            return E
        }
        var A = D.split(/[;&]/);
        for (var C = 0; C < A.length; C++) {
            var G = A[C].split("=");
            if (!G || G.length != 2) {
                continue
            }
            var B = unescape(G[0]);
            var F = unescape(G[1]);
            F = F.replace(/\+/g, " ");
            E[B] = F
        }
        return E
    }
};
var SuperBox = new SuperBoxClass();

function play(A) {
    $(A).SetVariable("player:jsPlay", "")
}
function pause(A) {
    $(A).SetVariable("player:jsPause", "")
}
function stop(A) {
    $(A).SetVariable("player:jsStop", "")
}
var FCKeditor = function (B, D, A, C, E) {
    this.InstanceName = B;
    this.Width = D || "100%";
    this.Height = A || "200";
    this.ToolbarSet = C || "Default";
    this.Value = E || "";
    this.BasePath = "/fckeditor/";
    this.CheckBrowser = true;
    this.DisplayErrors = true;
    this.EnableSafari = false;
    this.EnableOpera = false;
    this.Config = new Object();
    this.OnError = null
};
FCKeditor.prototype.Version = "2.4.2";
FCKeditor.prototype.VersionBuild = "14978";
FCKeditor.prototype.Create = function () {
    document.write(this.CreateHtml())
};
FCKeditor.prototype.CreateHtml = function () {
    if (!this.InstanceName || this.InstanceName.length == 0) {
        this._ThrowError(701, "You must specify an instance name.");
        return ""
    }
    var C = "<div>";
    if (!this.CheckBrowser || this._IsCompatibleBrowser()) {
        C += '<input type="hidden" id="' + this.InstanceName + '" name="' + this.InstanceName + '" value="' + this._HTMLEncode(this.Value) + '" style="display:none" />';
        C += this._GetConfigHtml();
        C += this._GetIFrameHtml()
    } else {
        var B = this.Width.toString().indexOf("%") > 0 ? this.Width : this.Width + "px";
        var A = this.Height.toString().indexOf("%") > 0 ? this.Height : this.Height + "px";
        C += '<textarea name="' + this.InstanceName + '" rows="4" cols="40" style="width:' + B + ";height:" + A + '">' + this._HTMLEncode(this.Value) + "</textarea>"
    }
    C += "</div>";
    return C
};
FCKeditor.prototype.ReplaceTextarea = function () {
    if (!this.CheckBrowser || this._IsCompatibleBrowser()) {
        var C = document.getElementById(this.InstanceName);
        var B = document.getElementsByName(this.InstanceName);
        var A = 0;
        while (C || A == 0) {
            if (C && C.tagName.toLowerCase() == "textarea") {
                break
            }
            C = B[A++]
        }
        if (!C) {
            alert('Error: The TEXTAREA with id or name set to "' + this.InstanceName + '" was not found');
            return
        }
        C.style.display = "none";
        this._InsertHtmlBefore(this._GetConfigHtml(), C);
        this._InsertHtmlBefore(this._GetIFrameHtml(), C)
    }
};
FCKeditor.prototype._InsertHtmlBefore = function (C, B) {
    if (B.insertAdjacentHTML) {
        B.insertAdjacentHTML("beforeBegin", C)
    } else {
        var D = document.createRange();
        D.setStartBefore(B);
        var A = D.createContextualFragment(C);
        B.parentNode.insertBefore(A, B)
    }
};
FCKeditor.prototype._GetConfigHtml = function () {
    var A = "";
    for (var B in this.Config) {
        if (A.length > 0) {
            A += "&amp;"
        }
        A += encodeURIComponent(B) + "=" + encodeURIComponent(this.Config[B])
    }
    return '<input type="hidden" id="' + this.InstanceName + '___Config" value="' + A + '" style="display:none" />'
};
FCKeditor.prototype._GetIFrameHtml = function () {
    var C = "fckeditor.html";
    try {
        if ((/fcksource=true/i).test(window.top.location.search)) {
            C = "fckeditor.original.html"
        }
    } catch (B) {}
    var A = this.BasePath + "editor/" + C + "?InstanceName=" + encodeURIComponent(this.InstanceName);
    if (this.ToolbarSet) {
        A += "&amp;Toolbar=" + this.ToolbarSet
    }
    return '<iframe id="' + this.InstanceName + '___Frame" src="' + A + '" width="' + this.Width + '" height="' + this.Height + '" frameborder="0" scrolling="no"></iframe>'
};
FCKeditor.prototype._IsCompatibleBrowser = function () {
    return FCKeditor_IsCompatibleBrowser(this.EnableSafari, this.EnableOpera)
};
FCKeditor.prototype._ThrowError = function (B, A) {
    this.ErrorNumber = B;
    this.ErrorDescription = A;
    if (this.DisplayErrors) {
        document.write('<div style="COLOR: #ff0000">');
        document.write("[ FCKeditor Error " + this.ErrorNumber + ": " + this.ErrorDescription + " ]");
        document.write("</div>")
    }
    if (typeof(this.OnError) == "function") {
        this.OnError(this, B, A)
    }
};
FCKeditor.prototype._HTMLEncode = function (A) {
    if (typeof(A) != "string") {
        A = A.toString()
    }
    A = A.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    return A
};

function FCKeditor_IsCompatibleBrowser(B, D) {
    var C = navigator.userAgent.toLowerCase();
    if (C.indexOf("msie") != -1 && C.indexOf("mac") == -1 && C.indexOf("opera") == -1) {
        var A = navigator.appVersion.match(/MSIE (.\..)/)[1];
        return (A >= 5.5)
    }
    if (navigator.product == "Gecko" && navigator.productSub >= 20030210 && !(typeof(opera) == "object" && opera.postError)) {
        return true
    }
    if (D && navigator.appName == "Opera" && parseInt(navigator.appVersion, 10) >= 9) {
        return true
    }
    if (B && C.indexOf("safari") != -1) {
        return (C.match(/safari\/(\d+)/)[1] >= 312)
    }
    return false
}


if (typeof bitt == 'undefined') {
  bitt =
  { ie : navigator.appName == 'Microsoft Internet Explorer', 
    entities : { amp : '&', 
          lt : '<', 
          gt : '>', 
          quot : '"' }, 
    bitts : [  ], 
    nextName : 0, 
    continuation : undefined, 
    writeFunc : undefined, 
    onLoadHandlers : [  ], 
    instance : undefined, 
    zone : undefined, 
    location : undefined, 
    keywords : [  ], 
    finishHook : function () {
          null;
        }, 
    now : new Date, 
    expandHtml : function (sink, str, c) {
          var self =
              { sink : sink, 
                top : str, 
                buffer : '', 
                buffers : [  ], 
                srcs : [  ] };
          bitt.process(self, c);
          document.write =
          function () {
            null;
          };
        }, 
    process : function (self, c) {
          var iter =
              function () {
                bitt.process(self, c);
              };
          var write =
              function (str) {
                bitt.write(self, str);
              };
          if (self.srcs.length != 0) {
            return bitt.loadScript(self.srcs.shift(), write, iter);
          };
          var split = bitt.splitOffFirstScript(self.top);
          self.sink(split.before);
          self.top = split.remaining;
          if (!split.script) {
            return c();
          };
          if (split.script.valid) {
            if (split.script.src) {
              if (split.script.type == 'js') {
                return bitt.loadScript(split.script.src, write, iter);
              };
            } else {
              bitt.evalScript
              (split.script.content, split.script.type, write);
            };
          };
          iter();
        }, 
    write : function (self, str) {
          self.buffer += str;
          while (true) {
            var split = bitt.splitOffFirstScript(self.buffer);
            self.sink(split.before);
            self.buffer = split.remaining;
            if (!split.script) {
              return null;
            };
            if (split.script.valid) {
              if (split.script.src) {
                if (split.script.type == 'js') {
                  self.srcs.push(split.script.src);
                };
              } else {
                self.buffers.push(self.buffer);
                self.buffer = '';
                bitt.evalScript
                (split.script.content, split.script.type,
                 function (str) {
                   bitt.write(self, str);
                 });
                self.buffer += self.buffers.pop();
              };
            };
          };
        }, 
    isJavascriptUrl : function (url) {
          return url.length > 11 && url.substr(0, 11) == 'javascript:';
        }, 
    hostnameToPath : function (hostname) {
          return hostname.split('.').reverse().join('/');
        }, 
    decorateUrl : function (url) {
          var parts =
              url.match(/^\s*(https?):\/\/(.*?)(?::(\d+))?(\/.*?)?\s*$/);
          if (parts) {
            var scheme = parts[1];
            var hostname = parts[2];
            var port = parts[3];
            var path = parts[4] || '/';
            return (document.location.protocol == 'https:'
                && 'https://decorator.bittads.com' ?
                'https://decorator.bittads.com' :
                'http://decorator.bittads.com')
               + '/' + bitt.hostnameToPath(hostname) + ';' + path
              + ';bitt' + ';scheme=' + scheme
              + (port ? ';port=' + port : '');
          };
        }, 
    loadScript : function (filename, write, c) {
          if (bitt.isJavascriptUrl(filename)) {
            var content =
                bitt.evalScript(filename.substr(11), 'js', write);
            bitt.evalScript(content, 'js', write);
            c();
          } else {
            bitt.continuation = c;
            bitt.writeFunc = write;
            bitt.appendScript(bitt.decorateUrl(filename));
          };
        }, 
    errors : [  ], 
    logError : function (e) {
          bitt.errors.push(e);
          if (window.console && window.console.error) {
            window.console.error(e);
          };
        }, 
    evalScript : function (content, type, write) {
          document.write = write;
          document.writeln =
          function (self, str) {
            return write(self, str + '\n');
          };
          try {
            if (bitt.ie) {
              switch (type) {
                case 'js':
                   return window.execScript(content);
                   break;
                case 'vb':
                   return window.execScript(content, 'VBScript');
              };
            } else {
              switch (type) {
                case 'js':
                   return window.eval(content);
                   break;
                case 'vb':   return null;
              };
            };
          } catch (e) {
            bitt.logError(e);
          };
        }, 
    splitOffFirstScript : function (string) {
          var firstScript = string.search(/<script/i);
          var retval =
              { before : string, 
                script : null, 
                remaining : '' };
          if (firstScript == -1) {
            return retval;
          };
          retval.before = string.substr(0, firstScript);
          string = string.substr(firstScript);
          var closeTag = string.search(/<\/script\s*>/i);
          if (closeTag == -1) {
            retval.remaining = string;
            return retval;
          };
          var scriptEnd = 1 + string.indexOf('>', closeTag);
          retval.remaining = string.substr(scriptEnd);
          retval.script = bitt.grokScript(string.substr(0, scriptEnd));
          return retval;
        }, 
    grokScript : function (script) {
          var openTagEnd = 1 + script.search('>');
          var openTag = script.substr(0, openTagEnd);
          var vbscript =
              openTag.match(/(language|type)=.?(text\/)?vbscript/i);
          var content =
              bitt.sanitizeScript
              (script.substr(openTagEnd, script.length - (openTagEnd + 9)),
               vbscript);
          var src = openTag.match(/src\s*=\s*["']?([^\s>'"]+)["']?/i);
          var retval =
              { type : vbscript ? 'vb' : 'js', 
                content : content, 
                valid : true, 
                src : false };
          if (src) {
            var filename = src[1];
            if (filename) {
              retval.src = bitt.decodeHtmlString(filename);
            } else {
              retval.valid = false;
            };
          };
          return retval;
        }, 
    sanitizeScript : function (content, vbscript) {
          content = content.replace(/^\s*<!--.*?\n/, '');
          content = content.replace(/^s*<!\[CDATA\[s*\n/, '');
          content = content.replace(/\s*\/?\/?-->\s*$/, '');
          if (vbscript) {
            content = content.replace(/^s*'.*$/mg, '');
          };
          return content;
        }, 
    elementFiller : function (element) {
          var buffer = '';
          var innerHtml = '';
          return function (str) {
              if (str != '') {
                if (element.innerHTML != innerHtml) {
                  buffer =
                  element.innerHTML.substr
                  (0,
                   element.innerHTML.length
                   - (innerHtml.length - buffer.length));
                };
                buffer += bitt.removeNoscriptParts(str);
                element.innerHTML = buffer;
                innerHtml = element.innerHTML;
              };
            };
        }, 
    removeNoscriptParts : function (string) {
          return string.replace
            (/<noscript[^>]*?>(?:.|\s)*?<\/noscript>/img,
             '<!-- NOSCRIPT removed -->');
        }, 
    fillBitts : function () {
          var listener = window.addEventListener;
          var ieListener = window.attachEvent;
          var iter =
              function (i) {
                if (i == bitt.bitts.length) {
                  {
                    var tmpArr17 = bitt.onLoadHandlers;
                    for (var tmpI18 = 0; tmpI18 < tmpArr17.length;
                         tmpI18 = tmpI18 + 1) {
                      var h = tmpArr17[tmpI18];
                      h(bitt.loadEvent);
                    };
                  };
                  window.addEventListener = listener;
                  window.attachEvent = ieListener;
                  bitt.loadEvent = null;
                  return bitt.finishHook();
                } else {
                  return bitt.fillBitt
                    (bitt.bitts[i],
                     function () {
                       iter(i + 1);
                     });
                };
              };
          if (window.addEventListener) {
            window.addEventListener =
            function (event, handler, useCapture) {
              if (event == 'load') {
                bitt.onLoadHandlers.push(handler);
              } else {
                return listener(event, handler, useCapture);
              };
            };
          };
          if (window.attachEvent) {
            window.attachEvent =
            function (event, handler) {
              if (event == 'onload') {
                bitt.onLoadHandlers.push(handler);
              } else {
                return ieListener(event, handler);
              };
            };
          };
          iter(0);
        }, 
    fillBitt : function (obj, c) {
          var element = document.getElementById(obj.name);
          return bitt.expandHtml
            (bitt.elementFiller(element), obj.content,
             function () {
               if (obj.viewUrl) {
                 var script = document.createElement('SCRIPT');
                 script.type = 'text/javascript';
                 script.src =
                 obj.viewUrl + '?user-name=' + bitt.findUser();
                 element.appendChild(script);
               };
               element.style.display = 'inline';
               c();
             });
        }, 
    onLoad : function (e) {
          bitt.loadEvent = e;
          if (bitt.bitts.length) {
            bitt.appendScript(bitt.bittRequestUrl());
          };
        }, 
    bittRequestUrl : function () {
          var bittArrays = [  ];
          {
            var tmpArr19 = bitt.bitts;
            for (var tmpI20 = 0; tmpI20 < tmpArr19.length;
                 tmpI20 = tmpI20 + 1) {
              var obj = tmpArr19[tmpI20];
              bittArrays.push([ obj.shape, obj.loc ]);
            };
          };
          return (document.location.protocol == 'https:'
              && 'https://server.bittads.com' ?
              'https://server.bittads.com' : 'http://server.bittads.com')
             + '/ad-js.ucw?'
            + bitt.expandUrlVars
            ({ 'keywords' : bitt.toJson(bitt.keywords), 
               'user-name' : bitt.findUser(), 
               'instance' : bitt.instance, 
               'zone' : bitt.zone, 
               'shape-locs' : bitt.toJson(bittArrays), 
               'time-zone' : bitt.timeZone(), 
               'anti-cache' : bitt.now.getTime(), 
               'confirm-view' : 'yes', 
               'height' : window.screen.height, 
               'width' : window.screen.width });
        }, 
    findUser : function () {
          var userValue =
              bitt.getCookie('bitt-' + bitt.instance)
              || bitt.getCookie('bitt-user-name');
          if (userValue == null) {
            {
              var newName = bitt.now.getTime() + bitt.randomString(6);
              bitt.setCookie('bitt-' + bitt.instance, newName);
              bitt.setCookie('bitt-user-name', newName);
            };
            userValue = bitt.getCookie('bitt-' + bitt.instance);
          };
          if (userValue == null) {
            return 'none';
          } else {
            return userValue;
          };
        }, 
    bitt : function (shape, loc) {
          if (loc === undefined) {
            loc = bitt.location;
          };
          var obj =
              { name : bitt.getNextName(), 
                loc : loc, 
                shape : shape };
          document.write('<span id=\'' + obj.name + '\'></span>');
          bitt.bitts.push(obj);
        }, 
    showAdNow : function (shape, loc) {
          document.write
          ('<script type=\'text/javascript\' src="'
           + bitt.escapeAttribute
           ((document.location.protocol == 'https:'
              && 'https://server.bittads.com' ?
              'https://server.bittads.com' :
              'http://server.bittads.com')
             + '/ad-script.ucw?'
            + bitt.expandUrlVars
            ({ 'keywords' : bitt.toJson(bitt.keywords), 
               'user-name' : bitt.findUser(), 
               'instance' : bitt.instance, 
               'zone' : bitt.zone, 
               'shape-locs' : bitt.toJson([ [ shape, loc || bitt.location ] ]), 
               'time-zone' : bitt.timeZone(), 
               'anti-cache' : bitt.now.getTime(), 
               'confirm-view' : 'yes', 
               'height' : window.screen.height, 
               'width' : window.screen.width }))
            + '"></script>');
        }, 
    flashVersion : function () {
          if (bitt.ie) {
            var tmpArr21 = [ 11, 10, 9, 8, 7, 6 ];
            for (var tmpI22 = 0; tmpI22 < tmpArr21.length;
                 tmpI22 = tmpI22 + 1) {
              var version = tmpArr21[tmpI22];
              try {
                new ActiveXObject
                  ('ShockwaveFlash.ShockwaveFlash.' + version);
                return version;
              } catch (e) {
                ;
              };
            };
          } else {
            var plugin = navigator.plugins['Shockwave Flash'];
            var match =
                plugin && plugin.description
                && plugin.description.match(/Flash ([0-9]+)/);
            if (match) {
              return match[1];
            };
          };
          return null;
        }, 
    flashHtml : function (src, attributes, params, variables) {
          if (bitt.ie) {
            return '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" '
              + bitt.expandAttributes(attributes) + '>'
              + '<param name="movie" value="' + bitt.escapeAttribute(src)
              + '">' + '<param name="flashvars" value="'
              + bitt.expandUrlVars(variables) + '">'
              + bitt.expandMap
              (params, '<param name="', '" value="', '">', '',
               bitt.escapeAttribute)
               + '</object>';
          } else {
            return '<embed type="application/x-shockwave-flash" src="'
              + bitt.escapeAttribute(src) + '" '
              + bitt.expandAttributes(attributes) + ' '
              + bitt.expandAttributes(params) + ' ' + 'flashvars="'
              + bitt.expandUrlVars(variables) + '"/>';
          };
        }, 
    writeAd : function (args) {
          var flashVersion = bitt.flashVersion();
          var paramObject = { 'clickURL' : args.clickURL };
          if (args.link) {
            paramObject.clickTag = args.link;
            paramObject.clickTAG = args.link;
          };
          if (args.swf && flashVersion
              && (!args.flashversion || flashVersion >= args.flashversion)) {
            document.write
            (bitt.flashHtml
             (args.swf,
              { width : args.width, 
                height : args.height },
              { wmode : args.wmode || 'opaque', 
                quality : args.quality || 'high', 
                allowScriptAccess : args.allowScriptAccess || 'always', 
                bgcolor : args.background },
              paramObject));
          } else {
            if (args.image) {
              var image =
                  '<img '
                  + bitt.expandAttributes
                  ({ width : args.width, 
                     height : args.height, 
                     border : 0, 
                     src : args.image.match(/http:\/\/admin.bittads.com/)
                           && document.location.protocol == 'https:' ?
                           args.image.replace('http:', 'https:') :
                           args.image, 
                     alt : args.title })
                   + '/>';
              if (args.link) {
                document.write
                ('<a target="' + (bitt.target || '_blank')
                 + '" href="' + bitt.escapeAttribute(args.link)
                 + '">' + image + '</a>');
              } else {
                document.write(image);
              };
            };
          };
        }, 
    decodeHtmlCharref : function (s) {
          var numerical = s.match(/#([xX]?)(.*)/);
          if (numerical) {
            var charCode = numerical[2];
            if (numerical[1] != '') {
              charCode = '0x' + charCode;
            };
            return String.fromCharCode(parseInt(charCode));
          } else {
            return bitt.entities[s] || '&' + s + ';';
          };
        }, 
    decodeHtmlString : function (s) {
          if (typeof s == 'string') {
            return s.replace
              (/&([^\s]*?);/g,
               function (e, c) {
                 return bitt.decodeHtmlCharref(c);
               });
          } else {
            return s;
          };
        }, 
    escapeAttribute : function (s) {
          if (typeof s == 'string') {
            return s.replace('&', '&amp;').replace('"', '&quot;');
          } else {
            return s;
          };
        }, 
    expandMap : function (map, before, between, after, join, escape) {
          var parts = [  ];
          for (var name in map) {
            if (typeof map[name] != 'undefined') {
              parts.push
              (before + name + between + escape(map[name]) + after);
            };
          };
          return parts.join(join);
        }, 
    expandUrlVars : function (map) {
          return bitt.expandMap(map, '', '=', '', '&', encodeURIComponent);
        }, 
    expandAttributes : function (map) {
          return bitt.expandMap(map, '', '="', '"', ' ', bitt.escapeAttribute);
        }, 
    appendScript : function (src, text, type) {
          var tag = document.createElement('script');
          tag.type = type ? type : 'text/javascript';
          if (src) {
            tag.src = src;
          } else {
            tag.innerHTML = text;
          };
          document.body.appendChild(tag);
        }, 
    toJson : function (val) {
          if (typeof val == 'string') {
            return '"' + val.replace(/"/g, '\\"') + '"';
          } else {
            var accum = '[';
            var first = true;
            {
              var tmpArr23 = val;
              for (var tmpI24 = 0; tmpI24 < tmpArr23.length;
                   tmpI24 = tmpI24 + 1) {
                var part = tmpArr23[tmpI24];
                if (first) {
                  first = false;
                } else {
                  accum += ', ';
                };
                accum += bitt.toJson(part);
              };
            };
            return accum + ']';
          };
        }, 
    timeZone : function () {
          var d = new Date;
          return d.getTimezoneOffset() * 60;
        }, 
    extractQuoted : function (str) {
          var firstQuote = str.search(/['"]/);
          if (firstQuote > -1) {
            var part = str.substr(1 + firstQuote);
            var end = part.search(str.charAt(firstQuote));
            if (end > -1) {
              return part.substr(0, end);
            };
          };
          return null;
        }, 
    randomString : function (length) {
          var chars =
              'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVW1234567890';
          var accum = '';
          for (var i = 0; i < length; i = i + 1) {
            accum += chars.charAt(Math.floor(Math.random() * chars.length));
          };
          return accum;
        }, 
    addEvent : function (element, event, fn) {
          if (element.addEventListener) {
            element.addEventListener(event, fn, false);
          } else {
            if (element.attachEvent) {
              element.attachEvent('on' + event, fn);
            };
          };
        }, 
    getNextName : function () {
          ++bitt.nextName;
          return 'bitt-unique-name-' + bitt.nextName;
        }, 
    getCookie : function (name) {
          var cookies = document.cookie.split(';');
          for (var i = 0; i < cookies.length; i = i + 1) {
            var current = cookies[i];
            current = current.split('=');
            if (bitt.trim(current[0]) == name) {
              return current[1];
            };
          };
          return null;
        }, 
    setCookie : function (name, value) {
          var much_later = new Date(2030, 1, 1);
          document.cookie =
          name + '=' + value + '; expires=' + much_later.toGMTString()
          + '; path=/';
        }, 
    trim : function (str) {
          return str.replace(/^\s*|\*s$/g, '');
        } };
  bitt.addEvent(window, 'load', bitt.onLoad);
  bitt.showAdOnLoad = bitt.bitt;
};


/*****/


//-- Google Analytics Urchin Module
//-- Copyright 2007 Google, All Rights Reserved.

//-- Urchin On Demand Settings ONLY
var _uacct="";			// set up the Urchin Account
var _userv=1;			// service mode (0=local,1=remote,2=both)

//-- UTM User Settings
var _ufsc=1;			// set client info flag (1=on|0=off)
var _udn="auto";		// (auto|none|domain) set the domain name for cookies
var _uhash="on";		// (on|off) unique domain hash for cookies
var _utimeout="1800";   	// set the inactive session timeout in seconds
var _ugifpath="/__utm.gif";	// set the web path to the __utm.gif file
var _utsp="|";			// transaction field separator
var _uflash=1;			// set flash version detect option (1=on|0=off)
var _utitle=1;			// set the document title detect option (1=on|0=off)
var _ulink=0;			// enable linker functionality (1=on|0=off)
var _uanchor=0;			// enable use of anchors for campaign (1=on|0=off)
var _utcp="/";			// the cookie path for tracking
var _usample=100;		// The sampling % of visitors to track (1-100).

//-- UTM Campaign Tracking Settings
var _uctm=1;			// set campaign tracking module (1=on|0=off)
var _ucto="15768000";		// set timeout in seconds (6 month default)
var _uccn="utm_campaign";	// name
var _ucmd="utm_medium";		// medium (cpc|cpm|link|email|organic)
var _ucsr="utm_source";		// source
var _uctr="utm_term";		// term/keyword
var _ucct="utm_content";	// content
var _ucid="utm_id";		// id number
var _ucno="utm_nooverride";	// don't override

//-- Auto/Organic Sources and Keywords
var _uOsr=new Array();
var _uOkw=new Array();
_uOsr[0]="google";	_uOkw[0]="q";
_uOsr[1]="yahoo";	_uOkw[1]="p";
_uOsr[2]="msn";		_uOkw[2]="q";
_uOsr[3]="aol";		_uOkw[3]="query";
_uOsr[4]="aol";		_uOkw[4]="encquery";
_uOsr[5]="lycos";	_uOkw[5]="query";
_uOsr[6]="ask";		_uOkw[6]="q";
_uOsr[7]="altavista";	_uOkw[7]="q";
_uOsr[8]="netscape";	_uOkw[8]="query";
_uOsr[9]="cnn";	_uOkw[9]="query";
_uOsr[10]="looksmart";	_uOkw[10]="qt";
_uOsr[11]="about";	_uOkw[11]="terms";
_uOsr[12]="mamma";	_uOkw[12]="query";
_uOsr[13]="alltheweb";	_uOkw[13]="q";
_uOsr[14]="gigablast";	_uOkw[14]="q";
_uOsr[15]="voila";	_uOkw[15]="rdata";
_uOsr[16]="virgilio";	_uOkw[16]="qs";
_uOsr[17]="live";	_uOkw[17]="q";
_uOsr[18]="baidu";	_uOkw[18]="wd";
_uOsr[19]="alice";	_uOkw[19]="qs";
_uOsr[20]="yandex";	_uOkw[20]="text";
_uOsr[21]="najdi";	_uOkw[21]="q";
_uOsr[22]="aol";	_uOkw[22]="q";
_uOsr[23]="club-internet"; _uOkw[23]="query";
_uOsr[24]="mama";	_uOkw[24]="query";
_uOsr[25]="seznam";	_uOkw[25]="q";
_uOsr[26]="search";	_uOkw[26]="q";
_uOsr[27]="wp";	_uOkw[27]="szukaj";
_uOsr[28]="onet";	_uOkw[28]="qt";
_uOsr[29]="netsprint";	_uOkw[29]="q";
_uOsr[30]="google.interia";	_uOkw[30]="q";
_uOsr[31]="szukacz";	_uOkw[31]="q";
_uOsr[32]="yam";	_uOkw[32]="k";
_uOsr[33]="pchome";	_uOkw[33]="q";
_uOsr[34]="kvasir";	_uOkw[34]="searchExpr";
_uOsr[35]="sesam";	_uOkw[35]="q";
_uOsr[36]="ozu"; _uOkw[36]="q";
_uOsr[37]="terra"; _uOkw[37]="query";
_uOsr[38]="nostrum"; _uOkw[38]="query";
_uOsr[39]="mynet"; _uOkw[39]="q";
_uOsr[40]="ekolay"; _uOkw[40]="q";
_uOsr[41]="search.ilse"; _uOkw[41]="search_for";
_uOsr[42]="bing"; _uOkw[42]="q";

//-- Auto/Organic Keywords to Ignore
var _uOno=new Array();
//_uOno[0]="urchin";
//_uOno[1]="urchin.com";
//_uOno[2]="www.urchin.com";

//-- Referral domains to Ignore
var _uRno=new Array();
//_uRno[0]=".urchin.com";

//-- **** Don't modify below this point ***
var _uff,_udh,_udt,_ubl=0,_udo="",_uu,_ufns=0,_uns=0,_ur="-",_ufno=0,_ust=0,_ubd=document,_udl=_ubd.location,_udlh="",_uwv="1.4";
var _ugifpath2="http://www.google-analytics.com/__utm.gif";
if (_udl.hash) _udlh=_udl.href.substring(_udl.href.indexOf('#'));
if (_udl.protocol=="https:") _ugifpath2="https://ssl.google-analytics.com/__utm.gif";
if (!_utcp || _utcp=="") _utcp="/";
function urchinTracker(page) {
 if (_udl.protocol=="file:") return;
 if (_uff && (!page || page=="")) return;
 var a,b,c,xx,v,z,k,x="",s="",f=0,nv=0;
 var nx=" expires="+_uNx()+";";
 var dc=_ubd.cookie;
 _udh=_uDomain();
 if (!_uVG()) return;
 _uu=Math.round(Math.random()*2147483647);
 _udt=new Date();
 _ust=Math.round(_udt.getTime()/1000);
 a=dc.indexOf("__utma="+_udh+".");
 b=dc.indexOf("__utmb="+_udh);
 c=dc.indexOf("__utmc="+_udh);
 if (_udn && _udn!="") { _udo=" domain="+_udn+";"; }
 if (_utimeout && _utimeout!="") {
  x=new Date(_udt.getTime()+(_utimeout*1000));
  x=" expires="+x.toGMTString()+";";
 }
 if (_ulink) {
  if (_uanchor && _udlh && _udlh!="") s=_udlh+"&";
  s+=_udl.search;
  if(s && s!="" && s.indexOf("__utma=")>=0) {
   if (!(_uIN(a=_uGC(s,"__utma=","&")))) a="-";
   if (!(_uIN(b=_uGC(s,"__utmb=","&")))) b="-";
   if (!(_uIN(c=_uGC(s,"__utmc=","&")))) c="-";
   v=_uGC(s,"__utmv=","&");
   z=_uGC(s,"__utmz=","&");
   k=_uGC(s,"__utmk=","&");
   xx=_uGC(s,"__utmx=","&");
   if ((k*1) != ((_uHash(a+b+c+xx+z+v)*1)+(_udh*1))) {_ubl=1;a="-";b="-";c="-";xx="-";z="-";v="-";}
   if (a!="-" && b!="-" && c!="-") f=1;
   else if(a!="-") f=2;
  }
 }
 if(f==1) {
  _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
  _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo;
  _ubd.cookie="__utmc="+c+"; path="+_utcp+";"+_udo;
 } else if (f==2) {
  a=_uFixA(s,"&",_ust);
  _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
  _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo;
  _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo;
  _ufns=1;
 } else if (a>=0 && b>=0 && c>=0) {
   b = _uGC(dc,"__utmb="+_udh,";");
   b = ("-" == b) ? _udh : b;  
  _ubd.cookie="__utmb="+b+"; path="+_utcp+";"+x+_udo;
 } else {
  if (a>=0) a=_uFixA(_ubd.cookie,";",_ust);
  else {
   a=_udh+"."+_uu+"."+_ust+"."+_ust+"."+_ust+".1";
   nv=1;
  }
  _ubd.cookie="__utma="+a+"; path="+_utcp+";"+nx+_udo;
  _ubd.cookie="__utmb="+_udh+"; path="+_utcp+";"+x+_udo;
  _ubd.cookie="__utmc="+_udh+"; path="+_utcp+";"+_udo;
  _ufns=1;
 }
 if (_ulink && xx && xx!="" && xx!="-") {
   xx=_uUES(xx);
   if (xx.indexOf(";")==-1) _ubd.cookie="__utmx="+xx+"; path="+_utcp+";"+nx+_udo;
 }
 if (_ulink && v && v!="" && v!="-") {
  v=_uUES(v);
  if (v.indexOf(";")==-1) _ubd.cookie="__utmv="+v+"; path="+_utcp+";"+nx+_udo;
 }
 var wc=window;
 var c=_ubd.cookie;
 if(wc && wc.gaGlobal && wc.gaGlobal.dh==_udh){
  var g=wc.gaGlobal;
  var ua=c.split("__utma="+_udh+".")[1].split(";")[0].split(".");
  if(g.sid)ua[3]=g.sid;
  if(nv>0){
   ua[2]=ua[3];
   if(g.vid){
    var v=g.vid.split(".");
    ua[0]=v[0];
    ua[1]=v[1];
   }
  }
  _ubd.cookie="__utma="+_udh+"."+ua.join(".")+"; path="+_utcp+";"+nx+_udo;
 }
 _uInfo(page);
 _ufns=0;
 _ufno=0;
 if (!page || page=="") _uff=1;
}
function _uGH() {
 var hid;
 var wc=window;
 if (wc && wc.gaGlobal && wc.gaGlobal.hid) {
  hid=wc.gaGlobal.hid;
 } else {
  hid=Math.round(Math.random()*0x7fffffff);
  if (!wc.gaGlobal) wc.gaGlobal={};
  wc.gaGlobal.hid=hid;
 }
 return hid;
}
function _uInfo(page) {
 var p,s="",dm="",pg=_udl.pathname+_udl.search;
 if (page && page!="") pg=_uES(page,1);
 _ur=_ubd.referrer;
 if (!_ur || _ur=="") { _ur="-"; }
 else {
  dm=_ubd.domain;
  if(_utcp && _utcp!="/") dm+=_utcp;
  p=_ur.indexOf(dm);
  if ((p>=0) && (p<=8)) { _ur="0"; }
  if (_ur.indexOf("[")==0 && _ur.lastIndexOf("]")==(_ur.length-1)) { _ur="-"; }
 }
 s+="&utmn="+_uu;
 if (_ufsc) s+=_uBInfo();
 if (_uctm) s+=_uCInfo();
 if (_utitle && _ubd.title && _ubd.title!="") s+="&utmdt="+_uES(_ubd.title);
 if (_udl.hostname && _udl.hostname!="") s+="&utmhn="+_uES(_udl.hostname);
 if (_usample && _usample != 100) s+="&utmsp="+_uES(_usample);
 s+="&utmhid="+_uGH();
 s+="&utmr="+_ur;
 s+="&utmp="+pg;
 if ((_userv==0 || _userv==2) && _uSP()) {
  var i=new Image(1,1);
  i.src=_ugifpath+"?"+"utmwv="+_uwv+s;
  i.onload=function() { _uVoid(); }
 }
 if ((_userv==1 || _userv==2) && _uSP()) {
  var i2=new Image(1,1);
  i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS();
  i2.onload=function() { _uVoid(); }
 }
 return;
}
function _uVoid() { return; }
function _uCInfo() {
 if (!_ucto || _ucto=="") { _ucto="15768000"; }
 if (!_uVG()) return;
 var c="",t="-",t2="-",t3="-",o=0,cs=0,cn=0,i=0,z="-",s="";
 if (_uanchor && _udlh && _udlh!="") s=_udlh+"&";
 s+=_udl.search;
 var x=new Date(_udt.getTime()+(_ucto*1000));
 var dc=_ubd.cookie;
 x=" expires="+x.toGMTString()+";";
 if (_ulink && !_ubl) {
  z=_uUES(_uGC(s,"__utmz=","&"));
  if (z!="-" && z.indexOf(";")==-1) { _ubd.cookie="__utmz="+z+"; path="+_utcp+";"+x+_udo; return ""; }
 }
 z=dc.indexOf("__utmz="+_udh+".");
 if (z>-1) { z=_uGC(dc,"__utmz="+_udh+".",";"); }
 else { z="-"; }
 t=_uGC(s,_ucid+"=","&");
 t2=_uGC(s,_ucsr+"=","&");
 t3=_uGC(s,"gclid=","&");
 if ((t!="-" && t!="") || (t2!="-" && t2!="") || (t3!="-" && t3!="")) {
  if (t!="-" && t!="") c+="utmcid="+_uEC(t);
  if (t2!="-" && t2!="") { if (c != "") c+="|"; c+="utmcsr="+_uEC(t2); }
  if (t3!="-" && t3!="") { if (c != "") c+="|"; c+="utmgclid="+_uEC(t3); }
  t=_uGC(s,_uccn+"=","&");
  if (t!="-" && t!="") c+="|utmccn="+_uEC(t);
  else c+="|utmccn=(not+set)";
  t=_uGC(s,_ucmd+"=","&");
  if (t!="-" && t!="") c+="|utmcmd="+_uEC(t);
  else  c+="|utmcmd=(not+set)";
  t=_uGC(s,_uctr+"=","&");
  if (t!="-" && t!="") c+="|utmctr="+_uEC(t);
  else { t=_uOrg(1); if (t!="-" && t!="") c+="|utmctr="+_uEC(t); }
  t=_uGC(s,_ucct+"=","&");
  if (t!="-" && t!="") c+="|utmcct="+_uEC(t);
  t=_uGC(s,_ucno+"=","&");
  if (t=="1") o=1;
  if (z!="-" && o==1) return "";
 }
 if (c=="-" || c=="") { c=_uOrg(); if (z!="-" && _ufno==1)  return ""; }
 if (c=="-" || c=="") { if (_ufns==1)  c=_uRef(); if (z!="-" && _ufno==1)  return ""; }
 if (c=="-" || c=="") {
  if (z=="-" && _ufns==1) { c="utmccn=(direct)|utmcsr=(direct)|utmcmd=(none)"; }
  if (c=="-" || c=="") return "";
 }
 if (z!="-") {
  i=z.indexOf(".");
  if (i>-1) i=z.indexOf(".",i+1);
  if (i>-1) i=z.indexOf(".",i+1);
  if (i>-1) i=z.indexOf(".",i+1);
  t=z.substring(i+1,z.length);
  if (t.toLowerCase()==c.toLowerCase()) cs=1;
  t=z.substring(0,i);
  if ((i=t.lastIndexOf(".")) > -1) {
   t=t.substring(i+1,t.length);
   cn=(t*1);
  }
 }
 if (cs==0 || _ufns==1) {
  t=_uGC(dc,"__utma="+_udh+".",";");
  if ((i=t.lastIndexOf(".")) > 9) {
   _uns=t.substring(i+1,t.length);
   _uns=(_uns*1);
  }
  cn++;
  if (_uns==0) _uns=1;
  _ubd.cookie="__utmz="+_udh+"."+_ust+"."+_uns+"."+cn+"."+c+"; path="+_utcp+"; "+x+_udo;
 }
 if (cs==0 || _ufns==1) return "&utmcn=1";
 else return "&utmcr=1";
}
function _uRef() {
 if (_ur=="0" || _ur=="" || _ur=="-") return "";
 var i=0,h,k,n;
 if ((i=_ur.indexOf("://"))<0 || _uGCse()) return "";
 h=_ur.substring(i+3,_ur.length);
 if (h.indexOf("/") > -1) {
  k=h.substring(h.indexOf("/"),h.length);
  if (k.indexOf("?") > -1) k=k.substring(0,k.indexOf("?"));
  h=h.substring(0,h.indexOf("/"));
 }
 h=h.toLowerCase();
 n=h;
 if ((i=n.indexOf(":")) > -1) n=n.substring(0,i);
 for (var ii=0;ii<_uRno.length;ii++) {
  if ((i=n.indexOf(_uRno[ii].toLowerCase())) > -1 && n.length==(i+_uRno[ii].length)) { _ufno=1; break; }
 }
 if (h.indexOf("www.")==0) h=h.substring(4,h.length);
 return "utmccn=(referral)|utmcsr="+_uEC(h)+"|"+"utmcct="+_uEC(k)+"|utmcmd=referral";
}
function _uOrg(t) {
 if (_ur=="0" || _ur=="" || _ur=="-") return "";
 var i=0,h,k;
 if ((i=_ur.indexOf("://"))<0 || _uGCse()) return "";
 h=_ur.substring(i+3,_ur.length);
 if (h.indexOf("/") > -1) {
  h=h.substring(0,h.indexOf("/"));
 }
 for (var ii=0;ii<_uOsr.length;ii++) {
  if (h.toLowerCase().indexOf(_uOsr[ii].toLowerCase()) > -1) {
   if ((i=_ur.indexOf("?"+_uOkw[ii]+"=")) > -1 || (i=_ur.indexOf("&"+_uOkw[ii]+"=")) > -1) {
    k=_ur.substring(i+_uOkw[ii].length+2,_ur.length);
    if ((i=k.indexOf("&")) > -1) k=k.substring(0,i);
    for (var yy=0;yy<_uOno.length;yy++) {
     if (_uOno[yy].toLowerCase()==k.toLowerCase()) { _ufno=1; break; }
    }
    if (t) return _uEC(k);
    else return "utmccn=(organic)|utmcsr="+_uEC(_uOsr[ii])+"|"+"utmctr="+_uEC(k)+"|utmcmd=organic";
   }
  }
 }
 return "";
}
function _uGCse() {
 var h,p;
 h=p=_ur.split("://")[1];
 if(h.indexOf("/")>-1) {
  h=h.split("/")[0];
  p=p.substring(p.indexOf("/")+1,p.length);
 }
 if(p.indexOf("?")>-1) {
  p=p.split("?")[0];
 }
 if(h.toLowerCase().indexOf("google")>-1) {
  if(_ur.indexOf("?q=")>-1 || _ur.indexOf("&q=")>-1) {
   if (p.toLowerCase().indexOf("cse")>-1) {
    return true;
   }
  }
 }
}
function _uBInfo() {
 var sr="-",sc="-",ul="-",fl="-",cs="-",je=1;
 var n=navigator;
 if (self.screen) {
  sr=screen.width+"x"+screen.height;
  sc=screen.colorDepth+"-bit";
 } else if (self.java) {
  var j=java.awt.Toolkit.getDefaultToolkit();
  var s=j.getScreenSize();
  sr=s.width+"x"+s.height;
 }
 if (n.language) { ul=n.language.toLowerCase(); }
 else if (n.browserLanguage) { ul=n.browserLanguage.toLowerCase(); }
 je=n.javaEnabled()?1:0;
 if (_uflash) fl=_uFlash();
 if (_ubd.characterSet) cs=_uES(_ubd.characterSet);
 else if (_ubd.charset) cs=_uES(_ubd.charset);
 return "&utmcs="+cs+"&utmsr="+sr+"&utmsc="+sc+"&utmul="+ul+"&utmje="+je+"&utmfl="+fl;
}
function __utmSetTrans() {
 var e;
 if (_ubd.getElementById) e=_ubd.getElementById("utmtrans");
 else if (_ubd.utmform && _ubd.utmform.utmtrans) e=_ubd.utmform.utmtrans;
 if (!e) return;
 var l=e.value.split("UTM:");
 var i,i2,c;
 if (_userv==0 || _userv==2) i=new Array();
 if (_userv==1 || _userv==2) { i2=new Array(); c=_uGCS(); }

 for (var ii=0;ii<l.length;ii++) {
  l[ii]=_uTrim(l[ii]);
  if (l[ii].charAt(0)!='T' && l[ii].charAt(0)!='I') continue;
  var r=Math.round(Math.random()*2147483647);
  if (!_utsp || _utsp=="") _utsp="|";
  var f=l[ii].split(_utsp),s="";
  if (f[0].charAt(0)=='T') {
   s="&utmt=tran"+"&utmn="+r;
   f[1]=_uTrim(f[1]); if(f[1]&&f[1]!="") s+="&utmtid="+_uES(f[1]);
   f[2]=_uTrim(f[2]); if(f[2]&&f[2]!="") s+="&utmtst="+_uES(f[2]);
   f[3]=_uTrim(f[3]); if(f[3]&&f[3]!="") s+="&utmtto="+_uES(f[3]);
   f[4]=_uTrim(f[4]); if(f[4]&&f[4]!="") s+="&utmttx="+_uES(f[4]);
   f[5]=_uTrim(f[5]); if(f[5]&&f[5]!="") s+="&utmtsp="+_uES(f[5]);
   f[6]=_uTrim(f[6]); if(f[6]&&f[6]!="") s+="&utmtci="+_uES(f[6]);
   f[7]=_uTrim(f[7]); if(f[7]&&f[7]!="") s+="&utmtrg="+_uES(f[7]);
   f[8]=_uTrim(f[8]); if(f[8]&&f[8]!="") s+="&utmtco="+_uES(f[8]);
  } else {
   s="&utmt=item"+"&utmn="+r;
   f[1]=_uTrim(f[1]); if(f[1]&&f[1]!="") s+="&utmtid="+_uES(f[1]);
   f[2]=_uTrim(f[2]); if(f[2]&&f[2]!="") s+="&utmipc="+_uES(f[2]);
   f[3]=_uTrim(f[3]); if(f[3]&&f[3]!="") s+="&utmipn="+_uES(f[3]);
   f[4]=_uTrim(f[4]); if(f[4]&&f[4]!="") s+="&utmiva="+_uES(f[4]);
   f[5]=_uTrim(f[5]); if(f[5]&&f[5]!="") s+="&utmipr="+_uES(f[5]);
   f[6]=_uTrim(f[6]); if(f[6]&&f[6]!="") s+="&utmiqt="+_uES(f[6]);
  }
  if (_udl.hostname && _udl.hostname!="") s+="&utmhn="+_uES(_udl.hostname);
  if (_usample && _usample != 100) s+="&utmsp="+_uES(_usample);

  if ((_userv==0 || _userv==2) && _uSP()) {
   i[ii]=new Image(1,1);
   i[ii].src=_ugifpath+"?"+"utmwv="+_uwv+s;
   i[ii].onload=function() { _uVoid(); }
  }
  if ((_userv==1 || _userv==2) && _uSP()) {
   i2[ii]=new Image(1,1);
   i2[ii].src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+c;
   i2[ii].onload=function() { _uVoid(); }
  }
 }
 return;
}
function _uFlash() {
 var f="-",n=navigator;
 if (n.plugins && n.plugins.length) {
  for (var ii=0;ii<n.plugins.length;ii++) {
   if (n.plugins[ii].name.indexOf('Shockwave Flash')!=-1) {
    f=n.plugins[ii].description.split('Shockwave Flash ')[1];
    break;
   }
  }
 } else {
  var fl;
  try {
   fl = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
   f = fl.GetVariable("$version");
  } catch(e) {}
  if (f == "-") {
   try {
    fl = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");
    f = "WIN 6,0,21,0";
    fl.AllowScriptAccess = "always";
    f = fl.GetVariable("$version");
   } catch(e) {}
  }
  if (f == "-") {
   try {
    fl = new ActiveXObject("ShockwaveFlash.ShockwaveFlash");
    f = fl.GetVariable("$version");
   } catch(e) {}
  }
  if (f != "-") {
   f = f.split(" ")[1].split(",");
   f = f[0] + "." + f[1] + " r" + f[2];
  }
 }
 return f;
}
function __utmLinkerUrl(l,h) {
 var p,k,a="-",b="-",c="-",x="-",z="-",v="-";
 var dc=_ubd.cookie;
 var iq = l.indexOf("?");
 var ih = l.indexOf("#");
 var url=l;
 if (dc) {
  a=_uES(_uGC(dc,"__utma="+_udh+".",";"));
  b=_uES(_uGC(dc,"__utmb="+_udh,";"));
  c=_uES(_uGC(dc,"__utmc="+_udh,";"));
  x=_uES(_uGC(dc,"__utmx="+_udh,";"));
  z=_uES(_uGC(dc,"__utmz="+_udh+".",";"));
  v=_uES(_uGC(dc,"__utmv="+_udh+".",";"));
  k=(_uHash(a+b+c+x+z+v)*1)+(_udh*1);
  p="__utma="+a+"&__utmb="+b+"&__utmc="+c+"&__utmx="+x+"&__utmz="+z+"&__utmv="+v+"&__utmk="+k;
 }
 if (p) {
  if (h && ih>-1) return;
  if (h) { url=l+"#"+p; }
  else {
   if (iq==-1 && ih==-1) url=l+"?"+p;
   else if (ih==-1) url=l+"&"+p;
   else if (iq==-1) url=l.substring(0,ih-1)+"?"+p+l.substring(ih);
   else url=l.substring(0,ih-1)+"&"+p+l.substring(ih);
  }
 }
 return url;
}
function __utmLinker(l,h) {
 if (!_ulink || !l || l=="") return;
 _udl.href=__utmLinkerUrl(l,h);
}
function __utmLinkPost(f,h) {
 if (!_ulink || !f || !f.action) return;
 f.action=__utmLinkerUrl(f.action, h);
 return;
}
function __utmSetVar(v) {
 if (!v || v=="") return;
 if (!_udo || _udo == "") {
  _udh=_uDomain();
  if (_udn && _udn!="") { _udo=" domain="+_udn+";"; }
 }
 if (!_uVG()) return;
 var r=Math.round(Math.random() * 2147483647);
 _ubd.cookie="__utmv="+_udh+"."+_uES(v)+"; path="+_utcp+"; expires="+_uNx()+";"+_udo;
 var s="&utmt=var&utmn="+r;
 if (_usample && _usample != 100) s+="&utmsp="+_uES(_usample);
 if ((_userv==0 || _userv==2) && _uSP()) {
  var i=new Image(1,1);
  i.src=_ugifpath+"?"+"utmwv="+_uwv+s;
  i.onload=function() { _uVoid(); }
 }
 if ((_userv==1 || _userv==2) && _uSP()) {
  var i2=new Image(1,1);
  i2.src=_ugifpath2+"?"+"utmwv="+_uwv+s+"&utmac="+_uacct+"&utmcc="+_uGCS();
  i2.onload=function() { _uVoid(); }
 }
}
function _uGCS() {
 var t,c="",dc=_ubd.cookie;
 if ((t=_uGC(dc,"__utma="+_udh+".",";"))!="-") c+=_uES("__utma="+t+";+");
 if ((t=_uGC(dc,"__utmx="+_udh,";"))!="-") c+=_uES("__utmx="+t+";+");
 if ((t=_uGC(dc,"__utmz="+_udh+".",";"))!="-") c+=_uES("__utmz="+t+";+");
 if ((t=_uGC(dc,"__utmv="+_udh+".",";"))!="-") c+=_uES("__utmv="+t+";");
 if (c.charAt(c.length-1)=="+") c=c.substring(0,c.length-1);
 return c;
}
function _uGC(l,n,s) {
 if (!l || l=="" || !n || n=="" || !s || s=="") return "-";
 var i,i2,i3,c="-";
 i=l.indexOf(n);
 i3=n.indexOf("=")+1;
 if (i > -1) {
  i2=l.indexOf(s,i); if (i2 < 0) { i2=l.length; }
  c=l.substring((i+i3),i2);
 }
 return c;
}
function _uDomain() {
 if (!_udn || _udn=="" || _udn=="none") { _udn=""; return 1; }
 if (_udn=="auto") {
  var d=_ubd.domain;
  if (d.substring(0,4)=="www.") {
   d=d.substring(4,d.length);
  }
  _udn=d;
 }
 _udn = _udn.toLowerCase(); 
 if (_uhash=="off") return 1;
 return _uHash(_udn);
}
function _uHash(d) {
 if (!d || d=="") return 1;
 var h=0,g=0;
 for (var i=d.length-1;i>=0;i--) {
  var c=parseInt(d.charCodeAt(i));
  h=((h << 6) & 0xfffffff) + c + (c << 14);
  if ((g=h & 0xfe00000)!=0) h=(h ^ (g >> 21));
 }
 return h;
}
function _uFixA(c,s,t) {
 if (!c || c=="" || !s || s=="" || !t || t=="") return "-";
 var a=_uGC(c,"__utma="+_udh+".",s);
 var lt=0,i=0;
 if ((i=a.lastIndexOf(".")) > 9) {
  _uns=a.substring(i+1,a.length);
  _uns=(_uns*1)+1;
  a=a.substring(0,i);
  if ((i=a.lastIndexOf(".")) > 7) {
   lt=a.substring(i+1,a.length);
   a=a.substring(0,i);
  }
  if ((i=a.lastIndexOf(".")) > 5) {
   a=a.substring(0,i);
  }
  a+="."+lt+"."+t+"."+_uns;
 }
 return a;
}
function _uTrim(s) {
  if (!s || s=="") return "";
  while ((s.charAt(0)==' ') || (s.charAt(0)=='\n') || (s.charAt(0,1)=='\r')) s=s.substring(1,s.length);
  while ((s.charAt(s.length-1)==' ') || (s.charAt(s.length-1)=='\n') || (s.charAt(s.length-1)=='\r')) s=s.substring(0,s.length-1);
  return s;
}
function _uEC(s) {
  var n="";
  if (!s || s=="") return "";
  for (var i=0;i<s.length;i++) {if (s.charAt(i)==" ") n+="+"; else n+=s.charAt(i);}
  return n;
}
function __utmVisitorCode(f) {
 var r=0,t=0,i=0,i2=0,m=31;
 var a=_uGC(_ubd.cookie,"__utma="+_udh+".",";");
 if ((i=a.indexOf(".",0))<0) return;
 if ((i2=a.indexOf(".",i+1))>0) r=a.substring(i+1,i2); else return "";  
 if ((i=a.indexOf(".",i2+1))>0) t=a.substring(i2+1,i); else return "";  
 if (f) {
  return r;
 } else {
  var c=new Array('A','B','C','D','E','F','G','H','J','K','L','M','N','P','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9');
  return c[r>>28&m]+c[r>>23&m]+c[r>>18&m]+c[r>>13&m]+"-"+c[r>>8&m]+c[r>>3&m]+c[((r&7)<<2)+(t>>30&3)]+c[t>>25&m]+c[t>>20&m]+"-"+c[t>>15&m]+c[t>>10&m]+c[t>>5&m]+c[t&m];
 }
}
function _uIN(n) {
 if (!n) return false;
 for (var i=0;i<n.length;i++) {
  var c=n.charAt(i);
  if ((c<"0" || c>"9") && (c!=".")) return false;
 }
 return true;
}
function _uES(s,u) {
 if (typeof(encodeURIComponent) == 'function') {
  if (u) return encodeURI(s);
  else return encodeURIComponent(s);
 } else {
  return escape(s);
 }
}
function _uUES(s) {
 if (typeof(decodeURIComponent) == 'function') {
  return decodeURIComponent(s);
 } else {
  return unescape(s);
 }
}
function _uVG() {
 if((_udn.indexOf("www.google.") == 0 || _udn.indexOf(".google.") == 0 || _udn.indexOf("google.") == 0) && _utcp=='/' && _udn.indexOf("google.org")==-1) {
  return false;
 }
 return true;
}
function _uSP() {
 var s=100;
 if (_usample) s=_usample;
 if(s>=100 || s<=0) return true;
 return ((__utmVisitorCode(1)%10000)<(s*100));
}
function urchinPathCopy(p){
 var d=document,nx,tx,sx,i,c,cs,t,h,o;
 cs=new Array("a","b","c","v","x","z");
 h=_uDomain(); if (_udn && _udn!="") o=" domain="+_udn+";";
 nx=_uNx()+";";
 tx=new Date(); tx.setTime(tx.getTime()+(_utimeout*1000));
 tx=tx.toGMTString()+";";
 sx=new Date(); sx.setTime(sx.getTime()+(_ucto*1000));
 sx=sx.toGMTString()+";";
 for (i=0;i<6;i++){
  t=" expires=";
  if (i==1) t+=tx; else if (i==2) t=""; else if (i==5) t+=sx; else t+=nx;
  c=_uGC(d.cookie,"__utm"+cs[i]+"="+h,";");
  if (c!="-") d.cookie="__utm"+cs[i]+"="+c+"; path="+p+";"+t+o;
 }
}
function _uCO() {
 if (!_utk || _utk=="" || _utk.length<10) return;
 var d='www.google.com';
 if (_utk.charAt(0)=='!') d='analytics.corp.google.com';
 _ubd.cookie="GASO="+_utk+"; path="+_utcp+";"+_udo;
 var sc=document.createElement('script');
 sc.type='text/javascript';
 sc.id="_gasojs";
 sc.src='https://'+d+'/analytics/reporting/overlay_js?gaso='+_utk+'&'+Math.random();
 document.getElementsByTagName('head')[0].appendChild(sc);  
}
function _uGT() {
 var h=location.hash, a;
 if (h && h!="" && h.indexOf("#gaso=")==0) {
  a=_uGC(h,"gaso=","&");
 } else {
  a=_uGC(_ubd.cookie,"GASO=",";");
 }
 return a;
}
var _utk=_uGT();
if (_utk && _utk!="" && _utk.length>10 && _utk.indexOf("=")==-1) {
 if (window.addEventListener) {
  window.addEventListener('load', _uCO, false); 
 } else if (window.attachEvent) { 
  window.attachEvent('onload', _uCO);
 }
}

function _uNx() {
  return (new Date((new Date()).getTime()+63072000000)).toGMTString();
}


/*****/


clickHeatSite = 'lesfrontaliers.lu';
clickHeatGroup = 'home_page';
clickHeatServer = 'http://clickheat.lampadaire.net/click.php';
initClickHeat();

/**
ClickHeat : Suivi et analyse des clics / Tracking and clicks analysis

@author Yvan Taviaud - LabsMedia - www.labsmedia.com/clickheat/
@since 27/10/2006
@update 01/03/2007 - Yvan : correctif Firefox (Károly Marton)
@update 23/03/2007 - Yvan : protection de 2 secondes entre chaque clic, et X clics maximum par page
@update 18/05/2007 - Yvan : suppression de clickHeatPage, ajout de clickHeatGroup et clickHeatSite
@update 27/08/2007 - Yvan : changement du système de débug
@update 28/09/2007 - Yvan : ajout de quelques messages de débug
@update 16/03/2008 - Yvan : utilisation des Listeners - ajout d'un délai pour enregistrer le clic correctement - correctif JSLint
@update 05/07/2010 - Yvan : ajout de Chrome, ajout du test non-Ajax pour libérer le clic plus rapidement
@update 13/08/2010 - Yvan : gestion de IE 8 qui posait des soucis sur l'event

Tested under :
Windows 2000 - IE 6.0
Linux - Firefox 2.0.0.1, Konqueror 3.5.5, IE 7
*/

/*global window: true*/

/** Event listener */
function addEvtListener(obj, evtName, f)
{
	/** FF */
	if (document.addEventListener)
	{
		if (obj)
		{
			obj.addEventListener(evtName, f, false);
		}
		else
		{
			addEventListener(evtName, f, false);
		}
	}
	/** IE */
	else if (attachEvent)
	{
		if (obj)
		{
			obj.attachEvent('on' + evtName, f);
		}
		else
		{
			attachEvent('on' + evtName, f);
		}
	}
}

/** Main variables */
var clickHeatGroup = '',
clickHeatSite = '',
clickHeatServer = '',
clickHeatLastIframe = -1,
clickHeatTime = 0,
clickHeatQuota = -1,
clickHeatBrowser = '',
clickHeatDocument = '',
clickHeatWait = 500,
clickHeatLocalWait = 0,
clickHeatDebug = (document.location.href.indexOf('debugclickheat') !== -1);

/**
* Shows a debug string
**/
function showClickHeatDebug(str)
{
	if (clickHeatDebug === true)
	{
		document.getElementById('clickHeatDebuggerSpan').innerHTML = str;
		document.getElementById('clickHeatDebuggerDiv').style.display = 'block';
	}
}

/** Main function */
function catchClickHeat(e)
{
	var c,
	element,
	x, y,
	w, h,
	scrollx, scrolly,
	clickTime,
	now,
	clickHeatImg,
	params,
	sent		= false,
	xmlhttp		= false;
	/** Use a try{} to avoid showing errors to users */
	try
	{
		showClickHeatDebug('Gathering click data...');
		if (clickHeatQuota === 0)
		{
			showClickHeatDebug('Click not logged: quota reached');
			return true;
		}
		if (clickHeatGroup === '')
		{
			showClickHeatDebug('Click not logged: group name empty (clickHeatGroup)');
			return true;
		}
		/** Look for the real event */
		if (!e)
		{
			e = window.event;
		}
		c = e.which || e.button;
		element = e.srcElement || null;
		if (c === 0)
		{
			showClickHeatDebug('Click not logged: no button pressed');
			return true;
		}
		/** Filter for same iframe (focus on iframe => popup ad => close ad => new focus on same iframe) */
		if (element !== null && element.tagName.toLowerCase() === 'iframe')
		{
			if (element.sourceIndex === clickHeatLastIframe)
			{
				showClickHeatDebug('Click not logged: same iframe (a click on iframe opens a popup and popup is closed => iframe gets the focus again)');
				return true;
			}
			clickHeatLastIframe = element.sourceIndex;
		}
		else
		{
			clickHeatLastIframe = -1;
		}
		x = e.clientX;
		y = e.clientY;
		w = clickHeatDocument.clientWidth || window.innerWidth;
		h = clickHeatDocument.clientHeight || window.innerHeight;
		scrollx = window.pageXOffset || clickHeatDocument.scrollLeft;
		scrolly = window.pageYOffset || clickHeatDocument.scrollTop;
		/** Is the click in the viewing area? Not on scrollbars. The problem still exists for FF on the horizontal scrollbar */
		if (x > w || y > h)
		{
			showClickHeatDebug('Click not logged: out of document (should be a click on scrollbars)');
			return true;
		}
		/** Check if last click was at least 1 second ago */
		clickTime = new Date();
		if (clickTime.getTime() - clickHeatTime < 1000)
		{
			showClickHeatDebug('Click not logged: at least 1 second between clicks');
			return true;
		}
		clickHeatTime = clickTime.getTime();
		if (clickHeatQuota > 0)
		{
			clickHeatQuota = clickHeatQuota - 1;
		}
		params = 's=' + clickHeatSite + '&g=' + clickHeatGroup + '&x=' + (x + scrollx) + '&y=' + (y + scrolly) + '&w=' + w + '&b=' + clickHeatBrowser + '&c=' + c + '&random=' + Date();
		showClickHeatDebug('Ready to send click data...');
		/** Local request (not starting with "http")? Try an ajax call */
		if (clickHeatServer.indexOf('http') !== 0)
		{
			try
			{
				xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
			}
			catch (er)
			{
				try
				{
					xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
				}
				catch (oc)
				{
					xmlhttp = null;
				}
			}
			if (!xmlhttp && typeof(XMLHttpRequest) !== 'undefined')
			{
				xmlhttp = new XMLHttpRequest();
			}
			if (xmlhttp)
			{
				if (clickHeatDebug === true)
				{
					xmlhttp.onreadystatechange = function ()
					{
						if (xmlhttp.readyState === 4)
						{
							if (xmlhttp.status === 200)
							{
								showClickHeatDebug('Click recorded at ' + clickHeatServer + ' with the following parameters:<br/>x = ' + (x + scrollx) + ' (' + x + 'px from left + ' + scrollx + 'px of horizontal scrolling)<br/>y = ' + (y + scrolly) + ' (' + y + 'px from top + ' + scrolly + 'px of vertical scrolling)<br/>width = ' + w + '<br/>browser = ' + clickHeatBrowser + '<br/>click = ' + c + '<br/>site = ' + clickHeatSite + '<br/>group = ' + clickHeatGroup + '<br/><br/>Server answer: ' + xmlhttp.responseText);
							}
							else if (xmlhttp.status === 404)
							{
								showClickHeatDebug('click.php was not found at: ' + (clickHeatServer !== '' ? clickHeatServer : '/clickheat/click.php') + ' please set clickHeatServer value');
							}
							else
							{
								showClickHeatDebug('click.php returned a status code ' + xmlhttp.status + ' with the following error: ' + xmlhttp.responseText);
							}
							/** Stop waiting */
							clickHeatLocalWait = 0;
						}
					};
				}
				xmlhttp.open('GET', clickHeatServer + '?' + params, true);
				xmlhttp.setRequestHeader('Connection', 'close');
				xmlhttp.send(null);
				sent = true;
			}
		}
		if (sent === false)
		{
			/** This test is needed, as it includes the call to click.php in the iframe */
			if (clickHeatDebug === true)
			{
				showClickHeatDebug('Click recorded at ' + clickHeatServer + ' with the following parameters:<br/>x = ' + (x + scrollx) + ' (' + x + 'px from left + ' + scrollx + 'px of horizontal scrolling)<br/>y = ' + (y + scrolly) + ' (' + y + 'px from top + ' + scrolly + 'px of vertical scrolling)<br/>width = ' + w + '<br/>browser = ' + clickHeatBrowser + '<br/>click = ' + c + '<br/>site = ' + clickHeatSite + '<br/>group = ' + clickHeatGroup + '<br/><br/>Server answer:<br/>' + '<iframe src="' + clickHeatServer + '?' + params + '" width="700" height="60"></iframe>');
			}
			else
			{
				clickHeatImg = new Image();
				clickHeatImg.src = clickHeatServer + '?' + params;
				//			clickHeatImg.onload = function() { clickHeatLocalWait = 0; }
			}
		}
		/** Little waiting cycle: default is to wait until Ajax sent or until the end of the time if no Ajax is available */
		now = new Date();
		clickHeatLocalWait = now.getTime() + clickHeatWait;
		while (clickHeatLocalWait > now.getTime())
		{
			now = new Date();
		}
	}
	catch (err)
	{
		showClickHeatDebug('An error occurred while processing click (Javascript error): ' + err.message);
	}
	return true;
}

function initClickHeat()
{
	var i,
	iFrames,
	b,
	browsers,
	domain,
	div;
	/** Debug Window */
	if (clickHeatDebug === true)
	{
		div = document.createElement('div');
		div.id = 'clickHeatDebuggerDiv';
		div.style.padding = '5px';
		div.style.display = 'none';
		div.style.position = 'absolute';
		div.style.top = '200px';
		div.style.left = '200px';
		div.style.border = '1px solid #888';
		div.style.backgroundColor = '#eee';
		div.style.zIndex = 99;
		div.innerHTML = '<strong>ClickHeat debug: <a href="#" onmouseover="document.getElementById(\'clickHeatDebuggerDiv\').style.display = \'none\'; return false">Rollover to close</a></strong><br/><br/><span id="clickHeatDebuggerSpan"></span>';
		document.body.appendChild(div);
	}

	if (clickHeatGroup === '' || clickHeatServer === '')
	{
		showClickHeatDebug('ClickHeat NOT initialised: either clickHeatGroup or clickHeatServer is empty');
		return false;
	}

	/** If current website has the same domain as the script, we remove the domain so that the call is made using Ajax */
	domain = document.location.protocol + '//' + document.location.host;
	if (clickHeatServer.indexOf(domain) === 0)
	{
		clickHeatServer = clickHeatServer.substring(domain.length, clickHeatServer.length);
	}
	/** Add onmousedown event using listeners */
	addEvtListener(document, 'mousedown', catchClickHeat);
	/** Add onfocus event on iframes (mostly ads) - Does NOT work with Gecko-powered browsers, because onfocus doesn't exist on iframes */
	iFrames = document.getElementsByTagName('iframe');
	for (i = 0; i < iFrames.length; i += 1)
	{
		addEvtListener(iFrames[i], 'focus', catchClickHeat);
	}
	/** Preparing main variables */
	clickHeatDocument = document.documentElement && document.documentElement.clientHeight !== 0 ? document.documentElement : document.body;
	/** Also the User-Agent is not the best value to use, it's the only one that gives the real browser */
	b = navigator.userAgent ? navigator.userAgent.toLowerCase().replace(/-/g, '') : '';
	/** Always test Chrome before Safari */
	browsers = ['chrome', 'firefox', 'safari', 'msie', 'opera'];
	clickHeatBrowser = 'unknown';
	for (i = 0; i < browsers.length; i += 1)
	{
		if (b.indexOf(browsers[i]) !== -1)
		{
			clickHeatBrowser = browsers[i];
			break;
		}
	}
	showClickHeatDebug('ClickHeat initialised with:<br/>site = ' + clickHeatSite + '<br/>group = ' + clickHeatGroup + '<br/>server = ' + clickHeatServer + '<br/>quota = ' + (clickHeatQuota === -1 ? 'unlimited' : clickHeatQuota) + '<br/><br/>browser = ' + clickHeatBrowser + '<br/><strong>Click in a blank area (not on a link) to test ClickHeat</strong>');
}


/**
 * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */ 
if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;


/* MetriWeb Javascript file */
/* Version 5.1 -- release 1.0 -- 2010-01-06 */

/* Please, do NEVER modify this monitored file! */

var mw=new Object({
V:"5.1",
R:"1.0",
i:new Image(),
p:0,
l:0,
D:".metriweb.be",
belgian:1,
r:function(u1,u2){
	if(mw.i.width){
		if(mw.i.width>1){
			var nS=document.createElement("script");
			nS.setAttribute("src", u1+"td"+u2+"&w="+mw.i.width+'&T='+new Date().getTime());
			document.getElementsByTagName("head").item(0).appendChild(nS);
		}
	}
	else
		setTimeout("mw.r('"+u1.replace(/'/,"\\'")+"','"+u2.replace(/'/,"\\'")+"')",1000);
},
W:function(u1,u2){
	if(mw.l){
		if(mw.l++>1){
			var nS=document.createElement("script");
			nS.setAttribute("src", u1+"sd"+u2+'&T='+new Date().getTime());
			document.getElementsByTagName("head").item(0).appendChild(nS);
		}else mw.r(u1,u2)
	}else{
		mw.i.src=u1+"dyn"+u2;
		if(!mw.p){
			if(window.addEventListener)window.addEventListener('load',function(){mw.l++;mw.W(u1,u2)},false);
			else if(window.attachEvent)window.attachEvent('onload',function(){mw.l++;mw.W(u1,u2)});
		}
	}
},
n:function(d){
	var k="0000";
	var t=d.split(".");
	if(parseInt(k+t[t.length-1]))mw.d=d;
	else mw.d="."+t[t.length-2]+"."+t[t.length-1];
	t="charCodeAt(0)";
	var c=(k+eval("\""+mw.d.split("").join("\"."+t+"+\"")+"\"."+t));
	t=k+k+k+k+new Date().getTime();
	t=t.substr(t.length-16,16);
	return t.substr(0,13)+"."+t.substr(13,3)+c.substr(c.length-3,3)+".5";
},
g:function(s,f){
	var c;
	var o=document.cookie.indexOf(s+"=");
	if(o<0){
		c=f(document.domain);
		document.cookie=s+"="+c+"; domain="+mw.d+"; path=/; expires="+
			new Date(new Date().getTime()+365*24*3600000).toGMTString()+";";
	}else{
		var e=document.cookie.indexOf(";",o);
		if(e<0)e=document.cookie.length;
		c=document.cookie.substring(o+4,e);
	}
	return c;
},
H:function(){
	var e=document.getElementById("metriwebLayer");
	if (e)
		e.style.visibility="hidden";
},
e:window.screen?window.screen.width+"x"+window.screen.height+"/"+window.screen.colorDepth:"-",
m:"0x0",
t:undefined,
k:undefined,
x:undefined,
s:undefined,
PR:0,
PV:0,
to:0,
pr:document.referrer?escape(document.referrer):"-",
RIA:function(action,keyword,origin,into){
	mw.W('http://'+mw.t+mw.D+'/','/'+mw.t+'/mw.cgi?page='+keyword+
		(mw.x?('&q='+mw.x):'')+(mw.s?('&s='+mw.s):'')+
		'&c='+mw.c+'&v='+mw.V+"."+mw.R+'&p='+mw.p+'&d='+Math.round(new Date().getTime())+
		'&e='+mw.e+'&a='+action+'&r='+mw.pr+'&f='+mw.f+
		'&m='+mw.m+'&o='+origin+'&i='+into+'&R='+Math.random());
},
em:function(e) {
	if(!e)var e=window.event;
	mw.m=e.screenX+"x"+e.screenY;
},
eb:function() {
	mw.PV=new Date().getTime();
	if(mw.to){clearTimeout(mw.to);mw.to=0};
},
ef:function() {
	if(!mw.PV){
		if(new Date().getTime()-mw.PR>15e3){
			if(mw.to){clearTimeout(mw.to);mw.to=setTimeout("mw.to=0;mw.RIA('page.idle','"+mw.k+"','','')",3e4);};
			mw.RIA("page.view",mw.k,"","");
		}
		mw.PV=new Date().getTime();
	}
}
});
mw.c=mw.g("mwc",mw.n);
if(window.addEventListener){
	window.addEventListener('focus',mw.ef,false);
	window.addEventListener('blur',mw.eb,false);
	window.addEventListener('mousemove',mw.em,false);
}else if(window.attachEvent){
	window.attachEvent('onfocus',mw.ef);
	window.attachEvent('onblur',mw.eb);
	window.attachEvent('onmousemove',mw.em);
}
function metriwebTag (tag,keyword,extra,refresh){
	if(mw.belgian&&!mw.p){
		try{
			mw.t=tag.replace(/[^a-zA-Z0-9\-/]/g,"").substring(0,24);
			mw.k=keyword.replace(/[^a-zA-Z0-9_/]/g,"").substring(0,24);
			if(extra.match(/en|fr|nl|ge/)){mw.x=extra}else mw.x="na";
			mw.s=refresh?parseInt(refresh):undefined;
			mw.PR=new Date().getTime();
			mw.to=setTimeout("mw.to=0;mw.RIA('page.idle','"+mw.k+"','','')",3e4);
			mw.f=(mw.t==tag?0:1)+(mw.k==keyword?0:2)+(mw.x==extra?0:4)+(mw.s==refresh?0:8);
			mw.RIA("page.request",mw.k,"","");
			mw.p++;
		}catch (e){}
	}
}
function metriwebRIA (action,keyword,origin)
{
	if(mw.belgian&&mw.PR){
		try{
			a=action.replace(/[^a-zA-Z0-9\./]/g,"").substring(0,24);
			k=keyword?keyword.replace(/[^a-zA-Z0-9_/]/g,"").substring(0,24):mw.k;
			o=origin?origin.replace(/[^a-zA-Z0-9\-/]/g,"").substring(0,24):"";
			if(mw.to){clearTimeout(mw.to);mw.to=0};
			mw.RIA(a,k,o,mw.k);
			mw.p++;
		}catch (e){}
	}
}

/* (c) 2000-2010, DouWère/MetriWare */



