/*
 * Ermes
 * Copyright(c) 2006, Guillaume Jactat.
 * 
 * This code is licensed under BSD license. Use it as you wish, 
 * but keep this copyright intact.
 */


(function() {
    (function($) {
        var i;
        i = document.createElement("input");
        i.setAttribute("type", "number");
        if (i.type === "text") {
            $.fn.inputNumber = function() {
                var clipValues, decrement, domMouseScrollHandler, extractNumDecimalDigits, getParams, increment, matchStep, mouseWheelHandler;
                getParams = function(elem) {
                    var $elem, max, min, step, val;
                    $elem = $(elem);
                    step = $elem.attr('step');
                    min = $elem.attr('min');
                    max = $elem.attr('max');
                    val = parseFloat($elem.val());
                    step = /^-?\d+(?:\.\d+)?$/.test(step) ? parseFloat(step) : null;
                    min = /^-?\d+(?:\.\d+)?$/.test(min) ? parseFloat(min) : null;
                    max = /^-?\d+(?:\.\d+)?$/.test(max) ? parseFloat(max) : null;
                    if (isNaN(val)) { val = min || 0; }
                    return { min: min, max: max, step: step, val: val };
                };
                clipValues = function(value, min, max) { if ((max != null) && value > max) { return max; } else if ((min != null) && value < min) { return min; } else { return value; } };
                extractNumDecimalDigits = function(input) {
                    var num, raisedNum;
                    if (input != null) {
                        num = 0;
                        raisedNum = input;
                        while (raisedNum !== Math.round(raisedNum)) {
                            num += 1;
                            raisedNum = input * Math.pow(10, num);
                        }
                        return num;
                    } else { return 0; }
                };
                matchStep = function(value, min, max, step) {
                    var mod, raiseTo, raisedMod, raisedStep, raisedStepDown, raisedStepUp, raisedValue, stepDecimalDigits, stepDown, stepUp;
                    stepDecimalDigits = extractNumDecimalDigits(step);
                    if (step == null) { return value; } else if (stepDecimalDigits === 0) {
                        mod = (value - (min || 0)) % step;
                        if (mod === 0) { return value; } else {
                            stepDown = value - mod;
                            stepUp = stepDown + step;
                            if ((stepUp > max) || ((value - stepDown) < (stepUp - value))) { return stepDown; } else { return stepUp; }
                        }
                    } else {
                        raiseTo = Math.pow(10, stepDecimalDigits);
                        raisedStep = step * raiseTo;
                        raisedMod = (value - (min || 0)) * raiseTo % raisedStep;
                        if (raisedMod === 0) { return value; } else {
                            raisedValue = value * raiseTo;
                            raisedStepDown = raisedValue - raisedMod;
                            raisedStepUp = raisedStepDown + raisedStep;
                            if (((raisedStepUp / raiseTo) > max) || ((raisedValue - raisedStepDown) < (raisedStepUp - raisedValue))) { return raisedStepDown / raiseTo; } else { return raisedStepUp / raiseTo; }
                        }
                    }
                };
                increment = function(elem) {
                    var newVal, params, raiseTo;
                    if (!$(elem).is(":disabled")) {
                        params = getParams(elem);
                        raiseTo = Math.pow(10, Math.max(extractNumDecimalDigits(params['val']), extractNumDecimalDigits(params['step'])));
                        newVal = (Math.round(params['val'] * raiseTo) + Math.round((params['step'] || 1) * raiseTo)) / raiseTo;
                        if ((params['max'] != null) && newVal > params['max']) { newVal = params['max']; }
                        newVal = matchStep(newVal, params['min'], params['max'], params['step']);
                        $(elem).val(newVal).change();
                    }
                    return null;
                };
                decrement = function(elem) {
                    var newVal, params, raiseTo;
                    if (!$(elem).is(":disabled")) {
                        params = getParams(elem);
                        raiseTo = Math.pow(10, Math.max(extractNumDecimalDigits(params['val']), extractNumDecimalDigits(params['step'])));
                        newVal = (Math.round(params['val'] * raiseTo) - Math.round((params['step'] || 1) * raiseTo)) / raiseTo;
                        if ((params['min'] != null) && newVal < params['min']) { newVal = params['min']; }
                        newVal = matchStep(newVal, params['min'], params['max'], params['step']);
                        $(elem).val(newVal).change();
                    }
                    return null;
                };
                domMouseScrollHandler = function(e) {
                    e.preventDefault();
                    if (e.originalEvent.detail < 0) { increment(this); } else { decrement(this); }
                    return null;
                };
                mouseWheelHandler = function(e) {
                    e.preventDefault();
                    if (e.originalEvent.wheelDelta > 0) { increment(this); } else { decrement(this); }
                    return null;
                };
                $(this).filter('input[type="number"]').each(function() {
                    var $downBtn, $elem, $upBtn, attrMutationCallback, attrObserver, btnContainer, downBtn, elem, halfHeight, upBtn;
                    elem = this;
                    $elem = $(elem);
                    halfHeight = ($elem.outerHeight() / 2) + 'px';
                    upBtn = document.createElement('div');
                    downBtn = document.createElement('div');
                    $upBtn = $(upBtn);
                    $downBtn = $(downBtn);
                    btnContainer = document.createElement('div');
                    $upBtn.addClass('number-spin-btn number-spin-btn-up').css('height', halfHeight);
                    $downBtn.addClass('number-spin-btn number-spin-btn-down').css('height', halfHeight);
                    btnContainer.appendChild(upBtn);
                    btnContainer.appendChild(downBtn);
                    $(btnContainer).addClass('number-spin-btn-container').insertAfter(elem);
                    $elem.on({
                        focus: function(e) { $elem.on({ DOMMouseScroll: domMouseScrollHandler, mousewheel: mouseWheelHandler }); return null; },
                        blur: function(e) { $elem.off({ DOMMouseScroll: domMouseScrollHandler, mousewheel: mouseWheelHandler }); return null; },
                        keypress: function(e) {
                            var _ref, _ref1;
                            if (e.keyCode === 38) { increment(this); } else if (e.keyCode === 40) { decrement(this); } else if (((_ref = e.keyCode) !== 8 && _ref !== 9 && _ref !== 35 && _ref !== 36 && _ref !== 37 && _ref !== 39) && ((_ref1 = e.which) !== 45 && _ref1 !== 46 && _ref1 !== 48 && _ref1 !== 49 && _ref1 !== 50 && _ref1 !== 51 && _ref1 !== 52 && _ref1 !== 53 && _ref1 !== 54 && _ref1 !== 55 && _ref1 !== 56 && _ref1 !== 57)) { e.preventDefault(); }
                            return null;
                        },
                        change: function(e) {
                            var newVal, params;
                            if (e.originalEvent != null) {
                                params = getParams(this);
                                newVal = clipValues(params['val'], params['min'], params['max']);
                                newVal = matchStep(newVal, params['min'], params['max'], params['step'], params['stepDecimal']);
                                $(this).val(newVal);
                            }
                            return null;
                        }
                    });
                    $upBtn.on("mousedown", function(e) {
                        var releaseFunc, timeoutFunc;
                        increment(elem);
                        timeoutFunc = function(elem, incFunc) {
                            incFunc(elem);
                            $elem.data("timeoutID", window.setTimeout(timeoutFunc, 10, elem, incFunc));
                            return null;
                        };
                        releaseFunc = function(e) {
                            window.clearTimeout($elem.data("timeoutID"));
                            $(document).off('mouseup', releaseFunc);
                            $upBtn.off('mouseleave', releaseFunc);
                            return null;
                        };
                        $(document).on('mouseup', releaseFunc);
                        $upBtn.on('mouseleave', releaseFunc);
                        $elem.data("timeoutID", window.setTimeout(timeoutFunc, 700, elem, increment));
                        return null;
                    });
                    $downBtn.on("mousedown", function(e) {
                        var releaseFunc, timeoutFunc;
                        decrement(elem);
                        timeoutFunc = function(elem, decFunc) {
                            decFunc(elem);
                            $elem.data("timeoutID", window.setTimeout(timeoutFunc, 10, elem, decFunc));
                            return null;
                        };
                        releaseFunc = function(e) {
                            window.clearTimeout($elem.data("timeoutID"));
                            $(document).off('mouseup', releaseFunc);
                            $downBtn.off('mouseleave', releaseFunc);
                            return null;
                        };
                        $(document).on('mouseup', releaseFunc);
                        $downBtn.on('mouseleave', releaseFunc);
                        $elem.data("timeoutID", window.setTimeout(timeoutFunc, 700, elem, decrement));
                        return null;
                    });
                    $elem.css("textAlign", 'right');
                    if ($elem.css("opacity") !== "1") { $(btnContainer).css("opacity", $elem.css("opacity")); }
                    if ($elem.css("visibility") !== "visible") { $(btnContainer).css("visibility", $elem.css("visibility")); }
                    if (elem.style.display !== "") { $(btnContainer).css("display", $elem.css("display")); }
                    if ((typeof WebKitMutationObserver !== "undefined" && WebKitMutationObserver !== null) || (typeof MutationObserver !== "undefined" && MutationObserver !== null)) {
                        attrMutationCallback = function(mutations, observer) {
                            var mutation, _i, _len;
                            for (_i = 0, _len = mutations.length; _i < _len; _i++) { mutation = mutations[_i]; if (mutation.type === "attributes") { if (mutation.attributeName === "class") { $(btnContainer).removeClass(mutation.oldValue).addClass(elem.className); } else if (mutation.attributeName === "style") { $(btnContainer).css({ "opacity": elem.style.opacity, "visibility": elem.style.visibility, "display": elem.style.display }); } } }
                            return null;
                        };
                        attrObserver = (typeof WebKitMutationObserver !== "undefined" && WebKitMutationObserver !== null) ? new WebKitMutationObserver(attrMutationCallback) : ((typeof MutationObserver !== "undefined" && MutationObserver !== null) ? new MutationObserver(attrMutationCallback) : null);
                        attrObserver.observe(elem, { attributes: true, attributeOldValue: true, attributeFilter: ["class", "style"] });
                    } else if (typeof MutationEvent !== "undefined" && MutationEvent !== null) {
                        $elem.on("DOMAttrModified", function(evt) {
                            if (evt.originalEvent.attrName === "class") { $(btnContainer).removeClass(evt.originalEvent.prevValue).addClass(evt.originalEvent.newValue); } else if (evt.originalEvent.attrName === "style") { $(btnContainer).css({ "display": elem.style.display, "visibility": elem.style.visibility, "opacity": elem.style.opacity }); }
                            return null;
                        });
                    }
                    return null;
                });
                return $(this);
            };
            $(function() { $('input[type="number"]').inputNumber(); return null; });
            null;
        } else {
            $.fn.inputNumber = function() { return $(this); };
            null;
        }
        return null;
    })(jQuery);
}).call(this);

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;

(function(root, factory) { "use strict"; if (typeof define === "function" && define.amd) { define(["jquery"], factory); } else if (typeof exports === "object") { module.exports = factory(require("jquery")); } else { root.bootbox = factory(root.jQuery); } }(this, function init($, undefined) {
    "use strict";
    var templates = { dialog: "<div class='bootbox modal' tabindex='-1' role='dialog'>" + "<div class='modal-dialog'>" + "<div class='modal-content'>" + "<div class='modal-body'><div class='bootbox-body'></div></div>" + "</div>" + "</div>" + "</div>", header: "<div class='modal-header'>" + "<h4 class='modal-title'></h4>" + "</div>", footer: "<div class='modal-footer'></div>", closeButton: "<button type='button' class='bootbox-close-button close' data-dismiss='modal' aria-hidden='true'>&times;</button>", form: "<form class='bootbox-form'></form>", inputs: { text: "<input class='bootbox-input bootbox-input-text form-control' autocomplete=off type=text />", textarea: "<textarea class='bootbox-input bootbox-input-textarea form-control'></textarea>", email: "<input class='bootbox-input bootbox-input-email form-control' autocomplete='off' type='email' />", select: "<select class='bootbox-input bootbox-input-select form-control'></select>", checkbox: "<div class='checkbox'><label><input class='bootbox-input bootbox-input-checkbox' type='checkbox' /></label></div>", date: "<input class='bootbox-input bootbox-input-date form-control' autocomplete=off type='date' />", time: "<input class='bootbox-input bootbox-input-time form-control' autocomplete=off type='time' />", number: "<input class='bootbox-input bootbox-input-number form-control' autocomplete=off type='number' />", password: "<input class='bootbox-input bootbox-input-password form-control' autocomplete='off' type='password' />" } };
    var defaults = { locale: "en", backdrop: "static", animate: true, className: null, closeButton: true, show: true, container: "body" };
    var exports = {};

    function _t(key) { var locale = locales[defaults.locale]; return locale ? locale[key] : locales.en[key]; }

    function processCallback(e, dialog, callback) {
        e.stopPropagation();
        e.preventDefault();
        var preserveDialog = $.isFunction(callback) && callback.call(dialog, e) === false;
        if (!preserveDialog) { dialog.modal("hide"); }
    }

    function getKeyLength(obj) {
        var k, t = 0;
        for (k in obj) { t++; }
        return t;
    }

    function each(collection, iterator) {
        var index = 0;
        $.each(collection, function(key, value) { iterator(key, value, index++); });
    }

    function sanitize(options) {
        var buttons;
        var total;
        if (typeof options !== "object") { throw new Error("Please supply an object of options"); }
        if (!options.message) { throw new Error("Please specify a message"); }
        options = $.extend({}, defaults, options);
        if (!options.buttons) { options.buttons = {}; }
        buttons = options.buttons;
        total = getKeyLength(buttons);
        each(buttons, function(key, button, index) {
            if ($.isFunction(button)) { button = buttons[key] = { callback: button }; }
            if ($.type(button) !== "object") { throw new Error("button with key " + key + " must be an object"); }
            if (!button.label) { button.label = key; }
            if (!button.className) { if (total <= 2 && index === total - 1) { button.className = "btn-primary"; } else { button.className = "btn-default"; } }
        });
        return options;
    }

    function mapArguments(args, properties) {
        var argn = args.length;
        var options = {};
        if (argn < 1 || argn > 2) { throw new Error("Invalid argument length"); }
        if (argn === 2 || typeof args[0] === "string") {
            options[properties[0]] = args[0];
            options[properties[1]] = args[1];
        } else { options = args[0]; }
        return options;
    }

    function mergeArguments(defaults, args, properties) { return $.extend(true, {}, defaults, mapArguments(args, properties)); }

    function mergeDialogOptions(className, labels, properties, args) { var baseOptions = { className: "bootbox-" + className, buttons: createLabels.apply(null, labels) }; return validateButtons(mergeArguments(baseOptions, args, properties), labels); }

    function createLabels() {
        var buttons = {};
        for (var i = 0, j = arguments.length; i < j; i++) {
            var argument = arguments[i];
            var key = argument.toLowerCase();
            var value = argument.toUpperCase();
            buttons[key] = { label: _t(value) };
        }
        return buttons;
    }

    function validateButtons(options, buttons) {
        var allowedButtons = {};
        each(buttons, function(key, value) { allowedButtons[value] = true; });
        each(options.buttons, function(key) { if (allowedButtons[key] === undefined) { throw new Error("button key " + key + " is not allowed (options are " + buttons.join("\n") + ")"); } });
        return options;
    }
    exports.alert = function() {
        var options;
        options = mergeDialogOptions("alert", ["ok"], ["message", "callback"], arguments);
        if (options.callback && !$.isFunction(options.callback)) { throw new Error("alert requires callback property to be a function when provided"); }
        options.buttons.ok.callback = options.onEscape = function() {
            if ($.isFunction(options.callback)) { return options.callback.call(this); }
            return true;
        };
        return exports.dialog(options);
    };
    exports.confirm = function() {
        var options;
        options = mergeDialogOptions("confirm", ["cancel", "confirm"], ["message", "callback"], arguments);
        options.buttons.cancel.callback = options.onEscape = function() { return options.callback.call(this, false); };
        options.buttons.confirm.callback = function() { return options.callback.call(this, true); };
        if (!$.isFunction(options.callback)) { throw new Error("confirm requires a callback"); }
        return exports.dialog(options);
    };
    exports.prompt = function() {
        var options;
        var defaults;
        var dialog;
        var form;
        var input;
        var shouldShow;
        var inputOptions;
        form = $(templates.form);
        defaults = { className: "bootbox-prompt", buttons: createLabels("cancel", "confirm"), value: "", inputType: "text" };
        options = validateButtons(mergeArguments(defaults, arguments, ["title", "callback"]), ["cancel", "confirm"]);
        shouldShow = (options.show === undefined) ? true : options.show;
        options.message = form;
        options.buttons.cancel.callback = options.onEscape = function() { return options.callback.call(this, null); };
        options.buttons.confirm.callback = function() {
            var value;
            switch (options.inputType) {
                case "text":
                case "textarea":
                case "email":
                case "select":
                case "date":
                case "time":
                case "number":
                case "password":
                    value = input.val();
                    break;
                case "checkbox":
                    var checkedItems = input.find("input:checked");
                    value = [];
                    each(checkedItems, function(_, item) { value.push($(item).val()); });
                    break;
            }
            return options.callback.call(this, value);
        };
        options.show = false;
        if (!options.title) { throw new Error("prompt requires a title"); }
        if (!$.isFunction(options.callback)) { throw new Error("prompt requires a callback"); }
        if (!templates.inputs[options.inputType]) { throw new Error("invalid prompt type"); }
        input = $(templates.inputs[options.inputType]);
        switch (options.inputType) {
            case "text":
            case "textarea":
            case "email":
            case "date":
            case "time":
            case "number":
            case "password":
                input.val(options.value);
                break;
            case "select":
                var groups = {};
                inputOptions = options.inputOptions || [];
                if (!$.isArray(inputOptions)) { throw new Error("Please pass an array of input options"); }
                if (!inputOptions.length) { throw new Error("prompt with select requires options"); }
                each(inputOptions, function(_, option) {
                    var elem = input;
                    if (option.value === undefined || option.text === undefined) { throw new Error("given options in wrong format"); }
                    if (option.group) {
                        if (!groups[option.group]) { groups[option.group] = $("<optgroup/>").attr("label", option.group); }
                        elem = groups[option.group];
                    }
                    elem.append("<option value='" + option.value + "'>" + option.text + "</option>");
                });
                each(groups, function(_, group) { input.append(group); });
                input.val(options.value);
                break;
            case "checkbox":
                var values = $.isArray(options.value) ? options.value : [options.value];
                inputOptions = options.inputOptions || [];
                if (!inputOptions.length) { throw new Error("prompt with checkbox requires options"); }
                if (!inputOptions[0].value || !inputOptions[0].text) { throw new Error("given options in wrong format"); }
                input = $("<div/>");
                each(inputOptions, function(_, option) {
                    var checkbox = $(templates.inputs[options.inputType]);
                    checkbox.find("input").attr("value", option.value);
                    checkbox.find("label").append(option.text);
                    each(values, function(_, value) { if (value === option.value) { checkbox.find("input").prop("checked", true); } });
                    input.append(checkbox);
                });
                break;
        }
        if (options.placeholder) { input.attr("placeholder", options.placeholder); }
        if (options.pattern) { input.attr("pattern", options.pattern); }
        if (options.maxlength) { input.attr("maxlength", options.maxlength); }
        form.append(input);
        form.on("submit", function(e) {
            e.preventDefault();
            e.stopPropagation();
            dialog.find(".btn-primary").click();
        });
        dialog = exports.dialog(options);
        dialog.off("shown.bs.modal");
        dialog.on("shown.bs.modal", function() { input.focus(); });
        if (shouldShow === true) { dialog.modal("show"); }
        return dialog;
    };
    exports.dialog = function(options) {
        options = sanitize(options);
        var dialog = $(templates.dialog);
        var innerDialog = dialog.find(".modal-dialog");
        var body = dialog.find(".modal-body");
        var buttons = options.buttons;
        var buttonStr = "";
        var callbacks = { onEscape: options.onEscape };
        if ($.fn.modal === undefined) { throw new Error("$.fn.modal is not defined; please double check you have included " + "the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ " + "for more details."); }
        each(buttons, function(key, button) {
            buttonStr += "<button data-bb-handler='" + key + "' type='button' class='btn " + button.className + "'>" + button.label + "</button>";
            callbacks[key] = button.callback;
        });
        body.find(".bootbox-body").html(options.message);
        if (options.animate === true) { dialog.addClass("fade"); }
        if (options.className) { dialog.addClass(options.className); }
        if (options.size === "large") { innerDialog.addClass("modal-lg"); } else if (options.size === "small") { innerDialog.addClass("modal-sm"); }
        if (options.title) { body.before(templates.header); }
        if (options.closeButton) { var closeButton = $(templates.closeButton); if (options.title) { dialog.find(".modal-header").prepend(closeButton); } else { closeButton.css("margin-top", "-10px").prependTo(body); } }
        if (options.title) { dialog.find(".modal-title").html(options.title); }
        if (buttonStr.length) {
            body.after(templates.footer);
            dialog.find(".modal-footer").html(buttonStr);
        }
        dialog.on("hidden.bs.modal", function(e) { if (e.target === this) { dialog.remove(); } });
        dialog.on("shown.bs.modal", function() { dialog.find(".btn-primary:first").focus(); });
        if (options.backdrop !== "static") {
            dialog.on("click.dismiss.bs.modal", function(e) {
                if (dialog.children(".modal-backdrop").length) { e.currentTarget = dialog.children(".modal-backdrop").get(0); }
                if (e.target !== e.currentTarget) { return; }
                dialog.trigger("escape.close.bb");
            });
        }
        dialog.on("escape.close.bb", function(e) { if (callbacks.onEscape) { processCallback(e, dialog, callbacks.onEscape); } });
        dialog.on("click", ".modal-footer button", function(e) {
            var callbackKey = $(this).data("bb-handler");
            processCallback(e, dialog, callbacks[callbackKey]);
        });
        dialog.on("click", ".bootbox-close-button", function(e) { processCallback(e, dialog, callbacks.onEscape); });
        dialog.on("keyup", function(e) { if (e.which === 27) { dialog.trigger("escape.close.bb"); } });
        $(options.container).append(dialog);
        dialog.modal({ backdrop: options.backdrop ? "static" : false, keyboard: false, show: false });
        if (options.show) { dialog.modal("show"); }
        return dialog;
    };
    exports.setDefaults = function() {
        var values = {};
        if (arguments.length === 2) { values[arguments[0]] = arguments[1]; } else { values = arguments[0]; }
        $.extend(defaults, values);
    };
    exports.hideAll = function() { $(".bootbox").modal("hide"); return exports; };
    var locales = { bg_BG: { OK: "Ок", CANCEL: "Отказ", CONFIRM: "Потвърждавам" }, br: { OK: "OK", CANCEL: "Cancelar", CONFIRM: "Sim" }, cs: { OK: "OK", CANCEL: "Zrušit", CONFIRM: "Potvrdit" }, da: { OK: "OK", CANCEL: "Annuller", CONFIRM: "Accepter" }, de: { OK: "OK", CANCEL: "Abbrechen", CONFIRM: "Akzeptieren" }, el: { OK: "Εντάξει", CANCEL: "Ακύρωση", CONFIRM: "Επιβεβαίωση" }, en: { OK: "OK", CANCEL: "Cancel", CONFIRM: "OK" }, es: { OK: "OK", CANCEL: "Cancelar", CONFIRM: "Aceptar" }, et: { OK: "OK", CANCEL: "Katkesta", CONFIRM: "OK" }, fa: { OK: "قبول", CANCEL: "لغو", CONFIRM: "تایید" }, fi: { OK: "OK", CANCEL: "Peruuta", CONFIRM: "OK" }, fr: { OK: "OK", CANCEL: "Annuler", CONFIRM: "D'accord" }, he: { OK: "אישור", CANCEL: "ביטול", CONFIRM: "אישור" }, hu: { OK: "OK", CANCEL: "Mégsem", CONFIRM: "Megerősít" }, hr: { OK: "OK", CANCEL: "Odustani", CONFIRM: "Potvrdi" }, id: { OK: "OK", CANCEL: "Batal", CONFIRM: "OK" }, it: { OK: "OK", CANCEL: "Annulla", CONFIRM: "Conferma" }, ja: { OK: "OK", CANCEL: "キャンセル", CONFIRM: "確認" }, lt: { OK: "Gerai", CANCEL: "Atšaukti", CONFIRM: "Patvirtinti" }, lv: { OK: "Labi", CANCEL: "Atcelt", CONFIRM: "Apstiprināt" }, nl: { OK: "OK", CANCEL: "Annuleren", CONFIRM: "Accepteren" }, no: { OK: "OK", CANCEL: "Avbryt", CONFIRM: "OK" }, pl: { OK: "OK", CANCEL: "Anuluj", CONFIRM: "Potwierdź" }, pt: { OK: "OK", CANCEL: "Cancelar", CONFIRM: "Confirmar" }, ru: { OK: "OK", CANCEL: "Отмена", CONFIRM: "Применить" }, sq: { OK: "OK", CANCEL: "Anulo", CONFIRM: "Prano" }, sv: { OK: "OK", CANCEL: "Avbryt", CONFIRM: "OK" }, th: { OK: "ตกลง", CANCEL: "ยกเลิก", CONFIRM: "ยืนยัน" }, tr: { OK: "Tamam", CANCEL: "İptal", CONFIRM: "Onayla" }, zh_CN: { OK: "OK", CANCEL: "取消", CONFIRM: "确认" }, zh_TW: { OK: "OK", CANCEL: "取消", CONFIRM: "確認" } };
    exports.addLocale = function(name, values) {
        $.each(["OK", "CANCEL", "CONFIRM"], function(_, v) { if (!values[v]) { throw new Error("Please supply a translation for '" + v + "'"); } });
        locales[name] = { OK: values.OK, CANCEL: values.CANCEL, CONFIRM: values.CONFIRM };
        return exports;
    };
    exports.removeLocale = function(name) { delete locales[name]; return exports; };
    exports.setLocale = function(name) { return exports.setDefaults("locale", name); };
    exports.init = function(_$) { return init(_$ || $); };
    return exports;
}));

if (!String.prototype.format) { String.prototype.format = function() { var args = arguments; return this.replace(/{(\d+)}/g, function(match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); }; }
if (typeof console == "undefined") { this.console = { log: function() {} }; }
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function(searchElement) {
        "use strict";
        if (this == null) { throw new TypeError(); }
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) { return -1; }
        var n = 0;
        if (arguments.length > 1) { n = Number(arguments[1]); if (n != n) { n = 0; } else if (n != 0 && n != Infinity && n != -Infinity) { n = (n > 0 || -1) * Math.floor(Math.abs(n)); } }
        if (n >= len) { return -1; }
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) { if (k in t && t[k] === searchElement) { return k; } }
        return -1;
    }
}
bootbox.addLocale('cf', { OK: ErmesManager.labels.CommentModalValid, CANCEL: ErmesManager.labels.CommentModalCancel, CONFIRM: ErmesManager.labels.ConfirmBoxConfirm });
bootbox.setDefaults({ locale: 'cf' });
var ErmesManager = (function(pub) {
    pub.SearchContexts = { "SimpleField": 0, "AdvancedForm": 1, "SpellCheking": 2, "IsbdLink": 3, "Rebound": 4, "SearchInsert": 5, "Selection": 6, "Suggestion": 7, "LiveSearch": 8 };
    pub.SearchType = { "Basket": 0, "Selection": 1, "Detail": 2, "DetailStatic": 3, "List": 4, "MDSI": 5, "OpenFindSelection": 6, "Tag": 7 };
    pub.CaptureType = { "Search": 0, "Area": 1, "Grid": 2 };
    pub.SearchTimeout = -1;
    pub.CurrentSearchType = pub.SearchType.List;
    pub.StopAutocompletion = false;
    pub.EnableTypewatch = true;
    pub.AjaxCalls = [];
    pub.CurrentCalendarDate;
    pub.MaxLoadingTime = 900;
    pub.modalConfirm = function(title, body, okHandler) {
        var modal = '<div class="modal fade"><div class="modal-dialog"><div class="modal-content"><div class="modal-header"><button role="button" type="button" class="close" data-dismiss="modal" title="{0}"><span class="ermes-label">{0}</span>x</button><h2 class="modal-title">{1}</h2></div><div class="modal-body">{2}</div><div class="modal-footer"><button role="button" type="button" class="btn btn-default confirm" title="{3}"><span class="ermes-label">{3}</span>{3}</button><button role="button" type="button" class="btn btn-primary" data-dismiss="modal" title="{4}"><span class="ermes-label">{4}</span>{4}</button></div></div></div></div>';
        var $modal = $(modal.format(ErmesManager.labels.CloseText, title, body, ErmesManager.labels.ConfirmBoxConfirm, ErmesManager.labels.ConfirmBoxCancel));
        $modal.on('hidden.bs.modal', function(e) { $(e.target).remove(); });
        $(".confirm", $modal).text(ErmesManager.labels.ConfirmBoxConfirm).on("click", function() {
            this.modal('hide');
            okHandler();
        }.bind($modal));
        $modal.modal();
    };
    pub.htmlDecode = function(value) { return $("<div/>").html(value).text(); };
    pub.htmlEscape = function(str) { return String(str).replace(/&/g, '&amp;').replace(/"/g, '&quot;').replace(/'/g, '&#39;').replace(/</g, '&lt;').replace(/>/g, '&gt;'); };
    pub.Guid = function() {
        return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
            var r = Math.random() * 16 | 0,
                v = c == 'x' ? r : (r & 0x3 | 0x8);
            return v.toString(16);
        });
    };
    pub.flushAjaxCalls = function() {
        for (var i = 0, len = ErmesManager.AjaxCalls.length; i < len; ++i) { try { ErmesManager.AjaxCalls[i].abort(); } catch (e) { if (window.console) { console.log(e); } } }
        ErmesManager.AjaxCalls = [];
    };
    pub.setHashSilently = function(hash) {
        hasher.changed.active = false;
        hasher.setHash(hash);
        hasher.changed.active = true;
    };
    pub.afterImgLoad = function(selector, callback) {
        var args = Array.prototype.slice.call(arguments, 2),
            imgCount = $(selector).length,
            imgLoaded = 0;
        $(selector).one('load', function() { imgLoaded++; if (imgLoaded >= imgCount) { callback.apply(this, args); } }).each(function() { if (this.complete) { $(this).load(); } });
    };
    pub.processAmazonCopyright = function() {
        $('img.amazonCover').each(function() {
            ErmesManager.afterImgLoad(this, function() {
                var $img = $(this);
                var t = new Image();
                t.src = ($img.attr ? $img.attr("src") : false) || $img.src;
                t.onload = function() { if (t.width !== 1 && t.height !== 1) { $img.parents('li').find('.copyright_vignettes').show(); } };
            });
        });
    };
    pub.processThumbnailBackground = function() {
        $('img.ermes-thumb').each(function() {
            ErmesManager.afterImgLoad(this, function() {
                var $img = $(this);
                var t = new Image();
                t.src = ($img.attr ? $img.attr("src") : false) || $img.src;
                t.onload = function() {
                    if (t.width > 5 && t.height > 5) { $img.css('background-image', 'none'); if ($('#containerSearchList').length > 0) { $img.parents(".item").find(".informationVignet").css({ display: 'none' }); } } else {
                        var bg = $img.css('background-image');
                        bg = bg.replace(/^url\(["']?/, '').replace(/["']?\)$/, '');
                        $img.attr('src', bg);
                        if ($('#containerSearchList').length > 0) { $img.css({ opacity: '0.2' }); }
                        if ($img.parent().attr('data-toggle')) {
                            $img.parent().attr('data-toggle', '');
                            $img.parent().click(function(event) { event.preventDefault(); });
                        }
                    }
                };
            });
        });
    };
    pub.beforeSearch = function() {
        $("div.dialog-model").remove();
        $(".ui-dialog").remove();
        return true;
    };
    pub.setupAutocomplete = function(input) {
        var suggestUrl = ErmesManager.BasePath + "ermes/recherche/Search.svc/SolrSuggestGet?term={0}&scenarioCode={1}";
        $(input).typeahead({ minLength: 0 }, {
            displayKey: "value",
            source: function(query, cb) {
                var req = { term: query.toLowerCase().replace(/\s+/g, " "), scenarioCode: $("#globalScenario").val() };
                req.scenarioCode = (req.scenarioCode) ? req.scenarioCode : "DEFAULT";
                ajaxSearch = jQuery.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    url: ErmesManager.BasePath + "ermes/recherche/Search.svc/SolrSuggest",
                    data: JSON.stringify(req),
                    success: function(data) {
                        if (!ErmesManager.checkResponse(data)) { return; }
                        if (data.d != null && typeof(data.d) !== 'undefined' && typeof(data.d.SearchInfo) !== 'undefined' && typeof(data.d.SearchInfo.PazPar2Info) !== 'undefined') { ErmesManager.EnableTypewatch = false; return; }
                        if (data.d != null && typeof(data.d) !== 'undefined') { cb(data.d.Suggestions); }
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) { $("#error").html(XMLHttpRequest.responseText); }
                });
            }
        });
    };
    pub.convertTagCloudJson = function(input) { return $.map(input, function(item) { return { label: item.Label, value: item.Label }; }); };
    pub.convertSelectionsJson = function(input) { return $.map(input, function(item) { return { label: item.SelName, value: item.SelUid }; }); };
    pub.getCurrentItemIdentifiers = function(controlElement) {
        var data = controlElement.closest("div.notice").data("result");
        var ids = {};
        if (!ErmesManager.isDefined(data.Resource)) { return null; }
        ids.RscUid = data.Resource.RscUid;
        if (ids.RscUid === 0 || typeof(ids.RscUid) === "undefined") {
            ids.RscBase = data.Resource.RscBase;
            ids.RscDocId = data.Resource.RscId;
        }
        return ids;
    };
    pub.checkResponse = function(jsonData, silent) {
        if (ErmesManager.isNullOrEmpty(jsonData) || typeof(jsonData.d) === "undefined") {
            if (!silent) { pub.notify(ErmesManager.labels.UnexpectedServerResponse, { "theme": "growlError" }); }
            return false;
        }
        if (typeof(jsonData.message) !== "undefined" && jsonData.message !== "") { if (!silent) { pub.notify(jsonData.message); } }
        if (typeof(jsonData.success) !== "undefined" && jsonData.success === false) {
            try { if (!silent) { pub.notify(jsonData.errors[0].msg, { "theme": "growlError", "sticky": true }); } } catch (e) {}
            $(".ajax-loader-big").remove();
            return false;
        }
        return true;
    };
    pub.showMessage = function(errors) { $("<div></div>").text(errors[0].msg).dialog({ title: ErmesManager.labels.GrowlErrorTitle, modal: true, buttons: { Ok: function() { $(this).dialog("close"); } } }); };
    pub.notify = function(msg, options) {
        var params = {
            position: "bottom-right",
            beforeOpen: function(e, m, o) {
                var $this = $(this);
                $this.attr("role", "alert");
            }
        };
        if (options) { params = $.extend(params, options); }
        if (ErmesManager.ErmesJgrowlParams) { params = $.extend(params, $.parseJSON(ErmesManager.ErmesJgrowlParams)); }
        $.jGrowl.defaults.closerTemplate = "<div>[ " + ErmesManager.labels.JGrowlCloserMessage + " ]</div>";
        $.jGrowl(msg, params);
    };
    pub.isDefined = function(o) { return (typeof(o) !== "undefined" && o !== null); };
    pub.isNullOrEmpty = function(o) { return (o === null || typeof(o) === "undefined" || o === ""); };
    pub.searchString = function(arrayToSearch, stringToSearch) {
        arrayToSearch.sort();
        for (var i = 0; i < arrayToSearch.length; i++) { if (arrayToSearch[i] === stringToSearch) { return true; } }
        return false;
    };
    pub.serializeObject = function(self) {
        var o = {};
        var a = $(self).serializeArray();
        $.each(a, function() {
            if (typeof(this.value) !== "undefined" && this.value !== "") {
                if (o[this.name]) {
                    if (!o[this.name].push) { o[this.name] = [o[this.name]]; }
                    o[this.name].push(this.value || '');
                } else { o[this.name] = [this.value || '']; }
            }
        });
        return o;
    };
    pub.findClosestContainer = function(self) {
        var $container = $(self).closest("div.searchContainer");
        if ($container.length !== 0) { return $container; } else { return $("body").find("div.searchContainer:first"); }
    };
    pub.displayForm = function($target, scenarioCode) {
        var params = { "query": { "ScenarioCode": scenarioCode } };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/Search.svc/GetForm" + ErmesManager.WsQueryString,
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                $target.html(json.d);
            }
        });
    };
    pub.saveCookieValue = function(cookieName, key, value) {
        if ((typeof(key) === "undefined") || (typeof(cookieName) === "undefined")) { return; }
        if ((key.length === 0) || (cookieName.length === 0)) { return; }
        var jsonCookie = null;
        jsonCookie = JSON.parse($.cookie(cookieName));
        if (jsonCookie === null) { jsonCookie = {}; }
        jsonCookie[key] = value;
        $.cookie(cookieName, JSON.stringify(jsonCookie), ErmesManager.cookieOptions);
    };
    pub.getCookieValue = function(cookieName, key, defaultValue) {
        if ((typeof(key) === "undefined") || (typeof(cookieName) === "undefined")) { return defaultValue; }
        if (cookieName.length === 0) { return defaultValue; }
        var jsonCookie = null;
        jsonCookie = JSON.parse($.cookie(cookieName));
        if (jsonCookie === null) { jsonCookie = {}; }
        if (key === '') { return jsonCookie; }
        value = jsonCookie[key];
        value = typeof(value) === "undefined" ? defaultValue : value;
        return value;
    };
    pub.cookieOptions = { path: '/', expires: 0 };
    pub.initTooltips = function() {
        return;
        $("ul.notice > li").each(function() {
            var $container = ErmesManager.findClosestContainer(this);
            var $this = $(this);
            var data = $container.data("form");
            var query = {};
            var ids = ErmesManager.getCurrentItemIdentifiers($this.find("div.notice_corps"));
            if (ErmesManager.isDefined(ids)) {
                query = { query: { RscUid: ids.RscUid, RscBase: ids.RscBase, RscDocId: ids.RscDocId, ScenarioCode: $("#globalScenario").val(), UseScenarioForTemplate: true } };
                $(this).qtip({
                    content: {
                        text: ErmesManager.labels.TooltipLoading,
                        ajax: {
                            url: ErmesManager.BasePath + "Ermes/Recherche/Openfind.svc/GetOpenfindRecord" + ErmesManager.WsQueryString,
                            type: 'POST',
                            data: JSON.stringify(query),
                            dataType: 'json',
                            success: function(data, status) {
                                var content = data.d.Result.CustomResult;
                                this.set('content.text', content);
                                return false;
                            }
                        }
                    },
                    position: { my: 'top left', at: 'bottom left', viewport: $(window), adjust: { x: 4, y: 0 } },
                    style: { classes: 'ui-tooltip-light ui-tooltip-shadow ui-tooltip-ermes' },
                    show: { solo: true },
                    hide: { fixed: true }
                });
            }
        });
    };
    pub.loadSearchInserts = function() {
        var searchInserts = $("div.ermes_search_model");
        var insertLength = searchInserts.length;
        for (var i = 0; i < insertLength; i++) {
            (function() {
                var $insert = $(searchInserts[i]);
                var q = { query: { InjectOpenFind: true, XslPath: "Recherche/encart_search.xslt", SearchContext: ErmesManager.SearchContexts.SearchInsert } };
                $.each($insert.find("span"), function() { q.query[$(this).attr("class")] = $(this).text(); });
                $insert.data("query", q);
                $.ajax({
                    url: ErmesManager.BasePath + "Ermes/Recherche/Search.svc/Search" + ErmesManager.WsQueryString,
                    data: JSON.stringify(q),
                    success: function(json) {
                        var rss = "<li class=\"visible-md visible-lg\"><a target=\"_blank\" class=\"btn\" role=\"button\" title=\"" + ErmesManager.labels.RssFeedLinkTitle + "\"  href=\"" +
                            ErmesManager.BasePath + "Ermes/Recherche/Search.svc/SearchRss?q=" +
                            encodeURIComponent(JSON.stringify(q.query)) + "\"> <span class=\"cms-icon-rss icon-rss\" aria-hidden=\"true\">  </span> <span class=\"ermes-label\">" + ErmesManager.labels.RssFeedLinkTitle + "</span></a></li>";
                        if ($insert.children("div.panel-footer").find(".footer-icon-container > ul").length > 0) { $insert.children("div.panel-footer").find(".footer-icon-container > ul").append(rss); } else { $insert.children("div.panel-footer").find(".footer-icon-container").append("<ul>" + rss + "</ul>"); }
                        $insert.html(json.d.HtmlResult);
                        if (!$insert.is(":visible")) { $insert.show(); }
                        if ($insert.hasClass("chargement_async")) { $insert.toggleClass("chargement_async"); }
                        ErmesManager.processThumbnailBackground();
                        $("div.capture_images_scroll").smoothDivScroll({ visibleHotSpotBackgrounds: "always" });
                        ErmesManager.afterImgLoad(".capture_images_scroll img", function() {
                            $("div.capture_images_scroll").smoothDivScroll("recalculateScrollableArea");
                            $("div.capture_images_scroll").smoothDivScroll("showHotSpotBackgrounds");
                        });
                    }
                });
            })();
        }
    };
    pub.checkCookie = function(token) {
        window.setTimeout(function() {
            var cookieValue = $.cookie('fileDownloadToken');
            if (cookieValue == token) { $('#pdf_loading').modal('hide'); } else { ErmesManager.checkCookie(token); }
        }, 500);
    };
    pub.initRoyalSlider = function(selector) {
        $(selector).each(function() {
            var center = true;
            var centerArea = 0.33;
            if ($(this).find(".rsContent").length < 3) {
                center = false;
                centerArea = 0.5;
            }
            $(this).royalSliderAccessible({ autoScaleSlider: true, slidesSpacing: 0, arrowsNav: true, loop: true, controlNavigation: 'bullets', randomizeSlides: false, slidesOrientation: 'horizontal', labels: { rsNavSelected: ErmesManager.labels.RoyalSliderLabels_NavSelected }, visibleNearby: { enabled: true, centerArea: centerArea, center: center, breakpoint: 650, breakpointCenterArea: 1, navigateByCenterClick: true } });
            setTimeout(function() { $('.royalSlider').royalSlider('updateSliderSize', true); }, 100);
        });
    };
    pub.initRoyalSliderTips = function(selector) { $(selector).qtip({ position: { my: 'top left', at: 'bottom left', viewport: $(window), adjust: { x: 4, y: 0 } }, style: { width: 250, classes: 'ui-tooltip-light ui-tooltip-shadow ui-tooltip-ermes' }, show: { solo: true }, hide: { fixed: true } }); };
    pub.initAgendaDatepicker = function(selector) {
        var datesToHighlight = [],
            datesCount = {},
            $selector = $(selector),
            $container = ErmesManager.findClosestContainer($selector),
            data = $container.data('form'),
            searchQuery = data.Query.query,
            scenario = searchQuery.ScenarioCode,
            startDate = $.datepicker.parseDate('yy/m/d', searchQuery.StartDateFilter || ''),
            endDate = $.datepicker.parseDate('yy/m/d', searchQuery.EndDateFilter || '');
        if (!$selector.length) { return; }

        function getDates(month, year) {
            $.ajax({
                url: ErmesManager.BasePath + 'Ermes/Recherche/Search.svc/GetCalendarDates',
                data: JSON.stringify({ query: { Month: month, Year: year, ScenarioCode: scenario, SearchQuery: searchQuery } }),
                async: false,
                success: function(result) {
                    datesToHighlight = result.d.Events;
                    datesCount = result.d.EventCounts;
                }
            });
        }

        function selectDay(year, month, day) {
            var dateParsed = $.datepicker.parseDate('yy/m/d', year + '/' + (month + 1) + '/' + day);
            if (!startDate || (startDate && endDate)) {
                startDate = dateParsed;
                endDate = null;
            } else if (!endDate && (dateParsed < startDate)) {
                endDate = startDate;
                startDate = dateParsed;
            } else { endDate = dateParsed; }
            $("#agenda-datepicker-start").val($.datepicker.formatDate('d/m/yy', startDate));
            $("#agenda-datepicker-end").val($.datepicker.formatDate('d/m/yy', endDate));
            if (startDate && endDate) {
                data.Query.query.StartDateFilter = $.datepicker.formatDate('yy/m/d', startDate);
                data.Query.query.EndDateFilter = $.datepicker.formatDate('yy/m/d', endDate);
                data.doSearch($container);
            }
        }
        var currentDate = ErmesManager.CurrentCalendarDate || new Date();
        getDates(currentDate.getMonth() + 1, currentDate.getFullYear());
        $("#agenda-datepicker-start").val($.datepicker.formatDate('d/m/yy', startDate));
        $("#agenda-datepicker-end").val($.datepicker.formatDate('d/m/yy', endDate));
        var changeCellTitles = function() {
            clearTimeout(changeCellTitles.timeout);
            if ($('.ui-datepicker-calendar', $selector).is(':visible')) {
                $selector.find('td.ui-state-event').each(function() {
                    var $this = $(this),
                        title = $this.prop('title');
                    if (title) {
                        $this.removeAttr('title');
                        $this.find('a:first').attr('title', title);
                    }
                });
            } else { changeCellTitles.timeout = setTimeout(changeCellTitles, 100); }
        };
        $selector.datepicker({
            changeMonth: true,
            changeYear: true,
            defaultDate: currentDate,
            onSelect: function(dateText, inst) { selectDay(inst.selectedYear, inst.selectedMonth, inst.selectedDay); },
            beforeShowDay: function(date) {
                var day = 'x' + date.getDate() + '_' + (date.getMonth() + 1) + '_' + date.getFullYear(),
                    formattedDate = date.getFullYear() + '/' + (date.getMonth() + 1) + '/' + date.getDate();
                if ((startDate && (startDate.getTime() === date.getTime())) || (endDate && (endDate.getTime() === date.getTime()))) { if (datesCount[day] >= 1) { return [false, 'ui-state-highlight-event']; } else { return [false, 'ui-state-highlight-no-event']; } } else if (date > startDate && date < endDate) { if (datesCount[day] >= 1) { return [true, 'ui-state-dateRange-event']; } else { return [true, 'ui-state-dateRange-no-event']; } } else if ($.inArray(day, datesToHighlight) == -1) { return [true, '']; } else if (datesCount[day] > 1) { return [true, 'ui-state-event', date.getDate() + ' - ' + datesCount[day] + ' ' + ErmesManager.labels.CalendarEventTitlePlural]; } else { return [true, 'ui-state-event', date.getDate() + ' - ' + datesCount[day] + ' ' + ErmesManager.labels.CalendarEventTitleSingular]; }
            },
            onChangeMonthYear: function(year, month, inst) {
                ErmesManager.CurrentCalendarDate = new Date(year, month - 1);
                getDates(month, year);
                setTimeout(changeCellTitles, 100);
            },
            beforeShow: function(input, instr) { setTimeout(changeCellTitles, 100); }
        });
        $selector.qtip({ content: ErmesManager.labels.AgendaCalendarHelpTooltip, position: { my: 'bottom center', at: 'top center' }, style: { classes: 'ui-tooltip-dark ui-tooltip-shadow' }, show: { target: $("#agenda-datepicker-help i") }, hide: { target: $("#agenda-datepicker-help i") } });
    };
    pub.gp_preloadAppLaunch = function(id) { $.ajax({ url: ErmesManager.gp_PortalLaunchBaseUri + 'Resource/' + id, dataType: 'jsonp', success: function(data) { if (!ErmesManager.checkResponse(data)) { return; } }, error: function(xhr, textStatus, errorThrown) { ErmesManager.notify(xhr.responseText); }, timeout: 30000 }); return false; };
    pub.gp_launchApp = function(id) {
        $(".gp_launch").prop("disabled", "disabled");
        $.ajax({
            url: ErmesManager.gp_PortalLaunchBaseUri + 'Launch/' + id,
            dataType: 'jsonp',
            success: function(data) { $(".gp_launch").removeProp("disabled"); var json = JSON.parse(data); if (!ErmesManager.checkResponse(json)) { return; } },
            error: function(xhr, textStatus, errorThrown) {
                $(".gp_launch").removeProp("disabled");
                ErmesManager.notify(xhr.responseText);
            },
            timeout: 30000
        });
        return false;
    };
    pub.checkEmptyTabs = function() {
        var $detailTabs = $('.detail-tab'),
            tabId, $firstTabAnchor, $firstTab;
        for (var i = 0, len = $detailTabs.length; i < len; ++i) {
            tabId = $($detailTabs[i]).attr('href');
            if (!$.trim($(tabId).text())) {
                $($detailTabs[i]).closest('li').remove();
                $(tabId).remove();
            }
        }
        if ($('.detail-tab').length) {
            $firstTabAnchor = $('.detail-tab:first');
            $firstTabAnchor.tab('show');
        } else {
            $('#myTabContent').remove();
            $('ul.nav-tabs', '#notice_longue_description').remove();
        }
        return false;
    };
    return pub;
}(ErmesManager || {}));
ErmesManager.BaseForm = {
    Query: { query: { Page: 0, ResultSize: ErmesManager.getCookieValue(ErmesManager.COOKIES_FORM, "resultSize", 10) } },
    PreviousQuery: { query: { Page: 0, ResultSize: ErmesManager.getCookieValue(ErmesManager.COOKIES_FORM, "resultSize", 10) } },
    Result: {},
    Info: {},
    toJson: function($form) {
        var jsonObject = {},
            jsonString = {};
        $form.each(function() {
            jsonObject = ErmesManager.serializeObject($(this));
            jsonString = JSON.stringify(jsonObject);
        });
        return jsonString.replace(new RegExp("\\[\\]", "g"), "");
    },
    doSearch: function($container) { return false; },
    getHoldingsFull: function($container, data) {
        var url = ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/GetHoldings" + ErmesManager.WsQueryString;
        if (ErmesManager.CurrentSearchType !== ErmesManager.SearchType.Detail && ErmesManager.CurrentSearchType !== ErmesManager.SearchType.DetailStatic) { url = ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/GetListHoldings" + ErmesManager.WsQueryString; }
        $.ajax({
            url: url,
            data: JSON.stringify(data),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                if (json.d === null) { $('#detail-holdings').html(""); return; }
                $('#detail-holdings').html(json.d.HtmlView);
                $('#detail-holdings-abstract').html(json.d.ItemHoldingsDataHtmlView);
                $.each(json.d.Holdings, function(index, value) {
                    var $holdings = $('.holding-item[data-id=' + value.HoldingId + ']', '.detail-holds,.detail-holds-transmissible');
                    $.each($holdings, function(holdingIndex, holdingValue) { $(holdingValue).data("result", value); });
                    $('#holding-reservation-title').data("result", value);
                });
                var $multipleSelect = $("#detail-holdings").find(".multiple-reservation-mad"),
                    $multipleResa = $("#detail-holdings").find(".multiple-reservation");
                if ($multipleSelect.length) { $multipleSelect.qtip({ content: ErmesManager.labels.HoldingHelpHoldingPlace, position: { my: 'bottom center', at: 'top center' }, style: { classes: 'ui-tooltip-dark ui-tooltip-shadow' }, show: { target: $("#detail-holdings .holding-help") }, hide: { target: $("#detail-holdings .holding-help") } }); }
                if ($multipleResa.length) { $multipleResa.qtip({ content: ErmesManager.labels.HoldingHelpHoldingMultiple, position: { my: 'bottom left', at: 'top right' }, style: { classes: 'ui-tooltip-dark ui-tooltip-shadow' }, show: { target: $("#detail-holdings .holding-help") }, hide: { target: $("#detail-holdings .holding-help") } }); }
                try { if (typeof(resourceEditor) != "undefined") { resourceEditor.refresh(); } } catch (err) {}
                if (ErmesManager.CurrentSearchType !== ErmesManager.SearchType.Detail && ErmesManager.CurrentSearchType !== ErmesManager.SearchType.DetailStatic) {
                    $("#modal-holdings").modal();
                    $("a.obtain-document-link").prop("disabled", false).removeClass("input_disabled");
                }
            }
        });
    },
    getHoldings: function($container) {
        var callback = function(json) {
            ErmesManager.checkResponse(json);
            $(".notice .statut-loading").hide();
            if (json.d === null) { return; }
            ErmesManager.callback.displayMosaic.setMosaicDisplay();
            $.each(json.d, function() {
                var itemJson = this;
                var $targetDiv = $("#rscId_" + itemJson.Id.RscId + "_" + itemJson.Id.Docbase, "#resultats");
                $targetDiv.siblings(".statut:first").html(itemJson.HtmlView);
                $targetDiv.find(".statut:first").html(itemJson.HtmlView);
            });
            try { if (typeof(resourceEditor) != "undefined") { resourceEditor.refresh(); } } catch (err) {}
        };
        var Holds = { RecordIdArray: [], searchQuery: this.Query.query };
        $.each(this.Result, function() { if (typeof(this.Resource) != "undefined") { Holds.RecordIdArray.push({ RscId: this.Resource.RscId, Docbase: this.Resource.RscBase, PazPar2Id: this.Recid, RscType: this.Resource.Frmt }); } });
        $.ajax({ url: ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/CheckAvailability" + ErmesManager.WsQueryString, data: JSON.stringify(Holds), success: callback });
        Holds = { RecordIdArray: [], searchQuery: this.Query.query };
        $.each(this.Result, function() { if (typeof(this.GroupedResults) !== "undefined") { $.each(this.GroupedResults, function() { if (ErmesManager.isDefined(this.Identifiers)) { Holds.RecordIdArray.push({ RscId: this.Identifiers.RscId, Docbase: this.Identifiers.Docbase, PazPar2Id: this.Recid }); } }); } });
        if (Holds.RecordIdArray.length > 0) { $.ajax({ url: ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/CheckAvailability" + ErmesManager.WsQueryString, data: JSON.stringify(Holds), success: callback }); }
    },
    getEnrichment: function($container, query) {
        var self = this;
        var ajaxMore;
        if (typeof(ajaxMore) != "undefined") { ajaxMore.abort(); }
        ajaxMore = $.ajax({
            ifModified: true,
            cache: true,
            async: true,
            url: ErmesManager.BasePath + "Ermes/Recherche/Sarasvati.svc/More" + ErmesManager.WsQueryString,
            data: JSON.stringify({ "query": query.query }),
            success: function(json) {
                ErmesManager.checkResponse(json);
                if (json.d != null && json.d.HtmlResult != null) {
                    $("#enrichissements").html(json.d.HtmlResult);
                    self.EnrichmentLoaded = true;
                    $('#tab-more-wip').hide();
                    $('.displayINAVideoEvent').live('click', function(a, b, c) {
                        var videoContainerId = $(this).parents("li.ina_listSelection").data('id');
                        var html = $('#' + videoContainerId).html();
                        $('#INA_main_video').html(html);
                        return false;
                    });
                    if (json.d.HtmlResult != "") { $('#tab-more-dispo').show(); }
                } else { $('#tab-more-wip').hide(); }
            }
        });
    },
    getComments: function($container, params) {
        $(".notice_avis").prepend('<i class="icon-spin animate-spin"/>')
        var callback = function() { $(".notice_avis .icon-spin").remove(); if ($('#avis_lecteurs ul li').length == 0) { $("#avis_lecteurs").remove(); } }
        $.ajax({
            ifModified: true,
            cache: true,
            async: true,
            type: 'POST',
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/GetComments" + ErmesManager.WsQueryString,
            data: JSON.stringify(params),
            success: function(json) {
                ErmesManager.checkResponse(json);
                if (json.d != null && json.d.HtmlResult != null) {
                    $("#avis_lecteurs").html(json.d.HtmlResult);
                    if (json.d.ReviewsLibflyCount > 0) {
                        $(".notice_avis .icon-spin").remove();
                        $(".notice_avis i[class^='icon-star']").remove();
                        for (var i = json.d.AverageRating; i < 5; ++i) { $(".notice_avis").prepend("<i class=\"icon-star-empty\"> </i>"); }
                        for (var i = 0; i < json.d.AverageRating; ++i) { $(".notice_avis").prepend("<i class=\"icon-star\"> </i>"); }
                        $(".notice_avis .avis").append(json.d.ReviewsLibflyLabel);
                    } else { callback(); }
                } else { callback(); }
            },
            error: function() { callback(); }
        });
    }
};
ErmesManager.services = (function() {
    var self = this;
    var pub = {};
    pub.retrieveShortAccount = function(code) {
        params = { codeConfig: code, xslPath: "Services/MyShortAccount.xslt" };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/RetrieveShortAccount" + ErmesManager.WsQueryString,
            type: 'POST',
            async: true,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            timeout: 60000,
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                $('#MyShortAccount').html(json.d.HtmlView);
            }
        });
    };
    pub.retrieveAccount = function(code) {
        params = { codeConfig: code };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/RetrieveAccount" + ErmesManager.WsQueryString,
            type: 'POST',
            async: true,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            timeout: 60000,
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                $('#MyAccount').html(json.d.HtmlResult);
                var $items = $('.Loan');
                $.each(json.d.ClientAccount.Loans, function(index, value) { $($items[index]).data("result", value); });
                $items = $('.Reservation');
                $.each(json.d.ClientAccount.Reservations, function(index, value) { $($items[index]).data("result", value); });
            }
        });
    };
    pub.PlaceTitleReservation = function() {
        $(this).closest(".modal").modal("hide");
        var holdingItem = $('#holding-reservation-title').data("result");
        if ($("#detail-holdings .multiple-reservation-mad").length) { holdingItem.HoldingPlace = $("#detail-holdings .multiple-reservation-mad").val(); }
        var callUrl = ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/PlaceReservation";
        var payLoad = { "HoldingItem": holdingItem };
        var cbFunc = function() {
            $.ajax({
                url: callUrl,
                type: 'POST',
                async: true,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                timeout: 60000,
                data: JSON.stringify(payLoad),
                success: function(json) {
                    if (!ErmesManager.checkResponse(json)) { return; }
                    ErmesManager.googleAnalytics.trackEvent(ErmesManager.googleAnalytics.Categories.Recherche.label, ErmesManager.googleAnalytics.Categories.Recherche.actions.Reservation.label, JSON.stringify(holdingItem));
                }
            });
            return false;
        }
        if (!ErmesManager.config.HoldingActions.NoteEnabled) { cbFunc(); } else {
            bootbox.prompt({
                title: ErmesManager.labels.HoldingAddNoteModalTitle,
                placeholder: ErmesManager.labels.HoldingAddNoteModalPlaceholder,
                inputType: "textarea",
                callback: function(result) {
                    if (result !== null) {
                        if (result != '') {
                            callUrl = ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/PlaceReservationWithContext";
                            payLoad.actionContext = { "Notes": result };
                        }
                        cbFunc();
                    }
                }
            });
        }
    };
    pub.PlaceReservation = function(holdingItem, $domItem) {
        if ($("#detail-holdings .multiple-reservation-mad").length) { holdingItem.HoldingPlace = $("#detail-holdings .multiple-reservation-mad").val(); }
        var callUrl = ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/PlaceReservation";
        var payLoad = { "HoldingItem": holdingItem };
        var cbFunc = function() {
            $.ajax({
                url: callUrl,
                type: 'POST',
                async: true,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                timeout: 60000,
                data: JSON.stringify(payLoad),
                success: function(json) {
                    if (!ErmesManager.checkResponse(json)) { return; }
                    $domItem.remove();
                    ErmesManager.googleAnalytics.trackEvent(ErmesManager.googleAnalytics.Categories.Recherche.label, ErmesManager.googleAnalytics.Categories.Recherche.actions.Reservation.label, JSON.stringify(holdingItem));
                }
            });
            return false;
        }
        if (!ErmesManager.config.HoldingActions.NoteEnabled) { cbFunc(); } else {
            bootbox.prompt({
                title: ErmesManager.labels.HoldingAddNoteModalTitle,
                placeholder: ErmesManager.labels.HoldingAddNoteModalPlaceholder,
                inputType: "textarea",
                callback: function(result) {
                    if (result !== null) {
                        if (result != '') {
                            callUrl = ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/PlaceReservationWithContext";
                            payLoad.actionContext = { "Notes": result };
                        }
                        cbFunc();
                    }
                }
            });
        }
    };
    pub.PlaceMultipleReservation = function() {
        var holdings = $("#detail-holdings .holding-item :checked").closest(".holding-item").map(function() { return $(this).data("result") });
        if (!holdings.length) { return false; }
        if ($("#detail-holdings .multiple-reservation-mad").length) { holdings[0].HoldingPlace = $("#detail-holdings .multiple-reservation-mad").val(); }
        var callUrl = ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/PlaceMultipleReservation";
        var payLoad = { "HoldingItems": holdings.toArray() };
        var cbFunc = function() {
            $.ajax({
                url: callUrl,
                type: 'POST',
                async: true,
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                timeout: 60000,
                data: JSON.stringify(payLoad),
                success: function(json) {
                    if (!ErmesManager.checkResponse(json)) { return; }
                    ErmesManager.googleAnalytics.trackEvent(ErmesManager.googleAnalytics.Categories.Recherche.label, ErmesManager.googleAnalytics.Categories.Recherche.actions.Reservation.label, JSON.stringify(holdings.toArray()));
                }
            });
            return false;
        }
        if (!ErmesManager.config.HoldingActions.NoteEnabled) { cbFunc(); } else {
            bootbox.prompt({
                title: ErmesManager.labels.HoldingAddNoteModalTitle,
                placeholder: ErmesManager.labels.HoldingAddNoteModalPlaceholder,
                inputType: "textarea",
                callback: function(result) {
                    if (result !== null) {
                        if (result != '') {
                            callUrl = ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/PlaceMultipleReservationWithContext";
                            payLoad.actionContext = { "Notes": result };
                        }
                        cbFunc();
                    }
                }
            });
        }
    };
    pub.PlaceProvision = function(holdingItem, $domItem, place) {
        var query = { HoldingItem: holdingItem };
        if (ErmesManager.isDefined(place)) { query.place = place; }
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/PlaceProvision",
            type: 'POST',
            async: true,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            timeout: 60000,
            data: JSON.stringify(query),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                $domItem.remove();
            }
        });
        return false;
    }
    return pub;
}());
ErmesManager.googleAnalytics = (function() {
    var self = this;
    var pub = {};
    pub.Categories = { "Recherche": { "label": "Recherche", "actions": { "Recherche": { "label": "Nouvelle recherche" }, "DetailNotice": { "label": "Consultation notice" }, "Reservation": { "label": "Réservation" }, "AjoutCommentaire": { "label": "Ajout de commentaire" }, "AjoutPanier": { "label": "Mise en panier" } } }, "ServicesLecteur": { "label": "Services aux lecteurs", "actions": { "NavCompteLecteur": { "label": "Consultation compte lecteur" }, "ProlongPret": { "label": "Prolongation de prêt(s)" }, "SuppResa": { "label": "Annulation de réservation(s)" } } } };
    pub.trackEvent = function(category, action, opt_label, opt_value, opt_noninteraction) {
        if (typeof(ga) != "undefined") {
            ga('send', 'event', category, action, opt_label);
            ga('archimedTracker.send', 'event', category, action, opt_label);
        }
    };
    pub._trackPageview = function(url) {
        if (typeof(ga) != "undefined") {
            ga('send', 'pageview', url);
            ga('archimedTracker.send', 'pageview', url);
        }
    };
    return pub;
}());
ErmesManager.navigation = (function() {
    var self = this;
    var pub = {};
    var outerDocument = top;
    pub.replace = function(url) { outerDocument.location.replace(url); };
    pub.assign = function(url) { outerDocument.location.assign(url); };
    pub.reload = function(forceGet) { window.location.reload(forceGet); };
    return pub;
}());
ErmesManager.selection = (function() {
    var state = 0;
    var pub = {};
    pub.options = { async: true };
    pub.List = [];
    pub.clear = function() {
        $.ajax({
            async: pub.options.async,
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/LightSelectionClear",
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.selection.List = [];
                ErmesManager.selection.refreshControl();
                ErmesManager.selection.checkSelectedItems();
            }
        });
    };
    pub.addToBasket = function() { $.ajax({ url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/LightSelectionAddToBasket", success: function(json) { if (!ErmesManager.checkResponse(json)) { return; } } }); };
    pub.deleteItem = function(index) { ErmesManager.selection.toggleItem(ErmesManager.selection.List[index]); };
    pub.toArray = function() { return this.List; };
    pub.load = function() {
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/GetLightSelection" + ErmesManager.WsQueryString,
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.selection.List = json.d;
                ErmesManager.selection.refreshControl();
            }
        });
    };
    pub.toggleItem = function(item) {
        var params = { resIdentifier: { RscUid: item.RscUid, RscBase: item.RscBase, RscDocId: item.RscId } };
        $.ajax({
            async: pub.options.async,
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/LightSelectionToggleItem",
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.selection.List = json.d;
                ErmesManager.selection.refreshControl();
                ErmesManager.selection.checkSelectedItems();
                ErmesManager.callback.selection.showSelection();
            }
        });
    };
    pub.addItem = function(item) {
        for (var i = 0; i < pub.List.length; ++i) { if (pub.List[i].RscUid === item.RscUid) { return false; } }
        pub.toggleItem(item);
        return true;
    };
    pub.toggleItems = function(items) {
        var identifiers = [];
        $.each(items, function() { if (ErmesManager.isDefined(this.Resource)) { identifiers.push({ RscUid: this.Resource.RscUid, RscBase: this.Resource.RscBase, RscDocId: this.Resource.RscId }); } });
        var query = { items: identifiers };
        $.ajax({
            async: pub.options.async,
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/LightSelectionToggleItems",
            data: JSON.stringify(query),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.selection.List = json.d;
                ErmesManager.selection.refreshControl();
                ErmesManager.selection.checkSelectedItems();
                ErmesManager.callback.selection.showSelection();
            }
        });
    };
    pub.toggleFloating = function(item) {};
    pub.refreshControl = function() {
        if ($("#multi_selection_simple").length > 0) { $("#multi_selection_simple").html($("#selectionTmpl").tmpl({ "item": ErmesManager.selection.toArray() })); } else {
            $("#multi_selection").html($("#selectionTmpl").tmpl({ "item": ErmesManager.selection.toArray() }));
            var $multiSelecChild = $("#multi_selection").children("div.global_content");
            $multiSelecChild.removeClass("sel_reduced").addClass("sel_enlarged");
            $multiSelecChild.find("div.panel-body").removeAttr("style");
            $multiSelecChild.find("div.panel-footer").removeAttr("style");
        }
        $(".selection_label", "#multi_selection_simple").addClass("ermes-label");
        $(".selection_label", "#multi_selection").removeClass("ermes-label");
    };
    pub.checkSelectedItems = function() {
        $("input:checkbox", "#resultats ul.notice li[id!=''], .ajouter_selection").attr('checked', false);
        $(".checkItemInSelection", "#resultats ul.notice li[id!=''], .ajouter_selection").attr('class', 'checkItemOutSelection');
        for (var item in ErmesManager.selection.List) {
            var notice = ErmesManager.selection.List[item];
            if (ErmesManager.CurrentSearchType !== ErmesManager.SearchType.Detail && ErmesManager.CurrentSearchType !== ErmesManager.SearchType.DetailStatic) {
                $("#rscId_" + notice.RscId + "_" + notice.RscBase, "#resultats").find('.checkItemOutSelection').attr('class', 'checkItemInSelection');
                $("#rscId_" + notice.RscId + "_" + notice.RscBase, "#resultats").closest("li.search-item, li.panier").find("input").attr('checked', true);
            } else { $("#rscId_" + notice.RscId + "_" + notice.RscBase, "#notice_longue").find("li.ajouter_selection input").attr('checked', true); }
        }
    };
    return pub;
}());
ErmesManager.event = (function() {
    var pub = {};
    pub.onSearchComplete = function(event, $container) {
        var $scenarioDropDown = $("#globalScenario");
        if ($scenarioDropDown.length !== 0) {
            var data = $($container).data("form");
            if (data.Query.query.ScenarioCode || data.Query.query.SearchQuery) {
                var scenarioCode = data.Query.query.ScenarioCode || data.Query.query.SearchQuery.ScenarioCode;
                $("option", $scenarioDropDown).attr("selected", false);
                if ($("option[value='" + scenarioCode + "']", $scenarioDropDown).length <= 0 || $("li a[data-scenario='" + scenarioCode + "']", $("#globalScenarioMobile")).length <= 0) {
                    $scenarioDropDown.append('<option value=' + scenarioCode + '>' + scenarioCode + '</option>');
                    $("#globalScenarioMobile").append("<li role='presentation'><a data-scenario='" + scenarioCode + "' data-original-title='" + scenarioCode + "' href='#' role='menuitem' tabindex='-1'>" + scenarioCode + "</a></li>");
                    $("#globalScenarioMobile li>a[data-scenario='" + scenarioCode + "']").click(ErmesGUI.callback.setScenarioMobile);
                }
                $("option[value='" + scenarioCode + "']", $scenarioDropDown).attr("selected", true);
                $("#globalScenarioMobile").find("[data-scenario]").removeClass('active');
                $("#globalScenarioMobile").find("[data-scenario='" + scenarioCode + "']").addClass('active');
                $("#scenario-selected-label").text($("#globalScenarioMobile").find("[data-scenario='" + scenarioCode + "']").text());
            }
            ErmesGUI.callback.saveScenario.call($scenarioDropDown);
        }
        ErmesManager.selection.refreshControl();
        ErmesManager.selection.checkSelectedItems();
        try { if (typeof(resourceEditor) != "undefined") { resourceEditor.refresh(); } } catch (err) {}
        $($container).trigger("searchHtmlLoaded");
        ErmesManager.processAmazonCopyright();
        ErmesManager.processThumbnailBackground();
        $($container).fadeTo(0, 1);
    };
    pub.launchSearchByAttribute = function() {
        var searchId = $(this).attr("data-searchid");
        var searchLabel = $(this).attr("data-searchLabel") || "";
        if (searchLabel.length === 0) { searchLabel = ErmesManager.labels.searchLabelDefault || "Recherche du document"; }
        var urlRedirect = location.protocol + "//" + location.hostname + (location.port ? ":" + location.port : "");
        var querySearch = ErmesManager.BasePath.concat("search.aspx?SC=DEFAULT&QUERY=", searchId, "&Detail_MODE=false&QUERY_LABEL=", searchLabel);
        urlRedirect = urlRedirect.concat(querySearch);
        window.location.href = urlRedirect;
    };
    return pub;
}());
ErmesManager.callback = (function() { var pub = {}; return pub; }());
ErmesManager.callback.selection = (function() {
    var pub = {};
    pub.toggleItemIntoSelection = function() {
        var index = $(this).closest("li.on").index();
        var data = ErmesManager.findClosestContainer(this).data("form");
        var item = data.Result[index].Resource;
        ErmesManager.selection.toggleItem(item);
        return false;
    };
    pub.showSelection = function() {
        var $selection = $("#multi_selection_simple");
        if ($selection.length > 0) {
            $selection.attr("id", "multi_selection");
            var $selectionChild = $selection.children("div.global_content");
            $selectionChild.removeClass("sel_reduced").addClass("sel_enlarged");
            $selectionChild.find("div.panel-body").removeAttr("style");
            $selectionChild.find("div.panel-footer").removeAttr("style");
            $selectionChild.find(".selection_label").removeClass("ermes-label");
        }
        return false;
    };
    pub.removeSelectionItem = function() {
        var $this = $(this);
        ErmesManager.selection.deleteItem($this.attr("data-index"));
        return false;
    };
    pub.clearSelection = function(callback) {
        var $modal = $("#confirm_dialog_selection");
        $("#selection_modal_confirm", $modal).off("click");
        $modal.modal();
        $("#selection_modal_confirm").on("click", function() {
            ErmesManager.selection.clear();
            $modal.modal("hide");
            if (callback && typeof(callback) == "function") { callback.apply(this, Array.prototype.slice.call(arguments, 1)); }
        });
        return false;
    };
    pub.addSelectionToBasket = function() { ErmesManager.selection.addToBasket(); return false; };
    pub.bindToSelections = function() { $("#manageSelectionsForm").data("result", ErmesManager.selection.toArray()).modal("show"); return false; };
    pub.removeFromSelection = function() {
        ErmesManager.selection.deleteItem($(this).closest("li").attr("id"));
        if ($("#multi_selection_simple").length > 0) { $("#multi_selection_simple").html($("#selectionTmpl").tmpl({ "item": ErmesManager.selection.toArray() })); } else { $("#multi_selection").html($("#selectionTmpl").tmpl({ "item": ErmesManager.selection.toArray() })); }
        ErmesManager.selection.save();
    };
    pub.toggleSelection = function() {
        var $selection = $("#multi_selection_simple"),
            $selectionChild;
        if ($selection.length > 0) {
            $selection.attr("id", "multi_selection");
            $selectionChild = $selection.children("div.global_content");
            $selectionChild.removeClass("sel_reduced").addClass("sel_enlarged");
            $selectionChild.find("div.panel-body").removeAttr("style");
            $selectionChild.find("div.panel-footer").removeAttr("style");
            $selectionChild.find(".selection_label").removeClass("ermes-label");
        } else {
            $selection = $("#multi_selection");
            $selection.attr("id", "multi_selection_simple");
            $selectionChild = $selection.children("div.global_content");
            $selectionChild.removeClass("sel_enlarged").addClass("sel_reduced");
            $selectionChild.find("div.panel-body").attr("style", "display:none;");
            $selectionChild.find("div.panel-footer").attr("style", "display:none;");
            $selectionChild.find(".selection_label").addClass("ermes-label");
        }
        return false;
    };
    pub.checkAll = function(self) {
        var data = ErmesManager.findClosestContainer(self).data("form");
        var notices = [];
        var uncheckedItems = $("ul.notice > li", "#resultats").find(":checkbox:not(:checked)");
        $.each(uncheckedItems, function() {
            var index = $(this).closest("li").index();
            notices.push(data.Result[index]);
        });
        ErmesManager.selection.toggleItems(notices);
    };
    pub.uncheckAll = function(self) {
        var data = ErmesManager.findClosestContainer(self).data("form");
        var notices = [];
        var uncheckedItems = $("ul.notice > li", "#resultats").find(":checkbox:checked");
        $.each(uncheckedItems, function() {
            var index = $(this).closest("li").index();
            notices.push(data.Result[index]);
        });
        ErmesManager.selection.toggleItems(notices);
    };
    return pub;
}());
ErmesManager.callback.pagination = (function() {
    var pub = {};
    pub.previousPage = function() {
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        if (data.Query.query.Page > 0) {
            data.Query.query.Page--;
            ErmesManager.flushAjaxCalls();
            data.doSearch($container);
        }
        return false;
    };
    pub.nextPage = function() {
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        if (data.Query.query.Page < data.Info.PageMax) {
            data.Query.query.Page++;
            ErmesManager.flushAjaxCalls();
            data.doSearch($container);
        }
        return false;
    };
    pub.changePage = function() {
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var newPage = $(this).children("span").text();
        data.Query.query.Page = newPage - 1;
        ErmesManager.flushAjaxCalls();
        data.doSearch($container);
        return false;
    };
    pub.changeResultSize = function() {
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var newResultSize = $(this).val() || $(this).text();
        data.Query.query.Page = 0;
        data.Query.query.ResultSize = newResultSize;
        ErmesManager.flushAjaxCalls();
        data.doSearch($container);
        ErmesManager.saveCookieValue(ErmesManager.COOKIES_FORM, "resultSize", newResultSize);
        return false;
    };
    return pub;
}());
ErmesManager.callback.tag = (function() {
    var pub = {};
    pub.removeTagResource = function() {
        var $this = $(this);
        var ids = ErmesManager.getCurrentItemIdentifiers($this);
        if (!ErmesManager.isDefined(ids)) { return false; }
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var tagUid = $this.attr("data-selectionId");
        var params = { "resIdentifier": { "RscUid": ids.RscUid, "RscBase": ids.RscBase, "RscDocId": ids.RscDocId }, "tagUid": tagUid };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/ResourceRemoveTag",
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                data.doSearch($container);
            }
        });
        return false;
    };
    pub.showTagForm = function() {
        var $this = $(this);
        var tags = [];
        tags = $this.closest("div.notice").data("result").Resource.Tags;
        var ids = ErmesManager.getCurrentItemIdentifiers($this);
        if (!ErmesManager.isDefined(ids)) { return false; }
        var name = "ce document";
        if ($(this).closest("div.notice").data("result").Resource.Ttl) { name = $(this).closest("div.notice").data("result").Resource.Ttl; }
        var $tagDiv = $this.closest("div.themes");
        $this.closest("div.cadre").html("<ul class='tagit_container_tag'></ul>").removeClass("cadre");
        var $tagitContainer = $tagDiv.find("ul.tagit_container_tag");
        var tagsLabel = [];
        for (var j = 0; j < tags.length; j++) { tagsLabel.push(tags[j].Label); }
        $tagitContainer.tagit({
            availableTags: function(req, add) {
                req.resIdentifier = ids;
                jQuery.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/SuggestTagsForResource",
                    data: JSON.stringify(req),
                    success: function(data) {
                        if (!ErmesManager.checkResponse(data)) { return; }
                        add(ErmesManager.convertTagCloudJson(data.d.list));
                    },
                    error: function(xhr, textStatus, errorThrown) { ErmesManager.notify(xhr.responseText); }
                });
            },
            htmlInputField: "<li class=\"tagit-new\"><input class=\"tagit-input form-control input-sm\" type=\"text\" title=\"" + ErmesManager.labels.AddNewTagName + " " + name + "\" /></li><button class=\"btn btn-sm btn-action tagit_ok\"  title=\"" + ErmesManager.labels.AddNewTagNotice + "\"><span class=\"icon-plus tagit_ok\" aria-hidden=\"true\">&#160;</span><span class=\"tagit_ok\">ok</span></button>\n"
        });
        return false;
    };
    pub.addTag = function(e) {
        if (e.keyCode === 13) {
            var $this = $(this);
            var request = { query: { Tags: [] } };
            var $container = ErmesManager.findClosestContainer(this);
            var data = $container.data("form");
            var ids = ErmesManager.getCurrentItemIdentifiers($this);
            if (!ErmesManager.isDefined(ids)) { return false; }
            request.query.RscUid = ids.RscUid;
            request.query.RscBase = ids.RscBase;
            request.query.RscDocId = ids.RscDocId;
            $.each($this.children("li.tagit-choice"), function() { request.query.Tags.push($(this).children("input").val()); });
            $.ajax({
                url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/AddTag",
                data: JSON.stringify(request),
                success: function(json) {
                    if (!ErmesManager.checkResponse(json)) { return; }
                    data.EnrichmentLoaded = false;
                    data.doSearch($container);
                }
            });
            return false;
        }
    };
    return pub;
}());
ErmesManager.callback.comment = (function() {
    var pub = {};
    pub.updateComment = function(form) { var $this = $(form); }
    pub.addComment = function(form, isDetail) {
        var $this = $(form);
        var request = { query: {} };
        var $container = ErmesManager.findClosestContainer($this);
        var data = $container.data("form");
        var result = $this.data("result");
        var controlField = true;
        var controlFieldClass = function(selector, test) {
            if (test) {
                selector.addClass("required");
                selector.parents().children('label').append("<span class='ermes-label'>" + ErmesManager.labels.ErrorModalFieldRequiredAccessibility + "</span>");
                controlField = false;
            } else { if (selector.hasClass("required")) { selector.removeClass("required"); } };
        };
        request.query.RscUid = result.Resource.RscUid;
        request.query.RscBase = result.Resource.RscBase;
        request.query.RscDocId = result.Resource.RscId || result.Resource.RscDocId;
        request.query.Title = $this.find("input[name='titre']").val();
        request.query.Message = $this.find("textarea[name='comment']").val();
        request.query.Nickname = $this.find("input[name='pseudo']").val();
        request.query.UserPlace = $this.find("input[name='ville']").val();
        request.query.Note = $this.find("input:radio[name='note']:checked").val();
        request.query.Promoted = ($("#promoted").is(":checked") ? 1 : 0);
        controlFieldClass($this.find("input[name='pseudo']"), request.query.Nickname.replace(/^\s+|\s+$/, '') === '');
        controlFieldClass($this.find("input[name='titre']"), request.query.Title.replace(/^\s+|\s+$/, '') === '');
        controlFieldClass($this.find("textarea[name='comment']"), request.query.Message.replace(/^\s+|\s+$/, '') === '');
        controlFieldClass($this.find("ul[id='note']").parent(), typeof(request.query.Note) === "undefined");
        if (controlField) {
            $this.modal('hide');
            $.ajax({
                url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/AddComment",
                data: JSON.stringify(request),
                success: function(json) {
                    if (!ErmesManager.checkResponse(json)) { return; }
                    if (ErmesManager.isDefined(data)) { data.doSearch($container); }
                }
            });
            ErmesManager.googleAnalytics.trackEvent(ErmesManager.googleAnalytics.Categories.Recherche.label, ErmesManager.googleAnalytics.Categories.Recherche.actions.AjoutCommentaire.label, result.Resource.Ttl);
        }
        return false;
    };
    pub.showAddCommentForm = function() {
        var result = $(this).closest("div.notice").data("result");
        $("#addCommentForm").data("result", result).modal();
        $("#addCommentForm ul.accessible-rating-star").accessibleRating();
        return false;
    };
    pub.commonDeleteComment = function(uid, callback) { $.ajax({ url: ErmesManager.BasePath + "Ermes/Contributions/CommentAdminService.svc/Delete", data: JSON.stringify({ commentUids: [uid] }), success: callback }); };
    pub.deleteComment = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer($this);
        var data = $container.data("form");
        var uid = $this.closest("li").attr("id").substr(3);
        var callback = function(json) {
            if (!ErmesManager.checkResponse(json)) { return; }
            ErmesManager.notify(ErmesManager.labels.CommentWasSuccessfullyDeleted);
            setTimeout(function() { data.doSearch($container); }, 1000);
        }
        ErmesManager.callback.comment.commonDeleteComment(uid, callback);
        return false;
    };
    pub.invalidateComment = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer($this);
        var data = $container.data("form");
        var commentUid = $this.closest("li").attr("id").substr(3);
        var callback = function(json) {
            if (!ErmesManager.checkResponse(json)) { return; }
            data.doSearch($container);
        }
        $.ajax({ url: ErmesManager.BasePath + "Ermes/Contributions/CommentAdminService.svc/Invalidate", data: JSON.stringify({ commentUids: [commentUid] }), success: callback });
        return false;
    }
    pub.commonEditComment = function(uid, message, title, callback, note, promoted) {
        var query = { commentUid: uid, newComment: "" };
        var $modal = $("#edit_comment_form");
        $("#edit_comment_form .confirm").off("click");
        $modal.modal();
        $("#comment", $modal).val(message);
        $("#titre", $modal).val(title);
        $("#note", $modal).accessibleRating({ "note": note });
        if (promoted == 0)
            $("#promoted", $modal).removeAttr('checked');
        else
            $("#promoted", $modal).attr('checked', 'checked');
        var callback = function(json) {
            if (!ErmesManager.checkResponse(json)) { return; }
            setTimeout(function() { ErmesManager.navigation.reload(); }, 1000);
        }
        $("#edit_comment_form .confirm").on("click", function() {
            var commentValue = $("#comment", $modal).val();
            var commentTitle = $("#titre", $modal).val();
            var commentNote = $modal.find("input:radio[name='note']:checked").val();
            var commentPromoted = ($("#promoted", $modal).is(":checked") ? 1 : 0);
            var controlField = true;
            var controlFieldClass = function(selector, test) {
                if (test) {
                    selector.addClass("required");
                    selector.parents().children('label').append("<span class='ermes-label'>" + ErmesManager.labels.ErrorModalFieldRequiredAccessibility + "</span>");
                    controlField = false;
                } else { if (selector.hasClass("required")) { selector.removeClass("required"); } };
            };
            query.newComment = commentValue;
            query.newTitle = commentTitle;
            query.newNote = commentNote;
            query.newPromoted = commentPromoted;
            controlFieldClass($("#titre", $modal), commentTitle.replace(/^\s+|\s+$/, '') === '');
            controlFieldClass($("#comment", $modal), commentValue.replace(/^\s+|\s+$/, '') === '');
            if (controlField) {
                $($modal).modal("hide");
                $.ajax({ url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/EditCommentByUid", data: JSON.stringify(query), success: callback });
            }
        });
        return false;
    };
    pub.editComment = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer($this);
        var data = $container.data("form");
        var commentUid = $this.closest("li").attr("id").substr(3);
        var commentIdx = $this.closest("li").index();
        var commentMsg = data.Result.Resource.Cmts[commentIdx].Message;
        var commentTitle = data.Result.Resource.Cmts[commentIdx].Title;
        var commentNote = data.Result.Resource.Cmts[commentIdx].Note;
        var commentPromoted = data.Result.Resource.Cmts[commentIdx].Promoted;
        var callback = function(json) {
            if (!ErmesManager.checkResponse(json)) { return; }
            $(this).dialog("hide");
            data.doSearch($container);
        };
        ErmesManager.callback.comment.commonEditComment(commentUid, commentMsg, commentTitle, callback, commentNote, commentPromoted);
        return false;
    };
    pub.validateComment = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer($this);
        var data = $container.data("form");
        var uid = { uid: parseInt($this.closest("li").attr("id").substr(3), 10) };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/ValidateComment",
            data: JSON.stringify(uid),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                data.doSearch($container);
            }
        });
    };
    pub.displayAllComments = function() {
        if ($("li").hasClass("comment-item-hidden")) {
            $("li.comment-item-hidden").removeClass("comment-item-hidden").addClass("comment-item-visible");
            $(this).text("Voir les derniers avis");
        } else if ($("li").hasClass("comment-item-visible")) {
            $("li.comment-item-visible").removeClass("comment-item-visible").addClass("comment-item-hidden");
            $(this).text("Voir tous les avis");
        }
        return false;
    };
    return pub;
}());
ErmesManager.callback.basket = (function() {
    var pub = {};
    pub.removeFromBasket = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var ids = ErmesManager.getCurrentItemIdentifiers($this);
        if (!ErmesManager.isDefined(ids)) { return false; }
        var params = { uid: ids.RscUid };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/DeleteBasketItem",
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                data.doSearch($container);
            }
        });
        return false;
    };
    pub.addToBasket = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var ids = ErmesManager.getCurrentItemIdentifiers($this);
        if (!ErmesManager.isDefined(ids)) { return false; }
        var params = { resIdentifier: { RscUid: ids.RscUid, RscBase: ids.RscBase, RscDocId: ids.RscDocId } };
        var labelUid = $this.attr("data-label-uid");
        params.labelUid = labelUid;
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/AddBasketItem",
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                data.doSearch($container);
            }
        });
        var targetResource = null;
        if ($.isArray(data.Result)) {
            var filteredArray = data.Result.filter(function(o) {
                if (typeof(ids.RscUid) != "undefined") { return (o.Resource.RscUid == ids.RscUid); } else { return (o.Resource.RscBase == ids.RscBase && o.Resource.RscId == ids.RscId); }
            });
            if (filteredArray.length == 1) { targetResource = filteredArray[0].Resource; }
        } else { targetResource = data.Result.Resource; }
        if (targetResource != null && typeof(targetResource) != "undefined") { ErmesManager.googleAnalytics.trackEvent(ErmesManager.googleAnalytics.Categories.Recherche.label, ErmesManager.googleAnalytics.Categories.Recherche.actions.AjoutPanier.label, targetResource.Ttl); }
        return false;
    };
    return pub;
}());
ErmesManager.callback.ofSelection = (function() {
    var pub = {};
    pub.showSelectionsForm = function() {
        var $this = $(this);
        var result = $this.closest("div.notice").data("result");
        $("#manageSelectionsForm").data("result", result.Resource);
        var $container = ErmesManager.findClosestContainer(this);
        $("#manageSelectionsForm").data("container", $container).modal("show");
        return false;
    };
    pub.addNewSelectionDialog = function() {
        var label = $("#manageSelectionsForm").find("#newSelectionName").val();
        var description = $("#manageSelectionsForm").find("#newSelectionDescription").val();
        var categorie = $("#manageSelectionsForm").find("#selectionCategorie").val();
        var module = $("#manageSelectionsForm").find("#newSelectionModule").val();
        ErmesManager.callback.ofSelection.addNewSelection(label, description, module, categorie);
        return false;
    };
    pub.addNewSelection = function(label, description, module, categorie) {
        var params = { "label": label, "description": description, "module": module, "categorie": categorie };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/CreateSelection",
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.callback.ofSelection.bindToSelection(json.d.SelUid);
                ErmesManager.callback.ofSelection.refreshSelectionsForm();
            }
        });
        return false;
    };
    pub.removeSelectionResource = function() {
        var $this = $(this);
        var ids = ErmesManager.getCurrentItemIdentifiers($this);
        if (!ErmesManager.isDefined(ids)) { return false; }
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var selectionUid = $this.attr("data-selectionId");
        var params = { "resIdentifier": [{ "RscUid": ids.RscUid, "RscBase": ids.RscBase, "RscDocId": ids.RscDocId }], "selectionUid": [selectionUid] };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/ResourcesRemoveSelections",
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                data.doSearch($container);
            }
        });
        return false;
    };
    pub.selectionsPaging = function() {
        var $input = $(".currentPage");
        var inputValue = parseInt($input.text());
        if ($(this).hasClass("previous")) { inputValue--; } else if ($(this).hasClass("next")) { inputValue++; } else { return false; }
        $input.text(inputValue);
        ErmesManager.callback.ofSelection.refreshSelectionsForm(true);
        return false;
    };
    pub.refreshSelectionsForm = function(keepCurrentPage) {
        $("#newSelectionName", "#manageSelectionsForm").val("");
        $("#newSelectionDescription", "#manageSelectionsForm").val("");
        $("#selectionCategorie", "#manageSelectionsForm").val("");
        var resIdentifiers = [];
        var results = $("#manageSelectionsForm").data("result");
        $(results).each(function(i, result) { resIdentifiers.push({ RscUid: result.RscUid, RscBase: result.RscBase, RscDocId: result.RscId }); });
        var filter = $("#selectionFilterInput", "#manageSelectionsForm").hasClass("blur") ? "" : $("#selectionFilterInput", "#manageSelectionsForm").val();
        var page = ($(".currentPage").length == 0) ? 0 : $(".currentPage").text();
        page = keepCurrentPage ? page : 0;
        var moduleFilter = $("#newSelectionModuleFilter").val();
        var params = { "resIdentifiers": resIdentifiers, "filter": filter, "moduleFilter": moduleFilter, limit: 10, page: parseInt(page) - 1 };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/GetAllSelectionsForResources" + ErmesManager.WsQueryString,
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                $("#selectionItemsPlaceHolder").html($("#manageSelectionsTmpl").tmpl(json));
                $("input.unknown", "#selectionItemsPlaceHolder").fadeTo(0, 0.5);
            }
        });
        return false;
    };
    pub.clickItem = function() {
        var $this = $(this);
        $this.fadeTo(0, 1);
        var serviceUrl = $this.is(":checked") ? ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/ResourcesAddSelections" : ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/ResourcesRemoveSelections";
        var resIdentifiers = [];
        var results = $("#manageSelectionsForm").data("result");
        $(results).each(function(i, result) { resIdentifiers.push({ RscUid: result.RscUid, RscBase: result.RscBase, RscDocId: result.RscId }); });
        var params = { "resIdentifiers": resIdentifiers, "selectionsUid": [$this.attr("data-id")] };
        $.ajax({
            url: serviceUrl,
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.callback.ofSelection.refreshSelectionsForm(true);
            }
        });
        return false;
    };
    pub.bindToSelection = function(selUid) {
        var serviceUrl = ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/ResourcesAddSelections";
        var resIdentifiers = [];
        var results = $("#manageSelectionsForm").data("result");
        $(results).each(function(i, result) { resIdentifiers.push({ RscUid: result.RscUid, RscBase: result.RscBase, RscDocId: result.RscId }); });
        var params = { "resIdentifiers": resIdentifiers, "selectionsUid": [selUid] };
        $.ajax({
            url: serviceUrl,
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.callback.ofSelection.refreshSelectionsForm();
            }
        });
        return false;
    };
    pub.deleteSelectionByUid = function(selUid) {
        var serviceUrl = ErmesManager.BasePath + "Ermes/Recherche/OpenFind.svc/DeleteSelection";
        var params = { "selectionUid": selUid };
        $.ajax({
            url: serviceUrl,
            data: JSON.stringify(params),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.callback.ofSelection.refreshSelectionsForm();
            }
        });
    };
    pub.deleteSelection = function() {
        var $this = $(this);
        var $dialog = $("#confirm_dialog_ofselection");
        ErmesManager.callback.common.buildConfirmBox($dialog);
        ErmesManager.callback.common.openConfirmBox($dialog, function() { ErmesManager.callback.ofSelection.deleteSelectionByUid($this.attr("data-selectionid")); });
    };
    pub.autocompleteCategorieSelection = function(input) {
        $(input).autocomplete({
            "source": function(req, add) {
                if (!ErmesManager.EnableTypewatch) { return; }
                if (typeof(req) === 'string') { req = { term: req }; }
                req.term = req.term.toLowerCase();
                if (typeof(ajaxSearch) !== "undefined") { ajaxSearch.abort(); }
                ajaxSearch = jQuery.ajax({
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    url: ErmesManager.BasePath + "ermes/recherche/OpenFind.svc/SuggestCategoriesForSelection",
                    data: JSON.stringify(req),
                    success: function(data) {
                        if (!ErmesManager.checkResponse(data)) { return; }
                        add(data.d);
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrown) { $("#error").html(XMLHttpRequest.responseText); }
                });
            },
            open: function() { $(this).autocomplete('widget').css('z-index', 999999); return false; },
            "appendTo": "#modalSelection",
            "minLength": 0,
            "dataType": "json",
            "delay": 200
        }).focus(function() { $(input).autocomplete("enable"); if (this.value === '') { $(this).autocomplete("search", ""); } });
        $(input).autocomplete("disable");
    };
    return pub;
}());
ErmesManager.callback.common = (function() {
    var pub = {};
    pub.search = function(e, options) {
        if (e.keyCode === undefined || e.keyCode === 13) {
            clearTimeout(ErmesManager.SearchTimeout);
            var $container = e.el === undefined ? ErmesManager.findClosestContainer(e) : ErmesManager.findClosestContainer(e.el);
            var data = $container.data("form");
            $.extend(data.PreviousQuery.query, data.Query.query);
            if (ErmesManager.isDefined(e.el)) { data.Query.query.QueryString = $(e.el).val(); } else if ($(e).val() !== "") { data.Query.query.QueryString = $(e).val(); } else { return false; }
            data.Query.query.Page = 0;
            if (ErmesManager.isDefined(data.Query.query.FacetFilter)) { delete data.Query.query.FacetFilter; }
            if (ErmesManager.isDefined(data.Query.query.RawQueryParameters)) { delete data.Query.query.RawQueryParameters; }
            if (ErmesManager.isDefined(data.Query.query.SortField)) { delete data.Query.query.SortField; }
            if (ErmesManager.isDefined(data.Query.query.SortFieldRandomSeed)) { delete data.Query.query.SortFieldRandomSeed; }
            if (ErmesManager.isDefined(data.Query.query.SortOrder)) { delete data.Query.query.SortOrder; }
            delete data.Query.query.GroupSize;
            delete data.Query.query.UseGrouping;
            delete data.Query.query.OriginalQueryString;
            $.extend(data.Query.query, options);
            data.doSearch($container);
        }
    };
    pub.cleanTextField = function() {
        $('input#textfield').val("");
        $('input#textfield').trigger('input');
        $('input#textfield').trigger(jQuery.Event("keydown"));
        $("input#textfield").focus();
    };
    pub.hoverResult = function() {
        var $this = $(this);
        $("ul.notice > li", "#resultats").removeClass("on");
        $this.addClass("on");
        return false;
    };
    pub.buildConfirmBox = function($target) { $target.dialog({ modal: true, autoOpen: false }); };
    pub.openConfirmBox = function($target, on_success) {
        $target.dialog('option', 'buttons', [{
            text: ErmesManager.labels.ConfirmBoxConfirm,
            click: function() {
                on_success();
                $(this).dialog("close");
            }
        }, { text: ErmesManager.labels.ConfirmBoxCancel, click: function() { $(this).dialog("close"); } }]);
        $target.dialog("open");
    };
    pub.replaySearchInsert = function() {
        var $this = $(this);
        var q = $this.closest(".ermes_search_model, .webframe-ermes-commonviewedresources").data("query");
        if (typeof q == "undefined") { var q = { "query": JSON.parse($this.closest(".ermes_search_model, .webframe-ermes-commonviewedresources").find(".query-serialized").html()) }; }
        delete q.query.XslPath;
        delete q.query.Page;
        delete q.query.UseCache;
        q.query.ResultSize = 10;
        q.query.InjectOpenFind = true;
        q.query.SearchContext = ErmesManager.SearchContexts.SearchInsert;
        q.query.UseCanvas = true;
        var queryStringEncoded = encodeURIComponent(q.query.QueryString);
        if (q.query.QueryString) { q.query.QueryString = q.query.QueryString.replace(/%/g, '%25'); }
        if (q.query.SortField) { q.query.SortField = q.query.SortField.replace(/%/g, '%25'); }
        if (ErmesManager.WsQueryString === '') { ErmesManager.navigation.assign(ErmesManager.BasePath + "search.aspx?SC=" + q.query.ScenarioCode + "&QUERY=" + queryStringEncoded + "#/Search/" + rison.encode(q)); } else { ErmesManager.navigation.assign(ErmesManager.BasePath + "search.aspx" + ErmesManager.WsQueryString + "&SC=" + q.query.ScenarioCode + "&QUERY=" + queryStringEncoded + "#/Search/" + rison.encode(q)); }
        return false;
    };
    pub.showCreatePublicSearchForm = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var query = data.Query.query;
        $("#SdiCreatePublicSearch").modal();
        $("#SdiCreatePublicSearch .confirm").live("click", function() { ErmesManager.callback.common.createPublicSearch(query, $("#SdiCreatePublicSearch").find("#description").val()); });
    };
    pub.showSubscribeForm = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var query = data.Query.query;
        ErmesManager.callback.common.showSubscribeFormWithQuery(query);
    };
    pub.showAgendaCategorySubscribeForm = function() {
        var $this = $(this),
            categoryId = $this.data("category"),
            $modal = $("#SdiCreateAgendaCategorySearch");
        $("#SdiCreateAgendaCategorySearch_confirm", $modal).off("click");
        $modal.modal();
        $("#SdiCreateAgendaCategorySearch_confirm").on("click", function() {
            $.ajax({
                url: ErmesManager.BasePath + "Ermes/Recherche/SdiService.svc/Subscribe",
                type: "GET",
                contentType: "application/x-www-form-urlencoded; charset=utf-8",
                data: "ServiceId=" + categoryId + "&FrequencyId=1&ChannelId=1",
                success: function(json) {
                    if (!ErmesManager.checkResponse(json)) { return; }
                    $modal.modal("hide");
                }
            });
        });
        return false;
    };
    pub.showSubscribeFormForSelection = function() {
        var $this = $(this);
        var query = { Forcesearch: false, Page: 0, PageRange: 3, QueryString: "", SelectionUid: $this.data("seluid"), ResultSize: 10, ScenarioCode: "DEFAULT", SearchLabel: "", SortField: null, SortOrder: 0 };
        ErmesManager.callback.common.showSubscribeFormWithQuery(query);
    };
    pub.showSubscribeFormWithQuery = function(query) {
        $modal = $("#SdiCreatePrivateSearch");
        $("#SdiCreatePrivateSearch .confirm").off("click");
        $modal.modal();
        $("#SdiCreatePrivateSearch .confirm").on("click", function() { ErmesManager.callback.common.subscribeSearch(query, $("#SdiCreatePrivateSearch").find("#name").val()); });
    };
    pub.subscribeSearch = function(query, name) {
        $("#SdiCreatePrivateSearch").modal("hide");
        var serviceUrl = ErmesManager.BasePath + "Ermes/Recherche/Sdi.svc/Subscribe";
        var params = { "query": query, "name": name };
        $.ajax({ url: serviceUrl, data: JSON.stringify(params), success: function(json) { if (!ErmesManager.checkResponse(json)) { return; } } });
        return false;
    };
    pub.createPublicSearch = function(query, description) {
        $("#SdiCreatePublicSearch").modal("hide");
        var serviceUrl = ErmesManager.BasePath + "Ermes/Recherche/Sdi.svc/CreatePublicSearchService";
        var params = { "query": query, "description": description };
        $.ajax({ url: serviceUrl, data: JSON.stringify(params), success: function(json) { if (!ErmesManager.checkResponse(json)) { return; } } });
        return false;
    };
    pub.exportToPDF = function(event, searchType) {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var token = new Date().getTime();
        var q = data.Query.query;
        var query = { Target: 0, Source: searchType || ErmesManager.CurrentSearchType, Query: JSON.stringify(q), Token: token };
        $('#iframe_download_pdf').remove();
        $('#form_download_pdf').remove();
        $('<iframe />', { name: 'pdf_iframe', id: 'iframe_download_pdf', style: 'display:none;' }).appendTo('body');
        $('<form />', { action: ErmesManager.BasePath + "ermes/Recherche/Convert.svc/ConvertPost", id: 'form_download_pdf', target: 'pdf_iframe', method: 'POST' }).append($('<input />', { name: 'query', value: JSON.stringify(query) })).appendTo('body').submit();
        $('#pdf_loading').modal();
        ErmesManager.checkCookie(token);
        return false;
    };
    pub.showExpoReservation = function() {
        var data = ErmesManager.findClosestContainer(this).data("form");
        var recId = $(this).closest(".holding-item").attr("data-id") || data.Result.Resource.RscId;
        var docBase = $(this).closest(".holding-item").attr("data-base") || data.Result.Resource.RscBase;
        var rec = { "Docbase": docBase, "RscId": recId };
        var q = { "query": { "Record": rec } };
        $("#expo_resa").modal();
        var expoDates = [];
        var startDate;
        var endDate;
        var dateSwitch = false;
        var dateLowerBound;
        var dateUpperBound;
        var onSelect = function(date) {
            var dateParsed = $.datepicker.parseDate("d/m/yy", date);
            if (!dateSwitch) {
                startDate = endDate = dateParsed;
                $("#date_debut").val(date);
                $("#date_fin").val(date);
            } else if (dateParsed < startDate) {
                startDate = dateParsed;
                $("#date_debut").val(date);
            } else {
                endDate = dateParsed;
                $("#date_fin").val(date);
            }
            dateSwitch = !dateSwitch;
            return true;
        };
        var beforeShowDay = function(date) {
            var textDate = $.datepicker.formatDate("d/m/Y", date);
            if (date < new Date()) { return [false, ""]; }
            for (var i = 0, length = expoDates.length; i < length; ++i) { var startExpoDate = $.datepicker.parseDate("d/m/yy", expoDates[i].DateDebut); var endExpoDate = $.datepicker.parseDate("d/m/yy", expoDates[i].DateFin); if (date >= startExpoDate && date <= endExpoDate) { return [false, "", expoDates[i].Libelle]; } }
            if ((startDate && (startDate.getTime() === date.getTime())) || (endDate && (endDate.getTime() === date.getTime()))) { return [true, "ui-state-highlight"]; } else if (date > startDate && date < endDate) { return [true, "ui-state-dateRange"]; } else { return [true, ""]; }
        };
        var showExpoTable = function() {
            var trDates = $("tbody > tr", "#planning_expo");
            var trDateDebut;
            var trDateFin;
            trDates.each(function() {
                trDateDebut = $.datepicker.parseDate("d/m/yy", $(this).find(".date_debut").html());
                trDateFin = $.datepicker.parseDate("d/m/yy", $(this).find(".date_fin").html());
                if ((trDateDebut > dateLowerBound && trDateDebut < dateUpperBound) || (trDateFin > dateLowerBound && trDateDebut < dateUpperBound)) { $(this).show(); } else { $(this).hide(); }
            });
        };
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Services/BDP.svc/InfoExposition" + ErmesManager.WsQueryString,
            data: JSON.stringify(q),
            success: function(json) {
                $("#expo_resa").find('.modal-body').html(json.d.HtmlResult);
                $('#expo_resa').find('.expo-valid').off('click').on('click', function() {
                    var $this = $(this);
                    $this.prop("disabled", "disabled");
                    var resaQuery = $.extend(true, {}, q);
                    resaQuery.query.DateDebut = $("#date_debut").val();
                    resaQuery.query.DateFin = $("#date_fin").val();
                    $.ajax({ url: ErmesManager.BasePath + "Ermes/Services/BDP.svc/PlaceExpoReservation", data: JSON.stringify(resaQuery), success: function(json) { $this.removeProp("disabled"); if (!ErmesManager.checkResponse(json)) { return; } else { ErmesManager.notify(json.d); } } });
                });
                expoDates = json.d.InfoExpos;
                $("#expo_datepicker").datepicker({
                    numberOfMonths: 3,
                    changeMonth: true,
                    changeYear: true,
                    onSelect: function(dateText, inst) { return onSelect(dateText); },
                    beforeShowDay: function(date) { return beforeShowDay(date); },
                    onChangeMonthYear: function(year, month, inst) {
                        dateLowerBound.setMonth(month - 1);
                        dateLowerBound.setYear(year);
                        dateUpperBound = new Date(dateLowerBound);
                        dateUpperBound.setMonth(dateLowerBound.getMonth() + $("#expo_datepicker").datepicker("option", "numberOfMonths"));
                        dateUpperBound.setDate(0);
                        showExpoTable();
                    }
                });
                var myDate = $("#expo_datepicker").datepicker("getDate");
                dateLowerBound = new Date(myDate.getFullYear(), myDate.getMonth(), 1);
                dateUpperBound = new Date(dateLowerBound);
                dateUpperBound.setMonth(dateLowerBound.getMonth() + $("#expo_datepicker").datepicker("option", "numberOfMonths"));
                dateUpperBound.setDate(0);
                showExpoTable();
            }
        });
        return false;
    };
    pub.exportResults = function(event, searchType) {
        var $this = $(this);
        var dataSearchType = $this.data("search-type");
        var token = new Date().getTime();
        var query = { ExportParamSetId: $(this).data("id"), Source: searchType || ErmesManager.CurrentSearchType, Token: token };
        if (!dataSearchType) {
            var $container = ErmesManager.findClosestContainer(this);
            var data = $container.data("form");
            var q = data.Query.query;
            q.ListSelectionPage = null;
            var checkedItems = $("ul.notice > li", "#resultats").find(":checkbox:checked");
            var notices = [];
            $.each(checkedItems, function() {
                var index = $(this).closest("li").index();
                notices.push(index);
            });
            if (notices.length > 0) { q.ListSelectionPage = notices; }
            query['Query'] = JSON.stringify(q);
        } else { query['Source'] = dataSearchType; }
        $('#iframe_download_pdf').remove();
        $('#form_download_pdf').remove();
        $('<iframe />', { name: 'pdf_iframe', id: 'iframe_download_pdf', style: 'display:none;' }).appendTo('body');
        $('<form />', { action: ErmesManager.BasePath + "ermes/Recherche/Convert.svc/ConvertPost", id: 'form_download_pdf', target: 'pdf_iframe', method: 'POST' }).append($('<input />', { name: 'query', value: JSON.stringify(query) })).appendTo('body').submit();
        $('#pdf_loading').modal();
        ErmesManager.checkCookie(token);
        return false;
    };
    pub.toggleExportBox = function() {
        var $this = $(this);
        $this.closest(".exports_container").find(".header-closed").toggle();
        $this.closest(".exports_container").find(".header-opened").toggle();
        $this.closest(".exports_container").find(".exports").toggle();
        return false;
    };
    pub.changeTitleAttr = function() {
        if ($(this).parent().hasClass("open")) { $(this).attr("title", ErmesManager.labels.ExportLinkUnFold); } else { $(this).attr("title", ErmesManager.labels.ExportLinkFold); }
    };
    return pub;
}());
ErmesManager.callback.detail = (function() {
    var pub = {};
    pub.launchTarzanAuthority = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var q = data.Query.query.SearchQuery;
        var scenario = ErmesManager.isNullOrEmpty(q) ? "DEFAULT" : q.ScenarioCode;
        if (ErmesManager.WsQueryString === '') { ErmesManager.navigation.assign(ErmesManager.BasePath + "search.aspx?SEARCH_CONTEXT=" + ErmesManager.SearchContexts.IsbdLink + "&SC=" + scenario + "&QUERY=Authority_id_idx:%22" + $this.attr("data-id") + "%22&QUERY_LABEL=" + encodeURIComponent($this.text())); } else { ErmesManager.navigation.assign(ErmesManager.BasePath + "search.aspx" + ErmesManager.WsQueryString + "&SEARCH_CONTEXT=" + ErmesManager.SearchContexts.IsbdLink + "&SC=" + scenario + "&QUERY=Authority_id_idx:%22" + $this.attr("data-id") + "%22&QUERY_LABEL=" + encodeURIComponent($this.text())); }
        return false;
    };
    pub.launchTarzanBibliographic = function() {
        var $this = $(this);
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var q = data.Query.query.SearchQuery;
        var scenario = ErmesManager.isNullOrEmpty(q) ? "DEFAULT" : q.ScenarioCode;
        if (ErmesManager.WsQueryString === '') { ErmesManager.navigation.assign(ErmesManager.BasePath + "search.aspx?SEARCH_CONTEXT=" + ErmesManager.SearchContexts.IsbdLink + "&SC=" + scenario + "&QUERY=Identifier_idx:%22" + $this.attr("data-id") + "%22&QUERY_LABEL=" + encodeURIComponent($this.text()) + "&DETAIL_MODE=true"); } else { ErmesManager.navigation.assign(ErmesManager.BasePath + "search.aspx" + ErmesManager.WsQueryString + "&SEARCH_CONTEXT=" + ErmesManager.SearchContexts.IsbdLink + "&SC=" + scenario + "&QUERY=Identifier_idx:%22" + $this.attr("data-id") + "%22&QUERY_LABEL=" + encodeURIComponent($this.text()) + "&DETAIL_MODE=true"); }
        return false;
    };
    pub.showTab = function() {
        var $this = $(this);
        $this.addClass("on");
        var thisTabId = $this.attr("href").substr(1);
        $("#" + thisTabId).removeAttr("style");
        var $tabOnA = $this.closest("li").siblings("li").find("a[class='on']");
        $tabOnA.removeClass("on");
        var tabOnId = $tabOnA.attr("href").substr(1);
        $("#" + tabOnId).attr("style", "display:none;");
        $(this).parents('ul').children().removeClass('active');
        $(this).parent().addClass('active');
        if (thisTabId === "enrichissements") {
            var $container = ErmesManager.findClosestContainer($this);
            var data = $container.data("form");
            if (data.EnrichmentLoaded === false) {
                var title = ErmesManager.isDefined(data.Result.More.Title) ? data.Result.More.Title : null;
                var author = ErmesManager.isDefined(data.Result.More.Title) ? data.Result.More.Author : null;
                var isbn = ErmesManager.isDefined(data.Result.More.Isbn) ? data.Result.More.Isbn : null;
                var isbnList = ErmesManager.isDefined(data.Result.More.IsbnList) ? data.Result.More.IsbnList : null;
                var ean = ErmesManager.isDefined(data.Result.More.Ean) ? data.Result.More.Ean : null;
                var format = ErmesManager.isDefined(data.Result.More.Format) ? data.Result.More.Format : null;
                var query = { query: { Title: title, Author: author, Isbn: isbn, Ean: ean, Format: format, IsbnList: isbnList } };
                $("#" + thisTabId).html("<h3> " + ErmesManager.labels.EnrichissementsLoading + " </h3>");
                data.getEnrichment($container, query);
            }
        }
        return false;
    };
    pub.gp_launch = function() {
        var $this = $(this),
            idResource = $this.data("id");
        ErmesManager.gp_launchApp(idResource);
        return false;
    };
    pub.logAccessToPrimaryDoc = function() {
        var params = { Resource: null }
        params.Resource = ErmesManager.findClosestContainer('.searchContainer').data('form').Result.Resource;
        ajaxSearch = $.ajax({ url: ErmesManager.BasePath + "Ermes/Recherche/Search.svc/LogPrimaryDocAccess", data: JSON.stringify(params) });
    };
    return pub;
}());
ErmesManager.callback.loans = (function() {
    var pub = {};
    pub.checkAllHoldings = function() {
        var $this = $(this);
        $("#detail-holdings .multiple-reservation-holding").each(function() { $(this).prop("checked", $this.is(":checked")); });
        return true;
    };
    pub.checkHolding = function() {
        var $this = $(this);
        if ($this.is(":not(:checked)")) { $("#detail-holdings .multiple-reservation").prop("checked", false); }
        return true;
    };
    pub.scrollToAnchor = function() {
        var $this = $(this);
        $('html,body').animate({ scrollTop: $this.offset().top }, 'slow');
    }
    return pub;
}());
ErmesManager.callback.capture = (function() {
    var pub = {};
    pub.changeXsl = function() {
        var $this = $(this);
        var q = $this.closest("#capture_search_dialog").data("query");
        q.query.XslPath = $this.val();
        ErmesManager.populateCaptureForm(q, ErmesManager.CaptureType.Search);
        return false;
    };
    pub.changeSize = function(event) {
        var $this = $(this);
        var q = $this.closest("#capture_search_dialog").data("query");
        q.query.ResultSize = $this.val();
        ErmesManager.populateCaptureForm(q, ErmesManager.CaptureType.Search);
        return true;
    };
    pub.captureSearch = function() {
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var captureQuery = $.extend(true, {}, data.Query);
        captureQuery.query.ResultSize = 6;
        captureQuery.query.XslPath = "Recherche/encart_search.xslt";
        captureQuery.query.UseCache = true;
        delete captureQuery.query.SessionGuid;
        delete captureQuery.query.ForceSearch;
        delete captureQuery.query.Page;
        delete captureQuery.query.SearchLabel;
        delete captureQuery.query.TemplateParams;
        delete captureQuery.query.SortFieldRandomSeed;
        $(".capture_search_container", "#captureSearch").html(JSON.stringify(captureQuery.query));
        var result = $(this).closest("div.notice").data("result");
        $("#captureSearch").data("result", result).modal();
        $('#captureSearch').on('shown.bs.modal', function() { $("#captureSearch").find('textarea').focus().select(); });
        return true;
    };
    pub.captureNotice = function() {
        var noticeId = $(this).closest("div.notice").data("result").Resource.RscId;
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        var captureQuery;
        if (ErmesManager.CurrentSearchType == ErmesManager.SearchType.Detail) { captureQuery = $.extend(true, {}, data.Query.query.SearchQuery); } else { captureQuery = $.extend(true, {}, data.Query.query); }
        captureQuery.ResultSize = 1;
        captureQuery.XslPath = "Recherche/encart_search.xslt";
        captureQuery.UseCache = true;
        captureQuery.QueryString = "Identifier_idx:" + noticeId;
        delete captureQuery.SessionGuid;
        delete captureQuery.ForceSearch;
        delete captureQuery.Page;
        delete captureQuery.SearchLabel;
        delete captureQuery.TemplateParams;
        delete captureQuery.PageRange;
        $(".capture_search_container", "#captureSearch").html(JSON.stringify(captureQuery));
        var result = $(this).closest("div.notice").data("result");
        $("#captureSearch").data("result", result).modal();
        return false;
    };
    return pub;
}());
ErmesManager.callback.account = (function() {
    var pub = {};
    pub.showCommentAccountForm = function(e) {
        var $item = $(this).closest("li.loan-item");
        var dataId = $item.attr("data-id");
        var dataBase = $item.attr("data-base");
        var result = { Resource: { RscDocId: dataId, RscBase: dataBase } };
        $("#addCommentForm").data("result", result).modal();
        $("#addCommentForm ul.accessible-rating-star").accessibleRating();
        return false;
    };
    pub.cancelReservation = function(e) {
        var item = $(this).closest("li.loan-item").find(".loan-data").text();
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/CancelReservation",
            type: 'POST',
            async: true,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            timeout: 60000,
            data: '{"Reservation":' + item + '}',
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.googleAnalytics.trackEvent(ErmesManager.googleAnalytics.Categories.ServicesLecteur.label, ErmesManager.googleAnalytics.Categories.ServicesLecteur.actions.SuppResa.label, item.Title);
                setTimeout(function() { ErmesManager.navigation.reload(); }, 1000);
            }
        });
        return false;
    };
    pub.prolongerLoan = function(e) {
        var item = $(this).closest("li.loan-item").find(".loan-data").text();
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/RenewLoan",
            type: 'POST',
            async: true,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            timeout: 60000,
            data: '{"Loan":' + item + '}',
            success: function(json) {
                if (ErmesManager.isNullOrEmpty(json) || typeof(json.d) === "undefined") { ErmesManager.notify(ErmesManager.labels.UnexpectedServerResponse, { "theme": "growlError" }); return false; }
                if (typeof(json.message) !== "undefined" && json.message !== "") { ErmesManager.notify(json.message, { "sticky": true }); }
                if (typeof(json.success) !== "undefined" && json.success === false) {
                    try { ErmesManager.notify(json.errors[0].msg, { "theme": "growlError", "sticky": true }); } catch (e) {}
                    return false;
                }
                ErmesManager.googleAnalytics.trackEvent(ErmesManager.googleAnalytics.Categories.ServicesLecteur.label, ErmesManager.googleAnalytics.Categories.ServicesLecteur.actions.ProlongPret.label, item);
                setTimeout(function() { ErmesManager.loadAccountFrame(true); }, 1000);
            }
        });
        return false;
    };
    pub.deleteComment = function() {
        var $this = $(this);
        var uid = $this.data("id");
        var callback = function(json) {
            if (!ErmesManager.checkResponse(json)) { return; }
            ErmesManager.notify(ErmesManager.labels.CommentWasSuccessfullyDeleted);
            setTimeout(function() { ErmesManager.navigation.reload(); }, 1000);
        }
        ErmesManager.callback.comment.commonDeleteComment(uid, callback);
        return false;
    };
    pub.editComment = function() {
        var $this = $(this);
        var uid = $this.data("id");
        var message = $this.closest(".myaccount-comment").find(".comment-content .message").text();
        var title = $this.closest(".myaccount-comment").find(".comment-content .title").text();
        var note = $this.closest(".myaccount-comment").find(".rating").data("rating");
        var promoted = parseInt($this.closest(".myaccount-comment").find(".promoted").text());
        var callback = function(json) {
            if (!ErmesManager.checkResponse(json)) { return; }
            $("#edit_comment_form").dialog("hide");
            setTimeout(function() { ErmesManager.navigation.reload(); }, 1000);
        }
        ErmesManager.callback.comment.commonEditComment(uid, message, title, callback, note, promoted);
        return false;
    };
    return pub;
}());
ErmesManager.callback.socialNetworking = (function() {
    var pub = {};
    pub.openSocialWindow = function() {
        var pageUrl = $("#detail-notice .permalink").attr('href');
        if (typeof(pageUrl) != 'undefined') {
            var r = new RegExp('^(?:[a-z]+:)?//', 'i');
            if (!r.test(pageUrl)) {
                var addHost = location.protocol + '//' + location.hostname + (location.port ? ':' + location.port : '');
                pageUrl = addHost.concat(pageUrl);
            }
        } else { pageUrl = location.href || "#"; }
        var pageTitle = $(document).attr('title') || "";
        var networks = $(this).attr('data-network');
        var helpers = { networkDefs: { facebook: { url: 'http://www.facebook.com/share.php?u=|u|' }, twitter: { url: 'https://twitter.com/share?url=|u|&text=|140|' }, linkedin: { url: 'http://www.linkedin.com/shareArticle?mini=true&url=|u|&title=|t|&summary=|d|&source=in1.com' }, in1: { url: 'http://www.in1.com/cast?u=|u|', w: '490', h: '529' }, tumblr: { url: 'http://www.tumblr.com/share?v=3&u=|u|' }, digg: { url: 'http://digg.com/submit?url=|u|&title=|t|' }, gplus: { url: 'https://plusone.google.com/_/+1/confirm?hl=en&url=|u|' }, reddit: { url: 'http://reddit.com/submit?url=|u|' }, pinterest: { url: 'http://pinterest.com/pin/create/button/?url=|u|&media=&description=|d|' }, posterous: { url: 'http://posterous.com/share?linkto=|u|&title=|t|' }, stumbleupon: { url: 'http://www.stumbleupon.com/submit?url=|u|&title=|t|' }, email: { url: 'mailto:?subject=|t|' } } }
        var $element = $(this),
            id = $element.attr("id"),
            u = encodeURIComponent(pageUrl),
            t = encodeURIComponent(pageTitle),
            href;
        href = helpers.networkDefs[networks].url;
        href = href.replace('|u|', u).replace('|t|', t).replace('|140|', t.substring(0, 130));
        $(this).attr('href', href);
        window.open($(this).attr('href'), 't', 'toolbar=0,resizable=1,status=0,width=640,height=528');
        return false;
    };
    return pub;
}());
ErmesManager.callback.marketPlaceThumbnails = (function() {
    var pub = {};
    pub.reportThumbnail = function() {
        var $this = $(this);
        var thumbnail = $this.data("thumbnail");
        var $img = $("img.img-thumbnail", $this.parent(".thumbnail-wrapper"))[0];
        if (ErmesManager.isDefined($img) && $img.src != thumbnail) {
            $this.remove();
            bootbox.alert(ErmesManager.labels.ReportThumbnailWrongUrl);
            return false;
        }
        ErmesManager.modalConfirm(ErmesManager.labels.ReportThumbnailModalTitle, ErmesManager.htmlDecode(ErmesManager.labels.ReportThumbnailModalBody.format(thumbnail)), ErmesManager.callback.marketPlaceThumbnails.processReportThumbnail.bind(this));
        return false;
    };
    pub.processReportThumbnail = function() {
        var $this = $(this);
        var id = $this.attr("data-id");
        if (ErmesManager.isNullOrEmpty(id))
            return false;
        var hash = $this.attr("data-hash");
        if (ErmesManager.isNullOrEmpty(hash))
            return false;
        var url = $this.attr("data-url");
        $.ajax({
            url: ErmesManager.config.CloudServicesBaseUrl + "ThumbnailService.svc/WarningThumbnail",
            data: JSON.stringify({ "warn": { "id": '' + id, "hash": hash, "url": url } }),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return false; }
                $this.remove();
            },
            error: function() { ErmesManager.checkResponse({ "errors": [{ "id": null, "msg": ErmesManager.labels.ErrorHappened }], "message": "", "success": false, "d": null }); }
        });
        return false;
    };
    return pub;
}());
ErmesManager.callback.agenda = (function() {
    var pub = {};
    pub.showEventSubscribeForm = function() {
        var $this = $(this),
            $item = $this.closest("li"),
            $notice = $this.closest("#document_02").find("div.notice"),
            data = $notice.data("result"),
            $modal = $("#subscribe_event_dialog");
        $("#subscribe_event_dialog_confirm", $modal).off("click");
        $modal.modal();
        $("#event-dialog-queue-id", $modal).val($item.data("id"));
        $("#event-dialog-event-name", $modal).text($item.find(".plage-event").text());
        $("#event-dialog-event-plage", $modal).text($item.find(".plage-date").text());
        $("#event-dialog-queue-size", $modal).text($item.find(".plage-size-left").text());
        if ($item.find(".plage-subscription-id").length) { $("#event-dialog-subscription-id", $modal).val($item.find(".plage-subscription-id").text()); }
        if ($item.find(".plage-subscription-mail").length) { $("#event-dialog-user-mail", $modal).text($item.find(".plage-subscription-mail").text()); }
        if ($item.find(".plage-subscription-phone").length) { $("#event-dialog-user-phone", $modal).text($item.find(".plage-subscription-phone").text()); }
        if ($item.find(".plage-subscription-nb").length) { $("#event-dialog-size-select", $modal).val($item.find(".plage-subscription-nb").text()); }
        if ($item.find(".plage-queue-overflow").text() === "false") { $("#event-dialog-size-select").attr("max", $item.find(".plage-size-left").text()); }
        $("#subscribe_event_dialog_confirm").on("click", function() { ErmesManager.callback.agenda.sendSubscription.apply(this); });
        return false;
    };
    pub.sendSubscription = function() {
        var formData = $("#subscribe_event_dialog form").serializeObject();
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        $.ajax({
            url: ErmesManager.BasePath + "Ermes/Agenda/Agenda.svc/SubscribeToQueue",
            data: JSON.stringify({ inscription: { IdInscription: formData.IdInscription[0], AgendaFileIdFile: formData.IdFile[0], Nb: formData.NbPlaces[0], UserMail: formData.UserMail ? formData.UserMail[0] : undefined, UserPhone: formData.UserPhone ? formData.UserPhone[0] : undefined } }),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                $("#subscribe_event_dialog").modal("hide");
                data.doSearch($container);
            }
        });
    };
    return pub;
}());
jQuery.fn.serializeObject = function() {
    var o = {};
    var a = jQuery(this).serializeArray();
    jQuery.each(a, function() {
        if (typeof(this.value) !== "undefined" && this.value !== "") {
            if (o[this.name]) {
                if (!o[this.name].push) { o[this.name] = [o[this.name]]; }
                o[this.name].push(this.value || '');
            } else { o[this.name] = [this.value || '']; }
        }
    });
    return o;
};
jQuery.fn.bindField = function(options) {
    var defaults = { serviceUrl: ErmesManager.BasePath + "ermes/recherche/Search.svc/Suggest" };
    var actualOptions = jQuery.extend(defaults, options);
    jQuery(this).each(function() {
        var jsonData = jQuery(this).data("jsonData"),
            $this = jQuery(this),
            scenarioCode = $this.closest("form").data("scenario");
        if (jsonData) {
            switch (jsonData.SearchFieldType) {
                case 3:
                    if (jsonData.DisplayMode == 1) {
                        jQuery.ajax({
                            type: "POST",
                            contentType: "application/json; charset=utf-8",
                            dataType: "json",
                            url: actualOptions.serviceUrl,
                            data: JSON.stringify({ fieldUid: jsonData.Id, term: '.*', scenarioCode: scenarioCode }),
                            success: function(data) {
                                if (!ErmesManager.checkResponse(data)) { return; }
                                for (var i = 0, len = data.d.length; i < len; ++i) { $this.append('<option value="' + ErmesManager.htmlEscape(data.d[i].value) + '">' + data.d[i].label + '</option>'); }
                            },
                            error: function(XMLHttpRequest, textStatus, errorThrown) { jQuery("#error").html(XMLHttpRequest.responseText); }
                        });
                    } else {
                        jQuery(this).autocomplete({
                            "source": function(req, add) {
                                req.fieldUid = jsonData.Id;
                                req.scenarioCode = scenarioCode;
                                jQuery.ajax({
                                    type: "POST",
                                    contentType: "application/json; charset=utf-8",
                                    dataType: "json",
                                    url: actualOptions.serviceUrl,
                                    data: JSON.stringify(req),
                                    success: function(data) {
                                        if (!ErmesManager.checkResponse(data)) { return; }
                                        add(data.d);
                                    },
                                    error: function(XMLHttpRequest, textStatus, errorThrown) { jQuery("#error").html(XMLHttpRequest.responseText); }
                                });
                            },
                            "dataType": "json",
                            "delay": 500
                        });
                    }
                    break;
                default:
                    break;
            }
        }
    });
    return this;
};
jQuery.fn.bindForm = function(options) {
    var defaults = {};
    jQuery(this).each(function() { jQuery(".suggest", jQuery(this)).bindField(jQuery.extend(defaults, options)); });
    return this;
};
jQuery.fn.copyField = function() {
    var newField = null;
    jQuery(this).each(function() {
        var currentRow = jQuery(this).parents(".indexWrapper");
        newField = currentRow.clone(false);
        var newId = ErmesManager.Guid();
        newField.find("input").prop("id", newId);
        newField.find("label").prop("for", newId);
        var labelId = newField.find("span").attr("id");
        var countOfSameField = jQuery("[id='" + labelId + "']").length;
        var array = newField.find("label").text().split('°');
        if (countOfSameField == 1) {
            currentRow.find("span").first().text(array[0] + " n°1");
            newField.find("span").first().text(array[0] + " n°2");
        } else { newField.find("span").first().text(array[0] + "°" + (countOfSameField + 1)); }
        var rowId = currentRow.data("id");
        var lastRow = jQuery(".indexWrapper[data-id='" + rowId + "']").last();
        newField = newField.insertAfter(lastRow).find("input[type='text']");
        newField.val("").data("jsonData", currentRow.find("input[type='text']").data("jsonData"));
        newField.bindField();
    });
    newField.focus();
    return newField;
};
jQuery.fn.toJson = function() {
    var jsonObject = null;
    var jsonString = null;
    jQuery(this).each(function() {
        jsonObject = jQuery(this).serializeObject();
        jsonString = JSON.stringify(jsonObject);
    });
    return jsonString.replace(new RegExp("\\[\\]", "g"), "");
};
jQuery.fn.displayForm = function(options) {
    var defaults = { serviceUrl: ErmesManager.BasePath + "ermes/recherche/Search.svc/GetGridByScenarioCode", restoreContext: options.restoreContext ? true : false, isInWebFrame: false };
    var actualOptions = jQuery.extend(defaults, options);
    jQuery(this).each(function() {
        var targetElement = jQuery(this);
        jQuery.ajax({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            url: actualOptions.serviceUrl,
            data: JSON.stringify({ code: actualOptions.scenarioCode }),
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { targetElement.html("<div class='alert alert-danger'> <a class='close' data-dismiss='alert'>×</a>" + json.errors[0].msg + "</div>"); return; }
                var tmplVal = $('<div />').html($("#formTmpl").tmpl({ searchGrid: json.d, options: actualOptions })).text();
                targetElement.html(tmplVal);
                jQuery.each(json.d.Index.list, function(i, item) { jQuery("." + item.Id, targetElement).data("jsonData", item); });
                var actualForm = targetElement.find("form");
                actualForm.addClass("ermes_form_container").addClass("ermes_container");
                actualForm.data("data", actualOptions);
                actualForm.bindForm();
                if (actualOptions.restoreContext) {
                    var jsonString = ErmesManager.getCookieValue(ErmesManager.COOKIES_FORM, actualOptions.scenarioCode);
                    if (typeof(jsonString) !== "undefined" && jsonString !== "") {
                        var jsonObject = JSON.parse(jsonString);
                        actualForm.populate(jsonObject);
                    }
                }
            }
        });
    });
};
jQuery.fn.launchAdvanceSearch = function(options) {
    var defaults = { resultSize: ErmesManager.getCookieValue(ErmesManager.COOKIES_FORM, "resultSize", 10) };
    var actualOptions = jQuery.extend(defaults, options);
    jQuery(this).each(function() {
        jQuery(this).fadeTo(0, 0.3);
        var savedData = jQuery(this).data("data");
        actualOptions.searchQuery = { Page: 0, ResultSize: actualOptions.resultSize, ScenarioCode: savedData.scenarioCode, Grid: jQuery(this).toJson(), SortOrder: 0, InjectFields: true };
        actualOptions.formOptions = savedData;
        ErmesManager.saveCookieValue(ErmesManager.COOKIES_FORM, savedData.scenarioCode, actualOptions.searchQuery.Grid);
        var targetElementById = null;
        if (typeof(savedData.searchTargetId) != "undefined") { targetElementById = jQuery("#" + savedData.searchTargetId); }
        var targetElement = targetElementById || actualOptions.searchTarget || savedData.searchTarget || jQuery(this).parent();
        var jsonQuery = {};
        jsonQuery.ForceSearch = true;
        jsonQuery.QueryString = null;
        jsonQuery.SearchContext = ErmesManager.SearchContexts.AdvancedForm;
        jsonQuery.Grid = actualOptions.searchQuery.Grid;
        jsonQuery.ScenarioCode = actualOptions.searchQuery.ScenarioCode;
        jsonQuery.Page = 0;
        jsonQuery.ResultSize = 10;
        var query = rison.encode({ query: jsonQuery });
        var url = "form.aspx?SC=" + jsonQuery.ScenarioCode + "#/Search/" + query;
        ErmesManager.navigation.assign(url);
    });
};
jQuery.fn.launchSearch = function(options) {
    window.scrollTo(0, 0);
    $(this).parent().prepend("<div class='panel panel-primary panel-loading'><div class='panel-body'><div class='ajax-loader-big icon-spin animate-spin' style='margin: 10px auto'> </div><h4>Chargement en cours...</h4></div></div>");
    if ($(this).hasClass("is-in-webframe")) { $(this).launchAdvanceSearch(options); return false; }
    var defaults = { resultSize: ErmesManager.getCookieValue(ErmesManager.COOKIES_FORM, "resultSize", 10) };
    var actualOptions = jQuery.extend(defaults, options);
    jQuery(this).each(function() {
        jQuery(this).fadeTo(0, 0.3);
        var savedData = jQuery(this).data("data");
        actualOptions.searchQuery = { Page: 0, ResultSize: actualOptions.resultSize, ScenarioCode: savedData.scenarioCode, Grid: jQuery(this).toJson(), SortOrder: 0, InjectFields: true, SearchContext: ErmesManager.SearchContexts.AdvancedForm };
        actualOptions.formOptions = savedData;
        ErmesManager.saveCookieValue(ErmesManager.COOKIES_FORM, savedData.scenarioCode, actualOptions.searchQuery.Grid);
        var targetElementById = null;
        if (typeof(savedData.searchTargetId) != "undefined") { targetElementById = jQuery("#" + savedData.searchTargetId); }
        var targetElement = targetElementById || actualOptions.searchTarget || savedData.searchTarget || jQuery(this).parent();
        var form = new ErmesManager.Form();
        form.Query.query.ForceSearch = true;
        form.Query.query.QueryString = null;
        form.Query.query.SearchContext = ErmesManager.SearchContexts.AdvancedForm;
        form.Query.query.Grid = actualOptions.searchQuery.Grid;
        form.Query.query.ScenarioCode = actualOptions.searchQuery.ScenarioCode;
        form.Query.query.Page = 0;
        targetElement.data("form", form);
        form.doSearch(targetElement);
        $(this).fadeTo(0, 1).hide();
    });
};
jQuery.fn.resetForm = function() {
    jQuery(this).each(function() {
        var $this = jQuery(this);
        var savedData = $this.data("data");
        if (typeof(savedData) != "undefined") { ErmesManager.saveCookieValue(ErmesManager.COOKIES_FORM, savedData.scenarioCode, null); }
        $(":input[type!=button][type!=checkbox]", $this).val("").removeAttr("selected");
        $(":input[type=checkbox]", $this).prop("checked", false);
    });
};
$.fn.isOnScreen = function() {
    var win = $(window);
    var viewport = { top: win.scrollTop(), left: win.scrollLeft() };
    viewport.right = viewport.left + win.width();
    viewport.bottom = viewport.top + win.height();
    var bounds = this.offset();
    bounds.right = bounds.left + this.outerWidth();
    bounds.bottom = bounds.top + this.outerHeight();
    if ((viewport.top < bounds.top) && (viewport.left < bounds.left) && (viewport.bottom > bounds.bottom) && (viewport.right > bounds.right))
        return 0;
    if ((viewport.top > bounds.bottom) || (viewport.left > bounds.right) || (viewport.bottom < bounds.top) || (viewport.right < bounds.left))
        return 1;
    return 2;
};
jQuery(function() {
    jQuery(function($) {
        $.datepicker.regional['fr'] = { closeText: 'Fermer', prevText: '&#x3c;Préc', nextText: 'Suiv&#x3e;', currentText: 'Courant', monthNames: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'], monthNamesShort: ['Jan', 'Fév', 'Mar', 'Avr', 'Mai', 'Jun', 'Jul', 'Aoû', 'Sep', 'Oct', 'Nov', 'Déc'], dayNames: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'], dayNamesShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'], dayNamesMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'], weekHeader: 'Sm', dateFormat: 'dd/mm/yy', firstDay: 1, isRTL: false, showMonthAfterYear: false, yearSuffix: '' };
        $.datepicker.setDefaults($.datepicker.regional['fr']);
    });
    jQuery("form.ermes_form .addRow").live("click", function() {
        var currentRow = jQuery(this).parents(".indexWrapper");
        currentRow.find("input[type='text']").copyField();
    });
    jQuery("form.ermes_form .addRow").live("keypress", function(e) {
        if (e.keyCode === 0 || e.keyCode === 13) {
            var currentRow = jQuery(this).parents(".indexWrapper");
            currentRow.find("input[type='text']").copyField();
        }
    });
    jQuery("form.ermes_form button.ermes_clear").live("click", function() {
        var $form = jQuery(this).parents("form");
        $form.resetForm();
    });
    jQuery("form.ermes_form").live("submit", function() { jQuery(this).launchSearch({}); return false; });
    $("span.back_to_form").live("click", function() {
        var $container = ErmesManager.findClosestContainer(this);
        var data = $container.data("form");
        data.clearTimeOut();
        if (!$("div.searchForm").is(':visible')) { $("div.searchForm").removeAttr('style'); }
        $("div.searchForm form").toggle();
    });
    $("button.reserver_expo").live("click", ErmesManager.callback.common.showExpoReservation);
    $("#holding-reservation-title").live("click", ErmesManager.services.PlaceTitleReservation);
    $("button.reserver").live("click", function() {
        var $domItem = $(this).closest("span.holding-item");
        var holdingItem = $domItem.data("result");
        ErmesManager.services.PlaceReservation(holdingItem, $domItem);
        $(this).closest(".modal").modal("hide");
        return false;
    });
    $("a.hold-more").live("click", function() {
        var holdMore = $(this).closest("tr").next("tr").length > 0 ? $(this).closest("tr").next("tr") : $(this).next("table").find("tr");
        holdMore.show();
        $(this).removeClass("hold-more").addClass("hold-more-remove");
        $(this).find("span").removeClass("icon-desc").addClass("icon-asc");
        return false;
    });
    $("a.hold-more-remove").live("click", function() {
        var holdMore = $(this).closest("tr").next("tr").length > 0 ? $(this).closest("tr").next("tr") : $(this).next("table").find("tr");
        holdMore.hide();
        $(this).removeClass("hold-more-remove").addClass("hold-more");
        $(this).find("span").removeClass("icon-asc").addClass("icon-desc");
        return false;
    });
    $("#detail-holdings .multiple-reservation").live("click", ErmesManager.callback.loans.checkAllHoldings);
    $("#detail-holdings .multiple-reservation-holding").live("click", ErmesManager.callback.loans.checkHolding);
    $("#detail-holdings .multiple-reservation-link").live("click", ErmesManager.services.PlaceMultipleReservation);
    $("#HoldingsStatic").live("click", ErmesManager.callback.loans.scrollToAnchor);
    $("#detail-holdings .require-provision").live("click", function() {
        var $domItem = $(this).closest("span.holding-item");
        var holdingItem = $domItem.data("result");
        var place = undefined;
        if (holdingItem.Place == "1") {
            $("#prompt_dialog_provision_place").dialog({
                autoOpen: true,
                modal: true,
                buttons: [{
                    text: ErmesManager.labels.CommentModalValid,
                    click: function() {
                        ErmesManager.services.PlaceProvision(holdingItem, $domItem, $("#provisionPlace").val());
                        $(this).dialog("close");
                    },
                    id: 'dialog_accept_button'
                }, { text: ErmesManager.labels.CommentModalCancel, click: function() { $(this).dialog("close"); } }],
                close: function() { $(this).dialog('destroy'); }
            }).keypress(function(e) {
                if (e.keyCode == $.ui.keyCode.ENTER) {
                    e.preventDefault();
                    e.stopPropagation();
                    $('#dialog_accept_button').click();
                }
            });
        } else { ErmesManager.services.PlaceProvision(holdingItem, $domItem, place); }
        return false;
    });
    $.ajaxSetup({ async: true, type: "POST", contentType: "application/json; charset=utf-8", dataType: "json", timeout: 60000, error: function(jqXHR, textStatus, errorThrown) { $(".searchContainer").find(".ajax-loader-big").remove(); return false; } });
    $("body").bind("ajaxSend", function(e, call) { ErmesManager.AjaxCalls.push(call); });
    ErmesManager.setupAutocomplete("#textfield");
    ErmesManager.selection.load();
    ErmesManager.processThumbnailBackground();
    ErmesManager.loadSearchInserts();
    $("div.ermes_search_model .see_all_results").live("click", ErmesManager.callback.common.replaySearchInsert);
    $("div.webframe-ermes-commonviewedresources .see_all_results").live("click", ErmesManager.callback.common.replaySearchInsert);
    $("input:checkbox", "#selectionsFormList").live("click", ErmesManager.callback.ofSelection.clickItem);
    $("#selectionsFormAddButton", "#manageSelectionsForm").live("click", ErmesManager.callback.ofSelection.addNewSelectionDialog);
    ErmesManager.callback.ofSelection.autocompleteCategorieSelection("#selectionCategorie");
    $("a.supp", "#manageSelectionsForm").live("click", ErmesManager.callback.ofSelection.deleteSelection);
    $("a.isbd-link-aut", "#notice_longue").live("click", ErmesManager.callback.detail.launchTarzanAuthority);
    $("a.isbd-link-bib", "#notice_longue").live("click", ErmesManager.callback.detail.launchTarzanBibliographic);
    $("a.export_pdf").live("click", ErmesManager.callback.common.exportToPDF);
    $("a.selection_export_pdf").live("click", function(e) { return ErmesManager.callback.common.exportToPDF.apply(this, [e, ErmesManager.SearchType.Selection]); });
    $("button.subscribe-search").live("click", ErmesManager.callback.common.showSubscribeForm);
    $("a.subscribe-search-selection").live("click", ErmesManager.callback.common.showSubscribeFormForSelection);
    $("a.subscribe-search-detail-selection").live("click", ErmesManager.callback.common.showSubscribeFormForSelection);
    $("button.subscribe-search-public").live("click", ErmesManager.callback.common.showCreatePublicSearchForm);
    $("#multi_selection button.removeItem").live("click", ErmesManager.callback.selection.removeSelectionItem);
    $("#multi_selection button.removeAll").live("click", ErmesManager.callback.selection.clearSelection);
    $("#multi_selection button.memoriser").live("click", ErmesManager.callback.selection.addSelectionToBasket);
    $("#multi_selection button.bindToSelections").live("click", ErmesManager.callback.selection.bindToSelections);
    $(".export_link").live("click", ErmesManager.callback.common.exportResults);
    $("#exportsList").live("mouseover", ErmesManager.callback.common.changeTitleAttr);
    $("#exportsList").live("click", ErmesManager.callback.common.changeTitleAttr);
    $(".exports_container .header-closed a").live("click", ErmesManager.callback.common.toggleExportBox);
    $(".exports_container .header-opened a").live("click", ErmesManager.callback.common.toggleExportBox);
    $("div.select > input:checkbox", "#resultats").live("click", ErmesManager.callback.selection.toggleItemIntoSelection);
    $(".check_all").live("change", function() { if ($(this).attr("checked")) { ErmesManager.callback.selection.checkAll(this); } else { ErmesManager.callback.selection.uncheckAll(this); } });
    $("button.bouton_detail").live("click", ErmesManager.callback.selection.toggleSelection);
    $('body').live('click', function(e) {
        if (!$(e.target).is('.exports_container *')) { $(".exports_container .header-opened").each(function() { if ($(this).is(":visible")) { ErmesManager.callback.common.toggleExportBox.apply(this); } }); }
        return true;
    });
    $("button.clean-text-field").live("click", ErmesManager.callback.common.cleanTextField);
    $("#avis_lecteurs button.comment-delete").live("click", ErmesManager.callback.comment.deleteComment);
    $("#avis_lecteurs button.comment-edit").live("click", ErmesManager.callback.comment.editComment);
    $("#display-all-comments").live("click", ErmesManager.callback.comment.displayAllComments);
    $("#SdiCreatePrivateSearch form").live("submit", function(e) { return false; });
    $("#SdiCreatePublicSearch form").live("submit", function(e) { return false; });
    $('li.cancel-reservation').live('click', ErmesManager.callback.account.cancelReservation);
    $('li.renew-loan').live('click', ErmesManager.callback.account.prolongerLoan);
    $("div.myaccount-actions li.add-comment button:not(disabled)").live("click", ErmesManager.callback.account.showCommentAccountForm);
    $("#account-comments a.edit_comment_account").live("click", ErmesManager.callback.account.editComment);
    $("#account-comments button.delete_comment_account").live("click", ErmesManager.callback.account.deleteComment);
    $("div.selection_images_scroll").smoothDivScroll({ visibleHotSpotBackgrounds: "always" });
    ErmesManager.afterImgLoad(".selection_images_scroll img", function() {
        $("div.selection_images_scroll").smoothDivScroll("recalculateScrollableArea");
        $("div.selection_images_scroll").smoothDivScroll("showHotSpotBackgrounds");
    });
    $(".subscribe-to-event").live("click", ErmesManager.callback.agenda.showEventSubscribeForm);
    $(".subscribe-category").live("click", ErmesManager.callback.common.showAgendaCategorySubscribeForm);
    $("#addCommentForm .confirm").live("click", function() { ErmesManager.callback.comment.addComment($("#addCommentForm")) });
    $('#addCommentForm').live("show.bs.modal", function() {
        var $this = $(this);
        $("#ville", $this).val("");
        $("#titre", $this).val("");
        $("#note", $this).val(0).change();
        $("#comment", $this).val("");
    });
    $("#manageSelectionsForm").on("hidden.bs.modal", function() {
        var $container = $(this).data("container");
        if (typeof($container) != "undefined") {
            var data = $container.data("form");
            data.doSearch($container);
        }
    });
    $("#manageSelectionsForm").on("show.bs.modal", function() { ErmesManager.callback.ofSelection.refreshSelectionsForm(); });
    $(".modal").live("shown.bs.modal", function(e) {
        $(this).attr("tabindex", -1);
        $("input:text:visible:not([readonly]), textarea:visible:not([readonly])", $(this)).first().focus();
    });
    $(".dropdown-direction-switcher").live('show.bs.dropdown', function(e) {
        var $target = $(e.target);
        var $ul = $target.find(".dropdown-menu");
        if ($ul.length == 0)
            return;
        $target.addClass("open");
        var isOnScreen = $ul.isOnScreen();
        $target.removeClass("open");
        if (isOnScreen != 0) { $(e.target).addClass("dropup"); }
    });
    $(".dropdown-direction-switcher").live('hidden.bs.dropdown', function(e) { $(e.target).removeClass("dropup"); });
    $(".modal").live("keydown", function(e) {
        var $this = $(this);
        var $modal = $this.closest(".modal");
        var $focusableElements = $(":focusable", $modal);
        if (e.target === $focusableElements.last()[0] && !e.shiftKey && e.keyCode == 9) {
            $focusableElements.first().focus();
            e.preventDefault();
        } else if (e.target === $focusableElements.first()[0] && e.shiftKey && e.keyCode == 9) {
            $focusableElements.last().focus();
            e.preventDefault();
        }
    });
    $(".selectionPaging", "#manageSelectionsForm").unbind().die();
    $("#selectionFilterInput", "#manageSelectionsForm").unbind().die();
    $(".selectionPaging").live("click", ErmesManager.callback.ofSelection.selectionsPaging);
    $("#newSelectionModuleFilter", "#manageSelectionsForm").die().live("change", ErmesManager.callback.ofSelection.refreshSelectionsForm);
    $("#selectionFilterInput", "#manageSelectionsForm").typeWatch({ captureLength: -1, highlight: true, wait: 200, callback: ErmesManager.callback.ofSelection.refreshSelectionsForm });
    $("#selectionFilterInput", "#manageSelectionsForm").hint();
    $(".gp_launch").live("click", ErmesManager.callback.detail.gp_launch);
    $("#linkToRecherche").live("click", function() { $("#textfield").focus() });
    $(".accessToPrimaryDoc").live("click", ErmesManager.callback.detail.logAccessToPrimaryDoc);
    $("div.themes button.add-tag").live("click", ErmesManager.callback.tag.showTagForm);
    $("div.themes a.plus").live("click", ErmesManager.callback.tag.showTagForm);
    $("div.themes ul.tagit_container_tag").live("keypress", ErmesManager.callback.tag.addTag);
    $("div.themes .tagit_ok").live("click", function() {
        var e = jQuery.Event("keypress");
        e.keyCode = 13;
        $(this).closest("ul.tagit_container_tag").trigger(e);
        return false;
    });
    $(document).delegate('*[data-toggle="lightbox"]', 'click', function(event) {
        event.preventDefault();
        $(this).ekkoLightbox();
    });
    $('.social-network a.pop').live("click", ErmesManager.callback.socialNetworking.openSocialWindow);
    $(".thumbnail-wrapper .warning-link").live("click", ErmesManager.callback.marketPlaceThumbnails.reportThumbnail);
    $('body').on('click', '.submit-search-vlc', ErmesManager.event.launchSearchByAttribute);
});

var ErmesGUI = (function(pub) {
    pub.CnilCookieName = "CookieBannerClosed";
    pub.constructMenu = function(e, bRoot, columnCount) {
        if (!Ext.get(e)) { return; }
        var items = [];
        var espace = String.fromCharCode(160);
        var reg = new RegExp(espace, "g");
        Ext.get(e).select('>li').each(function(loopItem, loopItems, loopIndex) {
            var link = this.child('a:first', true);
            var s = this.select('>ul');
            var currentItem = null;
            if (bRoot) {
                currentItem = Ext.select("#nav_menu_principal ul a.root-menu", true).elements[loopIndex];
                if (typeof(currentItem) != "undefined") {
                    currentItem.on('mouseover', function() {
                        if (this.menu) {
                            if (this.menu.hidden) {
                                var xy = currentItem.getXY();
                                var itemHeight = currentItem.getHeight();
                                this.menu.showAt(xy[0], xy[1] + itemHeight, false);
                            }
                        }
                    });
                }
            } else {
                if (link.innerHTML.toLowerCase() == "<span>-</span>") { items.push("-"); return; }
                currentItem = { title: link.title, text: link.innerHTML, cls: link.className.replace(reg, " ") + ' ermes_main_menu_panel_item', id: link.id, href: link.href, hrefTarget: link.rel };
            }
            if (s.elements.length) {
                var m = new Ext.menu.Menu({
                    cls: "ermes_main_menu_panel column_" + columnCount,
                    items: ErmesGUI.constructMenu(s.item(0), false, columnCount),
                    myAnchor: currentItem,
                    plain: true,
                    listeners: {
                        mouseenter: function() { m.mouseInside = true; },
                        mouseleave: function() {
                            m.mouseInside = false;
                            window.setTimeout(function() { ErmesGUI.callback.closeMenu(m); }, 800);
                        }
                    }
                });
                currentItem.menu = m;
            }
            items.push(currentItem);
            if (bRoot) { columnCount++; }
        });
        return items;
    };
    pub.restoreScenario = function() {
        var jsonCookie = {};
        jsonCookie = JSON.parse($.cookie(ErmesManager.COOKIES_SEARCH));
        if (typeof(jsonCookie) == "undefined" || jsonCookie == null || typeof(jsonCookie.mainScenario) == "undefined" || !($("#globalScenario option[value='" + jsonCookie.mainScenario + "']").length > 0)) {
            $("option:first", $("#globalScenario")).attr("selected", true);
            $("#globalScenarioMobile").find("a:first").addClass('active');
            $("#scenario-selected-label").text($("#globalScenarioMobile").find("a:first").text());
            $("#globalScenario").prop("title", $("#globalScenario").find("option:selected").text());
            $("#globalScenario").trigger("change");
            return;
        } else {
            $("option[value='" + jsonCookie.mainScenario + "']", $("#globalScenario")).attr("selected", true);
            $("#globalScenarioMobile").find("[data-scenario='" + jsonCookie.mainScenario + "']").addClass('active');
            $("#scenario-selected-label").text($("#globalScenarioMobile").find("[data-scenario='" + jsonCookie.mainScenario + "']").text());
            $('#submit-search').prop("title", function() { return ErmesManager.labels.StartSearch.format(jsonCookie.mainScenarioText); });
        }
    };
    pub.sortSelect = function(selElem) {
        var tmpAry = new Array();
        for (var i = 0; i < selElem.options.length; i++) {
            tmpAry[i] = new Array();
            tmpAry[i][0] = selElem.options[i].text;
            tmpAry[i][1] = selElem.options[i].value;
        }
        tmpAry.sort();
        while (selElem.options.length > 0) { selElem.options[0] = null; }
        for (var i = 0; i < tmpAry.length; i++) {
            var op = new Option(tmpAry[i][0], tmpAry[i][1]);
            selElem.options[i] = op;
        }
        return;
    };
    return pub;
}(ErmesGUI || {}));
ErmesGUI.callback = (function(pub) {
    var _$modalOrigin = null;
    pub.setModalOrigin = function() { _$modalOrigin = $(this); }
    pub.modalFocusBack = function() {
        if (!ErmesManager.isNullOrEmpty(_$modalOrigin)) { _$modalOrigin.focus(); }
        _$modalOrigin = null;
    }
    pub.toggleLoginBox = function() {
        var $box = $(".connectBox");
        $box.toggle();
        if ($box.is(":visible")) { $("input:text:visible:not([readonly]):first", $box).focus(); }
        return false;
    }
    pub.toggleTitle = function() {
        var $this = $(this);
        $this.attr("data-toggle-state", ($this.attr("data-toggle-state") == "on") ? "off" : "on");
        var title = ($this.attr("data-toggle-state") == "on") ? $this.attr("data-title-on") : $this.attr("data-title-off");
        $this.prop("title", title);
    };
    pub.bootstrapDropDownSwitchTitleStates = function() {
        var $this = $(this);
        var $ddmenu = $this.find(".dropdown-menu");
        var selectedItemLabel = "";
        var selectionFormat = $ddmenu.attr("data-selection-format");
        selectionFormat = ErmesManager.isNullOrEmpty(selectionFormat) ? ErmesManager.labels.DefaultDropdownItemSelectedFormat : selectionFormat;
        $ddmenu.find("li").each(function(index) {
            var $li = $(this);
            var $anchor = $li.children("a");
            var originalTitle = $anchor.attr("data-original-title");
            if ($li.hasClass("active") || $anchor.hasClass("active")) {
                selectedItemLabel = selectionFormat.format(originalTitle);
                $anchor.prop("title", selectedItemLabel);
            } else { $anchor.removeAttr("title"); }
        });
        var $dropdownButton = $(".dropdown-toggle", $this);
        if ($dropdownButton.length == 1) {
            var title = ($ddmenu.is(':visible')) ? $dropdownButton.attr("data-title-on") : $dropdownButton.attr("data-title-off");
            $dropdownButton.prop("title", title + ". " + selectedItemLabel);
        }
    }
    pub.bootstrapTabSwitchTitleStates = function(e) {
        if (e.relatedTarget) { $(e.relatedTarget).prop("title", $(e.relatedTarget).attr("data-title-off")); }
        if (e.target) { $(e.target).prop("title", $(e.target).attr("data-title-on")); }
    }
    pub.displayMenu = function() { if ($(this).children("a.dropdown-toggle").length > 0) { $(this).addClass("open"); } };
    pub.hiddenMenu = function() {
        if (!$(this).children(".dropdown-menu").is(':hover') || !$(this).is(':hover') || $("li.LEVEL1").is(':hover')) {
            $(this).removeClass("open");
            $(this).parent("li.LEVEL1").removeClass("open");
        }
    };
    pub.saveScenario = function() {
        var jsonCookie = {};
        jsonCookie = JSON.parse($.cookie(ErmesManager.COOKIES_SEARCH));
        if (typeof(jsonCookie) == "undefined" || jsonCookie == null) { jsonCookie = {}; }
        jsonCookie.mainScenario = $(this).val();
        jsonCookie.mainScenarioText = $(this).find(":selected").text();
        $.cookie(ErmesManager.COOKIES_SEARCH, JSON.stringify(jsonCookie), { path: '/' });
        $('#submit-search').prop("title", function() { return ErmesManager.labels.StartSearch.replace('$', jsonCookie.mainScenarioText); });
        ErmesManager.EnableTypewatch = true;
    };
    pub.saveScenarioMobile = function() {
        var jsonCookie = {};
        jsonCookie = JSON.parse($.cookie(ErmesManager.COOKIES_SEARCH));
        if (typeof(jsonCookie) == "undefined" || jsonCookie == null) { jsonCookie = {}; }
        jsonCookie.mainScenario = $('#globalScenario').val();
        jsonCookie.mainScenarioText = $('#globalScenario').find(":selected").text();
        $.cookie(ErmesManager.COOKIES_SEARCH, JSON.stringify(jsonCookie), { path: '/' });
        $('#submit-search').prop("title", function() { return ErmesManager.labels.StartSearch.replace('$', jsonCookie.mainScenarioText); });
        ErmesManager.EnableTypewatch = true;
    };
    pub.setScenario = function() {
        var form = $(".searchContainer").data("form");
        if (typeof(form) != "undefined" && ErmesManager.isDefined(form.CurrentTimeout)) {
            clearTimeout(form.CurrentTimeout);
            if (typeof(form.AjaxSearch) != "undefined") { form.AjaxSearch.abort(); }
            $(".searchContainer").find(".ajax-loader-big").remove();
        }
        var $this = $(this);
        $this.prop("title", $this.find("option:selected").text());
        if (typeof(form) == "undefined" || form == null) { ErmesGUI.callback.setScenarioMobile(); return; }
        form.Query.query.ScenarioCode = $this.val();
        delete form.Query.query.SessionGuid;
        $(".searchContainer").data("form", form);
    };
    pub.setScenarioMobile = function() {
        var form = $(".searchContainer").data("form");
        if (typeof(form) != "undefined" && ErmesManager.isDefined(form.CurrentTimeout)) {
            clearTimeout(form.CurrentTimeout);
            if (typeof(form.AjaxSearch) != "undefined") { form.AjaxSearch.abort(); }
            $(".searchContainer").find(".ajax-loader-big").remove();
        }
        var tabIndex = $(this).attr("data-scenario");
        $(this).blur();
        if (tabIndex) {
            $('#globalScenario option').attr("selected", false);
            $("option[value='" + tabIndex + "']").attr("selected", true);
        }
        $("#scenario-selected-label").text($("#globalScenario").children(":selected").text());
        $(this).parents('ul').children().children().removeClass('active');
        $(this).addClass('active');
        ErmesGUI.callback.saveScenarioMobile();
    };
    pub.resizeFrame = function() {
        if ($(this).hasClass("icon-resize-small")) {
            $(this).toggleClass("icon-resize-small");
            $(this).parents(".frame-standard").children(".panel-body").toggle();
            $(this).parents(".frame-standard").children(".panel-footer").toggle();
            $(this).addClass("icon-resize-full");
        } else {
            $(this).toggleClass("icon-resize-full");
            $(this).parents(".frame-standard").children(".panel-body").show();
            $(this).parents(".frame-standard").children(".panel-footer").show();
            if ($(this).parents(".frame-standard").children(".panel-body").find(".royalSlider").length != 0) { $(this).parents(".frame-standard").children(".panel-body").find(".royalSlider").data('royalSlider').updateSliderSize(); }
            $(this).addClass("icon-resize-small");
        }
    };
    pub.closeMenu = function(m) {
        if (m.activeChild && m.activeChild.hidden == false) { return; }
        if (m.mouseInside) { return; }
        m.hide();
        var currentMenu = m;
        while (typeof(currentMenu.parentMenu) != "undefined") {
            var parent = currentMenu.parentMenu;
            if (parent.mouseInside) { return; }
            parent.hide();
            currentMenu = parent;
        }
    };
    pub.onNavigate = function(e, sender, anchor) {
        if (!sender) return;
        if (!sender.menu) return;
        var k = e.keyCode;
        switch (k) {
            case Ext.EventObject.ESC:
                sender.menu.hide();
                sender.menu.myAnchor.focus();
                break;
            case Ext.EventObject.DOWN:
                sender.menu.show(sender);
                break;
        }
    };
    pub.onWAIOpen = function() {
        $("#wai_dialog_selector .wai_color select option.textresizer-active").attr('selected', 'selected')
        $("#wai_dialog_selector .wai_font select option.textresizer-active").attr('selected', 'selected')
        $("#wai_dialog_selector").show();
        return false;
    };
    pub.onWAIClose = function() { $("#wai_dialog_selector").hide(); return false; };
    pub.onAdvancedSearch = function() {
        if ($("#globalScenario").length > 0) { ErmesManager.navigation.assign(ErmesManager.BasePath + "form.aspx?SC=" + $("#globalScenario").val()); }
        return false;
    };
    pub.onSdiSubscribe = function(event) {
        var serviceName = $(this).data('id');
        jQuery.ajax({
            type: "GET",
            contentType: "application/json",
            dataType: "json",
            url: ErmesManager.BasePath + "Ermes/sdiservice.svc/subscribe?ServiceName=" + serviceName,
            success: function(d) {
                if (d.success != null && !d.success) {
                    var errorMessage = ErmesManager.labels.ErrorHappened;
                    if (d.errors != null && d.errors.length > 0 && d.errors[0].msg != null) { errorMessage = d.errors[0].msg; }
                    $('#sdi-subscription-description').html(errorMessage);
                } else { $('#sdi-subscription-description').html(s_SdiSuccessMessage); }
                $('#sdi-subscription-dialog').dialog();
                return;
            },
            failure: function() {
                $('#sdi-subscription-description').html(errorMessage).dialog();
                $('#sdi-subscription-dialog').dialog();
            }
        });
        return false;
    };
    pub.authenticate = function() {
        var $this = $(this),
            username = $this.find("#carte").val();
        $("#authentification").addClass("ajax-loading").find(':input').prop("disabled", true);
        jQuery.ajax({
            type: "POST",
            contentType: "application/x-www-form-urlencoded",
            data: { username: username, password: $this.find("#code").val() },
            url: ErmesManager.BasePath + "Ermes/Recherche/logon.svc/logon",
            success: function(json) {
                if (!ErmesManager.checkResponse(json, true)) {
                    $("#authentification").removeClass("ajax-loading").find(':input').prop("disabled", false);
                    if (json.errors && json.errors.length && json.errors.length > 0) {
                        var error = json.errors[0];
                        if (error.type == 'AccountExpired' && ErmesManager.config.RegistrationRenewalAllowed) { ErmesManager.navigation.assign(ErmesManager.BasePath + "RenewalRegistration.aspx?UserName=" + encodeURIComponent(username)); return false; } else if (error.type == 'PasswordMustChange' || error.type == 'PasswordExpired') { ErmesManager.navigation.assign(ErmesManager.BasePath + "changepassword.aspx?requestkey=" + encodeURIComponent(error.id)); return false; } else if (error.type == 'InvalidCredentials' && error.data && error.data.doCheckAdditionals) { ErmesManager.navigation.assign(ErmesManager.BasePath + "logon.aspx?requestkey=" + encodeURIComponent(error.id)); return false; }
                    }
                    $("#authentification").find("div.form-group").addClass("has-error");
                    var message = ErmesManager.ResetPasswordAllowed == "false" ? json.errors[0].msg : json.errors[0].msg + " <a class='errorAuth keep-underlined' href='" + ErmesManager.BasePath + "resetpassword.aspx' target='_blank' title='" + ErmesManager.labels.PasswordLostAuthenticate + "'>" + ErmesManager.labels.PasswordLostAuthenticate + " ?</a>";
                    $("#authentification").find("p.errorAuth").html(message);
                    $(document).ready(function() { if (!(document.title.indexOf(ErmesManager.labels.ErrorAuthenticatePage) > -1)) { document.title = ErmesManager.labels.ErrorAuthenticatePage + ' - ' + document.title; } });
                    return;
                }
                ErmesManager.navigation.reload();
            }
        });
        return false;
    };
    pub.disconnect = function() {
        var $this = $(this);
        jQuery.ajax({
            type: "POST",
            contentType: "application/x-www-form-urlencoded",
            data: "",
            url: ErmesManager.BasePath + "Ermes/Recherche/logon.svc/logoff",
            success: function(json) {
                if (!ErmesManager.checkResponse(json)) { return; }
                ErmesManager.navigation.assign(ErmesManager.BasePath);
            }
        });
        return false;
    };
    pub.setFrameSharePopup = function(e) {
        var $thisFrame = $(this);
        $("textarea", $thisFrame).text("");
        try {
            var $link = $(e.relatedTarget);
            var $frame = $link.closest(".frame");
            $("textarea", $thisFrame).text('<iframe src="http://' + (ErmesManager.DNSHostname || document.domain) + ErmesManager.BasePath + 'webFramePopup.aspx?portalId=' + $link.data("portalid") + '&frameId=' + $link.data("frameid") + '" width="' + $frame.width() + '" height="' + $frame.height() + '" style="border:none;"></iframe>');
        } catch (e) { console.log(e); }
    };
    pub.toggleSelectionDetailTitle = function() {
        if (!$("#panel-selection-detail").hasClass("sel_reduced")) { $("#panel-selection-detail").find("button.bouton_detail").prop("title", ErmesGUI.callback.GlobalActionDetailVisible); } else { $("#panel-selection-detail").find("button.bouton_detail").prop("title", ErmesGUI.callback.GlobalActionDetailHidden); }
    };
    pub.changeRoyalSliderState = function() {
        var id = $(this).data('id');
        var slider = $('#' + id).data('royalSlider');
        var autoStart = slider.st.autoPlay.enabled;
        if (autoStart) {
            $(this).removeClass('icon-pause').addClass('icon-play');
            $(this).prop("title", ErmesManager.labels.RoyalSliderStatePause);
            $(this).find('.ermes-label').text(ErmesManager.labels.RoyalSliderStatePause);
        } else {
            $(this).removeClass('icon-play').addClass('icon-pause');
            $(this).prop("title", ErmesManager.labels.RoyalSliderStatePlay);
            $(this).find('.ermes-label').text(ErmesManager.labels.RoyalSliderStatePlay);
        }
        slider.st.autoPlay.enabled = !autoStart;
        $('#' + id).royalSlider('toggleAutoPlay');
    };
    pub.closeCnilBanner = function() {
        var myDate = new Date();
        myDate.setDate(myDate.getDate() + 20 * 365);
        $.cookie(ErmesGUI.CnilCookieName, "1", { expires: myDate, path: "/" });
        $("#cnil_banner").remove();
    };
    pub.showCnilBanner = function() {
        if ($("#admin-actions").length) { return; }
        var cnilCookieValue = $.cookie(ErmesGUI.CnilCookieName);
        if (cnilCookieValue == "1") { return; }
        var htmlContent = '&lt;div id="cnil_banner" class="row"&gt;&lt;div class="cnil_message col-md-11"&gt;' + ErmesManager.labels.CnilBannerContent + '&lt;/div&gt;&lt;div class="cnil_button col-md-1"&gt;&lt;a href="#" class="cnil_close btn" role="button"&gt;&lt;i class="icon-remove"&gt;&lt;/i&gt; ' + ErmesManager.labels.SelectionModalClose + '&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;';
        var newDiv = $("<div />").html(htmlContent).text();
        $("body").prepend(newDiv);
        $("#cnil_banner .cnil_button a").on("click", ErmesGUI.callback.closeCnilBanner);
    };
    return pub;
}(ErmesGUI.callback || {}));
jQuery(function() {
    $("#globalScenario").change(ErmesGUI.callback.saveScenario);
    $("#globalScenario").change(ErmesGUI.callback.setScenario);
    $("#globalScenarioMobile li>a").click(ErmesGUI.callback.setScenarioMobile);
    if ($("#globalScenario").length) {
        if ($("#globalScenario").children().length === 0) {
            jQuery.ajax({
                type: "POST",
                contentType: "application/json",
                dataType: "json",
                url: ErmesManager.BasePath + "Ermes/Recherche/Search.svc/ListAllScenario",
                success: function(json) {
                    jQuery.tmpl('{{if Value.substr(0,1)!="_"}}<option value="${Key}">${Value}</option>{{/if}}', json.d).appendTo("#globalScenario");
                    jQuery.tmpl('{{if Value.substr(0,1)!="_"}}<li><a data-scenario="${Key}" href="#">${Value}</a></li>{{/if}}', json.d).appendTo("#globalScenarioMobile");
                    ErmesGUI.sortSelect($("#globalScenario")[0]);
                    ErmesGUI.restoreScenario();
                }
            });
        } else if ($("#globalScenario").children()[0].value === "NONE") { $("#globalScenario").html(""); } else { ErmesGUI.restoreScenario(); }
    }
    jQuery("#authentification input:text, #authentification input:password").change(function() {
        var $this = $(this);
        $this.val(jQuery.trim($this.val()));
    }); /** SL : Deploiement du menu sur le click et non pas sur le hover **/
    $("li.LEVEL1").live("click", ErmesGUI.callback.displayMenu);
    $("li.LEVEL1.open").live("click", ErmesGUI.callback.hiddenMenu); /*$("li.LEVEL1 .dropdown-menu").mouseleave(ErmesGUI.callback.hiddenMenu);*/
    $("i.resize").live("click", ErmesGUI.callback.resizeFrame);
    $("#globalAdvancedSearchLink").on("click", ErmesGUI.callback.onAdvancedSearch);
    $('a.sdi-subscribe-handler').on("click", ErmesGUI.callback.onSdiSubscribe);
    $('#authentification').on('submit', ErmesGUI.callback.authenticate);
    $('a.account_logoff').on('click', ErmesGUI.callback.disconnect);
});
var AccountSetting = { codeConfig: '', xslPath: "Services/LectorShortAccount.xslt" };
$(document).ready(function() {
    $("#textfield").attr("x-webkit-speech", "x-webkit-speech").attr("autocapitalize", "off").attr("autocorrect", "off");
    var hash = window.location.hash.substr(1);
    var selector = "#" + hash;
    if (/[$%&'()*+,./:;<=>?@[\]^`{|}~]/.test(selector) || !$(selector).length) { $("#textfield").focus(); }
    $('#my-account-top').qtip({
        content: {
            text: ErmesManager.labels.ErmesHeaderAccountWip,
            ajax: {
                url: ErmesManager.BasePath + "Ermes/Services/ILSClient.svc/RetrieveShortAccount" + ErmesManager.WsQueryString,
                type: 'POST',
                data: JSON.stringify(AccountSetting),
                contentType: "application/json; charset=utf-8",
                dataType: 'json',
                timeout: 60000,
                success: function(json, status) {
                    if (!ErmesManager.checkResponse(json)) { return; }
                    if (json.d == null) { return false; }
                    var content = json.d.HtmlView;
                    this.set('content.text', content);
                    return false;
                }
            }
        },
        position: { target: 'mouse', my: 'top right', at: 'bottom left', adjust: { x: -10, y: 10 } },
        style: { classes: 'ui-tooltip-light ui-tooltip-shadow' },
        show: { solo: true },
        hide: { fixed: true }
    });
    $("#search_reset").on("click", function() { $("#textfield").val(""); return false; });
    $("#textfield").on("keypress", function(e) { if (e.keyCode === 13 && $(this).val() != '') { $("#main_search_form").submit(); return false; } });
    var windowWidth = window.screen.width < window.outerWidth ? window.screen.width : window.outerWidth;
    var mobile = windowWidth < 500;
    if (!mobile) { $("#textfield").on("typeahead:selected", function(e, suggestion, dsName) { $("#main_search_form").submit(); return false; }); }
    $("#main_search_form").on("submit", function(e) {
        var $textField = $("#textfield");
        var $queryInput = $('input[name="QUERY"]');
        if (!$.trim($queryInput.val())) { $queryInput.attr('name', ''); }
        if (ErmesManager && ErmesManager.AjaxAutocomplete) {
            ErmesManager.CurrentSearchType = ErmesManager.SearchType.List;
            var textFieldValue = $.trim($textField.val());
            ErmesManager.callback.common.search($textField, { QueryString: textFieldValue || '*:*', ResultSize: ErmesManager.getCookieValue(ErmesManager.COOKIES_FORM, "resultSize", 10), Grid: null, ScenarioCode: $("#globalScenario").val(), ForceSearch: true, CloudTerms: [], SearchLabel: textFieldValue ? "" : ErmesManager.labels.SearchQueryAllDocument, SearchContext: ErmesManager.SearchContexts.SimpleField });
            return false;
        }
        return true;
    });
    $("#wai_open_link").on("click", ErmesGUI.callback.onWAIOpen);
    $("#wai_close_link").on("click", ErmesGUI.callback.onWAIClose);
    $("#wai_dialog_selector .wai_select .wai_color option").textresizer({ target: "body", type: "cssClass", sizes: ["", "wai-color-white-on-black", "wai-color-black-on-white"] });
    $("#wai_dialog_selector .wai_select .wai_font option").textresizer({ target: "body", type: "cssClass", sizes: ["", "wai-font-courier", "wai-font-arial", "wai-font-tahoma", "wai-font-trebuchet"] });
    $('body').on("click", "#panel-selection-detail", ErmesGUI.callback.toggleSelectionDetailTitle);
    $('body').on("mouseover", "#panel-selection-detail", ErmesGUI.callback.toggleSelectionDetailTitle);
    $(".site-btn,#langue-btn,#group-btn-research").live("shown.bs.dropdown hidden.bs.dropdown", ErmesGUI.callback.bootstrapDropDownSwitchTitleStates).trigger("hidden.bs.dropdown");
    $('a[data-toggle="tab"]').live('show.bs.tab', ErmesGUI.callback.bootstrapTabSwitchTitleStates);
    $(".toggle-title").live("click", ErmesGUI.callback.toggleTitle);
    $(".btn-account.account-form").live("click", ErmesGUI.callback.toggleLoginBox);
    $('.toggleAutoPlayBtn').live("click", ErmesGUI.callback.changeRoyalSliderState);
    $(".modal-focus").live("click", ErmesGUI.callback.setModalOrigin);
    $(".modal").live("hidden.bs.modal", ErmesGUI.callback.modalFocusBack);
    $("#share-frame").live("show.bs.modal", ErmesGUI.callback.setFrameSharePopup);
    $("#you-must-logon").live("click", ErmesGUI.callback.toggleLoginBox);
});

var ErmesFormContact = (function(pub) {
    pub.submit = function(keyPress) {
        var $this = $(this);
        if (keyPress.type != "click") { $this = $(keyPress); }
        var frameid = $this.attr("data-id");
        var form = $("#integration-form-" + frameid);
        form.validationEngine('attach', { scroll: false, focusFirstField: true, autoPositionUpdate: false, showOneMessage: true });
        if (form.validationEngine('validate')) {
            if (form.find('input[name=captcha]').val() != "") {
                var dataSend = { "frameId": frameid, "data": JSON.stringify(ErmesManager.serializeObject(form)) };
                $.ajax({
                    url: ErmesManager.BasePath + "cmsmanagementservice.svc/PostPortalFrame" + ErmesManager.WsQueryString,
                    type: "POST",
                    data: JSON.stringify(dataSend),
                    success: function(data, status) {
                        var response = $.parseJSON(data.d)
                        if (response.success === false) {
                            ErmesFormContact.resetCaptcha(pub);
                            alert(response.errors[0].msg);
                            $('.webframe-integration-formulaire .champCaptcha input').focus();
                        } else { $(location).attr("href", response.message); }
                    }
                });
                return true;
            }
            $('.webframe-integration-formulaire .champCaptcha input').focus();
            return false;
        }
        return false;
    };
    pub.resetCaptcha = function(pub) {
        var ajaxMore = $.ajax({
            ifModified: true,
            cache: true,
            async: true,
            type: 'GET',
            url: ErmesManager.BasePath + "formService.svc/generateCaptchaValue?length=6&_dc=" + new Date().getTime(),
            success: function(json) {
                $('.webframe-integration-formulaire .captcha img').attr('src', ErmesManager.BasePath + 'captcha.ashx?checkvalue=' + json.d).focus();
                $('#audioCaptchaButton audio').attr('src', ErmesManager.BasePath + 'audiocaptcha.ashx?checkvalue=' + json.d);
                $('#checkvalue').attr('value', json.d);
                $('.webframe-integration-formulaire .champCaptcha input').focus();
            }
        });
    };
    pub.audioCaptcha = function(pub) {
        var $this = $(this).find("audio")[0];
        $this.load();
        $this.play();
    };
    return pub;
}(ErmesFormContact || {}));
$(function() {
    $('.webframe-integration-formulaire  .submit').live("click", ErmesFormContact.submit);
    $('#nouveauCaptchaButton').click(ErmesFormContact.resetCaptcha);
    $('.webframe-integration-formulaire  .submit').bind('keypress', ErmesFormContact, function(e) { var code = e.keyCode || e.which; if (code == 32 || code == 13) { return ErmesFormContact.submit(this); } return; });
    $(".webframe-integration-formulaire").bind("jqv.form.validating", function(e) { $(this).find(".form-control").removeAttr("aria-describedBy"); });
    $(".webframe-integration-formulaire").bind("jqv.field.result", function(e, input) {
        var $input = $(input);
        var $siblings = $input.siblings(".formError");
        if ($siblings.length) {
            $siblings.find(".formErrorContent").attr("id", "formError" + $input.attr("id"));
            $input.attr("aria-describedBy", "formError" + $input.attr("id"));
        }
    });
    $('#audioCaptchaButton').click(ErmesFormContact.audioCaptcha);
});

var ErmesSurvey = (function(pub) {
    pub.voted = function() {
        var $this = $(this);
        var frameid = $this.attr("data-id");
        var aVoter = $.cookie('survey' + frameid);
        if (!aVoter) { $.cookie('survey' + frameid, 'true'); } else { ErmesManager.notify(ErmesManager.labels.SurveyVotedAlready); return false; }
        var reponses = $("#Form-" + frameid).find(":input:checked");
        var strValues = [];
        if (reponses.is(":checked")) {
            for (var i = 0, len = reponses.length; i < len; ++i) { strValues.push(reponses[i].value); }
            var dataSend = { "frameId": frameid, "data": JSON.stringify(strValues) };
            $.ajax({
                url: ErmesManager.BasePath + "cmsmanagementservice.svc/PostPortalFrame" + ErmesManager.WsQueryString,
                type: "POST",
                data: JSON.stringify(dataSend),
                success: function(data, status) {
                    if (status == "success") {
                        ErmesManager.notify(ErmesManager.labels.SurveyMessageConfirmVote);
                        setTimeout(function() { ErmesManager.navigation.reload(true); }, 1500);
                    }
                }
            });
            return true;
        }
        return false;
    };
    return pub;
}(ErmesSurvey || {}));
$(function() { $('.Ermes-Survey .voted').live("click", ErmesSurvey.voted); });


(function() {
    "use strict";
    var $, EkkoLightbox;
    $ = jQuery;
    EkkoLightbox = function(element, options) {
        var content, footer, header, _this = this;
        this.options = $.extend({ title: null, footer: null, remote: null }, $.fn.ekkoLightbox.defaults, options || {});
        this.$element = $(element);
        content = '';
        if ($("#ekkoLightbox-" + this.options.id).length > 0) {
            $("#ekkoLightbox-" + this.options.id).off("shown.bs.modal");
            $("#ekkoLightbox-" + this.options.id).modal('show');
            return true;
        }
        this.modal_id = this.options.modal_id ? this.options.modal_id : 'ekkoLightbox-' + this.options.id;
        header = '<div class="modal-header"' + (this.options.title || this.options.always_show_close ? '' : ' style="display:none"') + '><button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button><h4 class="modal-title ermes-label" id="' + this.options.id + '-label">' + (this.options.title || "&nbsp;") + '</h4></div>';
        footer = '<div class="modal-footer"' + (this.options.footer ? '' : ' style="display:none"') + '>' + this.options.footer + '</div>';
        $(document.body).append('<div id="' + this.modal_id + '" class="ekko-lightbox modal fade" tabindex="-1" role="dialog" aria-labelledby="' + this.options.id + '-label"><div class="modal-dialog"><div class="modal-content">' + header + '<div class="modal-body"><div class="ekko-lightbox-container"><div></div></div></div>' + footer + '</div></div></div>');
        this.modal = $('#' + this.modal_id);
        this.modal_dialog = this.modal.find('.modal-dialog').first();
        this.modal_content = this.modal.find('.modal-content').first();
        this.modal_body = this.modal.find('.modal-body').first();
        this.lightbox_container = this.modal_body.find('.ekko-lightbox-container').first();
        this.lightbox_body = this.lightbox_container.find('> div:first-child').first();
        this.lightbox_body.prepend("<div class='ajax-loader-big icon-spin animate-spin'/>");
        this.modal_arrows = null;
        this.border = { top: parseFloat(this.modal_dialog.css('border-top-width')) + parseFloat(this.modal_content.css('border-top-width')) + parseFloat(this.modal_body.css('border-top-width')), right: parseFloat(this.modal_dialog.css('border-right-width')) + parseFloat(this.modal_content.css('border-right-width')) + parseFloat(this.modal_body.css('border-right-width')), bottom: parseFloat(this.modal_dialog.css('border-bottom-width')) + parseFloat(this.modal_content.css('border-bottom-width')) + parseFloat(this.modal_body.css('border-bottom-width')), left: parseFloat(this.modal_dialog.css('border-left-width')) + parseFloat(this.modal_content.css('border-left-width')) + parseFloat(this.modal_body.css('border-left-width')) };
        this.padding = { top: parseFloat(this.modal_dialog.css('padding-top')) + parseFloat(this.modal_content.css('padding-top')) + parseFloat(this.modal_body.css('padding-top')), right: parseFloat(this.modal_dialog.css('padding-right')) + parseFloat(this.modal_content.css('padding-right')) + parseFloat(this.modal_body.css('padding-right')), bottom: parseFloat(this.modal_dialog.css('padding-bottom')) + parseFloat(this.modal_content.css('padding-bottom')) + parseFloat(this.modal_body.css('padding-bottom')), left: parseFloat(this.modal_dialog.css('padding-left')) + parseFloat(this.modal_content.css('padding-left')) + parseFloat(this.modal_body.css('padding-left')) };
        this.modal.on('show.bs.modal', this.options.onShow.bind(this)).on('shown.bs.modal', function() { _this.modal_shown(); return _this.options.onShown.call(_this); }).on('hide.bs.modal', this.options.onHide.bind(this)).on('hidden.bs.modal', function() {
            if (_this.gallery) { $(document).off('keydown.ekkoLightbox'); }
            return _this.options.onHidden.call(_this);
        }).modal('show', options);
        return this.modal;
    };
    EkkoLightbox.prototype = {
        modal_shown: function() {
            var video_id, _this = this;
            if (!this.options.remote) { return this.error('No remote target given'); } else {
                this.gallery = this.$element.data('gallery');
                if (this.gallery) {
                    if (this.options.gallery_parent_selector === 'document.body' || this.options.gallery_parent_selector === '') { this.gallery_items = $(document.body).find('*[data-toggle="lightbox"][data-gallery="' + this.gallery + '"]'); } else { this.gallery_items = this.$element.parents(this.options.gallery_parent_selector).first().find('*[data-toggle="lightbox"][data-gallery="' + this.gallery + '"]'); }
                    this.gallery_index = this.gallery_items.index(this.$element);
                    $(document).on('keydown.ekkoLightbox', this.navigate.bind(this));
                    if (this.options.directional_arrows && this.gallery_items.length > 1) {
                        this.lightbox_container.prepend('<div class="ekko-lightbox-nav-overlay"><a href="#" class="' + this.strip_stops(this.options.left_arrow_class) + '"></a><a href="#" class="' + this.strip_stops(this.options.right_arrow_class) + '"></a></div>');
                        this.modal_arrows = this.lightbox_container.find('div.ekko-lightbox-nav-overlay').first();
                        this.lightbox_container.find('a' + this.strip_spaces(this.options.left_arrow_class)).on('click', function(event) { event.preventDefault(); return _this.navigate_left(); });
                        this.lightbox_container.find('a' + this.strip_spaces(this.options.right_arrow_class)).on('click', function(event) { event.preventDefault(); return _this.navigate_right(); });
                    }
                }
                if (this.options.type) { if (this.options.type === 'image') { return this.preloadImage(this.options.remote, true, this.options.title); } else if (this.options.type === 'youtube' && (video_id = this.getYoutubeId(this.options.remote))) { return this.showYoutubeVideo(video_id); } else if (this.options.type === 'vimeo') { return this.showVimeoVideo(this.options.remote); } else { return this.error("Could not detect remote target type. Force the type using data-type=\"image|youtube|vimeo\""); } } else { return this.detectRemoteType(this.options.remote); }
            }
        },
        strip_stops: function(str) { return str.replace(/\./g, ''); },
        strip_spaces: function(str) { return str.replace(/\s/g, ''); },
        isImage: function(str) { return str.match(/(^data:image\/.*,)|(\.(jp(e|g|eg)|gif|png|bmp|webp|svg)((\?|#).*)?$)/i); },
        isSwf: function(str) { return str.match(/\.(swf)((\?|#).*)?$/i); },
        getYoutubeId: function(str) {
            var match;
            match = str.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/);
            if (match && match[2].length === 11) { return match[2]; } else { return false; }
        },
        getVimeoId: function(str) { if (str.indexOf('vimeo') > 0) { return str; } else { return false; } },
        navigate: function(event) { event = event || window.event; if (event.keyCode === 39 || event.keyCode === 37) { if (event.keyCode === 39) { return this.navigate_right(); } else if (event.keyCode === 37) { return this.navigate_left(); } } },
        navigate_left: function() {
            var src;
            if (this.gallery_items.length === 1) { return; }
            if (this.gallery_index === 0) { this.gallery_index = this.gallery_items.length - 1; } else { this.gallery_index--; }
            this.$element = $(this.gallery_items.get(this.gallery_index));
            this.updateTitleAndFooter();
            src = this.$element.attr('data-remote') || this.$element.attr('href');
            return this.detectRemoteType(src, this.$element.attr('data-type'));
        },
        navigate_right: function() {
            var next, src;
            if (this.gallery_items.length === 1) { return; }
            if (this.gallery_index === this.gallery_items.length - 1) { this.gallery_index = 0; } else { this.gallery_index++; }
            this.$element = $(this.gallery_items.get(this.gallery_index));
            src = this.$element.attr('data-remote') || this.$element.attr('href');
            this.updateTitleAndFooter();
            this.detectRemoteType(src, this.$element.attr('data-type'));
            if (this.gallery_index + 1 < this.gallery_items.length) {
                next = $(this.gallery_items.get(this.gallery_index + 1), false);
                src = next.attr('data-remote') || next.attr('href');
                if (next.attr('data-type') === 'image' || this.isImage(src)) { return this.preloadImage(src, false, null); }
            }
        },
        detectRemoteType: function(src, type) { var video_id; if (type === 'image' || this.isImage(src)) { this.options.type = 'image'; return this.preloadImage(src, true, null); } else if (type === 'youtube' || (video_id = this.getYoutubeId(src))) { this.options.type = 'youtube'; return this.showYoutubeVideo(video_id); } else if (type === 'vimeo' || (video_id = this.getVimeoId(src))) { this.options.type = 'vimeo'; return this.showVimeoVideo(video_id); } else { return this.error("Could not detect remote target type. Force the type using data-type=\"image|youtube|vimeo\""); } },
        updateTitleAndFooter: function() {
            var caption, footer, header, title;
            header = this.modal_content.find('.modal-header');
            footer = this.modal_content.find('.modal-footer');
            title = this.$element.data('title') || "";
            caption = this.$element.data('footer') || "";
            if (title || this.options.always_show_close) { header.css('display', '').find('.modal-title').html(title || "&nbsp;"); } else { header.css('display', 'none'); }
            if (caption) { footer.css('display', '').html(caption); } else { footer.css('display', 'none'); }
            return this;
        },
        showLoading: function() { this.lightbox_body.html('<div class="modal-loading">Loading..</div>'); return this; },
        showYoutubeVideo: function(id) {
            var aspectRatio, height, width;
            aspectRatio = 560 / 315;
            width = this.$element.data('width') || 560;
            width = this.checkDimensions(width);
            height = width / aspectRatio;
            this.resize(width);
            this.lightbox_body.html('<iframe width="' + width + '" height="' + height + '" src="//www.youtube.com/embed/' + id + '?badge=0&autoplay=1&html5=1" frameborder="0" allowfullscreen></iframe>');
            if (this.modal_arrows) { return this.modal_arrows.css('display', 'none'); }
        },
        showVimeoVideo: function(id) {
            var aspectRatio, height, width;
            aspectRatio = 500 / 281;
            width = this.$element.data('width') || 560;
            width = this.checkDimensions(width);
            height = width / aspectRatio;
            this.resize(width);
            this.lightbox_body.html('<iframe width="' + width + '" height="' + height + '" src="' + id + '?autoplay=1" frameborder="0" allowfullscreen></iframe>');
            if (this.modal_arrows) { return this.modal_arrows.css('display', 'none'); }
        },
        error: function(message) { this.lightbox_body.html(message); return this; },
        preloadImage: function(src, onLoadShowImage, alt) {
            var img, _this = this;
            img = new Image();
            if ((onLoadShowImage == null) || onLoadShowImage === true) {
                img.onload = function() {
                    var image;
                    image = $('<img />');
                    image.attr('src', img.src);
                    image.addClass('img-responsive');
                    if (alt != null)
                        image.attr('alt', img.alt);
                    _this.lightbox_body.html(image);
                    if (_this.modal_arrows) { _this.modal_arrows.css('display', 'block'); }
                    if (img.width > 800)
                        return _this.resize(800);
                    return _this.resize(img.width);
                };
                img.onerror = function() { return _this.error('Failed to load image: ' + src); };
            }
            if (alt != null)
                img.alt = alt;
            img.src = src;
            return img;
        },
        resize: function(width) {
            var width_total;
            width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;
            this.modal_dialog.css('width', 'auto').css('max-width', width_total);
            this.lightbox_container.find('a').css('padding-top', function() { return $(this).parent().height() / 2; });
            return this;
        },
        checkDimensions: function(width) {
            var body_width, width_total;
            width_total = width + this.border.left + this.padding.left + this.padding.right + this.border.right;
            body_width = document.body.clientWidth;
            if (width_total > body_width) { width = this.modal_body.width(); }
            return width;
        },
        close: function() { return this.modal.modal('hide'); }
    };
    $.fn.ekkoLightbox = function(options) {
        return this.each(function() {
            var $this;
            $this = $(this);
            options = $.extend({ remote: $this.attr('data-remote') || $this.attr('href'), gallery_parent_selector: $this.attr('data-parent'), type: $this.attr('data-type') }, options, $this.data());
            if (options.id.replace) { options.id = options.id.replace(/[.]/g, ''); }
            new EkkoLightbox(this, options);
            return this;
        });
    };
    $.fn.ekkoLightbox.defaults = { gallery_parent_selector: '*:not(.row)', left_arrow_class: '.glyphicon .glyphicon-chevron-left', right_arrow_class: '.glyphicon .glyphicon-chevron-right', directional_arrows: true, type: null, always_show_close: true, onShow: function() {}, onShown: function() {}, onHide: function() {}, onHidden: function() {} };
}).call(this);

(function(window) {
    var slice = Array.prototype.slice;

    function noop() {}

    function defineBridget($) {
        if (!$) { return; }

        function addOptionMethod(PluginClass) {
            if (PluginClass.prototype.option) { return; }
            PluginClass.prototype.option = function(opts) {
                if (!$.isPlainObject(opts)) { return; }
                this.options = $.extend(true, this.options, opts);
            };
        }
        var logError = typeof console === 'undefined' ? noop : function(message) { console.error(message); };

        function bridge(namespace, PluginClass) {
            $.fn[namespace] = function(options) {
                if (typeof options === 'string') {
                    var args = slice.call(arguments, 1);
                    for (var i = 0, len = this.length; i < len; i++) {
                        var elem = this[i];
                        var instance = $.data(elem, namespace);
                        if (!instance) { logError("cannot call methods on " + namespace + " prior to initialization; " + "attempted to call '" + options + "'"); continue; }
                        if (!$.isFunction(instance[options]) || options.charAt(0) === '_') { logError("no such method '" + options + "' for " + namespace + " instance"); continue; }
                        var returnValue = instance[options].apply(instance, args);
                        if (returnValue !== undefined) { return returnValue; }
                    }
                    return this;
                } else {
                    return this.each(function() {
                        var instance = $.data(this, namespace);
                        if (instance) {
                            instance.option(options);
                            instance._init();
                        } else {
                            instance = new PluginClass(this, options);
                            $.data(this, namespace, instance);
                        }
                    });
                }
            };
        }
        $.bridget = function(namespace, PluginClass) {
            addOptionMethod(PluginClass);
            bridge(namespace, PluginClass);
        };
        return $.bridget;
    }
    if (typeof define === 'function' && define.amd) { define('jquery-bridget/jquery.bridget', ['jquery'], defineBridget); } else { defineBridget(window.jQuery); }
})(window);
(function(window) {
    var docElem = document.documentElement;
    var bind = function() {};

    function getIEEvent(obj) {
        var event = window.event;
        event.target = event.target || event.srcElement || obj;
        return event;
    }
    if (docElem.addEventListener) { bind = function(obj, type, fn) { obj.addEventListener(type, fn, false); }; } else if (docElem.attachEvent) {
        bind = function(obj, type, fn) {
            obj[type + fn] = fn.handleEvent ? function() {
                var event = getIEEvent(obj);
                fn.handleEvent.call(fn, event);
            } : function() {
                var event = getIEEvent(obj);
                fn.call(obj, event);
            };
            obj.attachEvent("on" + type, obj[type + fn]);
        };
    }
    var unbind = function() {};
    if (docElem.removeEventListener) { unbind = function(obj, type, fn) { obj.removeEventListener(type, fn, false); }; } else if (docElem.detachEvent) { unbind = function(obj, type, fn) { obj.detachEvent("on" + type, obj[type + fn]); try { delete obj[type + fn]; } catch (err) { obj[type + fn] = undefined; } }; }
    var eventie = { bind: bind, unbind: unbind };
    if (typeof define === 'function' && define.amd) { define('eventie/eventie', eventie); } else if (typeof exports === 'object') { module.exports = eventie; } else { window.eventie = eventie; }
})(this);
(function(window) {
    var document = window.document;
    var queue = [];

    function docReady(fn) {
        if (typeof fn !== 'function') { return; }
        if (docReady.isReady) { fn(); } else { queue.push(fn); }
    }
    docReady.isReady = false;

    function init(event) {
        var isIE8NotReady = event.type === 'readystatechange' && document.readyState !== 'complete';
        if (docReady.isReady || isIE8NotReady) { return; }
        docReady.isReady = true;
        for (var i = 0, len = queue.length; i < len; i++) {
            var fn = queue[i];
            fn();
        }
    }

    function defineDocReady(eventie) {
        eventie.bind(document, 'DOMContentLoaded', init);
        eventie.bind(document, 'readystatechange', init);
        eventie.bind(window, 'load', init);
        return docReady;
    }
    if (typeof define === 'function' && define.amd) {
        docReady.isReady = typeof requirejs === 'function';
        define('doc-ready/doc-ready', ['eventie/eventie'], defineDocReady);
    } else { window.docReady = defineDocReady(window.eventie); }
})(this);
(function() {
    function EventEmitter() {}
    var proto = EventEmitter.prototype;
    var exports = this;
    var originalGlobalValue = exports.EventEmitter;

    function indexOfListener(listeners, listener) {
        var i = listeners.length;
        while (i--) { if (listeners[i].listener === listener) { return i; } }
        return -1;
    }

    function alias(name) { return function aliasClosure() { return this[name].apply(this, arguments); }; }
    proto.getListeners = function getListeners(evt) {
        var events = this._getEvents();
        var response;
        var key;
        if (evt instanceof RegExp) { response = {}; for (key in events) { if (events.hasOwnProperty(key) && evt.test(key)) { response[key] = events[key]; } } } else { response = events[evt] || (events[evt] = []); }
        return response;
    };
    proto.flattenListeners = function flattenListeners(listeners) {
        var flatListeners = [];
        var i;
        for (i = 0; i < listeners.length; i += 1) { flatListeners.push(listeners[i].listener); }
        return flatListeners;
    };
    proto.getListenersAsObject = function getListenersAsObject(evt) {
        var listeners = this.getListeners(evt);
        var response;
        if (listeners instanceof Array) {
            response = {};
            response[evt] = listeners;
        }
        return response || listeners;
    };
    proto.addListener = function addListener(evt, listener) {
        var listeners = this.getListenersAsObject(evt);
        var listenerIsWrapped = typeof listener === 'object';
        var key;
        for (key in listeners) { if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) { listeners[key].push(listenerIsWrapped ? listener : { listener: listener, once: false }); } }
        return this;
    };
    proto.on = alias('addListener');
    proto.addOnceListener = function addOnceListener(evt, listener) { return this.addListener(evt, { listener: listener, once: true }); };
    proto.once = alias('addOnceListener');
    proto.defineEvent = function defineEvent(evt) { this.getListeners(evt); return this; };
    proto.defineEvents = function defineEvents(evts) {
        for (var i = 0; i < evts.length; i += 1) { this.defineEvent(evts[i]); }
        return this;
    };
    proto.removeListener = function removeListener(evt, listener) {
        var listeners = this.getListenersAsObject(evt);
        var index;
        var key;
        for (key in listeners) { if (listeners.hasOwnProperty(key)) { index = indexOfListener(listeners[key], listener); if (index !== -1) { listeners[key].splice(index, 1); } } }
        return this;
    };
    proto.off = alias('removeListener');
    proto.addListeners = function addListeners(evt, listeners) { return this.manipulateListeners(false, evt, listeners); };
    proto.removeListeners = function removeListeners(evt, listeners) { return this.manipulateListeners(true, evt, listeners); };
    proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) {
        var i;
        var value;
        var single = remove ? this.removeListener : this.addListener;
        var multiple = remove ? this.removeListeners : this.addListeners;
        if (typeof evt === 'object' && !(evt instanceof RegExp)) {
            for (i in evt) {
                if (evt.hasOwnProperty(i) && (value = evt[i])) {
                    if (typeof value === 'function') { single.call(this, i, value); } else { multiple.call(this, i, value); }
                }
            }
        } else { i = listeners.length; while (i--) { single.call(this, evt, listeners[i]); } }
        return this;
    };
    proto.removeEvent = function removeEvent(evt) {
        var type = typeof evt;
        var events = this._getEvents();
        var key;
        if (type === 'string') { delete events[evt]; } else if (evt instanceof RegExp) { for (key in events) { if (events.hasOwnProperty(key) && evt.test(key)) { delete events[key]; } } } else { delete this._events; }
        return this;
    };
    proto.removeAllListeners = alias('removeEvent');
    proto.emitEvent = function emitEvent(evt, args) {
        var listeners = this.getListenersAsObject(evt);
        var listener;
        var i;
        var key;
        var response;
        for (key in listeners) {
            if (listeners.hasOwnProperty(key)) {
                i = listeners[key].length;
                while (i--) {
                    listener = listeners[key][i];
                    if (listener.once === true) { this.removeListener(evt, listener.listener); }
                    response = listener.listener.apply(this, args || []);
                    if (response === this._getOnceReturnValue()) { this.removeListener(evt, listener.listener); }
                }
            }
        }
        return this;
    };
    proto.trigger = alias('emitEvent');
    proto.emit = function emit(evt) { var args = Array.prototype.slice.call(arguments, 1); return this.emitEvent(evt, args); };
    proto.setOnceReturnValue = function setOnceReturnValue(value) { this._onceReturnValue = value; return this; };
    proto._getOnceReturnValue = function _getOnceReturnValue() {
        if (this.hasOwnProperty('_onceReturnValue')) { return this._onceReturnValue; } else { return true; }
    };
    proto._getEvents = function _getEvents() { return this._events || (this._events = {}); };
    EventEmitter.noConflict = function noConflict() { exports.EventEmitter = originalGlobalValue; return EventEmitter; };
    if (typeof define === 'function' && define.amd) { define('eventEmitter/EventEmitter', [], function() { return EventEmitter; }); } else if (typeof module === 'object' && module.exports) { module.exports = EventEmitter; } else { this.EventEmitter = EventEmitter; }
}.call(this));
(function(window) {
    var prefixes = 'Webkit Moz ms Ms O'.split(' ');
    var docElemStyle = document.documentElement.style;

    function getStyleProperty(propName) {
        if (!propName) { return; }
        if (typeof docElemStyle[propName] === 'string') { return propName; }
        propName = propName.charAt(0).toUpperCase() + propName.slice(1);
        var prefixed;
        for (var i = 0, len = prefixes.length; i < len; i++) { prefixed = prefixes[i] + propName; if (typeof docElemStyle[prefixed] === 'string') { return prefixed; } }
    }
    if (typeof define === 'function' && define.amd) { define('get-style-property/get-style-property', [], function() { return getStyleProperty; }); } else if (typeof exports === 'object') { module.exports = getStyleProperty; } else { window.getStyleProperty = getStyleProperty; }
})(window);
(function(window, undefined) {
    var getComputedStyle = window.getComputedStyle;
    var getStyle = getComputedStyle ? function(elem) { return getComputedStyle(elem, null); } : function(elem) { return elem.currentStyle; };

    function getStyleSize(value) { var num = parseFloat(value); var isValid = value.indexOf('%') === -1 && !isNaN(num); return isValid && num; }
    var measurements = ['paddingLeft', 'paddingRight', 'paddingTop', 'paddingBottom', 'marginLeft', 'marginRight', 'marginTop', 'marginBottom', 'borderLeftWidth', 'borderRightWidth', 'borderTopWidth', 'borderBottomWidth'];

    function getZeroSize() {
        var size = { width: 0, height: 0, innerWidth: 0, innerHeight: 0, outerWidth: 0, outerHeight: 0 };
        for (var i = 0, len = measurements.length; i < len; i++) {
            var measurement = measurements[i];
            size[measurement] = 0;
        }
        return size;
    }

    function defineGetSize(getStyleProperty) {
        var boxSizingProp = getStyleProperty('boxSizing');
        var isBoxSizeOuter;
        (function() {
            if (!boxSizingProp) { return; }
            var div = document.createElement('div');
            div.style.width = '200px';
            div.style.padding = '1px 2px 3px 4px';
            div.style.borderStyle = 'solid';
            div.style.borderWidth = '1px 2px 3px 4px';
            div.style[boxSizingProp] = 'border-box';
            var body = document.body || document.documentElement;
            body.appendChild(div);
            var style = getStyle(div);
            isBoxSizeOuter = getStyleSize(style.width) === 200;
            body.removeChild(div);
        })();

        function getSize(elem) {
            if (typeof elem === 'string') { elem = document.querySelector(elem); }
            if (!elem || typeof elem !== 'object' || !elem.nodeType) { return; }
            var style = getStyle(elem);
            if (style.display === 'none') { return getZeroSize(); }
            var size = {};
            size.width = elem.offsetWidth;
            size.height = elem.offsetHeight;
            var isBorderBox = size.isBorderBox = !!(boxSizingProp && style[boxSizingProp] && style[boxSizingProp] === 'border-box');
            for (var i = 0, len = measurements.length; i < len; i++) {
                var measurement = measurements[i];
                var value = style[measurement];
                value = mungeNonPixel(elem, value);
                var num = parseFloat(value);
                size[measurement] = !isNaN(num) ? num : 0;
            }
            var paddingWidth = size.paddingLeft + size.paddingRight;
            var paddingHeight = size.paddingTop + size.paddingBottom;
            var marginWidth = size.marginLeft + size.marginRight;
            var marginHeight = size.marginTop + size.marginBottom;
            var borderWidth = size.borderLeftWidth + size.borderRightWidth;
            var borderHeight = size.borderTopWidth + size.borderBottomWidth;
            var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
            var styleWidth = getStyleSize(style.width);
            if (styleWidth !== false) {
                size.width = styleWidth +
                    (isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth);
            }
            var styleHeight = getStyleSize(style.height);
            if (styleHeight !== false) {
                size.height = styleHeight +
                    (isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight);
            }
            size.innerWidth = size.width - (paddingWidth + borderWidth);
            size.innerHeight = size.height - (paddingHeight + borderHeight);
            size.outerWidth = size.width + marginWidth;
            size.outerHeight = size.height + marginHeight;
            return size;
        }

        function mungeNonPixel(elem, value) {
            if (getComputedStyle || value.indexOf('%') === -1) { return value; }
            var style = elem.style;
            var left = style.left;
            var rs = elem.runtimeStyle;
            var rsLeft = rs && rs.left;
            if (rsLeft) { rs.left = elem.currentStyle.left; }
            style.left = value;
            value = style.pixelLeft;
            style.left = left;
            if (rsLeft) { rs.left = rsLeft; }
            return value;
        }
        return getSize;
    }
    if (typeof define === 'function' && define.amd) { define('get-size/get-size', ['get-style-property/get-style-property'], defineGetSize); } else if (typeof exports === 'object') { module.exports = defineGetSize(require('get-style-property')); } else { window.getSize = defineGetSize(window.getStyleProperty); }
})(window);
(function(global, ElemProto) {
    var matchesMethod = (function() {
        if (ElemProto.matchesSelector) { return 'matchesSelector'; }
        var prefixes = ['webkit', 'moz', 'ms', 'o'];
        for (var i = 0, len = prefixes.length; i < len; i++) { var prefix = prefixes[i]; var method = prefix + 'MatchesSelector'; if (ElemProto[method]) { return method; } }
    })();

    function match(elem, selector) { return elem[matchesMethod](selector); }

    function checkParent(elem) {
        if (elem.parentNode) { return; }
        var fragment = document.createDocumentFragment();
        fragment.appendChild(elem);
    }

    function query(elem, selector) {
        checkParent(elem);
        var elems = elem.parentNode.querySelectorAll(selector);
        for (var i = 0, len = elems.length; i < len; i++) { if (elems[i] === elem) { return true; } }
        return false;
    }

    function matchChild(elem, selector) { checkParent(elem); return match(elem, selector); }
    var matchesSelector;
    if (matchesMethod) {
        var div = document.createElement('div');
        var supportsOrphans = match(div, 'div');
        matchesSelector = supportsOrphans ? match : matchChild;
    } else { matchesSelector = query; }
    if (typeof define === 'function' && define.amd) { define('matches-selector/matches-selector', [], function() { return matchesSelector; }); } else { window.matchesSelector = matchesSelector; }
})(this, Element.prototype);
(function(window) {
    var getComputedStyle = window.getComputedStyle;
    var getStyle = getComputedStyle ? function(elem) { return getComputedStyle(elem, null); } : function(elem) { return elem.currentStyle; };

    function extend(a, b) {
        for (var prop in b) { a[prop] = b[prop]; }
        return a;
    }

    function isEmptyObj(obj) {
        for (var prop in obj) { return false; }
        prop = null;
        return true;
    }

    function toDash(str) { return str.replace(/([A-Z])/g, function($1) { return '-' + $1.toLowerCase(); }); }

    function outlayerItemDefinition(EventEmitter, getSize, getStyleProperty) {
        var transitionProperty = getStyleProperty('transition');
        var transformProperty = getStyleProperty('transform');
        var supportsCSS3 = transitionProperty && transformProperty;
        var is3d = !!getStyleProperty('perspective');
        var transitionEndEvent = { WebkitTransition: 'webkitTransitionEnd', MozTransition: 'transitionend', OTransition: 'otransitionend', transition: 'transitionend' }[transitionProperty];
        var prefixableProperties = ['transform', 'transition', 'transitionDuration', 'transitionProperty'];
        var vendorProperties = (function() {
            var cache = {};
            for (var i = 0, len = prefixableProperties.length; i < len; i++) { var prop = prefixableProperties[i]; var supportedProp = getStyleProperty(prop); if (supportedProp && supportedProp !== prop) { cache[prop] = supportedProp; } }
            return cache;
        })();

        function Item(element, layout) {
            if (!element) { return; }
            this.element = element;
            this.layout = layout;
            this.position = { x: 0, y: 0 };
            this._create();
        }
        extend(Item.prototype, EventEmitter.prototype);
        Item.prototype._create = function() {
            this._transn = { ingProperties: {}, clean: {}, onEnd: {} };
            this.css({ position: 'absolute' });
        };
        Item.prototype.handleEvent = function(event) { var method = 'on' + event.type; if (this[method]) { this[method](event); } };
        Item.prototype.getSize = function() { this.size = getSize(this.element); };
        Item.prototype.css = function(style) {
            var elemStyle = this.element.style;
            for (var prop in style) {
                var supportedProp = vendorProperties[prop] || prop;
                elemStyle[supportedProp] = style[prop];
            }
        };
        Item.prototype.getPosition = function() {
            var style = getStyle(this.element);
            var layoutOptions = this.layout.options;
            var isOriginLeft = layoutOptions.isOriginLeft;
            var isOriginTop = layoutOptions.isOriginTop;
            var x = parseInt(style[isOriginLeft ? 'left' : 'right'], 10);
            var y = parseInt(style[isOriginTop ? 'top' : 'bottom'], 10);
            x = isNaN(x) ? 0 : x;
            y = isNaN(y) ? 0 : y;
            var layoutSize = this.layout.size;
            x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
            y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
            this.position.x = x;
            this.position.y = y;
        };
        Item.prototype.layoutPosition = function() {
            var layoutSize = this.layout.size;
            var layoutOptions = this.layout.options;
            var style = {};
            if (layoutOptions.isOriginLeft) {
                style.left = (this.position.x + layoutSize.paddingLeft) + 'px';
                style.right = '';
            } else {
                style.right = (this.position.x + layoutSize.paddingRight) + 'px';
                style.left = '';
            }
            if (layoutOptions.isOriginTop) {
                style.top = (this.position.y + layoutSize.paddingTop) + 'px';
                style.bottom = '';
            } else {
                style.bottom = (this.position.y + layoutSize.paddingBottom) + 'px';
                style.top = '';
            }
            this.css(style);
            this.emitEvent('layout', [this]);
        };
        var translate = is3d ? function(x, y) { return 'translate3d(' + x + 'px, ' + y + 'px, 0)'; } : function(x, y) { return 'translate(' + x + 'px, ' + y + 'px)'; };
        Item.prototype._transitionTo = function(x, y) {
            this.getPosition();
            var curX = this.position.x;
            var curY = this.position.y;
            var compareX = parseInt(x, 10);
            var compareY = parseInt(y, 10);
            var didNotMove = compareX === this.position.x && compareY === this.position.y;
            this.setPosition(x, y);
            if (didNotMove && !this.isTransitioning) { this.layoutPosition(); return; }
            var transX = x - curX;
            var transY = y - curY;
            var transitionStyle = {};
            var layoutOptions = this.layout.options;
            transX = layoutOptions.isOriginLeft ? transX : -transX;
            transY = layoutOptions.isOriginTop ? transY : -transY;
            transitionStyle.transform = translate(transX, transY);
            this.transition({ to: transitionStyle, onTransitionEnd: { transform: this.layoutPosition }, isCleaning: true });
        };
        Item.prototype.goTo = function(x, y) {
            this.setPosition(x, y);
            this.layoutPosition();
        };
        Item.prototype.moveTo = supportsCSS3 ? Item.prototype._transitionTo : Item.prototype.goTo;
        Item.prototype.setPosition = function(x, y) {
            this.position.x = parseInt(x, 10);
            this.position.y = parseInt(y, 10);
        };
        Item.prototype._nonTransition = function(args) {
            this.css(args.to);
            if (args.isCleaning) { this._removeStyles(args.to); }
            for (var prop in args.onTransitionEnd) { args.onTransitionEnd[prop].call(this); }
        };
        Item.prototype._transition = function(args) {
            if (!parseFloat(this.layout.options.transitionDuration)) { this._nonTransition(args); return; }
            var _transition = this._transn;
            for (var prop in args.onTransitionEnd) { _transition.onEnd[prop] = args.onTransitionEnd[prop]; }
            for (prop in args.to) { _transition.ingProperties[prop] = true; if (args.isCleaning) { _transition.clean[prop] = true; } }
            if (args.from) {
                this.css(args.from);
                var h = this.element.offsetHeight;
                h = null;
            }
            this.enableTransition(args.to);
            this.css(args.to);
            this.isTransitioning = true;
        };
        var itemTransitionProperties = transformProperty && (toDash(transformProperty) + ',opacity');
        Item.prototype.enableTransition = function() {
            if (this.isTransitioning) { return; }
            this.css({ transitionProperty: itemTransitionProperties, transitionDuration: this.layout.options.transitionDuration });
            this.element.addEventListener(transitionEndEvent, this, false);
        };
        Item.prototype.transition = Item.prototype[transitionProperty ? '_transition' : '_nonTransition'];
        Item.prototype.onwebkitTransitionEnd = function(event) { this.ontransitionend(event); };
        Item.prototype.onotransitionend = function(event) { this.ontransitionend(event); };
        var dashedVendorProperties = { '-webkit-transform': 'transform', '-moz-transform': 'transform', '-o-transform': 'transform' };
        Item.prototype.ontransitionend = function(event) {
            if (event.target !== this.element) { return; }
            var _transition = this._transn;
            var propertyName = dashedVendorProperties[event.propertyName] || event.propertyName;
            delete _transition.ingProperties[propertyName];
            if (isEmptyObj(_transition.ingProperties)) { this.disableTransition(); }
            if (propertyName in _transition.clean) {
                this.element.style[event.propertyName] = '';
                delete _transition.clean[propertyName];
            }
            if (propertyName in _transition.onEnd) {
                var onTransitionEnd = _transition.onEnd[propertyName];
                onTransitionEnd.call(this);
                delete _transition.onEnd[propertyName];
            }
            this.emitEvent('transitionEnd', [this]);
        };
        Item.prototype.disableTransition = function() {
            this.removeTransitionStyles();
            this.element.removeEventListener(transitionEndEvent, this, false);
            this.isTransitioning = false;
        };
        Item.prototype._removeStyles = function(style) {
            var cleanStyle = {};
            for (var prop in style) { cleanStyle[prop] = ''; }
            this.css(cleanStyle);
        };
        var cleanTransitionStyle = { transitionProperty: '', transitionDuration: '' };
        Item.prototype.removeTransitionStyles = function() { this.css(cleanTransitionStyle); };
        Item.prototype.removeElem = function() {
            this.element.parentNode.removeChild(this.element);
            this.emitEvent('remove', [this]);
        };
        Item.prototype.remove = function() {
            if (!transitionProperty || !parseFloat(this.layout.options.transitionDuration)) { this.removeElem(); return; }
            var _this = this;
            this.on('transitionEnd', function() { _this.removeElem(); return true; });
            this.hide();
        };
        Item.prototype.reveal = function() {
            delete this.isHidden;
            this.css({ display: '' });
            var options = this.layout.options;
            this.transition({ from: options.hiddenStyle, to: options.visibleStyle, isCleaning: true });
        };
        Item.prototype.hide = function() {
            this.isHidden = true;
            this.css({ display: '' });
            var options = this.layout.options;
            this.transition({ from: options.visibleStyle, to: options.hiddenStyle, isCleaning: true, onTransitionEnd: { opacity: function() { if (this.isHidden) { this.css({ display: 'none' }); } } } });
        };
        Item.prototype.destroy = function() { this.css({ position: '', left: '', right: '', top: '', bottom: '', transition: '', transform: '' }); };
        return Item;
    }
    if (typeof define === 'function' && define.amd) { define('outlayer/item', ['eventEmitter/EventEmitter', 'get-size/get-size', 'get-style-property/get-style-property'], outlayerItemDefinition); } else {
        window.Outlayer = {};
        window.Outlayer.Item = outlayerItemDefinition(window.EventEmitter, window.getSize, window.getStyleProperty);
    }
})(window);
(function(window) {
    var document = window.document;
    var console = window.console;
    var jQuery = window.jQuery;
    var noop = function() {};

    function extend(a, b) {
        for (var prop in b) { a[prop] = b[prop]; }
        return a;
    }
    var objToString = Object.prototype.toString;

    function isArray(obj) { return objToString.call(obj) === '[object Array]'; }

    function makeArray(obj) {
        var ary = [];
        if (isArray(obj)) { ary = obj; } else if (obj && typeof obj.length === 'number') { for (var i = 0, len = obj.length; i < len; i++) { ary.push(obj[i]); } } else { ary.push(obj); }
        return ary;
    }
    var isElement = (typeof HTMLElement === 'object') ? function isElementDOM2(obj) { return obj instanceof HTMLElement; } : function isElementQuirky(obj) { return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string'; };
    var indexOf = Array.prototype.indexOf ? function(ary, obj) { return ary.indexOf(obj); } : function(ary, obj) {
        for (var i = 0, len = ary.length; i < len; i++) { if (ary[i] === obj) { return i; } }
        return -1;
    };

    function removeFrom(obj, ary) { var index = indexOf(ary, obj); if (index !== -1) { ary.splice(index, 1); } }

    function toDashed(str) { return str.replace(/(.)([A-Z])/g, function(match, $1, $2) { return $1 + '-' + $2; }).toLowerCase(); }

    function outlayerDefinition(eventie, docReady, EventEmitter, getSize, matchesSelector, Item) {
        var GUID = 0;
        var instances = {};

        function Outlayer(element, options) {
            if (typeof element === 'string') { element = document.querySelector(element); }
            if (!element || !isElement(element)) {
                if (console) { console.error('Bad ' + this.constructor.namespace + ' element: ' + element); }
                return;
            }
            this.element = element;
            this.options = extend({}, this.constructor.defaults);
            this.option(options);
            var id = ++GUID;
            this.element.outlayerGUID = id;
            instances[id] = this;
            this._create();
            if (this.options.isInitLayout) { this.layout(); }
        }
        Outlayer.namespace = 'outlayer';
        Outlayer.Item = Item;
        Outlayer.defaults = { containerStyle: { position: 'relative' }, isInitLayout: true, isOriginLeft: true, isOriginTop: true, isResizeBound: true, isResizingContainer: true, transitionDuration: '0.4s', hiddenStyle: { opacity: 0, transform: 'scale(0.001)' }, visibleStyle: { opacity: 1, transform: 'scale(1)' } };
        extend(Outlayer.prototype, EventEmitter.prototype);
        Outlayer.prototype.option = function(opts) { extend(this.options, opts); };
        Outlayer.prototype._create = function() {
            this.reloadItems();
            this.stamps = [];
            this.stamp(this.options.stamp);
            extend(this.element.style, this.options.containerStyle);
            if (this.options.isResizeBound) { this.bindResize(); }
        };
        Outlayer.prototype.reloadItems = function() { this.items = this._itemize(this.element.children); };
        Outlayer.prototype._itemize = function(elems) {
            var itemElems = this._filterFindItemElements(elems);
            var Item = this.constructor.Item;
            var items = [];
            for (var i = 0, len = itemElems.length; i < len; i++) {
                var elem = itemElems[i];
                var item = new Item(elem, this);
                items.push(item);
            }
            return items;
        };
        Outlayer.prototype._filterFindItemElements = function(elems) {
            elems = makeArray(elems);
            var itemSelector = this.options.itemSelector;
            var itemElems = [];
            for (var i = 0, len = elems.length; i < len; i++) {
                var elem = elems[i];
                if (!isElement(elem)) { continue; }
                if (itemSelector) {
                    if (matchesSelector(elem, itemSelector)) { itemElems.push(elem); }
                    var childElems = elem.querySelectorAll(itemSelector);
                    for (var j = 0, jLen = childElems.length; j < jLen; j++) { itemElems.push(childElems[j]); }
                } else { itemElems.push(elem); }
            }
            return itemElems;
        };
        Outlayer.prototype.getItemElements = function() {
            var elems = [];
            for (var i = 0, len = this.items.length; i < len; i++) { elems.push(this.items[i].element); }
            return elems;
        };
        Outlayer.prototype.layout = function() {
            this._resetLayout();
            this._manageStamps();
            var isInstant = this.options.isLayoutInstant !== undefined ? this.options.isLayoutInstant : !this._isLayoutInited;
            this.layoutItems(this.items, isInstant);
            this._isLayoutInited = true;
        };
        Outlayer.prototype._init = Outlayer.prototype.layout;
        Outlayer.prototype._resetLayout = function() { this.getSize(); };
        Outlayer.prototype.getSize = function() { this.size = getSize(this.element); };
        Outlayer.prototype._getMeasurement = function(measurement, size) {
            var option = this.options[measurement];
            var elem;
            if (!option) { this[measurement] = 0; } else {
                if (typeof option === 'string') { elem = this.element.querySelector(option); } else if (isElement(option)) { elem = option; }
                this[measurement] = elem ? getSize(elem)[size] : option;
            }
        };
        Outlayer.prototype.layoutItems = function(items, isInstant) {
            items = this._getItemsForLayout(items);
            this._layoutItems(items, isInstant);
            this._postLayout();
        };
        Outlayer.prototype._getItemsForLayout = function(items) {
            var layoutItems = [];
            for (var i = 0, len = items.length; i < len; i++) { var item = items[i]; if (!item.isIgnored) { layoutItems.push(item); } }
            return layoutItems;
        };
        Outlayer.prototype._layoutItems = function(items, isInstant) {
            var _this = this;

            function onItemsLayout() { _this.emitEvent('layoutComplete', [_this, items]); }
            if (!items || !items.length) { onItemsLayout(); return; }
            this._itemsOn(items, 'layout', onItemsLayout);
            var queue = [];
            for (var i = 0, len = items.length; i < len; i++) {
                var item = items[i];
                var position = this._getItemLayoutPosition(item);
                position.item = item;
                position.isInstant = isInstant || item.isLayoutInstant;
                queue.push(position);
            }
            this._processLayoutQueue(queue);
        };
        Outlayer.prototype._getItemLayoutPosition = function() { return { x: 0, y: 0 }; };
        Outlayer.prototype._processLayoutQueue = function(queue) {
            for (var i = 0, len = queue.length; i < len; i++) {
                var obj = queue[i];
                this._positionItem(obj.item, obj.x, obj.y, obj.isInstant);
            }
        };
        Outlayer.prototype._positionItem = function(item, x, y, isInstant) { if (isInstant) { item.goTo(x, y); } else { item.moveTo(x, y); } };
        Outlayer.prototype._postLayout = function() { this.resizeContainer(); };
        Outlayer.prototype.resizeContainer = function() {
            if (!this.options.isResizingContainer) { return; }
            var size = this._getContainerSize();
            if (size) {
                this._setContainerMeasure(size.width, true);
                this._setContainerMeasure(size.height, false);
            }
        };
        Outlayer.prototype._getContainerSize = noop;
        Outlayer.prototype._setContainerMeasure = function(measure, isWidth) {
            if (measure === undefined) { return; }
            var elemSize = this.size;
            if (elemSize.isBorderBox) {
                measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
                    elemSize.borderLeftWidth + elemSize.borderRightWidth : elemSize.paddingBottom + elemSize.paddingTop +
                    elemSize.borderTopWidth + elemSize.borderBottomWidth;
            }
            measure = Math.max(measure, 0);
            this.element.style[isWidth ? 'width' : 'height'] = measure + 'px';
        };
        Outlayer.prototype._itemsOn = function(items, eventName, callback) {
            var doneCount = 0;
            var count = items.length;
            var _this = this;

            function tick() {
                doneCount++;
                if (doneCount === count) { callback.call(_this); }
                return true;
            }
            for (var i = 0, len = items.length; i < len; i++) {
                var item = items[i];
                item.on(eventName, tick);
            }
        };
        Outlayer.prototype.ignore = function(elem) { var item = this.getItem(elem); if (item) { item.isIgnored = true; } };
        Outlayer.prototype.unignore = function(elem) { var item = this.getItem(elem); if (item) { delete item.isIgnored; } };
        Outlayer.prototype.stamp = function(elems) {
            elems = this._find(elems);
            if (!elems) { return; }
            this.stamps = this.stamps.concat(elems);
            for (var i = 0, len = elems.length; i < len; i++) {
                var elem = elems[i];
                this.ignore(elem);
            }
        };
        Outlayer.prototype.unstamp = function(elems) {
            elems = this._find(elems);
            if (!elems) { return; }
            for (var i = 0, len = elems.length; i < len; i++) {
                var elem = elems[i];
                removeFrom(elem, this.stamps);
                this.unignore(elem);
            }
        };
        Outlayer.prototype._find = function(elems) {
            if (!elems) { return; }
            if (typeof elems === 'string') { elems = this.element.querySelectorAll(elems); }
            elems = makeArray(elems);
            return elems;
        };
        Outlayer.prototype._manageStamps = function() {
            if (!this.stamps || !this.stamps.length) { return; }
            this._getBoundingRect();
            for (var i = 0, len = this.stamps.length; i < len; i++) {
                var stamp = this.stamps[i];
                this._manageStamp(stamp);
            }
        };
        Outlayer.prototype._getBoundingRect = function() {
            var boundingRect = this.element.getBoundingClientRect();
            var size = this.size;
            this._boundingRect = { left: boundingRect.left + size.paddingLeft + size.borderLeftWidth, top: boundingRect.top + size.paddingTop + size.borderTopWidth, right: boundingRect.right - (size.paddingRight + size.borderRightWidth), bottom: boundingRect.bottom - (size.paddingBottom + size.borderBottomWidth) };
        };
        Outlayer.prototype._manageStamp = noop;
        Outlayer.prototype._getElementOffset = function(elem) { var boundingRect = elem.getBoundingClientRect(); var thisRect = this._boundingRect; var size = getSize(elem); var offset = { left: boundingRect.left - thisRect.left - size.marginLeft, top: boundingRect.top - thisRect.top - size.marginTop, right: thisRect.right - boundingRect.right - size.marginRight, bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom }; return offset; };
        Outlayer.prototype.handleEvent = function(event) { var method = 'on' + event.type; if (this[method]) { this[method](event); } };
        Outlayer.prototype.bindResize = function() {
            if (this.isResizeBound) { return; }
            eventie.bind(window, 'resize', this);
            this.isResizeBound = true;
        };
        Outlayer.prototype.unbindResize = function() {
            if (this.isResizeBound) { eventie.unbind(window, 'resize', this); }
            this.isResizeBound = false;
        };
        Outlayer.prototype.onresize = function() {
            if (this.resizeTimeout) { clearTimeout(this.resizeTimeout); }
            var _this = this;

            function delayed() {
                _this.resize();
                delete _this.resizeTimeout;
            }
            this.resizeTimeout = setTimeout(delayed, 100);
        };
        Outlayer.prototype.resize = function() {
            if (!this.isResizeBound || !this.needsResizeLayout()) { return; }
            this.layout();
        };
        Outlayer.prototype.needsResizeLayout = function() { var size = getSize(this.element); var hasSizes = this.size && size; return hasSizes && size.innerWidth !== this.size.innerWidth; };
        Outlayer.prototype.addItems = function(elems) {
            var items = this._itemize(elems);
            if (items.length) { this.items = this.items.concat(items); }
            return items;
        };
        Outlayer.prototype.appended = function(elems) {
            var items = this.addItems(elems);
            if (!items.length) { return; }
            this.layoutItems(items, true);
            this.reveal(items);
        };
        Outlayer.prototype.prepended = function(elems) {
            var items = this._itemize(elems);
            if (!items.length) { return; }
            var previousItems = this.items.slice(0);
            this.items = items.concat(previousItems);
            this._resetLayout();
            this._manageStamps();
            this.layoutItems(items, true);
            this.reveal(items);
            this.layoutItems(previousItems);
        };
        Outlayer.prototype.reveal = function(items) {
            var len = items && items.length;
            if (!len) { return; }
            for (var i = 0; i < len; i++) {
                var item = items[i];
                item.reveal();
            }
        };
        Outlayer.prototype.hide = function(items) {
            var len = items && items.length;
            if (!len) { return; }
            for (var i = 0; i < len; i++) {
                var item = items[i];
                item.hide();
            }
        };
        Outlayer.prototype.getItem = function(elem) { for (var i = 0, len = this.items.length; i < len; i++) { var item = this.items[i]; if (item.element === elem) { return item; } } };
        Outlayer.prototype.getItems = function(elems) {
            if (!elems || !elems.length) { return; }
            var items = [];
            for (var i = 0, len = elems.length; i < len; i++) { var elem = elems[i]; var item = this.getItem(elem); if (item) { items.push(item); } }
            return items;
        };
        Outlayer.prototype.remove = function(elems) {
            elems = makeArray(elems);
            var removeItems = this.getItems(elems);
            if (!removeItems || !removeItems.length) { return; }
            this._itemsOn(removeItems, 'remove', function() { this.emitEvent('removeComplete', [this, removeItems]); });
            for (var i = 0, len = removeItems.length; i < len; i++) {
                var item = removeItems[i];
                item.remove();
                removeFrom(item, this.items);
            }
        };
        Outlayer.prototype.destroy = function() {
            var style = this.element.style;
            style.height = '';
            style.position = '';
            style.width = '';
            for (var i = 0, len = this.items.length; i < len; i++) {
                var item = this.items[i];
                item.destroy();
            }
            this.unbindResize();
            delete this.element.outlayerGUID;
            if (jQuery) { jQuery.removeData(this.element, this.constructor.namespace); }
        };
        Outlayer.data = function(elem) { var id = elem && elem.outlayerGUID; return id && instances[id]; };
        Outlayer.create = function(namespace, options) {
            function Layout() { Outlayer.apply(this, arguments); }
            if (Object.create) { Layout.prototype = Object.create(Outlayer.prototype); } else { extend(Layout.prototype, Outlayer.prototype); }
            Layout.prototype.constructor = Layout;
            Layout.defaults = extend({}, Outlayer.defaults);
            extend(Layout.defaults, options);
            Layout.prototype.settings = {};
            Layout.namespace = namespace;
            Layout.data = Outlayer.data;
            Layout.Item = function LayoutItem() { Item.apply(this, arguments); };
            Layout.Item.prototype = new Item();
            docReady(function() {
                var dashedNamespace = toDashed(namespace);
                var elems = document.querySelectorAll('.js-' + dashedNamespace);
                var dataAttr = 'data-' + dashedNamespace + '-options';
                for (var i = 0, len = elems.length; i < len; i++) {
                    var elem = elems[i];
                    var attr = elem.getAttribute(dataAttr);
                    var options;
                    try { options = attr && JSON.parse(attr); } catch (error) {
                        if (console) {
                            console.error('Error parsing ' + dataAttr + ' on ' +
                                elem.nodeName.toLowerCase() + (elem.id ? '#' + elem.id : '') + ': ' +
                                error);
                        }
                        continue;
                    }
                    var instance = new Layout(elem, options);
                    if (jQuery) { jQuery.data(elem, namespace, instance); }
                }
            });
            if (jQuery && jQuery.bridget) { jQuery.bridget(namespace, Layout); }
            return Layout;
        };
        Outlayer.Item = Item;
        return Outlayer;
    }
    if (typeof define === 'function' && define.amd) { define('outlayer/outlayer', ['eventie/eventie', 'doc-ready/doc-ready', 'eventEmitter/EventEmitter', 'get-size/get-size', 'matches-selector/matches-selector', './item'], outlayerDefinition); } else { window.Outlayer = outlayerDefinition(window.eventie, window.docReady, window.EventEmitter, window.getSize, window.matchesSelector, window.Outlayer.Item); }
})(window);
(function(window) {
    var indexOf = Array.prototype.indexOf ? function(items, value) { return items.indexOf(value); } : function(items, value) {
        for (var i = 0, len = items.length; i < len; i++) { var item = items[i]; if (item === value) { return i; } }
        return -1;
    };

    function masonryDefinition(Outlayer, getSize) {
        var Masonry = Outlayer.create('masonry');
        Masonry.prototype._resetLayout = function() {
            this.getSize();
            this._getMeasurement('columnWidth', 'outerWidth');
            this._getMeasurement('gutter', 'outerWidth');
            this.measureColumns();
            var i = this.cols;
            this.colYs = [];
            while (i--) { this.colYs.push(0); }
            this.maxY = 0;
        };
        Masonry.prototype.measureColumns = function() {
            this.getContainerWidth();
            if (!this.columnWidth) {
                var firstItem = this.items[0];
                var firstItemElem = firstItem && firstItem.element;
                this.columnWidth = firstItemElem && getSize(firstItemElem).outerWidth || this.containerWidth;
            }
            this.columnWidth += this.gutter;
            this.cols = Math.floor((this.containerWidth + this.gutter) / this.columnWidth);
            this.cols = Math.max(this.cols, 1);
        };
        Masonry.prototype.getContainerWidth = function() {
            var container = this.options.isFitWidth ? this.element.parentNode : this.element;
            var size = getSize(container);
            this.containerWidth = size && size.innerWidth;
        };
        Masonry.prototype._getItemLayoutPosition = function(item) {
            item.getSize();
            var remainder = item.size.outerWidth % this.columnWidth;
            var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
            var colSpan = Math[mathMethod](item.size.outerWidth / this.columnWidth);
            colSpan = Math.min(colSpan, this.cols);
            var colGroup = this._getColGroup(colSpan);
            var minimumY = Math.min.apply(Math, colGroup);
            var shortColIndex = indexOf(colGroup, minimumY);
            var position = { x: this.columnWidth * shortColIndex, y: minimumY };
            var setHeight = minimumY + item.size.outerHeight;
            var setSpan = this.cols + 1 - colGroup.length;
            for (var i = 0; i < setSpan; i++) { this.colYs[shortColIndex + i] = setHeight; }
            return position;
        };
        Masonry.prototype._getColGroup = function(colSpan) {
            if (colSpan < 2) { return this.colYs; }
            var colGroup = [];
            var groupCount = this.cols + 1 - colSpan;
            for (var i = 0; i < groupCount; i++) {
                var groupColYs = this.colYs.slice(i, i + colSpan);
                colGroup[i] = Math.max.apply(Math, groupColYs);
            }
            return colGroup;
        };
        Masonry.prototype._manageStamp = function(stamp) {
            var stampSize = getSize(stamp);
            var offset = this._getElementOffset(stamp);
            var firstX = this.options.isOriginLeft ? offset.left : offset.right;
            var lastX = firstX + stampSize.outerWidth;
            var firstCol = Math.floor(firstX / this.columnWidth);
            firstCol = Math.max(0, firstCol);
            var lastCol = Math.floor(lastX / this.columnWidth);
            lastCol -= lastX % this.columnWidth ? 0 : 1;
            lastCol = Math.min(this.cols - 1, lastCol);
            var stampMaxY = (this.options.isOriginTop ? offset.top : offset.bottom) +
                stampSize.outerHeight;
            for (var i = firstCol; i <= lastCol; i++) { this.colYs[i] = Math.max(stampMaxY, this.colYs[i]); }
        };
        Masonry.prototype._getContainerSize = function() {
            this.maxY = Math.max.apply(Math, this.colYs);
            var size = { height: this.maxY };
            if (this.options.isFitWidth) { size.width = this._getContainerFitWidth(); }
            return size;
        };
        Masonry.prototype._getContainerFitWidth = function() {
            var unusedCols = 0;
            var i = this.cols;
            while (--i) {
                if (this.colYs[i] !== 0) { break; }
                unusedCols++;
            }
            return (this.cols - unusedCols) * this.columnWidth - this.gutter;
        };
        Masonry.prototype.needsResizeLayout = function() {
            var previousWidth = this.containerWidth;
            this.getContainerWidth();
            return previousWidth !== this.containerWidth;
        };
        return Masonry;
    }
    if (typeof define === 'function' && define.amd) { define(['outlayer/outlayer', 'get-size/get-size'], masonryDefinition); } else { window.Masonry = masonryDefinition(window.Outlayer, window.getSize); }
})(window);

(function($) {
    $.fn.validationEngineLanguage = function() {};
    $.validationEngineLanguage = { newLang: function() { $.validationEngineLanguage.allRules = { "required": { "regex": "none", "alertText": "* Ce champ est requis", "alertTextCheckboxMultiple": "* Choisir une option", "alertTextCheckboxe": "* Cette option est requise" }, "requiredInFunction": { "func": function(field, rules, i, options) { return (field.val() == "test") ? true : false; }, "alertText": "* Field must equal test" }, "minSize": { "regex": "none", "alertText": "* Minimum ", "alertText2": " caractères requis" }, "groupRequired": { "regex": "none", "alertText": "* Vous devez remplir un des champs suivant" }, "maxSize": { "regex": "none", "alertText": "* Maximum ", "alertText2": " caractères requis" }, "min": { "regex": "none", "alertText": "* Valeur minimum requise " }, "max": { "regex": "none", "alertText": "* Valeur maximum requise " }, "past": { "regex": "none", "alertText": "* Date antérieure au " }, "future": { "regex": "none", "alertText": "* Date postérieure au " }, "maxCheckbox": { "regex": "none", "alertText": "* Nombre max de choix excédé" }, "minCheckbox": { "regex": "none", "alertText": "* Veuillez choisir ", "alertText2": " options" }, "equals": { "regex": "none", "alertText": "* Votre champ n'est pas identique" }, "creditCard": { "regex": "none", "alertText": "* Numéro de carte bancaire valide" }, "phone": { "regex": /^0[1-9]([-. ]?[0-9]{2}){4}$/, "alertText": "* Numéro de téléphone invalide (0x.xx.xx.xx.xx)" }, "email": { "regex": /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i, "alertText": "* Adresse email invalide" }, "integer": { "regex": /^[\-\+]?\d+$/, "alertText": "* Nombre entier invalide" }, "number": { "regex": /^[\-\+]?((([0-9]{1,3})([,][0-9]{3})*)|([0-9]+))?([\.]([0-9]+))?$/, "alertText": "* Nombre flottant invalide" }, "date": { "regex": /^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/, "alertText": "* Date invalide, format YYYY-MM-DD requis" }, "ipv4": { "regex": /^((([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))[.]){3}(([0-1]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))$/, "alertText": "* Adresse IP invalide" }, "url": { "regex": /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i, "alertText": "* URL invalide" }, "onlyNumberSp": { "regex": /^[0-9\ ]+$/, "alertText": "* Seuls les chiffres sont acceptés" }, "onlyLetterSp": { "regex": /^[a-zA-Z\u00C0-\u00D6\u00D9-\u00F6\u00F9-\u00FD\ \']+$/, "alertText": "* Seules les lettres sont acceptées" }, "onlyLetterNumber": { "regex": /^[0-9a-zA-Z\u00C0-\u00D6\u00D9-\u00F6\u00F9-\u00FD]+$/, "alertText": "* Aucun caractère spécial n'est accepté" }, "ajaxUserCall": { "url": "ajaxValidateFieldUser", "extraData": "name=eric", "alertTextLoad": "* Chargement, veuillez attendre", "alertText": "* Ce nom est déjà pris" }, "ajaxNameCall": { "url": "ajaxValidateFieldName", "alertText": "* Ce nom est déjà pris", "alertTextOk": "*Ce nom est disponible", "alertTextLoad": "* Chargement, veuillez attendre" }, "validate2fields": { "alertText": "Veuillez taper le mot HELLO" } }; } };
    $.validationEngineLanguage.newLang();
})(jQuery);

(function($) {
    "use strict";
    var methods = {
        init: function(options) {
            var form = this;
            if (!form.data('jqv') || form.data('jqv') == null) {
                options = methods._saveOptions(form, options);
                $(document).on("click", ".formError", function() {
                    $(this).fadeOut(150, function() {
                        $(this).parent('.formErrorOuter').remove();
                        $(this).remove();
                    });
                });
            }
            return this;
        },
        attach: function(userOptions) {
            var form = this;
            var options;
            if (userOptions)
                options = methods._saveOptions(form, userOptions);
            else
                options = form.data('jqv');
            options.validateAttribute = (form.find("[data-validation-engine*=validate]").length) ? "data-validation-engine" : "class";
            if (options.binded) {
                form.on(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)", methods._onFieldEvent);
                form.on("click", "[" + options.validateAttribute + "*=validate][type=checkbox],[" + options.validateAttribute + "*=validate][type=radio]", methods._onFieldEvent);
                form.on(options.validationEventTrigger, "[" + options.validateAttribute + "*=validate][class*=datepicker]", { "delay": 300 }, methods._onFieldEvent);
            }
            if (options.autoPositionUpdate) { $(window).bind("resize", { "noAnimation": true, "formElem": form }, methods.updatePromptsPosition); }
            form.on("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", methods._submitButtonClick);
            form.removeData('jqv_submitButton');
            form.on("submit", methods._onSubmitEvent);
            return this;
        },
        detach: function() {
            var form = this;
            var options = form.data('jqv');
            form.find("[" + options.validateAttribute + "*=validate]").not("[type=checkbox]").off(options.validationEventTrigger, methods._onFieldEvent);
            form.find("[" + options.validateAttribute + "*=validate][type=checkbox],[class*=validate][type=radio]").off("click", methods._onFieldEvent);
            form.off("submit", methods._onSubmitEvent);
            form.removeData('jqv');
            form.off("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", methods._submitButtonClick);
            form.removeData('jqv_submitButton');
            if (options.autoPositionUpdate)
                $(window).off("resize", methods.updatePromptsPosition);
            return this;
        },
        validate: function() {
            var element = $(this);
            var valid = null;
            if (element.is("form") || element.hasClass("validationEngineContainer")) {
                if (element.hasClass('validating')) { return false; } else {
                    element.addClass('validating');
                    var options = element.data('jqv');
                    var valid = methods._validateFields(this);
                    setTimeout(function() { element.removeClass('validating'); }, 100);
                    if (valid && options.onSuccess) { options.onSuccess(); } else if (!valid && options.onFailure) { options.onFailure(); }
                }
            } else if (element.is('form') || element.hasClass('validationEngineContainer')) { element.removeClass('validating'); } else {
                var form = element.closest('form, .validationEngineContainer'),
                    options = (form.data('jqv')) ? form.data('jqv') : $.validationEngine.defaults,
                    valid = methods._validateField(element, options);
                if (valid && options.onFieldSuccess)
                    options.onFieldSuccess();
                else if (options.onFieldFailure && options.InvalidFields.length > 0) { options.onFieldFailure(); }
            }
            if (options.onValidationComplete) { return !!options.onValidationComplete(form, valid); }
            return valid;
        },
        updatePromptsPosition: function(event) {
            if (event && this == window) { var form = event.data.formElem; var noAnimation = event.data.noAnimation; } else
                var form = $(this.closest('form, .validationEngineContainer'));
            var options = form.data('jqv');
            form.find('[' + options.validateAttribute + '*=validate]').not(":disabled").each(function() {
                var field = $(this);
                if (options.prettySelect && field.is(":hidden"))
                    field = form.find("#" + options.usePrefix + field.attr('id') + options.useSuffix);
                var prompt = methods._getPrompt(field);
                var promptText = $(prompt).find(".formErrorContent").html();
                if (prompt)
                    methods._updatePrompt(field, $(prompt), promptText, undefined, false, options, noAnimation);
            });
            return this;
        },
        showPrompt: function(promptText, type, promptPosition, showArrow) {
            var form = this.closest('form, .validationEngineContainer');
            var options = form.data('jqv');
            if (!options)
                options = methods._saveOptions(this, options);
            if (promptPosition)
                options.promptPosition = promptPosition;
            options.showArrow = showArrow == true;
            methods._showPrompt(this, promptText, type, false, options);
            return this;
        },
        hide: function() {
            var form = $(this).closest('form, .validationEngineContainer');
            var options = form.data('jqv');
            var fadeDuration = (options && options.fadeDuration) ? options.fadeDuration : 0.3;
            var closingtag;
            if ($(this).is("form") || $(this).hasClass("validationEngineContainer")) { closingtag = "parentForm" + methods._getClassName($(this).attr("id")); } else { closingtag = methods._getClassName($(this).attr("id")) + "formError"; }
            $('.' + closingtag).fadeTo(fadeDuration, 0.3, function() {
                $(this).parent('.formErrorOuter').remove();
                $(this).remove();
            });
            return this;
        },
        hideAll: function() {
            var form = this;
            var options = form.data('jqv');
            var duration = options ? options.fadeDuration : 300;
            $('.formError').fadeTo(duration, 300, function() {
                $(this).parent('.formErrorOuter').remove();
                $(this).remove();
            });
            return this;
        },
        _onFieldEvent: function(event) {
            var field = $(this);
            var form = field.closest('form, .validationEngineContainer');
            var options = form.data('jqv');
            options.eventTrigger = "field";
            window.setTimeout(function() { methods._validateField(field, options); if (options.InvalidFields.length == 0 && options.onFieldSuccess) { options.onFieldSuccess(); } else if (options.InvalidFields.length > 0 && options.onFieldFailure) { options.onFieldFailure(); } }, (event.data) ? event.data.delay : 0);
        },
        _onSubmitEvent: function() {
            var form = $(this);
            var options = form.data('jqv');
            if (form.data("jqv_submitButton")) {
                var submitButton = $("#" + form.data("jqv_submitButton"));
                if (submitButton) {
                    if (submitButton.length > 0) {
                        if (submitButton.hasClass("validate-skip") || submitButton.attr("data-validation-engine-skip") == "true")
                            return true;
                    }
                }
            }
            options.eventTrigger = "submit";
            var r = methods._validateFields(form);
            if (r && options.ajaxFormValidation) { methods._validateFormWithAjax(form, options); return false; }
            if (options.onValidationComplete) { return !!options.onValidationComplete(form, r); }
            return r;
        },
        _checkAjaxStatus: function(options) {
            var status = true;
            $.each(options.ajaxValidCache, function(key, value) { if (!value) { status = false; return false; } });
            return status;
        },
        _checkAjaxFieldStatus: function(fieldid, options) { return options.ajaxValidCache[fieldid] == true; },
        _validateFields: function(form) {
            var options = form.data('jqv');
            var errorFound = false;
            form.trigger("jqv.form.validating");
            var first_err = null;
            form.find('[' + options.validateAttribute + '*=validate]').not(":disabled").each(function() {
                var field = $(this);
                var names = [];
                if ($.inArray(field.attr('name'), names) < 0) {
                    errorFound |= methods._validateField(field, options);
                    if (errorFound && first_err == null)
                        if (field.is(":hidden") && options.prettySelect)
                            first_err = field = form.find("#" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix);
                        else {
                            if (field.data('jqv-prompt-at') instanceof jQuery) { field = field.data('jqv-prompt-at'); } else if (field.data('jqv-prompt-at')) { field = $(field.data('jqv-prompt-at')); }
                            first_err = field;
                        }
                    if (options.doNotShowAllErrosOnSubmit)
                        return false;
                    names.push(field.attr('name'));
                    if (options.showOneMessage == true && errorFound) { return false; }
                }
            });
            form.trigger("jqv.form.result", [errorFound]);
            if (errorFound) {
                if (options.scroll) {
                    var destination = first_err.offset().top;
                    var fixleft = first_err.offset().left;
                    var positionType = options.promptPosition;
                    if (typeof(positionType) == 'string' && positionType.indexOf(":") != -1)
                        positionType = positionType.substring(0, positionType.indexOf(":"));
                    if (positionType != "bottomRight" && positionType != "bottomLeft") { var prompt_err = methods._getPrompt(first_err); if (prompt_err) { destination = prompt_err.offset().top; } }
                    if (options.scrollOffset) { destination -= options.scrollOffset; }
                    if (options.isOverflown) {
                        var overflowDIV = $(options.overflownDIV);
                        if (!overflowDIV.length) return false;
                        var scrollContainerScroll = overflowDIV.scrollTop();
                        var scrollContainerPos = -parseInt(overflowDIV.offset().top);
                        destination += scrollContainerScroll + scrollContainerPos - 5;
                        var scrollContainer = $(options.overflownDIV + ":not(:animated)");
                        scrollContainer.animate({ scrollTop: destination }, 1100, function() { if (options.focusFirstField) first_err.focus(); });
                    } else {
                        $("html, body").animate({ scrollTop: destination }, 1100, function() { if (options.focusFirstField) first_err.focus(); });
                        $("html, body").animate({ scrollLeft: fixleft }, 1100)
                    }
                } else if (options.focusFirstField)
                    first_err.focus();
                return false;
            }
            return true;
        },
        _validateFormWithAjax: function(form, options) {
            var data = form.serialize();
            var type = (options.ajaxFormValidationMethod) ? options.ajaxFormValidationMethod : "GET";
            var url = (options.ajaxFormValidationURL) ? options.ajaxFormValidationURL : form.attr("action");
            var dataType = (options.dataType) ? options.dataType : "json";
            $.ajax({
                type: type,
                url: url,
                cache: false,
                dataType: dataType,
                data: data,
                form: form,
                methods: methods,
                options: options,
                beforeSend: function() { return options.onBeforeAjaxFormValidation(form, options); },
                error: function(data, transport) { if (options.onFailure) { options.onFailure(data, transport); } else { methods._ajaxError(data, transport); } },
                success: function(json) {
                    if ((dataType == "json") && (json !== true)) {
                        var errorInForm = false;
                        for (var i = 0; i < json.length; i++) {
                            var value = json[i];
                            var errorFieldId = value[0];
                            var errorField = $($("#" + errorFieldId)[0]);
                            if (errorField.length == 1) {
                                var msg = value[2];
                                if (value[1] == true) {
                                    if (msg == "" || !msg) { methods._closePrompt(errorField); } else {
                                        if (options.allrules[msg]) {
                                            var txt = options.allrules[msg].alertTextOk;
                                            if (txt)
                                                msg = txt;
                                        }
                                        if (options.showPrompts) methods._showPrompt(errorField, msg, "pass", false, options, true);
                                    }
                                } else {
                                    errorInForm |= true;
                                    if (options.allrules[msg]) {
                                        var txt = options.allrules[msg].alertText;
                                        if (txt)
                                            msg = txt;
                                    }
                                    if (options.showPrompts) methods._showPrompt(errorField, msg, "", false, options, true);
                                }
                            }
                        }
                        options.onAjaxFormComplete(!errorInForm, form, json, options);
                    } else
                        options.onAjaxFormComplete(true, form, json, options);
                }
            });
        },
        _validateField: function(field, options, skipAjaxValidation) {
            if (!field.attr("id")) { field.attr("id", "form-validation-field-" + $.validationEngine.fieldIdCounter);++$.validationEngine.fieldIdCounter; }
            if (!options.validateNonVisibleFields && (field.is(":hidden") && !options.prettySelect || field.parent().is(":hidden")))
                return false;
            var rulesParsing = field.attr(options.validateAttribute);
            var getRules = /validate\[(.*)\]/.exec(rulesParsing);
            if (!getRules)
                return false;
            var str = getRules[1];
            var rules = str.split(/\[|,|\]/);
            var isAjaxValidator = false;
            var fieldName = field.attr("name");
            var promptText = "";
            var promptType = "";
            var required = false;
            var limitErrors = false;
            options.isError = false;
            options.showArrow = true;
            if (options.maxErrorsPerField > 0) { limitErrors = true; }
            var form = $(field.closest("form, .validationEngineContainer"));
            for (var i = 0; i < rules.length; i++) { rules[i] = rules[i].replace(" ", ""); if (rules[i] === '') { delete rules[i]; } }
            for (var i = 0, field_errors = 0; i < rules.length; i++) {
                if (limitErrors && field_errors >= options.maxErrorsPerField) {
                    if (!required) {
                        var have_required = $.inArray('required', rules);
                        required = (have_required != -1 && have_required >= i);
                    }
                    break;
                }
                var errorMsg = undefined;
                switch (rules[i]) {
                    case "required":
                        required = true;
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._required);
                        break;
                    case "custom":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._custom);
                        break;
                    case "groupRequired":
                        var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
                        var firstOfGroup = form.find(classGroup).eq(0);
                        if (firstOfGroup[0] != field[0]) {
                            methods._validateField(firstOfGroup, options, skipAjaxValidation);
                            options.showArrow = true;
                        }
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._groupRequired);
                        if (errorMsg) required = true;
                        options.showArrow = false;
                        break;
                    case "ajax":
                        errorMsg = methods._ajax(field, rules, i, options);
                        if (errorMsg) { promptType = "load"; }
                        break;
                    case "minSize":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minSize);
                        break;
                    case "maxSize":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxSize);
                        break;
                    case "min":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._min);
                        break;
                    case "max":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._max);
                        break;
                    case "past":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._past);
                        break;
                    case "future":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._future);
                        break;
                    case "dateRange":
                        var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
                        options.firstOfGroup = form.find(classGroup).eq(0);
                        options.secondOfGroup = form.find(classGroup).eq(1);
                        if (options.firstOfGroup[0].value || options.secondOfGroup[0].value) { errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._dateRange); }
                        if (errorMsg) required = true;
                        options.showArrow = false;
                        break;
                    case "dateTimeRange":
                        var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
                        options.firstOfGroup = form.find(classGroup).eq(0);
                        options.secondOfGroup = form.find(classGroup).eq(1);
                        if (options.firstOfGroup[0].value || options.secondOfGroup[0].value) { errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._dateTimeRange); }
                        if (errorMsg) required = true;
                        options.showArrow = false;
                        break;
                    case "maxCheckbox":
                        field = $(form.find("input[name='" + fieldName + "']"));
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._maxCheckbox);
                        break;
                    case "minCheckbox":
                        field = $(form.find("input[name='" + fieldName + "']"));
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._minCheckbox);
                        break;
                    case "equals":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._equals);
                        break;
                    case "funcCall":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._funcCall);
                        break;
                    case "creditCard":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._creditCard);
                        break;
                    case "condRequired":
                        errorMsg = methods._getErrorMessage(form, field, rules[i], rules, i, options, methods._condRequired);
                        if (errorMsg !== undefined) { required = true; }
                        break;
                    default:
                }
                var end_validation = false;
                if (typeof errorMsg == "object") {
                    switch (errorMsg.status) {
                        case "_break":
                            end_validation = true;
                            break;
                        case "_error":
                            errorMsg = errorMsg.message;
                            break;
                        case "_error_no_prompt":
                            return true;
                            break;
                        default:
                            break;
                    }
                }
                if (end_validation) { break; }
                if (typeof errorMsg == 'string') {
                    promptText += errorMsg + "<br/>";
                    options.isError = true;
                    field_errors++;
                }
            }
            if (!required && !(field.val()) && field.val().length < 1 && rules.indexOf("equals") < 0) options.isError = false;
            var fieldType = field.prop("type");
            var positionType = field.data("promptPosition") || options.promptPosition;
            if ((fieldType == "radio" || fieldType == "checkbox") && form.find("input[name='" + fieldName + "']").size() > 1) {
                if (positionType === 'inline') { field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:last")); } else { field = $(form.find("input[name='" + fieldName + "'][type!=hidden]:first")); }
                options.showArrow = false;
            }
            if (field.is(":hidden") && options.prettySelect) { field = form.find("#" + options.usePrefix + methods._jqSelector(field.attr('id')) + options.useSuffix); }
            if (options.isError && options.showPrompts) { methods._showPrompt(field, promptText, promptType, false, options); } else { if (!isAjaxValidator) methods._closePrompt(field); }
            if (!isAjaxValidator) { field.trigger("jqv.field.result", [field, options.isError, promptText]); }
            var errindex = $.inArray(field[0], options.InvalidFields);
            if (errindex == -1) {
                if (options.isError)
                    options.InvalidFields.push(field[0]);
            } else if (!options.isError) { options.InvalidFields.splice(errindex, 1); }
            methods._handleStatusCssClasses(field, options);
            if (options.isError && options.onFieldFailure)
                options.onFieldFailure(field);
            if (!options.isError && options.onFieldSuccess)
                options.onFieldSuccess(field);
            return options.isError;
        },
        _handleStatusCssClasses: function(field, options) {
            if (options.addSuccessCssClassToField)
                field.removeClass(options.addSuccessCssClassToField);
            if (options.addFailureCssClassToField)
                field.removeClass(options.addFailureCssClassToField);
            if (options.addSuccessCssClassToField && !options.isError)
                field.addClass(options.addSuccessCssClassToField);
            if (options.addFailureCssClassToField && options.isError)
                field.addClass(options.addFailureCssClassToField);
        },
        _getErrorMessage: function(form, field, rule, rules, i, options, originalValidationMethod) {
            var rule_index = jQuery.inArray(rule, rules);
            if (rule === "custom" || rule === "funcCall") {
                var custom_validation_type = rules[rule_index + 1];
                rule = rule + "[" + custom_validation_type + "]";
                delete(rules[rule_index]);
            }
            var alteredRule = rule;
            var element_classes = (field.attr("data-validation-engine")) ? field.attr("data-validation-engine") : field.attr("class");
            var element_classes_array = element_classes.split(" ");
            var errorMsg;
            if (rule == "future" || rule == "past" || rule == "maxCheckbox" || rule == "minCheckbox") { errorMsg = originalValidationMethod(form, field, rules, i, options); } else { errorMsg = originalValidationMethod(field, rules, i, options); }
            if (errorMsg != undefined) { var custom_message = methods._getCustomErrorMessage($(field), element_classes_array, alteredRule, options); if (custom_message) errorMsg = custom_message; }
            return errorMsg;
        },
        _getCustomErrorMessage: function(field, classes, rule, options) {
            var custom_message = false;
            var validityProp = /^custom\[.*\]$/.test(rule) ? methods._validityProp["custom"] : methods._validityProp[rule];
            if (validityProp != undefined) {
                custom_message = field.attr("data-errormessage-" + validityProp);
                if (custom_message != undefined)
                    return custom_message;
            }
            custom_message = field.attr("data-errormessage");
            if (custom_message != undefined)
                return custom_message;
            var id = '#' + field.attr("id");
            if (typeof options.custom_error_messages[id] != "undefined" && typeof options.custom_error_messages[id][rule] != "undefined") { custom_message = options.custom_error_messages[id][rule]['message']; } else if (classes.length > 0) { for (var i = 0; i < classes.length && classes.length > 0; i++) { var element_class = "." + classes[i]; if (typeof options.custom_error_messages[element_class] != "undefined" && typeof options.custom_error_messages[element_class][rule] != "undefined") { custom_message = options.custom_error_messages[element_class][rule]['message']; break; } } }
            if (!custom_message && typeof options.custom_error_messages[rule] != "undefined" && typeof options.custom_error_messages[rule]['message'] != "undefined") { custom_message = options.custom_error_messages[rule]['message']; }
            return custom_message;
        },
        _validityProp: { "required": "value-missing", "custom": "custom-error", "groupRequired": "value-missing", "ajax": "custom-error", "minSize": "range-underflow", "maxSize": "range-overflow", "min": "range-underflow", "max": "range-overflow", "past": "type-mismatch", "future": "type-mismatch", "dateRange": "type-mismatch", "dateTimeRange": "type-mismatch", "maxCheckbox": "range-overflow", "minCheckbox": "range-underflow", "equals": "pattern-mismatch", "funcCall": "custom-error", "creditCard": "pattern-mismatch", "condRequired": "value-missing" },
        _required: function(field, rules, i, options, condRequired) {
            switch (field.prop("type")) {
                case "text":
                case "password":
                case "textarea":
                case "file":
                case "select-one":
                case "select-multiple":
                default:
                    var field_val = $.trim(field.val());
                    var dv_placeholder = $.trim(field.attr("data-validation-placeholder"));
                    var placeholder = $.trim(field.attr("placeholder"));
                    if ((!field_val) || (dv_placeholder && field_val == dv_placeholder) || (placeholder && field_val == placeholder)) { return options.allrules[rules[i]].alertText; }
                    break;
                case "radio":
                case "checkbox":
                    if (condRequired) {
                        if (!field.attr('checked')) { return options.allrules[rules[i]].alertTextCheckboxMultiple; }
                        break;
                    }
                    var form = field.closest("form, .validationEngineContainer");
                    var name = field.attr("name");
                    if (form.find("input[name='" + name + "']:checked").size() == 0) {
                        if (form.find("input[name='" + name + "']:visible").size() == 1)
                            return options.allrules[rules[i]].alertTextCheckboxe;
                        else
                            return options.allrules[rules[i]].alertTextCheckboxMultiple;
                    }
                    break;
            }
        },
        _groupRequired: function(field, rules, i, options) {
            var classGroup = "[" + options.validateAttribute + "*=" + rules[i + 1] + "]";
            var isValid = false;
            field.closest("form, .validationEngineContainer").find(classGroup).each(function() { if (!methods._required($(this), rules, i, options)) { isValid = true; return false; } });
            if (!isValid) { return options.allrules[rules[i]].alertText; }
        },
        _custom: function(field, rules, i, options) {
            var customRule = rules[i + 1];
            var rule = options.allrules[customRule];
            var fn;
            if (!rule) { alert("jqv:custom rule not found - " + customRule); return; }
            if (rule["regex"]) {
                var ex = rule.regex;
                if (!ex) { alert("jqv:custom regex not found - " + customRule); return; }
                var pattern = new RegExp(ex);
                if (!pattern.test(field.val())) return options.allrules[customRule].alertText;
            } else if (rule["func"]) {
                fn = rule["func"];
                if (typeof(fn) !== "function") { alert("jqv:custom parameter 'function' is no function - " + customRule); return; }
                if (!fn(field, rules, i, options))
                    return options.allrules[customRule].alertText;
            } else { alert("jqv:custom type not allowed " + customRule); return; }
        },
        _funcCall: function(field, rules, i, options) {
            var functionName = rules[i + 1];
            var fn;
            if (functionName.indexOf('.') > -1) {
                var namespaces = functionName.split('.');
                var scope = window;
                while (namespaces.length) { scope = scope[namespaces.shift()]; }
                fn = scope;
            } else
                fn = window[functionName] || options.customFunctions[functionName];
            if (typeof(fn) == 'function')
                return fn(field, rules, i, options);
        },
        _equals: function(field, rules, i, options) {
            var equalsField = rules[i + 1];
            if (field.val() != $("#" + equalsField).val())
                return options.allrules.equals.alertText;
        },
        _maxSize: function(field, rules, i, options) { var max = rules[i + 1]; var len = field.val().length; if (len > max) { var rule = options.allrules.maxSize; return rule.alertText + max + rule.alertText2; } },
        _minSize: function(field, rules, i, options) { var min = rules[i + 1]; var len = field.val().length; if (len < min) { var rule = options.allrules.minSize; return rule.alertText + min + rule.alertText2; } },
        _min: function(field, rules, i, options) { var min = parseFloat(rules[i + 1]); var len = parseFloat(field.val()); if (len < min) { var rule = options.allrules.min; if (rule.alertText2) return rule.alertText + min + rule.alertText2; return rule.alertText + min; } },
        _max: function(field, rules, i, options) { var max = parseFloat(rules[i + 1]); var len = parseFloat(field.val()); if (len > max) { var rule = options.allrules.max; if (rule.alertText2) return rule.alertText + max + rule.alertText2; return rule.alertText + max; } },
        _past: function(form, field, rules, i, options) {
            var p = rules[i + 1];
            var fieldAlt = $(form.find("*[name='" + p.replace(/^#+/, '') + "']"));
            var pdate;
            if (p.toLowerCase() == "now") { pdate = new Date(); } else if (undefined != fieldAlt.val()) {
                if (fieldAlt.is(":disabled"))
                    return;
                pdate = methods._parseDate(fieldAlt.val());
            } else { pdate = methods._parseDate(p); }
            var vdate = methods._parseDate(field.val());
            if (vdate > pdate) { var rule = options.allrules.past; if (rule.alertText2) return rule.alertText + methods._dateToString(pdate) + rule.alertText2; return rule.alertText + methods._dateToString(pdate); }
        },
        _future: function(form, field, rules, i, options) {
            var p = rules[i + 1];
            var fieldAlt = $(form.find("*[name='" + p.replace(/^#+/, '') + "']"));
            var pdate;
            if (p.toLowerCase() == "now") { pdate = new Date(); } else if (undefined != fieldAlt.val()) {
                if (fieldAlt.is(":disabled"))
                    return;
                pdate = methods._parseDate(fieldAlt.val());
            } else { pdate = methods._parseDate(p); }
            var vdate = methods._parseDate(field.val());
            if (vdate < pdate) {
                var rule = options.allrules.future;
                if (rule.alertText2)
                    return rule.alertText + methods._dateToString(pdate) + rule.alertText2;
                return rule.alertText + methods._dateToString(pdate);
            }
        },
        _isDate: function(value) { var dateRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/); return dateRegEx.test(value); },
        _isDateTime: function(value) { var dateTimeRegEx = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/); return dateTimeRegEx.test(value); },
        _dateCompare: function(start, end) { return (new Date(start.toString()) < new Date(end.toString())); },
        _dateRange: function(field, rules, i, options) {
            if ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) { return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; }
            if (!methods._isDate(options.firstOfGroup[0].value) || !methods._isDate(options.secondOfGroup[0].value)) { return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; }
            if (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) { return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; }
        },
        _dateTimeRange: function(field, rules, i, options) {
            if ((!options.firstOfGroup[0].value && options.secondOfGroup[0].value) || (options.firstOfGroup[0].value && !options.secondOfGroup[0].value)) { return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; }
            if (!methods._isDateTime(options.firstOfGroup[0].value) || !methods._isDateTime(options.secondOfGroup[0].value)) { return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; }
            if (!methods._dateCompare(options.firstOfGroup[0].value, options.secondOfGroup[0].value)) { return options.allrules[rules[i]].alertText + options.allrules[rules[i]].alertText2; }
        },
        _maxCheckbox: function(form, field, rules, i, options) {
            var nbCheck = rules[i + 1];
            var groupname = field.attr("name");
            var groupSize = form.find("input[name='" + groupname + "']:checked").size();
            if (groupSize > nbCheck) {
                options.showArrow = false;
                if (options.allrules.maxCheckbox.alertText2)
                    return options.allrules.maxCheckbox.alertText + " " + nbCheck + " " + options.allrules.maxCheckbox.alertText2;
                return options.allrules.maxCheckbox.alertText;
            }
        },
        _minCheckbox: function(form, field, rules, i, options) { var nbCheck = rules[i + 1]; var groupname = field.attr("name"); var groupSize = form.find("input[name='" + groupname + "']:checked").size(); if (groupSize < nbCheck) { options.showArrow = false; return options.allrules.minCheckbox.alertText + " " + nbCheck + " " + options.allrules.minCheckbox.alertText2; } },
        _creditCard: function(field, rules, i, options) {
            var valid = false,
                cardNumber = field.val().replace(/ +/g, '').replace(/-+/g, '');
            var numDigits = cardNumber.length;
            if (numDigits >= 14 && numDigits <= 16 && parseInt(cardNumber) > 0) {
                var sum = 0,
                    i = numDigits - 1,
                    pos = 1,
                    digit, luhn = new String();
                do {
                    digit = parseInt(cardNumber.charAt(i));
                    luhn += (pos++ % 2 == 0) ? digit * 2 : digit;
                } while (--i >= 0)
                for (i = 0; i < luhn.length; i++) { sum += parseInt(luhn.charAt(i)); }
                valid = sum % 10 == 0;
            }
            if (!valid) return options.allrules.creditCard.alertText;
        },
        _ajax: function(field, rules, i, options) {
            var errorSelector = rules[i + 1];
            var rule = options.allrules[errorSelector];
            var extraData = rule.extraData;
            var extraDataDynamic = rule.extraDataDynamic;
            var data = { "fieldId": field.attr("id"), "fieldValue": field.val() };
            if (typeof extraData === "object") { $.extend(data, extraData); } else if (typeof extraData === "string") { var tempData = extraData.split("&"); for (var i = 0; i < tempData.length; i++) { var values = tempData[i].split("="); if (values[0] && values[0]) { data[values[0]] = values[1]; } } }
            if (extraDataDynamic) {
                var tmpData = [];
                var domIds = String(extraDataDynamic).split(",");
                for (var i = 0; i < domIds.length; i++) {
                    var id = domIds[i];
                    if ($(id).length) {
                        var inputValue = field.closest("form, .validationEngineContainer").find(id).val();
                        var keyValue = id.replace('#', '') + '=' + escape(inputValue);
                        data[id.replace('#', '')] = inputValue;
                    }
                }
            }
            if (options.eventTrigger == "field") { delete(options.ajaxValidCache[field.attr("id")]); }
            if (!options.isError && !methods._checkAjaxFieldStatus(field.attr("id"), options)) {
                $.ajax({
                    type: options.ajaxFormValidationMethod,
                    url: rule.url,
                    cache: false,
                    dataType: "json",
                    data: data,
                    field: field,
                    rule: rule,
                    methods: methods,
                    options: options,
                    beforeSend: function() {},
                    error: function(data, transport) { if (options.onFailure) { options.onFailure(data, transport); } else { methods._ajaxError(data, transport); } },
                    success: function(json) {
                        var errorFieldId = json[0];
                        var errorField = $("#" + errorFieldId).eq(0);
                        if (errorField.length == 1) {
                            var status = json[1];
                            var msg = json[2];
                            if (!status) {
                                options.ajaxValidCache[errorFieldId] = false;
                                options.isError = true;
                                if (msg) { if (options.allrules[msg]) { var txt = options.allrules[msg].alertText; if (txt) { msg = txt; } } } else
                                    msg = rule.alertText;
                                if (options.showPrompts) methods._showPrompt(errorField, msg, "", true, options);
                            } else {
                                options.ajaxValidCache[errorFieldId] = true;
                                if (msg) { if (options.allrules[msg]) { var txt = options.allrules[msg].alertTextOk; if (txt) { msg = txt; } } } else
                                    msg = rule.alertTextOk;
                                if (options.showPrompts) {
                                    if (msg)
                                        methods._showPrompt(errorField, msg, "pass", true, options);
                                    else
                                        methods._closePrompt(errorField);
                                }
                                if (options.eventTrigger == "submit")
                                    field.closest("form").submit();
                            }
                        }
                        errorField.trigger("jqv.field.result", [errorField, options.isError, msg]);
                    }
                });
                return rule.alertTextLoad;
            }
        },
        _ajaxError: function(data, transport) {
            if (data.status == 0 && transport == null)
                alert("The page is not served from a server! ajax call failed");
            else if (typeof console != "undefined")
                console.log("Ajax error: " + data.status + " " + transport);
        },
        _dateToString: function(date) { return date.getFullYear() + "-" + (date.getMonth() + 1) + "-" + date.getDate(); },
        _parseDate: function(d) {
            var dateParts = d.split("-");
            if (dateParts == d)
                dateParts = d.split("/");
            if (dateParts == d) { dateParts = d.split("."); return new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]); }
            return new Date(dateParts[0], (dateParts[1] - 1), dateParts[2]);
        },
        _showPrompt: function(field, promptText, type, ajaxed, options, ajaxform) {
            if (field.data('jqv-prompt-at') instanceof jQuery) { field = field.data('jqv-prompt-at'); } else if (field.data('jqv-prompt-at')) { field = $(field.data('jqv-prompt-at')); }
            var prompt = methods._getPrompt(field);
            if (ajaxform) prompt = false;
            if ($.trim(promptText)) {
                if (prompt)
                    methods._updatePrompt(field, prompt, promptText, type, ajaxed, options);
                else
                    methods._buildPrompt(field, promptText, type, ajaxed, options);
            }
        },
        _buildPrompt: function(field, promptText, type, ajaxed, options) {
            var prompt = $('<div>');
            prompt.addClass(methods._getClassName(field.attr("id")) + "formError");
            prompt.addClass("parentForm" + methods._getClassName(field.closest('form, .validationEngineContainer').attr("id")));
            prompt.addClass("formError");
            switch (type) {
                case "pass":
                    prompt.addClass("greenPopup");
                    break;
                case "load":
                    prompt.addClass("blackPopup");
                    break;
                default:
            }
            if (ajaxed)
                prompt.addClass("ajaxed");
            var promptContent = $('<div>').addClass("formErrorContent").html(promptText).appendTo(prompt);
            var positionType = field.data("promptPosition") || options.promptPosition;
            if (options.showArrow) {
                var arrow = $('<div>').addClass("formErrorArrow");
                if (typeof(positionType) == 'string') {
                    var pos = positionType.indexOf(":");
                    if (pos != -1)
                        positionType = positionType.substring(0, pos);
                }
                switch (positionType) {
                    case "bottomLeft":
                    case "bottomRight":
                        prompt.find(".formErrorContent").before(arrow);
                        arrow.addClass("formErrorArrowBottom").html('<div class="line1"><!-- --></div><div class="line2"><!-- --></div><div class="line3"><!-- --></div><div class="line4"><!-- --></div><div class="line5"><!-- --></div><div class="line6"><!-- --></div><div class="line7"><!-- --></div><div class="line8"><!-- --></div><div class="line9"><!-- --></div><div class="line10"><!-- --></div>');
                        break;
                    case "topLeft":
                    case "topRight":
                        arrow.html('<div class="line10"><!-- --></div><div class="line9"><!-- --></div><div class="line8"><!-- --></div><div class="line7"><!-- --></div><div class="line6"><!-- --></div><div class="line5"><!-- --></div><div class="line4"><!-- --></div><div class="line3"><!-- --></div><div class="line2"><!-- --></div><div class="line1"><!-- --></div>');
                        prompt.append(arrow);
                        break;
                }
            }
            if (options.addPromptClass)
                prompt.addClass(options.addPromptClass);
            var requiredOverride = field.attr('data-required-class');
            if (requiredOverride !== undefined) { prompt.addClass(requiredOverride); } else { if (options.prettySelect) { if ($('#' + field.attr('id')).next().is('select')) { var prettyOverrideClass = $('#' + field.attr('id').substr(options.usePrefix.length).substring(options.useSuffix.length)).attr('data-required-class'); if (prettyOverrideClass !== undefined) { prompt.addClass(prettyOverrideClass); } } } }
            prompt.css({ "opacity": 0 });
            if (positionType === 'inline') { prompt.addClass("inline"); if (typeof field.attr('data-prompt-target') !== 'undefined' && $('#' + field.attr('data-prompt-target')).length > 0) { prompt.appendTo($('#' + field.attr('data-prompt-target'))); } else { field.after(prompt); } } else { field.before(prompt); }
            var pos = methods._calculatePosition(field, prompt, options);
            prompt.css({ 'position': positionType === 'inline' ? 'relative' : 'absolute', "top": pos.callerTopPosition, "left": pos.callerleftPosition, "marginTop": pos.marginTopSize, "opacity": 0 }).data("callerField", field);
            if (options.autoHidePrompt) {
                setTimeout(function() {
                    prompt.animate({ "opacity": 0 }, function() {
                        prompt.closest('.formErrorOuter').remove();
                        prompt.remove();
                    });
                }, options.autoHideDelay);
            }
            return prompt.animate({ "opacity": 0.87 });
        },
        _updatePrompt: function(field, prompt, promptText, type, ajaxed, options, noAnimation) {
            if (prompt) {
                if (typeof type !== "undefined") {
                    if (type == "pass")
                        prompt.addClass("greenPopup");
                    else
                        prompt.removeClass("greenPopup");
                    if (type == "load")
                        prompt.addClass("blackPopup");
                    else
                        prompt.removeClass("blackPopup");
                }
                if (ajaxed)
                    prompt.addClass("ajaxed");
                else
                    prompt.removeClass("ajaxed");
                prompt.find(".formErrorContent").html(promptText);
                var pos = methods._calculatePosition(field, prompt, options);
                var css = { "top": pos.callerTopPosition, "left": pos.callerleftPosition, "marginTop": pos.marginTopSize };
                if (noAnimation)
                    prompt.css(css);
                else
                    prompt.animate(css);
            }
        },
        _closePrompt: function(field) {
            var prompt = methods._getPrompt(field);
            if (prompt)
                prompt.fadeTo("fast", 0, function() {
                    prompt.parent('.formErrorOuter').remove();
                    prompt.remove();
                });
        },
        closePrompt: function(field) { return methods._closePrompt(field); },
        _getPrompt: function(field) {
            var formId = $(field).closest('form, .validationEngineContainer').attr('id');
            var className = methods._getClassName(field.attr("id")) + "formError";
            var match = $("." + methods._escapeExpression(className) + '.parentForm' + methods._getClassName(formId))[0];
            if (match)
                return $(match);
        },
        _escapeExpression: function(selector) { return selector.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1"); },
        isRTL: function(field) { var $document = $(document); var $body = $('body'); var rtl = (field && field.hasClass('rtl')) || (field && (field.attr('dir') || '').toLowerCase() === 'rtl') || $document.hasClass('rtl') || ($document.attr('dir') || '').toLowerCase() === 'rtl' || $body.hasClass('rtl') || ($body.attr('dir') || '').toLowerCase() === 'rtl'; return Boolean(rtl); },
        _calculatePosition: function(field, promptElmt, options) {
            var promptTopPosition, promptleftPosition, marginTopSize;
            var fieldWidth = field.width();
            var fieldLeft = field.position().left;
            var fieldTop = field.position().top;
            var fieldHeight = field.height();
            var promptHeight = promptElmt.height();
            promptTopPosition = promptleftPosition = 0;
            marginTopSize = -promptHeight;
            var positionType = field.data("promptPosition") || options.promptPosition;
            var shift1 = "";
            var shift2 = "";
            var shiftX = 0;
            var shiftY = 0;
            if (typeof(positionType) == 'string') {
                if (positionType.indexOf(":") != -1) {
                    shift1 = positionType.substring(positionType.indexOf(":") + 1);
                    positionType = positionType.substring(0, positionType.indexOf(":"));
                    if (shift1.indexOf(",") != -1) {
                        shift2 = shift1.substring(shift1.indexOf(",") + 1);
                        shift1 = shift1.substring(0, shift1.indexOf(","));
                        shiftY = parseInt(shift2);
                        if (isNaN(shiftY)) shiftY = 0;
                    };
                    shiftX = parseInt(shift1);
                    if (isNaN(shift1)) shift1 = 0;
                };
            };
            switch (positionType) {
                default:
                    case "topRight":
                    promptleftPosition += fieldLeft + fieldWidth - 30;promptTopPosition += fieldTop;
                break;
                case "topLeft":
                        promptTopPosition += fieldTop;promptleftPosition += fieldLeft;
                    break;
                case "centerRight":
                        promptTopPosition = fieldTop + 4;marginTopSize = 0;promptleftPosition = fieldLeft + field.outerWidth(true) + 5;
                    break;
                case "centerLeft":
                        promptleftPosition = fieldLeft - (promptElmt.width() + 2);promptTopPosition = fieldTop + 4;marginTopSize = 0;
                    break;
                case "bottomLeft":
                        promptTopPosition = fieldTop + field.height() + 5;marginTopSize = 0;promptleftPosition = fieldLeft;
                    break;
                case "bottomRight":
                        promptleftPosition = fieldLeft + fieldWidth - 30;promptTopPosition = fieldTop + field.height() + 5;marginTopSize = 0;
                    break;
                case "inline":
                        promptleftPosition = 0;promptTopPosition = 0;marginTopSize = 0;
            };
            promptleftPosition += shiftX;
            promptTopPosition += shiftY;
            return { "callerTopPosition": promptTopPosition + "px", "callerleftPosition": promptleftPosition + "px", "marginTopSize": marginTopSize + "px" };
        },
        _saveOptions: function(form, options) {
            if ($.validationEngineLanguage)
                var allRules = $.validationEngineLanguage.allRules;
            else
                $.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");
            $.validationEngine.defaults.allrules = allRules;
            var userOptions = $.extend(true, {}, $.validationEngine.defaults, options);
            form.data('jqv', userOptions);
            return userOptions;
        },
        _getClassName: function(className) {
            if (className)
                return className.replace(/:/g, "_").replace(/\./g, "_");
        },
        _jqSelector: function(str) { return str.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1'); },
        _condRequired: function(field, rules, i, options) { var idx, dependingField; for (idx = (i + 1); idx < rules.length; idx++) { dependingField = jQuery("#" + rules[idx]).first(); if (dependingField.length && methods._required(dependingField, ["required"], 0, options, true) == undefined) { return methods._required(field, ["required"], 0, options); } } },
        _submitButtonClick: function(event) {
            var button = $(this);
            var form = button.closest('form, .validationEngineContainer');
            form.data("jqv_submitButton", button.attr("id"));
        }
    };
    $.fn.validationEngine = function(method) {
        var form = $(this);
        if (!form[0]) return form;
        if (typeof(method) == 'string' && method.charAt(0) != '_' && methods[method]) {
            if (method != "showPrompt" && method != "hide" && method != "hideAll")
                methods.init.apply(form);
            return methods[method].apply(form, Array.prototype.slice.call(arguments, 1));
        } else if (typeof method == 'object' || !method) { methods.init.apply(form, arguments); return methods.attach.apply(form); } else { $.error('Method ' + method + ' does not exist in jQuery.validationEngine'); }
    };
    $.validationEngine = { fieldIdCounter: 0, defaults: { validationEventTrigger: "blur", scroll: true, focusFirstField: true, showPrompts: true, validateNonVisibleFields: false, promptPosition: "topRight", bindMethod: "bind", inlineAjax: false, ajaxFormValidation: false, ajaxFormValidationURL: false, ajaxFormValidationMethod: 'get', onAjaxFormComplete: $.noop, onBeforeAjaxFormValidation: $.noop, onValidationComplete: false, doNotShowAllErrosOnSubmit: false, custom_error_messages: {}, binded: true, showArrow: true, isError: false, maxErrorsPerField: false, ajaxValidCache: {}, autoPositionUpdate: false, InvalidFields: [], onFieldSuccess: false, onFieldFailure: false, onSuccess: false, onFailure: false, validateAttribute: "class", addSuccessCssClassToField: "", addFailureCssClassToField: "", autoHidePrompt: false, autoHideDelay: 10000, fadeDuration: 0.3, prettySelect: false, addPromptClass: "", usePrefix: "", useSuffix: "", showOneMessage: false } };
    $(function() { $.validationEngine.defaults.promptPosition = methods.isRTL() ? 'topLeft' : "topRight" });
})(jQuery);

(function($) {
    $.fn.accessibleRating = function(options) {
        return this.each(function() {
            var $this = $(this);
            if (!String.prototype.format) { String.prototype.format = function() { var args = arguments; return this.replace(/{(\d+)}/g, function(match, number) { return typeof args[number] != 'undefined' ? args[number] : match; }); }; }
            var settings = $.extend({ start: $this.data("start"), max: $this.data("max"), note: $this.data("note") }, options);
            $this.empty();
            $this.addClass("js");
            $this.addClass("notes-echelle");
            for (var i = settings.start; i <= settings.max; i++) { $this.append('<li class="li-note-{1}"><label for="{0}-note-{1}" title="{1}/{2}">{1}</label><span title="{1}"></span><input {3} type="radio" name="{4}" id="{0}-note-{1}" value="{1}" /></li>'.format($this.attr("id"), i, settings.max, (settings.note == i) ? 'checked="checked"' : '', $this.attr("data-name"))); }
            $this.children("li").addClass("note-off");
            $this.find("span").click(function() { $(this).parent("li").children("input").trigger("click"); });
            $this.find("input").focus(function() {
                $this.find("li").removeClass("note-focus");
                $(this).parent("li").addClass("note-focus");
                $(this).parent("li").nextAll("li").addClass("note-off");
                $(this).parent("li").prevAll("li").removeClass("note-off");
                $(this).parent("li").removeClass("note-off");
            }).blur(function() { $this.find("li").removeClass("note-focus"); if ($this.find("li input:checked").length == 0) { $this.find("li").addClass("note-off"); } }).click(function() {
                $this.find("li").removeClass("note-checked");
                $(this).parent("li").addClass("note-checked");
            });
            $this.find("li").mouseover(function() {
                $(this).nextAll("li").addClass("note-off");
                $(this).prevAll("li").removeClass("note-off");
                $(this).removeClass("note-off");
            });
            $this.mouseout(function() {
                $(this).children("li").addClass("note-off");
                $(this).find("li input:checked").parent("li").trigger("mouseover");
            });
            $this.find("input:checked").parent("li").trigger("mouseover");
            $this.find("input:checked").trigger("click");
        });
    };
}(jQuery));

(function($) {
    var _ = {
        isMsie: function() { return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; },
        isBlankString: function(str) { return !str || /^\s*$/.test(str); },
        escapeRegExChars: function(str) { return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); },
        isString: function(obj) { return typeof obj === "string"; },
        isNumber: function(obj) { return typeof obj === "number"; },
        isArray: $.isArray,
        isFunction: $.isFunction,
        isObject: $.isPlainObject,
        isUndefined: function(obj) { return typeof obj === "undefined"; },
        bind: $.proxy,
        each: function(collection, cb) {
            $.each(collection, reverseArgs);

            function reverseArgs(index, value) { return cb(value, index); }
        },
        map: $.map,
        filter: $.grep,
        every: function(obj, test) {
            var result = true;
            if (!obj) { return result; }
            $.each(obj, function(key, val) { if (!(result = test.call(null, val, key, obj))) { return false; } });
            return !!result;
        },
        some: function(obj, test) {
            var result = false;
            if (!obj) { return result; }
            $.each(obj, function(key, val) { if (result = test.call(null, val, key, obj)) { return false; } });
            return !!result;
        },
        mixin: $.extend,
        getUniqueId: function() { var counter = 0; return function() { return counter++; }; }(),
        templatify: function templatify(obj) {
            return $.isFunction(obj) ? obj : template;

            function template() { return String(obj); }
        },
        defer: function(fn) { setTimeout(fn, 0); },
        debounce: function(func, wait, immediate) {
            var timeout, result;
            return function() {
                var context = this,
                    args = arguments,
                    later, callNow;
                later = function() { timeout = null; if (!immediate) { result = func.apply(context, args); } };
                callNow = immediate && !timeout;
                clearTimeout(timeout);
                timeout = setTimeout(later, wait);
                if (callNow) { result = func.apply(context, args); }
                return result;
            };
        },
        throttle: function(func, wait) {
            var context, args, timeout, result, previous, later;
            previous = 0;
            later = function() {
                previous = new Date();
                timeout = null;
                result = func.apply(context, args);
            };
            return function() {
                var now = new Date(),
                    remaining = wait - (now - previous);
                context = this;
                args = arguments;
                if (remaining <= 0) {
                    clearTimeout(timeout);
                    timeout = null;
                    previous = now;
                    result = func.apply(context, args);
                } else if (!timeout) { timeout = setTimeout(later, remaining); }
                return result;
            };
        },
        noop: function() {}
    };
    var utils = {
        defaultDiacriticsRemovalMap: [{ 'base': 'A', 'letters': /[\u0041\u24B6\uFF21\u00C0\u00C1\u00C2\u1EA6\u1EA4\u1EAA\u1EA8\u00C3\u0100\u0102\u1EB0\u1EAE\u1EB4\u1EB2\u0226\u01E0\u00C4\u01DE\u1EA2\u00C5\u01FA\u01CD\u0200\u0202\u1EA0\u1EAC\u1EB6\u1E00\u0104\u023A\u2C6F]/g }, { 'base': 'AA', 'letters': /[\uA732]/g }, { 'base': 'AE', 'letters': /[\u00C6\u01FC\u01E2]/g }, { 'base': 'AO', 'letters': /[\uA734]/g }, { 'base': 'AU', 'letters': /[\uA736]/g }, { 'base': 'AV', 'letters': /[\uA738\uA73A]/g }, { 'base': 'AY', 'letters': /[\uA73C]/g }, { 'base': 'B', 'letters': /[\u0042\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0182\u0181]/g }, { 'base': 'C', 'letters': /[\u0043\u24B8\uFF23\u0106\u0108\u010A\u010C\u00C7\u1E08\u0187\u023B\uA73E]/g }, { 'base': 'D', 'letters': /[\u0044\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018B\u018A\u0189\uA779]/g }, { 'base': 'DZ', 'letters': /[\u01F1\u01C4]/g }, { 'base': 'Dz', 'letters': /[\u01F2\u01C5]/g }, { 'base': 'E', 'letters': /[\u0045\u24BA\uFF25\u00C8\u00C9\u00CA\u1EC0\u1EBE\u1EC4\u1EC2\u1EBC\u0112\u1E14\u1E16\u0114\u0116\u00CB\u1EBA\u011A\u0204\u0206\u1EB8\u1EC6\u0228\u1E1C\u0118\u1E18\u1E1A\u0190\u018E]/g }, { 'base': 'F', 'letters': /[\u0046\u24BB\uFF26\u1E1E\u0191\uA77B]/g }, { 'base': 'G', 'letters': /[\u0047\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E]/g }, { 'base': 'H', 'letters': /[\u0048\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D]/g }, { 'base': 'I', 'letters': /[\u0049\u24BE\uFF29\u00CC\u00CD\u00CE\u0128\u012A\u012C\u0130\u00CF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197]/g }, { 'base': 'J', 'letters': /[\u004A\u24BF\uFF2A\u0134\u0248]/g }, { 'base': 'K', 'letters': /[\u004B\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2]/g }, { 'base': 'L', 'letters': /[\u004C\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780]/g }, { 'base': 'LJ', 'letters': /[\u01C7]/g }, { 'base': 'Lj', 'letters': /[\u01C8]/g }, { 'base': 'M', 'letters': /[\u004D\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C]/g }, { 'base': 'N', 'letters': /[\u004E\u24C3\uFF2E\u01F8\u0143\u00D1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u0220\u019D\uA790\uA7A4]/g }, { 'base': 'NJ', 'letters': /[\u01CA]/g }, { 'base': 'Nj', 'letters': /[\u01CB]/g }, { 'base': 'O', 'letters': /[\u004F\u24C4\uFF2F\u00D2\u00D3\u00D4\u1ED2\u1ED0\u1ED6\u1ED4\u00D5\u1E4C\u022C\u1E4E\u014C\u1E50\u1E52\u014E\u022E\u0230\u00D6\u022A\u1ECE\u0150\u01D1\u020C\u020E\u01A0\u1EDC\u1EDA\u1EE0\u1EDE\u1EE2\u1ECC\u1ED8\u01EA\u01EC\u00D8\u01FE\u0186\u019F\uA74A\uA74C]/g }, { 'base': 'OI', 'letters': /[\u01A2]/g }, { 'base': 'OO', 'letters': /[\uA74E]/g }, { 'base': 'OU', 'letters': /[\u0222]/g }, { 'base': 'P', 'letters': /[\u0050\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754]/g }, { 'base': 'Q', 'letters': /[\u0051\u24C6\uFF31\uA756\uA758\u024A]/g }, { 'base': 'R', 'letters': /[\u0052\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782]/g }, { 'base': 'S', 'letters': /[\u0053\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784]/g }, { 'base': 'T', 'letters': /[\u0054\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786]/g }, { 'base': 'TZ', 'letters': /[\uA728]/g }, { 'base': 'U', 'letters': /[\u0055\u24CA\uFF35\u00D9\u00DA\u00DB\u0168\u1E78\u016A\u1E7A\u016C\u00DC\u01DB\u01D7\u01D5\u01D9\u1EE6\u016E\u0170\u01D3\u0214\u0216\u01AF\u1EEA\u1EE8\u1EEE\u1EEC\u1EF0\u1EE4\u1E72\u0172\u1E76\u1E74\u0244]/g }, { 'base': 'V', 'letters': /[\u0056\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245]/g }, { 'base': 'VY', 'letters': /[\uA760]/g }, { 'base': 'W', 'letters': /[\u0057\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72]/g }, { 'base': 'X', 'letters': /[\u0058\u24CD\uFF38\u1E8A\u1E8C]/g }, { 'base': 'Y', 'letters': /[\u0059\u24CE\uFF39\u1EF2\u00DD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE]/g }, { 'base': 'Z', 'letters': /[\u005A\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762]/g }, { 'base': 'a', 'letters': /[\u0061\u24D0\uFF41\u1E9A\u00E0\u00E1\u00E2\u1EA7\u1EA5\u1EAB\u1EA9\u00E3\u0101\u0103\u1EB1\u1EAF\u1EB5\u1EB3\u0227\u01E1\u00E4\u01DF\u1EA3\u00E5\u01FB\u01CE\u0201\u0203\u1EA1\u1EAD\u1EB7\u1E01\u0105\u2C65\u0250]/g }, { 'base': 'aa', 'letters': /[\uA733]/g }, { 'base': 'ae', 'letters': /[\u00E6\u01FD\u01E3]/g }, { 'base': 'ao', 'letters': /[\uA735]/g }, { 'base': 'au', 'letters': /[\uA737]/g }, { 'base': 'av', 'letters': /[\uA739\uA73B]/g }, { 'base': 'ay', 'letters': /[\uA73D]/g }, { 'base': 'b', 'letters': /[\u0062\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253]/g }, { 'base': 'c', 'letters': /[\u0063\u24D2\uFF43\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184]/g }, { 'base': 'd', 'letters': /[\u0064\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\uA77A]/g }, { 'base': 'dz', 'letters': /[\u01F3\u01C6]/g }, { 'base': 'e', 'letters': /[\u0065\u24D4\uFF45\u00E8\u00E9\u00EA\u1EC1\u1EBF\u1EC5\u1EC3\u1EBD\u0113\u1E15\u1E17\u0115\u0117\u00EB\u1EBB\u011B\u0205\u0207\u1EB9\u1EC7\u0229\u1E1D\u0119\u1E19\u1E1B\u0247\u025B\u01DD]/g }, { 'base': 'f', 'letters': /[\u0066\u24D5\uFF46\u1E1F\u0192\uA77C]/g }, { 'base': 'g', 'letters': /[\u0067\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\u1D79\uA77F]/g }, { 'base': 'h', 'letters': /[\u0068\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265]/g }, { 'base': 'hv', 'letters': /[\u0195]/g }, { 'base': 'i', 'letters': /[\u0069\u24D8\uFF49\u00EC\u00ED\u00EE\u0129\u012B\u012D\u00EF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131]/g }, { 'base': 'j', 'letters': /[\u006A\u24D9\uFF4A\u0135\u01F0\u0249]/g }, { 'base': 'k', 'letters': /[\u006B\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3]/g }, { 'base': 'l', 'letters': /[\u006C\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747]/g }, { 'base': 'lj', 'letters': /[\u01C9]/g }, { 'base': 'm', 'letters': /[\u006D\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F]/g }, { 'base': 'n', 'letters': /[\u006E\u24DD\uFF4E\u01F9\u0144\u00F1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5]/g }, { 'base': 'nj', 'letters': /[\u01CC]/g }, { 'base': 'o', 'letters': /[\u006F\u24DE\uFF4F\u00F2\u00F3\u00F4\u1ED3\u1ED1\u1ED7\u1ED5\u00F5\u1E4D\u022D\u1E4F\u014D\u1E51\u1E53\u014F\u022F\u0231\u00F6\u022B\u1ECF\u0151\u01D2\u020D\u020F\u01A1\u1EDD\u1EDB\u1EE1\u1EDF\u1EE3\u1ECD\u1ED9\u01EB\u01ED\u00F8\u01FF\u0254\uA74B\uA74D\u0275]/g }, { 'base': 'oi', 'letters': /[\u01A3]/g }, { 'base': 'ou', 'letters': /[\u0223]/g }, { 'base': 'oo', 'letters': /[\uA74F]/g }, { 'base': 'p', 'letters': /[\u0070\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755]/g }, { 'base': 'q', 'letters': /[\u0071\u24E0\uFF51\u024B\uA757\uA759]/g }, { 'base': 'r', 'letters': /[\u0072\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783]/g }, { 'base': 's', 'letters': /[\u0073\u24E2\uFF53\u00DF\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B]/g }, { 'base': 't', 'letters': /[\u0074\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787]/g }, { 'base': 'tz', 'letters': /[\uA729]/g }, { 'base': 'u', 'letters': /[\u0075\u24E4\uFF55\u00F9\u00FA\u00FB\u0169\u1E79\u016B\u1E7B\u016D\u00FC\u01DC\u01D8\u01D6\u01DA\u1EE7\u016F\u0171\u01D4\u0215\u0217\u01B0\u1EEB\u1EE9\u1EEF\u1EED\u1EF1\u1EE5\u1E73\u0173\u1E77\u1E75\u0289]/g }, { 'base': 'v', 'letters': /[\u0076\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C]/g }, { 'base': 'vy', 'letters': /[\uA761]/g }, { 'base': 'w', 'letters': /[\u0077\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73]/g }, { 'base': 'x', 'letters': /[\u0078\u24E7\uFF58\u1E8B\u1E8D]/g }, { 'base': 'y', 'letters': /[\u0079\u24E8\uFF59\u1EF3\u00FD\u0177\u1EF9\u0233\u1E8F\u00FF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF]/g }, { 'base': 'z', 'letters': /[\u007A\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763]/g }],
        removeDiacritics: function(str) {
            for (var i = 0; i < this.defaultDiacriticsRemovalMap.length; i++) { str = str.replace(this.defaultDiacriticsRemovalMap[i].letters, this.defaultDiacriticsRemovalMap[i].base); }
            return str;
        }
    };
    var html = { wrapper: '<span class="twitter-typeahead"></span>', dropdown: '<span class="tt-dropdown-menu"></span>', dataset: '<div class="tt-dataset-%CLASS%"></div>', suggestions: '<span class="tt-suggestions"></span>', suggestion: '<div class="tt-suggestion"></div>' };
    var css = { wrapper: { position: "relative", display: "block", width: "100%" }, hint: { position: "absolute", top: "0", left: "0", borderColor: "transparent", boxShadow: "none" }, input: { position: "relative", verticalAlign: "top", backgroundColor: "transparent" }, inputWithNoHint: { position: "relative", verticalAlign: "top" }, dropdown: { position: "absolute", top: "100%", left: "0", zIndex: "100", display: "none" }, suggestions: { display: "block" }, suggestion: { whiteSpace: "nowrap", cursor: "pointer" }, suggestionChild: { whiteSpace: "normal" }, ltr: { left: "0", right: "auto" }, rtl: { left: "auto", right: " 0" } };
    if (_.isMsie()) { _.mixin(css.input, { backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" }); }
    if (_.isMsie() && _.isMsie() <= 7) { _.mixin(css.input, { marginTop: "-1px" }); }
    var EventBus = function() {
        var namespace = "typeahead:";

        function EventBus(o) {
            if (!o || !o.el) { $.error("EventBus initialized without el"); }
            this.$el = $(o.el);
        }
        _.mixin(EventBus.prototype, {
            trigger: function(type) {
                var args = [].slice.call(arguments, 1);
                this.$el.trigger(namespace + type, args);
            }
        });
        return EventBus;
    }();
    var EventEmitter = function() {
        var splitter = /\s+/,
            nextTick = getNextTick();
        return { onSync: onSync, onAsync: onAsync, off: off, trigger: trigger };

        function on(method, types, cb, context) {
            var type;
            if (!cb) { return this; }
            types = types.split(splitter);
            cb = context ? bindContext(cb, context) : cb;
            this._callbacks = this._callbacks || {};
            while (type = types.shift()) {
                this._callbacks[type] = this._callbacks[type] || { sync: [], async: [] };
                this._callbacks[type][method].push(cb);
            }
            return this;
        }

        function onAsync(types, cb, context) { return on.call(this, "async", types, cb, context); }

        function onSync(types, cb, context) { return on.call(this, "sync", types, cb, context); }

        function off(types) {
            var type;
            if (!this._callbacks) { return this; }
            types = types.split(splitter);
            while (type = types.shift()) { delete this._callbacks[type]; }
            return this;
        }

        function trigger(types) {
            var type, callbacks, args, syncFlush, asyncFlush;
            if (!this._callbacks) { return this; }
            types = types.split(splitter);
            args = [].slice.call(arguments, 1);
            while ((type = types.shift()) && (callbacks = this._callbacks[type])) {
                syncFlush = getFlush(callbacks.sync, this, [type].concat(args));
                asyncFlush = getFlush(callbacks.async, this, [type].concat(args));
                syncFlush() && nextTick(asyncFlush);
            }
            return this;
        }

        function getFlush(callbacks, context, args) {
            return flush;

            function flush() {
                var cancelled;
                for (var i = 0; !cancelled && i < callbacks.length; i += 1) { cancelled = callbacks[i].apply(context, args) === false; }
                return !cancelled;
            }
        }

        function getNextTick() {
            var nextTickFn;
            if (window.setImmediate) { nextTickFn = function nextTickSetImmediate(fn) { setImmediate(function() { fn(); }); }; } else { nextTickFn = function nextTickSetTimeout(fn) { setTimeout(function() { fn(); }, 0); }; }
            return nextTickFn;
        }

        function bindContext(fn, context) { return fn.bind ? fn.bind(context) : function() { fn.apply(context, [].slice.call(arguments, 0)); }; }
    }();
    var highlight = function(doc) {
        var defaults = { node: null, pattern: null, tagName: "strong", className: null, wordsOnly: false, caseSensitive: false };
        return function hightlight(o) {
            var regex;
            o = _.mixin({}, defaults, o);
            if (!o.node || !o.pattern) { return; }
            o.pattern = _.isArray(o.pattern) ? o.pattern : [o.pattern];
            regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly);
            traverse(o.node, hightlightTextNode);

            function hightlightTextNode(textNode) {
                var match, patternNode;
                if (match = regex.exec(textNode.data)) {
                    wrapperNode = doc.createElement(o.tagName);
                    o.className && (wrapperNode.className = o.className);
                    patternNode = textNode.splitText(match.index);
                    patternNode.splitText(match[0].length);
                    wrapperNode.appendChild(patternNode.cloneNode(true));
                    textNode.parentNode.replaceChild(wrapperNode, patternNode);
                }
                return !!match;
            }

            function traverse(el, hightlightTextNode) { var childNode, TEXT_NODE_TYPE = 3; for (var i = 0; i < el.childNodes.length; i++) { childNode = el.childNodes[i]; if (childNode.nodeType === TEXT_NODE_TYPE) { i += hightlightTextNode(childNode) ? 1 : 0; } else { traverse(childNode, hightlightTextNode); } } }
        };

        function getRegex(patterns, caseSensitive, wordsOnly) {
            var escapedPatterns = [],
                regexStr;
            for (var i = 0; i < patterns.length; i++) { escapedPatterns.push(_.escapeRegExChars(patterns[i])); }
            regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")";
            return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i");
        }
    }(window.document);
    var Input = function() {
        var specialKeyCodeMap;
        specialKeyCodeMap = { 9: "tab", 27: "esc", 37: "left", 39: "right", 13: "enter", 38: "up", 40: "down" };

        function Input(o) {
            var that = this,
                onBlur, onFocus, onKeydown, onInput;
            o = o || {};
            if (!o.input) { $.error("input is missing"); }
            onBlur = _.bind(this._onBlur, this);
            onFocus = _.bind(this._onFocus, this);
            onKeydown = _.bind(this._onKeydown, this);
            onInput = _.bind(this._onInput, this);
            this.$hint = $(o.hint);
            this.$input = $(o.input).on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown);
            if (this.$hint.length === 0) { this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; }
            if (!_.isMsie()) { this.$input.on("input.tt", onInput); } else {
                this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) {
                    if (specialKeyCodeMap[$e.which || $e.keyCode]) { return; }
                    _.defer(_.bind(that._onInput, that, $e));
                });
            }
            this.query = utils.removeDiacritics(this.$input.val());
            this.$overflowHelper = buildOverflowHelper(this.$input);
        }
        Input.normalizeQuery = function(str) { return (str || "").replace(/^\s*/g, "").replace(/\s{2,}/g, " "); };
        _.mixin(Input.prototype, EventEmitter, {
            _onBlur: function onBlur() {
                this.resetInputValue();
                this.trigger("blurred");
            },
            _onFocus: function onFocus() { this.trigger("focused"); },
            _onKeydown: function onKeydown($e) {
                var keyName = specialKeyCodeMap[$e.which || $e.keyCode];
                this._managePreventDefault(keyName, $e);
                if (keyName && this._shouldTrigger(keyName, $e)) { this.trigger(keyName + "Keyed", $e); }
            },
            _onInput: function onInput() { this._checkInputValue(); },
            _managePreventDefault: function managePreventDefault(keyName, $e) {
                var preventDefault, hintValue, inputValue;
                switch (keyName) {
                    case "tab":
                        hintValue = this.getHint();
                        inputValue = this.getInputValue();
                        preventDefault = hintValue && hintValue !== inputValue && !withModifier($e);
                        break;
                    case "up":
                    case "down":
                        preventDefault = !withModifier($e);
                        break;
                    default:
                        preventDefault = false;
                }
                preventDefault && $e.preventDefault();
            },
            _shouldTrigger: function shouldTrigger(keyName, $e) {
                var trigger;
                switch (keyName) {
                    case "tab":
                        trigger = !withModifier($e);
                        break;
                    default:
                        trigger = true;
                }
                return trigger;
            },
            _checkInputValue: function checkInputValue() {
                var inputValue, areEquivalent, hasDifferentWhitespace;
                inputValue = this.getInputValue();
                areEquivalent = areQueriesEquivalent(inputValue, this.query);
                hasDifferentWhitespace = areEquivalent ? this.query.length !== inputValue.length : false;
                if (!areEquivalent) { this.trigger("queryChanged", this.query = inputValue); } else if (hasDifferentWhitespace) { this.trigger("whitespaceChanged", this.query); }
            },
            focus: function focus() { this.$input.focus(); },
            blur: function blur() { this.$input.blur(); },
            getQuery: function getQuery() { return this.query; },
            setQuery: function setQuery(query) { this.query = query; },
            getInputValue: function getInputValue() { return utils.removeDiacritics(this.$input.val()); },
            setInputValue: function setInputValue(value, silent) {
                this.$input.val(value + " ");
                silent ? this.clearHint() : this._checkInputValue();
            },
            resetInputValue: function resetInputValue() { this.setInputValue(this.query, true); },
            getHint: function getHint() { return this.$hint.val(); },
            setHint: function setHint(value) { this.$hint.val(value); },
            clearHint: function clearHint() { this.setHint(""); },
            clearHintIfInvalid: function clearHintIfInvalid() {
                var val, hint, valIsPrefixOfHint, isValid;
                val = this.getInputValue();
                hint = this.getHint();
                valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0;
                isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow();
                !isValid && this.clearHint();
            },
            getLanguageDirection: function getLanguageDirection() { return (this.$input.css("direction") || "ltr").toLowerCase(); },
            hasOverflow: function hasOverflow() {
                var constraint = this.$input.width() - 2;
                this.$overflowHelper.text(this.getInputValue());
                return this.$overflowHelper.width() >= constraint;
            },
            isCursorAtEnd: function() {
                var valueLength, selectionStart, range;
                valueLength = this.$input.val().length;
                selectionStart = this.$input[0].selectionStart;
                if (_.isNumber(selectionStart)) { return selectionStart === valueLength; } else if (document.selection) {
                    range = document.selection.createRange();
                    range.moveStart("character", -valueLength);
                    return valueLength === range.text.length;
                }
                return true;
            },
            destroy: function destroy() {
                this.$hint.off(".tt");
                this.$input.off(".tt");
                this.$hint = this.$input = this.$overflowHelper = null;
            }
        });
        return Input;

        function buildOverflowHelper($input) { return $('<pre aria-hidden="true"></pre>').css({ position: "absolute", visibility: "hidden", whiteSpace: "pre", fontFamily: $input.css("font-family"), fontSize: $input.css("font-size"), fontStyle: $input.css("font-style"), fontVariant: $input.css("font-variant"), fontWeight: $input.css("font-weight"), wordSpacing: $input.css("word-spacing"), letterSpacing: $input.css("letter-spacing"), textIndent: $input.css("text-indent"), textRendering: $input.css("text-rendering"), textTransform: $input.css("text-transform") }).insertAfter($input); }

        function areQueriesEquivalent(a, b) { return Input.normalizeQuery(a) === Input.normalizeQuery(b); }

        function withModifier($e) { return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; }
    }();
    var Dataset = function() {
        var datasetKey = "ttDataset",
            valueKey = "ttValue",
            datumKey = "ttDatum";

        function Dataset(o) {
            o = o || {};
            o.templates = o.templates || {};
            if (!o.source) { $.error("missing source"); }
            if (o.name && !isValidName(o.name)) { $.error("invalid dataset name: " + o.name); }
            this.query = null;
            this.highlight = !!o.highlight;
            this.name = o.name || _.getUniqueId();
            this.source = o.source;
            this.displayFn = getDisplayFn(o.display || o.displayKey);
            this.templates = getTemplates(o.templates, this.displayFn);
            this.$el = $(html.dataset.replace("%CLASS%", this.name));
        }
        Dataset.extractDatasetName = function extractDatasetName(el) { return $(el).data(datasetKey); };
        Dataset.extractValue = function extractDatum(el) { return $(el).data(valueKey); };
        Dataset.extractDatum = function extractDatum(el) { return $(el).data(datumKey); };
        _.mixin(Dataset.prototype, EventEmitter, {
            _render: function render(query, suggestions) {
                if (!this.$el) { return; }
                var that = this,
                    hasSuggestions;
                this.$el.empty();
                hasSuggestions = suggestions && suggestions.length;
                if (!hasSuggestions && this.templates.empty) { this.$el.html(getEmptyHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null); } else if (hasSuggestions) { this.$el.html(getSuggestionsHtml()).prepend(that.templates.header ? getHeaderHtml() : null).append(that.templates.footer ? getFooterHtml() : null); }
                this.trigger("rendered");

                function getEmptyHtml() { return that.templates.empty({ query: query, isEmpty: true }); }

                function getSuggestionsHtml() {
                    var $suggestions, nodes;
                    $suggestions = $(html.suggestions).css(css.suggestions);
                    nodes = _.map(suggestions, getSuggestionNode);
                    $suggestions.append.apply($suggestions, nodes);
                    that.highlight && highlight({ node: $suggestions[0], pattern: query });
                    return $suggestions;

                    function getSuggestionNode(suggestion) {
                        var $el;
                        $el = $(html.suggestion).append(that.templates.suggestion(suggestion)).data(datasetKey, that.name).data(valueKey, that.displayFn(suggestion)).data(datumKey, suggestion);
                        $el.children().each(function() { $(this).css(css.suggestionChild); });
                        return $el;
                    }
                }

                function getHeaderHtml() { return that.templates.header({ query: query, isEmpty: !hasSuggestions }); }

                function getFooterHtml() { return that.templates.footer({ query: query, isEmpty: !hasSuggestions }); }
            },
            getRoot: function getRoot() { return this.$el; },
            update: function update(query) {
                var that = this;
                this.query = query;
                this.canceled = false;
                this.source(query, render);

                function render(suggestions) { if (!that.canceled && query === that.query) { that._render(query, suggestions); } }
            },
            cancel: function cancel() { this.canceled = true; },
            clear: function clear() {
                this.cancel();
                this.$el.empty();
                this.trigger("rendered");
            },
            isEmpty: function isEmpty() { return this.$el.is(":empty"); },
            destroy: function destroy() { this.$el = null; }
        });
        return Dataset;

        function getDisplayFn(display) {
            display = display || "value";
            return _.isFunction(display) ? display : displayFn;

            function displayFn(obj) { return obj[display]; }
        }

        function getTemplates(templates, displayFn) {
            return { empty: templates.empty && _.templatify(templates.empty), header: templates.header && _.templatify(templates.header), footer: templates.footer && _.templatify(templates.footer), suggestion: templates.suggestion || suggestionTemplate };

            function suggestionTemplate(context) { return "<p>" + displayFn(context) + "</p>"; }
        }

        function isValidName(str) { return /^[_a-zA-Z0-9-]+$/.test(str); }
    }();
    var Dropdown = function() {
        function Dropdown(o) {
            var that = this,
                onSuggestionClick, onSuggestionMouseEnter, onSuggestionMouseLeave;
            o = o || {};
            if (!o.menu) { $.error("menu is required"); }
            this.isOpen = false;
            this.isEmpty = true;
            this.datasets = _.map(o.datasets, initializeDataset);
            onSuggestionClick = _.bind(this._onSuggestionClick, this);
            onSuggestionMouseEnter = _.bind(this._onSuggestionMouseEnter, this);
            onSuggestionMouseLeave = _.bind(this._onSuggestionMouseLeave, this);
            this.$menu = $(o.menu).on("click.tt", ".tt-suggestion", onSuggestionClick).on("mouseenter.tt", ".tt-suggestion", onSuggestionMouseEnter).on("mouseleave.tt", ".tt-suggestion", onSuggestionMouseLeave);
            _.each(this.datasets, function(dataset) {
                that.$menu.append(dataset.getRoot());
                dataset.onSync("rendered", that._onRendered, that);
            });
        }
        _.mixin(Dropdown.prototype, EventEmitter, {
            _onSuggestionClick: function onSuggestionClick($e) { this.trigger("suggestionClicked", $($e.currentTarget)); },
            _onSuggestionMouseEnter: function onSuggestionMouseEnter($e) {
                this._removeCursor();
                this._setCursor($($e.currentTarget), true);
            },
            _onSuggestionMouseLeave: function onSuggestionMouseLeave() { this._removeCursor(); },
            _onRendered: function onRendered() {
                this.isEmpty = _.every(this.datasets, isDatasetEmpty);
                this.isEmpty ? this._hide() : this.isOpen && this._show();
                this.trigger("datasetRendered");

                function isDatasetEmpty(dataset) { return dataset.isEmpty(); }
            },
            _hide: function() { this.$menu.hide(); },
            _show: function() { this.$menu.css("display", "block"); },
            _getSuggestions: function getSuggestions() { return this.$menu.find(".tt-suggestion"); },
            _getCursor: function getCursor() { return this.$menu.find(".tt-cursor").first(); },
            _setCursor: function setCursor($el, silent) { $el.first().addClass("tt-cursor");!silent && this.trigger("cursorMoved"); },
            _removeCursor: function removeCursor() { this._getCursor().removeClass("tt-cursor"); },
            _moveCursor: function moveCursor(increment) {
                var $suggestions, $oldCursor, newCursorIndex, $newCursor;
                if (!this.isOpen) { return; }
                $oldCursor = this._getCursor();
                $suggestions = this._getSuggestions();
                this._removeCursor();
                newCursorIndex = $suggestions.index($oldCursor) + increment;
                newCursorIndex = (newCursorIndex + 1) % ($suggestions.length + 1) - 1;
                if (newCursorIndex === -1) { this.trigger("cursorRemoved"); return; } else if (newCursorIndex < -1) { newCursorIndex = $suggestions.length - 1; }
                this._setCursor($newCursor = $suggestions.eq(newCursorIndex));
                this._ensureVisible($newCursor);
            },
            _ensureVisible: function ensureVisible($el) {
                var elTop, elBottom, menuScrollTop, menuHeight;
                elTop = $el.position().top;
                elBottom = elTop + $el.outerHeight(true);
                menuScrollTop = this.$menu.scrollTop();
                menuHeight = this.$menu.height() + parseInt(this.$menu.css("paddingTop"), 10) + parseInt(this.$menu.css("paddingBottom"), 10);
                if (elTop < 0) { this.$menu.scrollTop(menuScrollTop + elTop); } else if (menuHeight < elBottom) { this.$menu.scrollTop(menuScrollTop + (elBottom - menuHeight)); }
            },
            close: function close() {
                if (this.isOpen) {
                    this.isOpen = false;
                    this._removeCursor();
                    this._hide();
                    this.trigger("closed");
                }
            },
            open: function open() {
                if (!this.isOpen) {
                    this.isOpen = true;
                    !this.isEmpty && this._show();
                    this.trigger("opened");
                }
            },
            setLanguageDirection: function setLanguageDirection(dir) { this.$menu.css(dir === "ltr" ? css.ltr : css.rtl); },
            moveCursorUp: function moveCursorUp() { this._moveCursor(-1); },
            moveCursorDown: function moveCursorDown() { this._moveCursor(+1); },
            getDatumForSuggestion: function getDatumForSuggestion($el) {
                var datum = null;
                if ($el.length) { datum = { raw: Dataset.extractDatum($el), value: Dataset.extractValue($el), datasetName: Dataset.extractDatasetName($el) }; }
                return datum;
            },
            getDatumForCursor: function getDatumForCursor() { return this.getDatumForSuggestion(this._getCursor().first()); },
            getDatumForTopSuggestion: function getDatumForTopSuggestion() { return this.getDatumForSuggestion(this._getSuggestions().first()); },
            update: function update(query) {
                _.each(this.datasets, updateDataset);

                function updateDataset(dataset) { dataset.update(query); }
            },
            empty: function empty() {
                _.each(this.datasets, clearDataset);
                this.isEmpty = true;

                function clearDataset(dataset) { dataset.clear(); }
            },
            isVisible: function isVisible() { return this.isOpen && !this.isEmpty; },
            destroy: function destroy() {
                this.$menu.off(".tt");
                this.$menu = null;
                _.each(this.datasets, destroyDataset);

                function destroyDataset(dataset) { dataset.destroy(); }
            }
        });
        return Dropdown;

        function initializeDataset(oDataset) { return new Dataset(oDataset); }
    }();
    var Typeahead = function() {
        var attrsKey = "ttAttrs";

        function Typeahead(o) {
            var $menu, $input, $hint;
            o = o || {};
            if (!o.input) { $.error("missing input"); }
            this.isActivated = false;
            this.autoselect = !!o.autoselect;
            this.minLength = _.isNumber(o.minLength) ? o.minLength : 1;
            this.$node = buildDomStructure(o.input, o.withHint);
            $menu = this.$node.find(".tt-dropdown-menu");
            $input = this.$node.find(".tt-input");
            $hint = this.$node.find(".tt-hint");
            $input.on("blur.tt", function($e) {
                var active, isActive, hasActive;
                active = document.activeElement;
                isActive = $menu.is(active);
                hasActive = $menu.has(active).length > 0;
                if (_.isMsie() && (isActive || hasActive)) {
                    $e.preventDefault();
                    $e.stopImmediatePropagation();
                    _.defer(function() { $input.focus(); });
                }
            });
            $menu.on("mousedown.tt", function($e) { $e.preventDefault(); });
            this.eventBus = o.eventBus || new EventBus({ el: $input });
            this.dropdown = new Dropdown({ menu: $menu, datasets: o.datasets }).onSync("suggestionClicked", this._onSuggestionClicked, this).onSync("cursorMoved", this._onCursorMoved, this).onSync("cursorRemoved", this._onCursorRemoved, this).onSync("opened", this._onOpened, this).onSync("closed", this._onClosed, this).onAsync("datasetRendered", this._onDatasetRendered, this);
            this.input = new Input({ input: $input, hint: $hint }).onSync("focused", this._onFocused, this).onSync("blurred", this._onBlurred, this).onSync("enterKeyed", this._onEnterKeyed, this).onSync("tabKeyed", this._onTabKeyed, this).onSync("escKeyed", this._onEscKeyed, this).onSync("upKeyed", this._onUpKeyed, this).onSync("downKeyed", this._onDownKeyed, this).onSync("leftKeyed", this._onLeftKeyed, this).onSync("rightKeyed", this._onRightKeyed, this).onSync("queryChanged", this._onQueryChanged, this).onSync("whitespaceChanged", this._onWhitespaceChanged, this);
            this._setLanguageDirection();
        }
        _.mixin(Typeahead.prototype, {
            _onSuggestionClicked: function onSuggestionClicked(type, $el) { var datum; if (datum = this.dropdown.getDatumForSuggestion($el)) { this._select(datum); } },
            _onCursorMoved: function onCursorMoved() {
                var datum = this.dropdown.getDatumForCursor();
                this.input.setInputValue(datum.value, true);
                this.eventBus.trigger("cursorchanged", datum.raw, datum.datasetName);
            },
            _onCursorRemoved: function onCursorRemoved() {
                this.input.resetInputValue();
                this._updateHint();
            },
            _onDatasetRendered: function onDatasetRendered() { this._updateHint(); },
            _onOpened: function onOpened() {
                this._updateHint();
                this.eventBus.trigger("opened");
            },
            _onClosed: function onClosed() {
                this.input.clearHint();
                this.eventBus.trigger("closed");
            },
            _onFocused: function onFocused() {
                this.isActivated = true;
                this.dropdown.open();
            },
            _onBlurred: function onBlurred() {
                this.isActivated = false;
                this.dropdown.empty();
                this.dropdown.close();
            },
            _onEnterKeyed: function onEnterKeyed(type, $e) {
                var cursorDatum, topSuggestionDatum;
                cursorDatum = this.dropdown.getDatumForCursor();
                topSuggestionDatum = this.dropdown.getDatumForTopSuggestion();
                if (cursorDatum) {
                    this._select(cursorDatum);
                    $e.preventDefault();
                } else if (this.autoselect && topSuggestionDatum) {
                    this._select(topSuggestionDatum);
                    $e.preventDefault();
                }
            },
            _onTabKeyed: function onTabKeyed(type, $e) {
                var datum;
                if (datum = this.dropdown.getDatumForCursor()) {
                    this._select(datum);
                    $e.preventDefault();
                } else { this._autocomplete(true); }
            },
            _onEscKeyed: function onEscKeyed() {
                this.dropdown.close();
                this.input.resetInputValue();
            },
            _onUpKeyed: function onUpKeyed() {
                var query = this.input.getQuery();
                this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorUp();
                this.dropdown.open();
            },
            _onDownKeyed: function onDownKeyed() {
                var query = this.input.getQuery();
                this.dropdown.isEmpty && query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.moveCursorDown();
                this.dropdown.open();
            },
            _onLeftKeyed: function onLeftKeyed() { this.dir === "rtl" && this._autocomplete(); },
            _onRightKeyed: function onRightKeyed() { this.dir === "ltr" && this._autocomplete(); },
            _onQueryChanged: function onQueryChanged(e, query) {
                this.input.clearHintIfInvalid();
                query.length >= this.minLength ? this.dropdown.update(query) : this.dropdown.empty();
                this.dropdown.open();
                this._setLanguageDirection();
            },
            _onWhitespaceChanged: function onWhitespaceChanged() {
                this._updateHint();
                this.dropdown.open();
            },
            _setLanguageDirection: function setLanguageDirection() {
                var dir;
                if (this.dir !== (dir = this.input.getLanguageDirection())) {
                    this.dir = dir;
                    this.$node.css("direction", dir);
                    this.dropdown.setLanguageDirection(dir);
                }
            },
            _updateHint: function updateHint() {
                var datum, val, query, escapedQuery, frontMatchRegEx, match;
                datum = this.dropdown.getDatumForTopSuggestion();
                if (datum && this.dropdown.isVisible() && !this.input.hasOverflow()) {
                    val = this.input.getInputValue();
                    query = Input.normalizeQuery(val);
                    escapedQuery = _.escapeRegExChars(query);
                    frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i");
                    match = frontMatchRegEx.exec(datum.value);
                    match ? this.input.setHint(val + match[1]) : this.input.clearHint();
                } else { this.input.clearHint(); }
            },
            _autocomplete: function autocomplete(laxCursor) {
                var hint, query, isCursorAtEnd, datum;
                hint = this.input.getHint();
                query = this.input.getQuery();
                isCursorAtEnd = laxCursor || this.input.isCursorAtEnd();
                if (hint && query !== hint && isCursorAtEnd) {
                    datum = this.dropdown.getDatumForTopSuggestion();
                    datum && this.input.setInputValue(datum.value);
                    this.eventBus.trigger("autocompleted", datum.raw, datum.datasetName);
                }
            },
            _select: function select(datum) {
                this.input.setQuery(datum.value);
                this.input.setInputValue(datum.value, true);
                this._setLanguageDirection();
                this.eventBus.trigger("selected", datum.raw, datum.datasetName);
                this.dropdown.close();
                _.defer(_.bind(this.dropdown.empty, this.dropdown));
            },
            open: function open() { this.dropdown.open(); },
            close: function close() { this.dropdown.close(); },
            setVal: function setVal(val) {
                if (this.isActivated) { this.input.setInputValue(val); } else {
                    this.input.setQuery(val);
                    this.input.setInputValue(val, true);
                }
                this._setLanguageDirection();
            },
            getVal: function getVal() { return this.input.getQuery(); },
            destroy: function destroy() {
                this.input.destroy();
                this.dropdown.destroy();
                destroyDomStructure(this.$node);
                this.$node = null;
            }
        });
        return Typeahead;

        function buildDomStructure(input, withHint) {
            var $input, $wrapper, $dropdown, $hint;
            $input = $(input);
            $wrapper = $(html.wrapper).css(css.wrapper);
            $dropdown = $(html.dropdown).css(css.dropdown);
            $hint = $input.clone().css(css.hint).css(getBackgroundStyles($input));
            $hint.val("").removeData().addClass("tt-hint").removeAttr("id name placeholder").prop("disabled", true).attr({ autocomplete: "off", spellcheck: "false" });
            $input.data(attrsKey, { dir: $input.attr("dir"), autocomplete: $input.attr("autocomplete"), spellcheck: $input.attr("spellcheck"), style: $input.attr("style") });
            $input.addClass("tt-input").attr({ autocomplete: "off", spellcheck: false }).css(withHint ? css.input : css.inputWithNoHint);
            try {!$input.attr("dir") && $input.attr("dir", "auto"); } catch (e) {}
            return $input.wrap($wrapper).parent().prepend(withHint ? $hint : null).append($dropdown);
        }

        function getBackgroundStyles($el) { return { backgroundAttachment: $el.css("background-attachment"), backgroundClip: $el.css("background-clip"), backgroundColor: $el.css("background-color"), backgroundImage: $el.css("background-image"), backgroundOrigin: $el.css("background-origin"), backgroundPosition: $el.css("background-position"), backgroundRepeat: $el.css("background-repeat"), backgroundSize: $el.css("background-size") }; }

        function destroyDomStructure($node) {
            var $input = $node.find(".tt-input");
            _.each($input.data(attrsKey), function(val, key) { _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); });
            $input.detach().removeData(attrsKey).removeClass("tt-input").insertAfter($node);
            $node.remove();
        }
    }();
    (function() {
        var old, typeaheadKey, methods;
        old = $.fn.typeahead;
        typeaheadKey = "ttTypeahead";
        methods = {
            initialize: function initialize(o, datasets) {
                datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1);
                o = o || {};
                return this.each(attach);

                function attach() {
                    var $input = $(this),
                        eventBus, typeahead;
                    _.each(datasets, function(d) { d.highlight = !!o.highlight; });
                    typeahead = new Typeahead({ input: $input, eventBus: eventBus = new EventBus({ el: $input }), withHint: _.isUndefined(o.hint) ? true : !!o.hint, minLength: o.minLength, autoselect: o.autoselect, datasets: datasets });
                    $input.data(typeaheadKey, typeahead);
                }
            },
            open: function open() {
                return this.each(openTypeahead);

                function openTypeahead() {
                    var $input = $(this),
                        typeahead;
                    if (typeahead = $input.data(typeaheadKey)) { typeahead.open(); }
                }
            },
            close: function close() {
                return this.each(closeTypeahead);

                function closeTypeahead() {
                    var $input = $(this),
                        typeahead;
                    if (typeahead = $input.data(typeaheadKey)) { typeahead.close(); }
                }
            },
            val: function val(newVal) {
                return !arguments.length ? getVal(this.first()) : this.each(setVal);

                function setVal() {
                    var $input = $(this),
                        typeahead;
                    if (typeahead = $input.data(typeaheadKey)) { typeahead.setVal(newVal); }
                }

                function getVal($input) {
                    var typeahead, query;
                    if (typeahead = $input.data(typeaheadKey)) { query = typeahead.getVal(); }
                    return query;
                }
            },
            destroy: function destroy() {
                return this.each(unattach);

                function unattach() {
                    var $input = $(this),
                        typeahead;
                    if (typeahead = $input.data(typeaheadKey)) {
                        typeahead.destroy();
                        $input.removeData(typeaheadKey);
                    }
                }
            }
        };
        $.fn.typeahead = function(method) { if (methods[method]) { return methods[method].apply(this, [].slice.call(arguments, 1)); } else { return methods.initialize.apply(this, arguments); } };
        $.fn.typeahead.noConflict = function noConflict() { $.fn.typeahead = old; return this; };
    })();
})(window.jQuery);

(function($) {
    $.fn.changeElementType = function(newType) {
        this.each(function() {
            var events = $(this).data('events');
            var attrs = {};
            $.each(this.attributes, function(idx, attr) { attrs[attr.nodeName] = attr.nodeValue; });
            var $newElement = $("<" + newType + "/>", attrs).append($(this).contents());
            if (events) { for (var eventType in events) { for (var idx in events[eventType]) { $newElement[eventType](events[eventType][idx].handler); } } }
            $(this).replaceWith(function() { return $newElement; });
        });
    };
})(jQuery);
(function($) {
    'use strict';
    $.fn.royalSliderAccessible = function(options) {
        return this.each(function() {
            var slider = $(this);
            slider.css('visibility', 'visible');
            if ($(".flat-clone", slider.parent()).length == 0) {
                var $sliderClone = slider.clone();
                $sliderClone.removeAttr("id class");
                $sliderClone.appendTo(slider.parent());
                $('div.rsItem, div.rsContent', $sliderClone).wrap('<li/>').contents().unwrap();
                $sliderClone.wrap('<ul class="flat-clone sr-only"/>').contents().unwrap();
                slider.attr('aria-hidden', 'true');
            }
            if (options.fixedHeight) {
                if (options.renderType === 'htmlCarousel' || options.renderType === 'horizontalCommentCarousel' || options.renderType === 'verticalCommentCarousel') {
                    var maxHeight = -1;
                    $('.rsItem', slider).each(function() { maxHeight = maxHeight > $(this).height() ? maxHeight : $(this).height(); });
                    $('.rsItem', slider).each(function() { $(this).height(maxHeight); });
                }
            }
            slider.royalSlider(options);
            var sliderInstance = slider.data('royalSlider');
            var $images = slider.find("img");
            $(".rsArrow", slider).each(function() {
                var arrow = $(this);
                var arrowContainer = arrow.parent();
                var arrowCls = arrow.attr("class");
                var arrowContent = arrow.children();
                var arrowLabel = ErmesManager.labels.RoyalSliderLabels_ArrowLeft;
                if (arrowCls.indexOf("rsArrowRight") != -1) { arrowLabel = ErmesManager.labels.RoyalSliderLabels_ArrowRight; }
                var newArrow = $("<button role='button' class='" + arrowCls + "'>" + arrowContent.prop('outerHTML') + "<span class='ermes-label'>" + arrowLabel + "</span>" + "</button>");
                arrow.remove();
                if (arrowCls.indexOf("rsArrowLeft") != -1) { newArrow.prependTo(arrowContainer); } else { newArrow.appendTo(arrowContainer); }
            });
            $('.rsArrowLeft', slider).click(function(e) {
                e.preventDefault();
                sliderInstance.prev();
            });
            $('.rsArrowRight', slider).click(function(e) {
                e.preventDefault();
                sliderInstance.next();
            });
            if (sliderInstance.st.arrowsNavAutoHide && !sliderInstance.hasTouch) {
                $('.rsArrowLeft', slider).addClass('rsHidden');
                $('.rsArrowRight', slider).addClass('rsHidden');
                slider.one("mousemove.arrowshover", function() {
                    $('.rsArrowLeft', slider).removeClass('rsHidden');
                    $('.rsArrowRight', slider).removeClass('rsHidden');
                });
                slider.hover(function() {
                    $('.rsArrowLeft', slider).removeClass('rsHidden');
                    $('.rsArrowRight', slider).removeClass('rsHidden');
                }, function() {
                    $('.rsArrowLeft', slider).addClass('rsHidden');
                    $('.rsArrowRight', slider).addClass('rsHidden');
                });
                $(".rsArrow", slider).focus(function() {
                    $('.rsArrowLeft', slider).removeClass('rsHidden');
                    $('.rsArrowRight', slider).removeClass('rsHidden');
                });
                $(".rsArrow", slider).blur(function() {
                    $('.rsArrowLeft', slider).addClass('rsHidden');
                    $('.rsArrowRight', slider).addClass('rsHidden');
                });
            }
            $(".rsFullscreenBtn", slider).each(function() {
                var fullscreenBtn = $(this);
                fullscreenBtn.remove();
                sliderInstance._fsBtn = $('<button role="button" class="rsFullscreenBtn">' + "<span class='ermes-label'>" + ErmesManager.labels.RoyalSliderLabels_FullScreen + "</span>" + '<div class="rsFullscreenIcn"></div></button>').appendTo(sliderInstance._controlsContainer).on('click.rs', function() { if (sliderInstance.isFullscreen) { sliderInstance.exitFullscreen(); } else { sliderInstance.enterFullscreen(); } });
            });
            sliderInstance.ev.on('rsAfterSlideChange', function() {
                var thumbs = $('.rsThumbs', slider);
                if (thumbs) {
                    $(".rsTmb > img", slider).each(function() {
                        var thumb = $(this);
                        var resetAlt = thumb.attr("data-alt");
                        thumb.attr("alt", resetAlt);
                    });
                    var thumbSelected = $(".rsThumb.rsNavSelected > .rsTmb > img", thumbs);
                    var alt = thumbSelected.attr("data-alt");
                    if (typeof(options.labels) != 'undefined')
                        thumbSelected.attr("alt", alt + options.labels.rsNavSelected);
                }
                var titles = $('.thumb-title', slider);
                titles.each(function() {
                    var $this = $(this);
                    if ($this.attr("data-title") === undefined) { $this.attr("data-title", $this.attr("title")); }
                    $this.attr("title", $this.attr("data-title"));
                });
                var $selectedTitle = $(".rsThumb.rsNavSelected .thumb-title", slider);
                if (typeof(options.labels) != 'undefined')
                    $selectedTitle.attr("title", $selectedTitle.attr("title") + options.labels.rsNavSelected);
                $(".rsPlayBtn", slider).each(function() {
                    var btn = $(this);
                    var btnCls = btn.attr("class");
                    var btnContent = "<span class='icon-play btnPlayVideoIcon' aria-hidden='true'></span>";
                    var btnLabel = ErmesManager.labels.RoyalSliderLabels_PlayVideo;
                    btn.replaceWith("<button role='button' class='" + btnCls + " btnPlayVideo'>" + btnContent + "<span class='ermes-label'>" + btnLabel + "</span>" + "</button>");
                });
                $(".rsPlayBtn", slider).click(function(e) {
                    e.preventDefault();
                    sliderInstance.playVideo();
                    e.stopPropagation();
                });
            });
            if (options.renderType == 'textualCarousel') {
                sliderInstance.ev.on('rsVideoPlay', function() { var caption = $('.rsGCaption', slider); if (caption) { caption.addClass('rsHidden'); } });
                sliderInstance.ev.on('rsVideoStop', function() { var caption = $('.rsGCaption', slider); if (caption) { caption.removeClass('rsHidden'); } });
            }
            if ($(".rsThumbsContainer > ul", slider).length < 1) {
                $(".rsThumbsContainer", slider).append("<ul class='ermes-label'> </ul>");
                $(".rsThumbsContainer > div", slider).each(function(a, el) {
                    var image = $(el).find("img").clone(false);
                    if (image[0])
                        $(".rsThumbsContainer > ul", slider).append("<li>" + image[0].outerHTML + "</li>");
                });
            }
            $(".rsNav.rsBullets", slider).each(function() {
                var bullets = $(this);
                bullets.remove();
                var itemHTML = '<li class="rsNavItem rsBullet"><button type="button" class="btn btn-info btn btn-xs"><span class="glyphicon" aria-hidden="true"></span><span class="ermes-label"></span></button></li>';
                var out = '<ul class="rsNav rsBullets bs-bullets">';
                for (var i = 0; i < sliderInstance.numSlides; i++) { out += itemHTML; }
                sliderInstance._controlNav = out = $(out + '</ul>');
                sliderInstance._controlNavItems = out.appendTo(sliderInstance.slider).children();
                var currItem = $(sliderInstance._controlNavItems[sliderInstance.currSlideId]);
                sliderInstance._prevNavItem = currItem;
                currItem.addClass("rsNavSelected");
                modifyBulletsLabel();
                sliderInstance._controlNav.on('click.rs', '.rsNavItem', function(e) {
                    if (!sliderInstance._thumbsDrag) { sliderInstance.goTo($(this).index()); }
                    modifyBulletsLabel();
                });

                function modifyBulletsLabel() {
                    for (var i = 0; i < sliderInstance.numSlides; i++) {
                        var label;
                        if (i === sliderInstance.currSlideId) { label = ErmesManager.labels.RoyalSliderBulletContentSelected; } else { label = ErmesManager.labels.RoyalSliderBulletContentNotSelected; }
                        $(sliderInstance._controlNavItems[i]).find('.ermes-label').text(label.replace('{0}', i + 1));
                    }
                }
            });
            sliderInstance.ev.trigger("rsAfterSlideChange");
        });
    };
}(jQuery));