﻿(function() {
    var Leetchi = {};
    if (window.Leetchi != null)
        Leetchi = window.Leetchi;
    else
        window.Leetchi = Leetchi;
    Leetchi.setTestimonial = function(items) {
        Leetchi.setTestimonial.items = items;
        window.setTimeout(Leetchi.changeFeedback, 2000);
    };
    Leetchi.parseNumber = function(num) {
        if (typeof (num) == "number") return num;
        num = num.replace(/[\s€]+/g, "");
        num = num.replace(/\.|,/g, Leetchi.parseNumber.decimalSeparator);
        return parseFloat(num);
    };
    Leetchi.formatEuroCents = function(num) {
        var cents = num % 100;
        var euros = Math.floor(num / 100);
        if (cents === 0)
            return "€ " + euros.toString();
        return "€ " + euros.toString() + "," + cents.toString();
    };
    Leetchi.parseNumber.decimalSeparator = (1.5).toString(10)[1];
    Leetchi.changeFeedback = function() {
        function buildItem(item) {
            var oParent = document.createElement("blockquote");
            var oText = document.createElement("p");
            var oAuthor = document.createElement("div");
            oText.appendChild(document.createTextNode(item[0]));
            oAuthor.className = "Author";
            oAuthor.appendChild(document.createTextNode(item[1]));

            oParent.appendChild(oText);
            oParent.appendChild(oAuthor);
            oParent.style.display = "none";
            return oParent;
        };
        if (Leetchi.setTestimonial.currentItem != null)
            Leetchi.setTestimonial.items.push(Leetchi.setTestimonial.currentItem);
        var oItem = Leetchi.setTestimonial.currentItem = Leetchi.setTestimonial.items[0];
        Leetchi.setTestimonial.items.splice(0, 1);

        var oNewQuote = buildItem(oItem);
        var oPreviousQuote = $(".Testimonial blockquote");
        oPreviousQuote.fadeOut("slow", function() {
            oPreviousQuote.remove();
            $(".Testimonial").prepend(oNewQuote);
            $(oNewQuote).fadeIn("slow");
        });
        window.setTimeout(Leetchi.changeFeedback, 10000);
    };
    Leetchi.setFieldError = function(field, message) {
        var oErrorSpan = Leetchi.getFieldError(field);
        oErrorSpan.addClass("Error");
    };
    Leetchi.getFieldError = function(field) {
        temp = $(field).closest("span.ErrorFlagSpan");
        return temp.size() == 0 ? null : temp;

    };
    Leetchi.clearFieldError = function(field) {
        var errSpan = Leetchi.getFieldError(field);
        if (errSpan != null) {
            $(errSpan).removeClass("Error");
            return true;
        };
        return false;
    };

    Leetchi.gravatarURL = function(email, options) {
        var url = "http://www.gravatar.com/avatar/" + MD5(email);
        if (options) {
            var query = "";
            if (options.size != undefined) query = "s=" + options.size;
            if (options.def != undefined) query = (query != "" ? query + "&" : "") + "d=" + encodeURI(options.def);
            if (query != "") url += "?" + query;
        };
        return url;
    };
    Leetchi.createInvitationItem = function(guy, invited) {
        var liItem = document.createElement("LI");
        var oItem = $(liItem);
        oItem.html(["<a title=\"", (invited ? "Retirer" : "Ajouter"), " ", guy.name, "\" href=\"javascript:return false;\" >",
            "<img alt=\"Avatar de ", guy.name, "\" src=\"", guy.picPath || "/Content/img/no-picture_small.jpg", "\" />",
            "<span class=\"ActionInfo\">Ajouter </span><strong>", guy.name, "</strong> <span class=\"Email\">",
            guy.email, "</span></a></li>"].join("")).click(function() { guy.liItem.toggle(); });
        guy.liItem = liItem;
        liItem.guy = guy;
        if (!guy.id) {
            guy.id = JSONstring.make([{ name: guy.name, email: guy.email}]);
        };
        liItem.setInvited = function(isInvited) {
            this.invited = isInvited;
            if (isInvited) {
                oItem.children("a").attr("title", "Retirer " + guy.name);
                oItem.children("a").children(".ActionInfo").text("Retirer ");
                oItem.appendTo(".ItemsToRemove ul");
                $('#selectedFriends, #inviteesBeforeWebmailImport').addOption(guy.id, guy.id);
                $(".ItemsToRemove #NoItemsToRemove").hide();
            } else {
                oItem.children("a").attr("title", "Ajouter " + guy.name);
                oItem.children("a").children(".ActionInfo").text("Ajouter ");
                oItem.appendTo($(guy.container).children("ul"));
                $(guy.container).children("ul").trigger("childAdded");
                $('#selectedFriends, #inviteesBeforeWebmailImport').removeOption(guy.id.toString());
                if ($(".ItemsToRemove ul").children("li").length == 0)
                    $(".ItemsToRemove #NoItemsToRemove").show();
            };
        };
        liItem.toggle = function() {
            this.setInvited(!this.invited);
            oItem.tooltip({
                track: true,
                delay: 0,
                showURL: false,
                showBody: " - ",
                fade: 250
            });
            return this.isRemoveActive;
        };
        liItem.setInvited(invited);
        return liItem;
    };

    Leetchi.validateEmailFormat = function(email) {
        var mailExp = "([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*)@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?";
        return new RegExp(regex, "ig").test(email);
    };

    Leetchi.requestAddFriendByEMail = function(url, emailList, container) {
        var split = /[,|;|\n|$]+/img;
        var tokens = emailList.split(split);
        if (tokens.length == 0) {
            return;
        }

        var tab = [];

        var mailExp = "([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*)@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?";
        var regex = "\\s*(?:\"?([\\w|\\s]*\\w+)\"?\\s+)?<?(" + mailExp + ")>?";
        for (var i in tokens) {
            regexResult = new RegExp(regex, "ig").exec(tokens[i]);
            if (regexResult != null && regexResult["index"] == 0) {
                var name = regexResult[1] != null ? regexResult[1] : regexResult[3];
                var email = regexResult[2];
                tab = tab.concat([{ name: name, email: email}]);
            }
        }


        var query = JSONstring.make(tab);
        $.post(url, encodeURIComponent(query), function(reply) {
            for (var i = 0; i < reply.data.length; i++) {
                var o = reply.data[i];
                o.container = container;
                Leetchi.createInvitationItem(o, true);
            }
        }, "json");

    };
    Leetchi.createTabs = function(tabList, selectedId) {
        var currentTab = null;
        var tabDivs = new Array(tabList.length);
        var tabLinks = new Array(tabList.length);
        function setTab(tab, div, link) {
            if (arguments.length == 3) {
                if (tab == currentTab) return false;
                currentTab = tab;
                $(link).addClass("SelectedTab");
                $(div).slideDown("fast");
                $(tabDivs).not(div).slideUp("fast");
                $(tabLinks).not(link).removeClass("SelectedTab");
            } else {
                $(tabDivs).slideUp("fast");
                $(tabLinks).removeClass("SelectedTab");
            }
            return true;
        }
        var iSelectedId = -1;
        for (var i = tabList.length - 1; i >= 0; i--) {
            var item = tabList[i];
            if (selectedId == item[0]) iSelectedId = i;
            var tabDiv = document.getElementById(item[0]);
            var tabLink = document.getElementById(item[1]);
            tabDivs[i] = tabDiv;
            tabLinks[i] = tabLink.parentNode;
            $(tabLink).click((function(tabId, tabLinkParent) {
                return function() {
                    setTab(tabId, document.getElementById(tabId), tabLinkParent);
                    return false;
                }
            })(item[0], tabLink.parentNode));
        };
        if (iSelectedId >= 0)
            setTab(selectedId, tabDivs[iSelectedId], tabLinks[iSelectedId]);
        else setTab();
    };

    Leetchi.createTabs2 = function(tabList, selectedId) {
        divSelector = "";
        linkSelector = "";
        for (var i = 0; i < tabList.length; i++) {
            linkSelector += "#" + tabList[i][1];
            divSelector += "#" + tabList[i][0];
            if (i < tabList.length - 1) {
                divSelector += ",";
                linkSelector += ",";
            }
        }
        function setTab(div) {
            index = $(links).index(div);
            target = $(divs).filter(":eq(" + index + ")");
            $(divs).slideUp("fast");
            target.slideDown("fast");
        }

        divs = $(divSelector);
        links = $(linkSelector);
        links.click(function() {
            setTab(this);
        });
        setTab(links.filter("#tablink_" + selectedId));
    };

    /* Thanks to Peter-Paul Koch - http://www.quirksmode.org/dom/inputfile.html */
    Leetchi.initFileUploads = function() {
        if (!(document.createElement && document.getElementsByTagName) || !!Leetchi.initFileUploads.done) return;
        Leetchi.initFileUploads.done = true;
        var fakeFileUpload = document.createElement('div');
        fakeFileUpload.className = 'fakefile';
        fakeFileUpload.appendChild(document.createElement('input'));

        var link = document.createElement('a');
        link.className = "Button";
        link.href = "#";
        var leftSpan = document.createElement('span');
        var rightSpan = document.createElement('span');
        leftSpan.className = "LeftPart";
        rightSpan.className = "RightPart";
        rightSpan.appendChild(document.createTextNode("Choisir..."));
        leftSpan.appendChild(rightSpan);
        link.appendChild(leftSpan);
        fakeFileUpload.appendChild(link);
        var x = document.getElementsByTagName('input');
        for (var i = 0; i < x.length; i++) {
            if (x[i].type != 'file') continue;
            if (x[i].parentNode.className != 'fileinputs') continue;
            x[i].className = 'file hidden';
            var clone = fakeFileUpload.cloneNode(true);
            x[i].parentNode.appendChild(clone);
            x[i].relatedElement = clone.getElementsByTagName('input')[0];
            x[i].onchange = x[i].onmouseout = function() {
                this.relatedElement.value = this.value;
            }
        }
    };
    Leetchi.parseFrenchDate = function(date) {
        if (!Leetchi.parseFrenchDate.rx)
            Leetchi.parseFrenchDate.rx = new RegExp("\\s*([0-9]+)\\s*[-/]\\s*([0-9]+)\\s*[-/]\\s*([0-9]+)\\s*", "i");
        var oMatches;
        if ((oMatches = Leetchi.parseFrenchDate.rx.exec(date)) == null)
            return null;
        try {
            var iDays = parseInt(oMatches[1], 10);
            var iMonths = parseInt(oMatches[2], 10);
            var iYears = parseInt(oMatches[3], 10);
            if (iYears < 100) iYears = iYears + (iYears < 20 ? 2000 : 1900);
            return new Date(iYears, iMonths - 1, iDays);
        } catch (e) {
            return null;
        }
    };
    Leetchi.bindFilterCheckbox = function(allItemsSelector, noItemsSelector, items) {
        function uncheckExclusive(checkedItemGroup, checkedItem) {
            for (var j = 0; j < checkedItemGroup.length; j += 2) {
                if (checkedItemGroup[j] != checkedItem) {
                    var checkboxID = document.getElementById(checkedItemGroup[j]);
                    if (!!$(checkboxID).attr('checked')) {
                        checkboxID._checkBoxManager.click();
                    };
                };
            };
        };
        function getClassesToHide() {
            var result = [];
            for (var i = items.length - 1; i >= 0; i--) {
                var innerList = items[i];
                for (var j = 0; j < innerList.length; j += 2) {
                    var checkboxID = document.getElementById(innerList[j]);
                    var labelSelector = $("label[for=" + innerList[j] + "]");
                    if (!!$(checkboxID).attr('checked')) {
                        result.push(innerList[j + 1]);
                        labelSelector.addClass("FilterActive");
                    } else {
                        labelSelector.removeClass("FilterActive");
                    };
                };
            };
            if (result.length == 0) return "";
            return "." + result.join(",.");
        };
        function updateVisibility() {
            function showOrHideNoItemsMessage() {
                if ($(allItemsSelector).filter(":visible").length == 0) $(noItemsSelector).show(); else $(noItemsSelector).hide();
            };
            var classesToHide = getClassesToHide();
            if (classesToHide == "") {
                $(allItemsSelector).slideDown("fast", showOrHideNoItemsMessage);
            } else {
                $(allItemsSelector).not(classesToHide).slideDown("fast", function() { window.setTimeout(showOrHideNoItemsMessage, 0); });
                $(classesToHide).slideUp("fast", function() { window.setTimeout(showOrHideNoItemsMessage, 0); });
            };
        };
        function clickHandlerBuilder(itemGroup, itemID) {
            return function() {
                if (!!$(itemID).attr('checked'))
                    uncheckExclusive(itemGroup, itemID);
                updateVisibility();
            };
        };
        for (var i = items.length - 1; i >= 0; i--) {
            var innerList = items[i];
            for (var j = 0; j < innerList.length; j += 2) {
                var checkboxID = document.getElementById(innerList[j]);
                $(checkboxID).click(clickHandlerBuilder(innerList, checkboxID));
            };
        };
        updateVisibility();
    };
    Leetchi.bindSlider = function(sliderId, textBox1ID, textBox2ID, formID, selectedChangedCallback) {
        // Equation : items[1] / items[0] = items[2]
        var items = [$(sliderId), $(textBox1ID), $(textBox2ID)];
        var itemsLastValue = [items[0].slider('value'), items[1].val(), items[2].val()];
        var lastChanges = [];
        var inhibitEvents = false;
        function AddChangedItem(itemNumber) {
            if (itemNumber == 0) return;
            var i = 0;
            if (lastChanges.length && lastChanges[lastChanges.length - 1] == itemNumber) return;
            while (i < lastChanges.length) if (lastChanges[i] == itemNumber) lastChanges.splice(i, 1); else i++;
            lastChanges.push(itemNumber);
            selectedChangedCallback(itemNumber == 2 ? textBox1ID : textBox2ID);
        };
        function CalculateValue(fromIndex1, fromIndex2) {
            if (fromIndex2 < fromIndex1) {
                var iTempForSwap = fromIndex1;
                fromIndex1 = fromIndex2;
                fromIndex2 = iTempForSwap;
            };
            var destIndex = 0;
            if (fromIndex1 == destIndex) destIndex++;
            if (fromIndex2 == destIndex) destIndex++;
            var iResult = 0;
            switch (destIndex) {
                case 0:
                    iResult = itemsLastValue[1] / itemsLastValue[2];
                    break;
                case 1:
                    iResult = itemsLastValue[0] * itemsLastValue[2];
                    break;
                case 2:
                    iResult = itemsLastValue[1] / itemsLastValue[0];
                    break;
            };
            if (destIndex == 0) {
                iResult = Math.ceil(iResult);
                items[destIndex].slider('value', iResult);
            } else {
                if (destIndex == 1)
                    iResult = Math.floor(iResult * 100) / 100;
                else
                    iResult = Math.ceil(iResult * 100) / 100;
                items[destIndex].val(iResult);
                $(formID).validate().element(items[destIndex]);
            };
            itemsLastValue[destIndex] = iResult;
        };
        function ValueChanged(itemNumber, newValue) {
            if (inhibitEvents) return;
            inhibitEvents = true;
            try {
                AddChangedItem(itemNumber);
                itemsLastValue[itemNumber] = newValue;
                var iLen = lastChanges.length;
                if (iLen >= 1) {
                    items[0].show();
                    CalculateValue(0, lastChanges[iLen - 1]);
                };
            } finally { inhibitEvents = false; };
        };
        $(sliderId).bind("slidechange", function(event, ui) {
            if (ui) ValueChanged(0, ui.value);
        });
        $(sliderId).bind("slide", function(event, ui) {
            if (ui) ValueChanged(0, ui.value);
        });
        for (var i = 1; i <= 2; i++) {
            var fnValueChangedHandler = (function(itemIndex) {
                return function(event, ui) {
                    var fNum = Leetchi.parseNumber(items[itemIndex].val());
                    if (!isNaN(fNum) && isFinite(fNum) && fNum >= 1)
                        ValueChanged(itemIndex, fNum);
                };
            })(i);
            items[i].bind("change keyup", fnValueChangedHandler);
            items[i].bind("focus", (function(itemIndex) {
                return function() {
                    AddChangedItem(itemIndex);
                };
            })(i));
        }
    };
    Leetchi.sendForm = function(form, target, button) {
        var originalHtml = $(button).children().hide();
        $(button).append("<span class=\"Loading\" style=\"line-height: 42px\"><img src=\"/Content/img/AjaxLoader.gif\"></img> Chargement en cours...</span>");
        function fnError() {
            $(button).children(".Loading").remove();
            $(button).children().show();
        };
        $(form).ajaxSubmit({
            success: function(data) {
                $(target).html(data);
            },
            error: function() {
                fnError();
            }
        });
    };
    Leetchi.rotateLogos = function(items, logocss) {
        var slices = [];
        var iItemCount = items.length;
        for (var i = 0; i < logocss.length; i++) {
            var iCurLen = logocss.length - (i * iItemCount);
            if (iCurLen > iItemCount) iCurLen = iItemCount;
            else if (iCurLen <= 0) break;
            slices.push(logocss.slice(i * iItemCount, (i * iItemCount) + iCurLen + 1));
        };
        function smoothChangeTo(item, newClass) {
            return function() {
                var oItem = document.getElementById(item);
                oItem.className = newClass[0];
                oItem.setAttribute("href", newClass[1]);
                $(oItem).fadeIn("fast").children("span").text(newClass[2]);
            };
        };
        var iCurrentSlice = 0;
        setInterval(function() {
            iCurrentSlice = (iCurrentSlice + 1) % slices.length;
            for (var i = 0; i < iItemCount; i++) {
                if (i < slices[iCurrentSlice].length)
                    $("#" + items[i]).fadeOut("fast", smoothChangeTo(items[i], slices[iCurrentSlice][i]));
                else
                    $("#" + items[i]).fadeOut("fast");
            }
        }, 6000);
    };
    Leetchi.paginate = function(addMoreMessage, parent, elements, pagesize) {
        var oDiv = document.createElement("DIV");
        oDiv.className = "ShowMoreItems";
        var oLink = document.createElement("A");
        oLink.setAttribute("href", "javascript:void(0);");
        oDiv.appendChild(oLink);
        var iShownCount = pagesize;
        $.each(elements, function(itemIdx, item) {
            if (itemIdx >= iShownCount) $(item).hide();
        });
        function updateLink() {
            if (iShownCount >= elements.length)
                $(oDiv).hide();
            else
                $(oLink).text(addMoreMessage + " (" + (elements.length - iShownCount) + " cachés)");
        };
        $(oLink).text(addMoreMessage + " (" + (elements.length - iShownCount) + " cachés)")
	        .click(function() {
	            var iOldCount = iShownCount;
	            iShownCount += pagesize;
	            $.each(elements, function(itemIdx, item) {
	                if (itemIdx >= iOldCount && itemIdx < iShownCount)
	                    $(item).show();
	            });
	            updateLink();
	        });
        updateLink();
        parent.append(oDiv);
    };
    Leetchi.setupDateFieldToRevalidateAutomatically = function(id) {
        var $item = $("#" + id);
        var $form = $item.closest("form");
        /*while ($form != null && $form.length > 0 && $form[0].tagName.toLowerCase() != "form")
        $form = $form.parent();
        if ($form == null) throw "Could not find parent form of date field !";
        */
        return function() {
            $form.validate().element($item);
        };
    };
    $.validator.setDefaults({
        highlight: function(element, errorClass) {
            Leetchi.setFieldError(element);
        },
        unhighlight: function(element, errorClass) {
            Leetchi.clearFieldError(element);
        },
        errorPlacement: function(error, element) {
            error.appendTo(Leetchi.getFieldError(element));
        },
        focusInvalid: false,
        wrapper: "p"
    });
    jQuery.validator.addMethod("equalToInsensitive", function(value, element, param) {
        return value.toLowerCase() == $(param).val().toLowerCase();
    }, jQuery.validator.messages['equalTo']);
    $.validator.addMethod("frenchDate", function(value, element, param) {
        if (typeof value != "string") return false;
        if (value.length == 0) return false;
        if (Leetchi.parseFrenchDate(value) == null) return false;
        return true;
    }, "Veuillez saisir une date au format jj/mm/yyyy.");
    function dateTimeValidatorGenerator(operator) {
        return function(value, element, param) {
            if (typeof value != "string") return false;
            if (value.length == 0) return false;
            value = Leetchi.parseFrenchDate(value);
            var other = Leetchi.parseFrenchDate(param);
            if (value == null || other == null) return false;
            return operator(value, other);
        };
    };
    $.validator.addMethod("frenchDateMin",
        dateTimeValidatorGenerator(function(v, p) { return v >= p; })
    , $.validator.format("Veuillez saisir une date après le {0}."));
    $.validator.addMethod("frenchDateMinIncl",
        dateTimeValidatorGenerator(function(v, p) { return v >= p; })
    , $.validator.format("Veuillez saisir une date après le {0}."));
    $.validator.addMethod("frenchDateMinExcl",
        dateTimeValidatorGenerator(function(v, p) { return v > p; })
    , $.validator.format("Veuillez saisir une date après le {0}."));
    $.validator.addMethod("frenchDateMax",
        dateTimeValidatorGenerator(function(v, p) { return v <= p; })
    , $.validator.format("Veuillez saisir une date avant le {0}."));
    $.validator.addMethod("frenchDateMaxIncl",
        dateTimeValidatorGenerator(function(v, p) { return v <= p; })
    , $.validator.format("Veuillez saisir une date avant le {0}."));
    $.validator.addMethod("frenchDateMaxExcl",
        dateTimeValidatorGenerator(function(v, p) { return v < p; })
    , $.validator.format("Veuillez saisir une date avant le {0}."));
    $.validator.addMethod("password", function(value) {
        if (typeof value != "string") return false;
        if (value.length == 0) return false;
        var bHasLetter = false;
        var bHasNumber = false;
        var i = 0;
        for (i = 0; i < value.length && !(bHasLetter && bHasNumber); i++) {
            if ("abcdefghjiklmnopqrstuvwxyzABCDEFGHJIKLMNOPQRSTUVWXYZ".indexOf(value.charAt(i)) > -1)
                bHasLetter = true;
            else
                bHasNumber = true;
        };
        return bHasLetter && bHasNumber;
    }, "Utilisez au moins un chiffre et une lettre dans votre mot de passe");
    $.validator.addMethod("citelis", function(value) {
        if (typeof value != "string") return false;
        if (value.length == 0) return false;
        var bHasInvalidChar = false;
        var i = 0;
        for (i = 0; i < value.length && !(bHasInvalidChar); i++) {
            if ("=!".indexOf(value.charAt(i)) > -1)
                bHasInvalidChar = true;
        };
        return !bHasInvalidChar;
    }, "Les caractères = (égal) et ! (point d'exclamation) sont interdits dans le nom.");
    $.validator.addMethod("iban", function(value) {
        if (typeof value != "string") return false;
        if (value.length == 0) return false;
        value = value.replace(new RegExp("[^0123456789ABCDEFGHJIKLMNOPQRSTUVWXYZ]+", "gi"), "");
        return (new RegExp("^FR[0123456789ABCDEFGHJIKLMNOPQRSTUVWXYZ]{25}$", "gi")).test(value);
    }, "Votre saisie n'est pas un IBAN français valide.");
    $.validator.addMethod("bic", function(value) {
        if (typeof value != "string") return false;
        if (value.length == 0) return false;
        value = value.replace(new RegExp("[^0123456789ABCDEFGHJIKLMNOPQRSTUVWXYZ]+", "gi"), "");
        return (new RegExp("^[A-Z]{4}FR[0-9A-Z]{2,5}$", "gi")).test(value);
    }, "Votre saisie n'est pas un code BIC français valide.");
    $.validator.addMethod("flexNumber", function(value) {
        if (typeof value != "string") return false;
        if (value.length == 0) return false;
        var fNum = Leetchi.parseNumber(value);
        return !isNaN(fNum) && isFinite(fNum);
    }, "Veuillez saisir un nombre");
    function flexNumberValidatorGenerator(operator) {
        return function(value, element, param) {
            if (typeof value != "string") return false;
            if (value.length == 0) return false;
            var fNum = Leetchi.parseNumber(value);
            return !isNaN(fNum) && isFinite(fNum) && operator(fNum, Leetchi.parseNumber(param));
        };
    };
    Leetchi.validatorEuroFormater = function(text) {
        var oSubMethod = $.validator.format(text);
        return function(param) {
            param = Leetchi.formatEuroCents(param);
            return oSubMethod(param);
        };
    };
    $.validator.addMethod("flexEuroNumberMin", flexNumberValidatorGenerator(function(val, param) {
        return (val * 100) > param;
    }), Leetchi.validatorEuroFormater("Veuillez saisir un montant plus grand que {0}."));
    $.validator.addMethod("flexEuroNumberMinIncl", flexNumberValidatorGenerator(function(val, param) {
        return (val * 100) >= param;
    }), Leetchi.validatorEuroFormater("Veuillez saisir un montant d'au moins {0}."));
    $.validator.addMethod("flexEuroNumberMax", flexNumberValidatorGenerator(function(val, param) {
        return (val * 100) < param;
    }), Leetchi.validatorEuroFormater("Veuillez saisir un montant plus petit que {0}."));
    $.validator.addMethod("flexEuroNumberMaxIncl", flexNumberValidatorGenerator(function(val, param) {
        return (val * 100) <= param;
    }), Leetchi.validatorEuroFormater("Veuillez saisir un montant plus petit que {0}."));
    $.validator.addMethod("flexNumberMin", flexNumberValidatorGenerator(function(val, param) {
        return val > param;
    }), $.validator.format("Veuillez saisir un nombre plus grand que {0}."));
    $.validator.addMethod("flexNumberMinIncl", flexNumberValidatorGenerator(function(val, param) {
        return val >= param;
    }), $.validator.format("Veuillez saisir un nombre plus grand que (ou égal à) {0}."));
    $.validator.addMethod("flexNumberMax", flexNumberValidatorGenerator(function(val, param) {
        return val < param;
    }), $.validator.format("Veuillez saisir un nombre plus petit que {0}."));
    $.validator.addMethod("flexNumberMaxIncl", flexNumberValidatorGenerator(function(val, param) {
        return val <= param;
    }), $.validator.format("Veuillez saisir un nombre plus petit que (ou égal à) {0}."));
})();

$.fn.wait = function(time, type) {
    time = time || 1000;
    type = type || "fx";
    return this.queue(type, function() {
        var self = this;
        setTimeout(function() {
            $(self).dequeue();
        }, time);
    });
};

$.expr[':'].external = function(obj) {
    return obj.hostname && obj.hostname !== location.hostname;
};
$.expr[':'].pdf = function(obj) {
    return obj.href.match(/\.pdf$/) != null;
};