/** @file
 *
 *  Fichier contenant des fonctions javascript
 */

if (typeof window.PublinovaJs == "undefined") {

    /** @brief Parametre indiquant que le fichier est charge */
    var PublinovaJs = 'charger';

    var Novius = function() {};

    if (document.getElementsByTagName('base')[0]) {
        /** @brief Recuperation de l'attribut href du Tag BASE si defini */
        var base_url = document.getElementsByTagName('base')[0].href;
    }

    /** @brief Ajout d'un fichier js ou css au head
     *  @param url L'url du fichier
     *  @param params Les parametres d'ajout
     *      - @c type : Optionnel, css ou js
     *      - @c media : Optionnel, le type de media concerne pour le css
     *      - @c onload : Optionnel, une fonction appelle en callback a la fin du chagement du fichier js
     */
    Novius.addFile = function(url, params) {
        params     = params || new Array();
        var headID = document.getElementsByTagName("head")[0];
        var type   = params.type || (/\.css/i.test(url) ? 'css' : '') || (/\.js/i.test(url) ? 'js' : '');
        if (type == 'css') {
            var cssNode  = document.createElement('link');
            cssNode.type = 'text/css';
            cssNode.rel  = 'stylesheet';
            cssNode.href = url;
            if (params.media) {
                cssNode.media = params.media;
            }
            headID.appendChild(cssNode);
        } else if (type == 'js') {
            var newScript  = document.createElement('script');
            newScript.type = 'text/javascript';
            newScript.src  = url;
            if (params.onload) {
                newScript.onload = params.onload;
            }
            headID.appendChild(newScript);
        }
    };

    /** @brief Traduit une chaine en fonction du language
     *  @param chaine La chaine a traduire
     */
    Novius = {
        i18n        : {
            uk : {
                "La date est incompl\u00e8te."                                                                                       : "Date is incomplete",
                "La date n'est pas valide."                                                                                          : "Date is not correct",
                "Le champ email doit contenir au maximum xxxlongueurxxx caract\u00e8res."                                            : "Email field cannot contain more than xxxlongueurxxx characters",
                "Le champ email doit \u00eatre rempli."                                                                              : "Email field must be filled in",
                "Le champ xxxchampxxx doit contenir des chiffres."                                                                   : "Field xxxchampxxx must contain figures",
                "Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00e8res au maximum."                                      : "Field xxxchampxxx cannot contain more than xxxlongueurxxx characters",
                "Le champ xxxchampxxx est vide."                                                                                     : "Field xxxchampxxx is empty",
                "Le fichier s\u00e9lectionn\u00e9 n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx" : "Selected file extension is not allowed.\r\nExtensions allowed: xxxextension_requisesxxx",
                "Le fichier xxxchampxxx n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx"           : "File extension xxxchampxxx is not allowed.\r\nExtensions allowed: xxxextension_requisesxxx",
                "Pas de s\u00e9lection"                                                                                              : "No selection",
                "Veuillez s\u00e9lectionner une valeur pour le champ xxxchampxxx."                                                   : "Please select a value for field xxxchampxxx",
                "V\u00e9rifiez l'adresse email,\nelle ne semble pas valide."                                                         : "Check the email address,\r\nit seems to be incorrect"
            },
            de : {
                "La date est incompl\u00e8te."                                                                                       : "Unvollst\u00e4ndiges Datum.",
                "La date n'est pas valide."                                                                                          : "Ung\u00fcltiges Datum",
                "Le champ email doit contenir au maximum xxxlongueurxxx caract\u00e8res."                                            : "Das Feld xxxchampxxx darf h\u00f6chstens xxxlongueurxxx Zeichen enthalten.",
                "Le champ email doit \u00eatre rempli."                                                                              : "Bitte das Feld E-Mail ausf\u00fcllen.",
                "Le champ xxxchampxxx doit contenir des chiffres."                                                                   : "Das Feld xxxchampxxx muss eine Zahl enthalten.",
                "Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00e8res au maximum."                                      : "Das Feld xxxchampxxx darf h\u00f6chstens xxxlongueurxxx Zeichen enthalten.",
                "Le champ xxxchampxxx est vide."                                                                                     : "Das Feld xxxchampxxx ist leer.",
                "Le fichier s\u00e9lectionn\u00e9 n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx" : "Die ausgew\u00e4hlte Datei xxxchampxxx hat keine zugelassenen Erweiterung. \nZugelassen: xxxextension_requisesxxx",
                "Le fichier xxxchampxxx n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx"           : "Die Datei xxxchampxxx hat keine zugelassene Erweiterung. \nZugelassen: xxxextension_requisesxxx",
                "Pas de s\u00e9lection"                                                                                              : "Keine Auswahl",
                "Veuillez s\u00e9lectionner une valeur pour le champ xxxchampxxx."                                                   : "W\u00e4hlen Sie im Feld xxxchampxxx einen Wert aus.",
                "V\u00e9rifiez l'adresse email,\nelle ne semble pas valide."                                                         : "Bitte \u00fcberpr\u00fcfen Sie die E-Mail-Adresse,\nsie k\u00f6nnte ung\u00fcltig sein."
            },
            es : {
                "La date est incompl\u00e8te."                                                                                       : "Fecha incompleta",
                "La date n'est pas valide."                                                                                          : "Fecha incorrecta",
                "Le champ email doit contenir au maximum xxxlongueurxxx caract\u00e8res."                                            : "El campo Email debe incluir xxxlongueurxxx caracteres como m\u00e1ximo",
                "Le champ email doit \u00eatre rempli."                                                                              : "Debe completar el campo Email",
                "Le champ xxxchampxxx doit contenir des chiffres."                                                                   : "El campo xxxchampxxx debe incluir n\u00fameros",
                "Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00e8res au maximum."                                      : "El campo xxxchampxxx debe incluir como m\u00e1ximo xxxlongueurxxx caracteres",
                "Le champ xxxchampxxx est vide."                                                                                     : "El campo xxxchampxxx est\u00e1 vac\u00edo",
                "Le fichier s\u00e9lectionn\u00e9 n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx" : "No se puede admitir la extensi\u00f3n del archivo seleccionado.\nExtensiones admitidas: xxxextension_requisesxxx",
                "Le fichier xxxchampxxx n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx"           : "No se puede admitir la extensi\u00f3n del archivo xxxchampxxx.\nExtensiones admitidas:  xxxextension_requisesxxx",
                "Pas de s\u00e9lection"                                                                                              : "Ninguna selecci\u00f3n",
                "Veuillez s\u00e9lectionner une valeur pour le champ xxxchampxxx."                                                   : "Por favor, seleccione un valor en el campo xxxchampxxx",
                "V\u00e9rifiez l'adresse email,\nelle ne semble pas valide."                                                         : "Compruebe la direcci\u00f3n email,\nparece que no es correcta"
            },
            pt : {
                'Le champ xxxchampxxx est vide.'                                                                                        : 'O campo xxxchampxxx necessita de ser preenchido.',
                'Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00E8res au maximum.'                                         : 'O campo xxxchampxxx n\u00E3o pode exceder xxxlongueurxxx caracteres.',
                'Veuillez s\u00E9lectionner une valeur pour le champ xxxchampxxx.'                                                      : 'Por favor, seleccione um valor para o campo xxxchampxxx',
                'Le champ xxxchampxxx doit contenir des chiffres.'                                                                      : 'O campo xxxchampxx apenas aceita caracteres num\u00E9ricos.',
                'Le champ email doit \u00EAtre rempli.'                                                                                 : 'O preenchimento do campo email \u00E9 obrigat\u00F3rio.',
                'Le champ email doit contenir au maximum xxxlongueurxxx caract\u00E8res.'                                               : 'O campo email n\u00E3o pode exceder xxxlongueurxxx caracteres',
                "V\u00E9rifiez l'adresse email,\nelle ne semble pas valide."                                                            : "Por favor verifique o endere\u00E7o de email.",
                'La date est incompl\u00E8te.'                                                                                          : 'A data est\u00E1 incompleta',
                "La date n'est pas valide."                                                                                             : 'A data n\u00E3o \u00E9 v\u00E1lida',
                "Le fichier xxxchampxxx n'a pas une extension autoris\u00E9e.\nAutoris\u00E9es : xxxextension_requisesxxx"              : "A extens\u00E3o do ficheiro xxxchampxxx n\u00E3o \u00E9 v\u00E1lida.\nAs extens\u00F5es autorizadas s\u00E3o as seguintes: xxxextension_requisesxxx",
                "Le fichier s\u00E9lectionn\u00E9 n'a pas une extension autoris\u00E9e.\nAutoris\u00E9es : xxxextension_requisesxxx"    : "A extens\u00E3o do ficheiro seleccionado xxxchampxxx n\u00E3o \u00E9 v\u00E1lida.\nAs extens\u00F5es autorizadas s\u00E3o as seguintes: xxxextension_requisesxxx",
                'Pas de s\u00E9lection'                                                                                                 : 'Por favor seleccionar uma op\u00E7\u00E3o'
            },
            nl : {
                "La date est incompl\u00e8te."                                                                                          : "Datum is incompleet",
                "La date n\'est pas valide."                                                                                            : "Datum is niet juist",
                "Le champ email doit contenir au maximum xxxlongueurxxx caract\u00e8res."                                               : "Het E-mail veld kan niet uit meer dan xxxlongueurxxx karakters bestaan",
                "Le champ email doit \u00eatre rempli."                                                                                 : "Het E-mail veld moet ingevuld worden",
                "Le champ xxxchampxxx doit contenir des chiffres."                                                                      : "Het veld xxxchampxxx moet uit cijfers bestaan",
                "Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00e8res au maximum."                                         : "Het veld xxxchampxxx kan niet uit meer dan xxxlongueurxxx karakters bestaan",
                "Le champ xxxchampxxx est vide."                                                                                        : "Het veld xxxchampxxx is niet ingevuld",
                "Le fichier s\u00e9lectionn\u00e9 n\'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx"   : "Dit formaat is niet toegestaan.\nToegestane formaten xxxextension_requisesxxx",
                "Le fichier xxxchampxxx n\'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx"             : "Formaat xxxchampxxx is niet toegestaan.\nToegestane formaten xxxextension_requisesxxx",
                "Pas de s\u00e9lection"                                                                                                 : "Geen keuzemogelijkheid",
                "Veuillez s\u00e9lectionner une valeur pour le champ xxxchampxxx."                                                      : "Gelieve het veld xxxchampxxx in te vullen",
                "V\u00e9rifiez l\'adresse email,\nelle ne semble pas valide."                                                           : "Kijk het emailadres na,\nhet lijkt onjuist te zijn"
            },
            it : {
                "La date est incompl\u00e8te."                                                                                       : "Data incompleta.",
                "La date n'est pas valide."                                                                                          : "Data non valida.",
                "Le champ email doit contenir au maximum xxxlongueurxxx caract\u00e8res."                                            : "Il campo e-mail deve contenere almeno xxxlongueurxxx caratteri.",
                "Le champ email doit \u00eatre rempli."                                                                              : "Il campo e-mail deve essere compilato.",
                "Le champ xxxchampxxx doit contenir des chiffres."                                                                   : "Il campo xxxcampoxxx deve contenere dei numeri.",
                "Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00e8res au maximum."                                      : "Il campo xxxchampxxx deve contenere al massimo xxxlongueurxxx caratteri.",
                "Le champ xxxchampxxx est vide."                                                                                     : "Il campo xxxchampxxx \u00e8 vuoto.",
                "Le fichier s\u00e9lectionn\u00e9 n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx" : "Estensione del file selezionato non permessa.\nPermesse: xxxextension_requisesxxx",
                "Le fichier xxxchampxxx n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx"           : "Il file xxxchampxxx ha un'estensione non permessa.\nPermesse: xxxextension_requisesxxx",
                "Pas de s\u00e9lection"                                                                                              : "Nessuna selezione",
                "Veuillez s\u00e9lectionner une valeur pour le champ xxxchampxxx."                                                   : "Seleziona un valore per il campo xxxchampxxx.",
                "V\u00e9rifiez l'adresse email,\nelle ne semble pas valide."                                                         : "Verifica l'indirizzo e-mail;\nquesto sembra non essere valido."
            },
            pl : {
                "La date est incompl\u00e8te."                                                                                       : "Data jest niekompletna.",
                "La date n'est pas valide."                                                                                          : "Data jest nieprawid\u0142owa.",
                "Le champ email doit contenir au maximum xxxlongueurxxx caract\u00e8res."                                            : "Pole \"email\" powinno zawiera\u0107 maksymalnie xxxlongueurxxx znak\u00f3w.",
                "Le champ email doit \u00eatre rempli."                                                                              : "Pole \u0022email\u0022 powinno zosta\u0107 wype\u0142nione.",
                "Le champ xxxchampxxx doit contenir des chiffres."                                                                   : "Pole xxxchampxxx powinno zawiera\u0107 cyfry.",
                "Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00e8res au maximum."                                      : "Pole xxxchampxxx powinno zawiera\u0107 maksymalnie xxxlongueurxxx znak\u00f3w.",
                "Le champ xxxchampxxx est vide."                                                                                     : "Pole xxxchampxxx jest puste.",
                "Le fichier s\u00e9lectionn\u00e9 n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx" : "Wybrany plik nie ma dozwolonego rozszerzenia.\nPermesse: xxxextension_requisesxxx",
                "Le fichier xxxchampxxx n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx"           : "Wybrany plik nie ma dozwolonego rozszerzenia.\nDozwolone : xxxextension_requisesxxx.",
                "Pas de s\u00e9lection"                                                                                              : "Nie wybrano \u017cadnej warto\u015bci.",
                "Veuillez s\u00e9lectionner une valeur pour le champ xxxchampxxx."                                                   : "Prosz\u0119 wybra\u0107 warto\u015b\u0107 dla pola xxxchampxxx.",
                "V\u00e9rifiez l'adresse email,\nelle ne semble pas valide."                                                         : "Prosz\u0119 zweryfikowa\u0107 adres email, wydaje sie by\u0107 b\u0142\u0119dny."
            },
            cz : {
                "La date est incompl\u00e8te."                                                                                       : "Ne\u00fapln\u00e9 datum.",
                "La date n'est pas valide."                                                                                          : "Nespr\u00e1vn\u00e9 datum.",
                "Le champ email doit contenir au maximum xxxlongueurxxx caract\u00e8res."                                            : "V\u00e1\u0161 e-mail sm\u00ed obsahovat maxim\u00e1ln\u011b xxxlongueurxxx znak\u016f.",
                "Le champ email doit \u00eatre rempli."                                                                              : "Informace o Va\u0161em e-mailu je povinn\u00e1.",
                "Le champ xxxchampxxx doit contenir des chiffres."                                                                   : "Pole xxxchampxxx mus\u00ed obsahovat pouze \u010d\u00edsla.",
                "Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00e8res au maximum."                                      : "Pole xxxchampxxx mus\u00ed obsahovat maxim\u00e1ln\u011b xxx znak\u016f.",
                "Le champ xxxchampxxx est vide."                                                                                     : "Pole xxxchampxxx je pr\u00e1zdn\u00e9",
                "Le fichier s\u00e9lectionn\u00e9 n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx" : "Vybran\u00fd soubor nem\u00e1 povolenou p\u0159\u00edponu.\r\nPovoleno: xxxextension_requisesxxx",
                "Le fichier xxxchampxxx n'a pas une extension autoris\u00e9e.\nAutoris\u00e9es : xxxextension_requisesxxx"           : "Vybran\u00fd soubor nem\u00e1 povolenou p\u0159\u00edponu.\r\nPovoleno: xxxextension_requisesxxx",
                "Pas de s\u00e9lection"                                                                                              : "\u017d\u00e1dn\u00e1 hodnota nebyla vybr\u00e1na",
                "Veuillez s\u00e9lectionner une valeur pour le champ xxxchampxxx."                                                   : "Pros\u00edm vyberte hodnotu pole xxxchampxxx.",
                "V\u00e9rifiez l'adresse email,\nelle ne semble pas valide."                                                         : "Ov\u011b\u0159te pros\u00edm spr\u00e1vnost Va\u0161\u00ed e-mailov\u00e9 adresy. Zd\u00e1 se b\u00fdt neplatn\u00e1."
            }
        },
        translate   : function(chaine) {
            if (language_js == 'fr') {
                return chaine;
            }
            if (this.i18n[language_js] && this.i18n[language_js][chaine]) {
                return this.i18n[language_js][chaine];
            }
            return chaine;
        }
    };

    if (typeof window.language_js == "undefined") {
        /** @brief Initialisation de la variable language_js contenant le code langue utilise */
        var language_js = "";
    }

    /** @brief Ajout d'un fichier js ou css au head
     *  @param url L'url du fichier
     *  @param params Les parametres d'ajout
     *      - @c type : Optionnel, css ou js
     *      - @c media : Optionnel, le type de media concerne pour le css
     *      - @c onload : Optionnel, une fonction appelle en callback a la fin du chagement du fichier js
     */
    Logger = function(log, message) {
        try {
            message = message || "Logger : %o";
            console.log(message, log);
        } catch (e) {
            try {
                window.console.log(log);
            } catch (e) {
                message = "Logger";
                alert(message + " :\n" + print_r(log, "\n"));
            }
        }
    };

    function WindowVisu(url, titre, winStats){
        titre = titre || 'titre';
        if (winStats && navigator.appName.indexOf("Microsoft") < 0) {
            winStats = winStats.replace(/width/i, 'innerWidth');
            winStats = winStats.replace(/height/i, 'innerHeight');
            winStats = winStats.replace(/left/i, 'screenX');
            winStats = winStats.replace(/top/i, 'screenY');
        }
        try {
            eval('if (top.win' + titre + ' && !(top.win' + titre + '.closed)) top.win' + titre + '.close();');
        } catch (e) {}
        eval('win' + titre + ' = window.open(url, titre' + (winStats ? ', winStats' : '') + ');');
        eval('if (win' + titre + ') win' + titre + '.focus();');
    }

    /** @brief Suppression des espaces au debut ou a la fin d'une chaine
     *  @param chaine La chaine a traiter
     */
    function Trim(chaine) {
        var res = chaine;
        res     = res.replace(/^\s+/, '');
        res     = res.replace(/\s+$/, '');
        return res;
    }

    /** @brief Verification d'un champ chaine
     *  @param champ Le champ a verifier
     *  @param nom_champ Le nom du champ
     *  @param longueur Optionnel. La longueur maximum du champ, si 0 illimite (par defaut)
     *  @param pas_vide Optionnel. Booleen indiquant is le champ est obligatoire (false par defaut)
     */
    function TesteChaine(champ, nom_champ, longueur, pas_vide) {
        nom_champ = nom_champ ? "'" + nom_champ + "'" : '';
        if (pas_vide && Trim(getChampValue(champ)) == '') {
            alert(Novius.translate('Le champ xxxchampxxx est vide.').replace(/xxxchampxxx/, nom_champ));
            try {
                champ.focus();
                champ.select();
            } catch (e) {}
            return false;
        }
        if (longueur && longueur != 0 && champ.value.length > longueur) {
            alert(Novius.translate('Le champ xxxchampxxx doit contenir xxxlongueurxxx caract\u00E8res au maximum.').replace(/xxxchampxxx/, nom_champ).replace(/xxxlongueurxxx/, longueur));
            try {
                champ.focus();
                champ.select();
            } catch (e) {}
            return false;
        }
        return true;
    }

    /** @brief Verification d'un champ liste
     *  @param champ Le champ a verifier
     *  @param nom_champ Le nom du champ
     *  @param pas_vide Optionnel. Booleen indiquant is le champ est obligatoire (false par defaut)
     */
    function TesteListe(champ, nom_champ, pas_vide) {
        nom_champ = nom_champ ? "'" + nom_champ + "'" : '';
        if (pas_vide && Trim(getChampValue(champ)) == '') {
            alert(Novius.translate('Veuillez s\u00E9lectionner une valeur pour le champ xxxchampxxx.').replace(/xxxchampxxx/, nom_champ));
            try {
                champ.focus();
            } catch (e) {}
            return false;
        }
        return true;
    }

    /** @brief Verification d'un champ liste choix multiple
     *  @param champ Le champ a verifier
     *  @param nom_champ Le nom du champ
     *  @param pas_vide Optionnel. Booleen indiquant is le champ est obligatoire (false par defaut)
     */
    function TesteListeMultiple(champ, nom_champ, pas_vide) {
        return TesteListe(champ, nom_champ, pas_vide);
    }

    /** @brief Verification d'un champ numerique
     *  @param champ Le champ a verifier
     *  @param nom_champ Le nom du champ
     *  @param pas_vide Optionnel. Booleen indiquant is le champ est obligatoire (false par defaut)
     */
    function TesteNombre(champ, nom_champ, pas_vide) {
        nom_champ = nom_champ ? "'" + nom_champ + "'" : '';
        if (!TesteChaine(champ, nom_champ, 0, pas_vide)) {
            return false;
        }
        champ.value = champ.value.replace(/,/, '.');
        champ.value = champ.value.replace(/\s/g, '');
        if (isNaN(champ.value)) {
            alert(Novius.translate('Le champ xxxchampxxx doit contenir des chiffres.').replace(/xxxchampxxx/, nom_champ));
            try {
                champ.focus();
                champ.select();
            } catch (e) {}
            return false;
        }
        return true;
    }

    /** @brief Verification d'un champ email
     *  @param champ Le champ a verifier
     *  @param longueur Optionnel. La longueur maximum du champ, si 0 illimite (par defaut)
     *  @param pas_vide Optionnel. Booleen indiquant is le champ est obligatoire (false par defaut)
     */
    function TesteEMail(email, longueur, pas_vide) {
        var retour = TesteEMailValeur(email.value, longueur, pas_vide);
        if (retour != "") {
            alert(retour);
            email.focus();
            email.select();
            return(false);
        }
        return true;
    }

    /** @brief Verification d'un email
     *  @param champ L'email a verifier
     *  @param longueur Optionnel. La longueur maximum de l'email, si 0 illimite (par defaut)
     *  @param pas_vide Optionnel. Booleen indiquant is le champ est obligatoire (false par defaut)
     */
    function TesteEMailValeur(email, longueur, pas_vide) {
        if (pas_vide && Trim(email) == '') {
            return Novius.translate('Le champ email doit \u00EAtre rempli.');
        }
        if (email != '') {
            if (longueur && longueur != 0 && email.length > longueur) {
                return Novius.translate('Le champ email doit contenir au maximum xxxlongueurxxx caract\u00E8res.').replace(/xxxlongueurxxx/, longueur);
            } else {
                var reg = /^([a-z0-9\.\-\_\+]+\@([a-z0-9\-]+\.)+[a-z]{2,7})$/i;
                if (!reg.test(email)) {
                    return Novius.translate("V\u00E9rifiez l'adresse email,\nelle ne semble pas valide.");
                }
            }
        }
        return '';
    }


    /** @brief Fonction permettant l'affichage d'un nombre avec trois chiffres apres la virgule
     *  @param Nombre Le nombre a afficher
     */
    function AfficheCoeff(Nombre) {
        var nb = new Number(Nombre);
        if (nb.toFixed) {
            return nb.toFixed(3);
        } else {
            // TODO : Inutile depuis javascript 1.5, a supprimer un jour
            var NombreInt = parseInt(Nombre, 10);
            if (Nombre == NombreInt) {
                Nombre = Nombre + '.000';
            }
            if (((Nombre - NombreInt) > 0) && ((Nombre - NombreInt) < 1)) {
                Nombre = Nombre + '000';
            }
            var decimal3 = String(Nombre).replace(/((\.|,)\d\d\d\d).*$/, '$1');
            decimal3     = String(decimal3).substr(String(decimal3).length, 1);
            Nombre       = String(Nombre).replace(/((\.|,)\d\d\d).*$/, '$1');
            if ((decimal3 >= 5.0) && (decimal3 <= 9.0)) {
                Nombre = Nombre * 1 + 0.001;
            }
            Nombre = String(Nombre) + '0000';
            Nombre = Nombre.replace(/((\.|,)\d)$/, '$1'.concat('0'));
            Nombre = String(Nombre).replace(/((\.|,)\d\d\d).*$/, '$1');
            return Nombre;
        }
    }

    /** @brief Fonction permettant l'affichage d'un nombre avec deux chiffres apres la virgule
     *  @param Nombre Le nombre a afficher
     */
    function AfficheFlottant(Nombre) {
        var nb = new Number(Nombre);
        if (nb.toFixed) {
            return nb.toFixed(2);
        } else {
            // TODO : Inutile depuis javascript 1.5, a supprimer un jour
            var NombreInt = parseInt(Nombre, 10);
            if (Nombre == NombreInt) {
                Nombre = Nombre + '.00';
            }
            if (((Nombre - NombreInt) > 0) && ((Nombre - NombreInt) < 1)) {
                Nombre = Nombre + '0';
            }
            var decimal3 = String(Nombre).replace(/((\.|,)\d\d\d).*$/, '$1');
            decimal3     = String(decimal3).substr(String(decimal3).length - 1);
            Nombre       = String(Nombre).replace(/((\.|,)\d\d).*$/, '$1');
            if ((decimal3 >= 5.0) && (decimal3 <= 9.0)) {
                Nombre = Nombre * 1 + 0.01;
            }
            Nombre = String(Nombre) + '000';
            Nombre = Nombre.replace(/((\.|,)\d)$/, '$1'.concat('0'));
            Nombre = String(Nombre).replace(/((\.|,)\d\d).*$/, '$1');
            return Nombre;
        }
    }

    /** @brief Verification de la validite de champs dates
     *  @param theform Le formulaire contenant les champs
     *  @param prefixe_champ Le prefixe des champs dates
     *  @param pas_vide Optionnel. Booleen indiquant is la date est obligatoire (false par defaut)
     */
    function CheckDate (theform, prefixe_champ, pas_vide) {
        Jour  = getChampValue(eval('theform.' + prefixe_champ + '_jour'));
        Mois  = getChampValue(eval('theform.' + prefixe_champ + '_mois'));
        Annee = getChampValue(eval('theform.' + prefixe_champ + '_annee'));
        if (!pas_vide && (Jour == '' || Jour == '0') && (Mois == '' || Mois == '0') && (Annee == '')) {
            return true;
        }

        if (Jour == '' || Jour == '0' || Mois == '' || Mois == '0' || Annee == '') {
            alert(Novius.translate('La date est incompl\u00E8te.'));
            eval('theform.' + prefixe_champ + '_jour.focus();');
            return false;
        }
        ChkDate = new Date(Annee, Mois - 1, Jour);
        if (ChkDate.getDate() != Jour || ChkDate.getMonth() != (Mois - 1)) {
            alert(Novius.translate("La date n'est pas valide."));
            eval('theform.' + prefixe_champ + '_jour.focus();');
            return false;
        }
        return true;
    }

    /** @brief Verification de la validite d'un champs date
     *  @param LeChampDate Le champ date
     */
    function CheckDate2(LeChampDate) {
        if (LeChampDate.value != '') {
            var LaDate  = LeChampDate.value;
            var NewDate = LaDate.replace(/[\\ \-\.\:\|*\+\/]+/g, '/');
            // Comment faire complique !!!
            var TabVal = NewDate.split('/');
            var Jour   = parseInt(TabVal[0], 10);
            var Mois   = parseInt(TabVal[1], 10);
            var Annee  = parseInt(TabVal[2], 10);
            if (Jour == 0 || Mois == 0) {
                return false;
            }
            if (Annee >= 0 && Annee < 99) {
                Annee += 2000;
            }
            var ChkDate = new Date(Annee, Mois - 1, Jour);
            if (ChkDate.getDate() != Jour || ChkDate.getMonth() != (Mois - 1)) {
                alert(Novius.translate("La date n'est pas valide."));
                LeChampDate.focus();
                return false;
            }

            // Vivement l'an 2000
            var Annee = ChkDate.getFullYear();

            if ((Annee >= 0) && (Annee <= 99)) {
                Annee += 1900;
            }
            LeChampDate.value = (Jour < 10 ? '0' + Jour : Jour) + '/' + (Mois < 10 ? '0' + Mois : Mois) + '/' + Annee;
        }
        return true;
    }

    /** @brief Verification d'un champ fichier
     *  @param champ Le champ fichier
     *  @param nom_champ Le nom du champ
     *  @param pas_vide Optionnel. Booleen indiquant is le champ est obligatoire (false par defaut)
     *  @param extension_requises Optionnel. Listes des extensions autorisees separees par un caractere (/ ou | ou ; par exemple)
     */
    function TesteFichier(champ, nom_champ, pas_vide, extension_requises) {
        nom_champ = nom_champ ? "'" + nom_champ + "'" : '';
        if (!TesteChaine(champ, nom_champ, 0, pas_vide)) {
            return false;
        }
        if (extension_requises != '' && Trim(champ.value) != '') {
            var found = champ.value.match(/.+\.(\w{3,4})$/gi);
            var reg   = new RegExp(RegExp.$1, 'gi');
            if (extension_requises.search(reg) == -1) {
                alert(Novius.translate("Le fichier xxxchampxxx n'a pas une extension autoris\u00E9e.\nAutoris\u00E9es : xxxextension_requisesxxx").replace(/xxxchampxxx/, nom_champ).replace(/xxxextension_requisesxxx/, extension_requises));
                return false;
            }
        }
        return true;
    }

    /** @brief Verification de l extension d'un champ fichier (obligatoire et extension)
     *  @param champ Le champ fichier
     *  @param extension_requises Listes des extensions autorisees separees par un caractere (/ ou | ou ; par exemple)
     */
    function TesteFichierExtension(champ, extension_requises) {
        if (extension_requises != '') {
            var found = champ.value.match(/.+\.(\w{2,4})$/gi);
            var reg   = new RegExp(RegExp.$1, 'gi');
            if (extension_requises.search(reg) == -1) {
                alert(Novius.translate("Le fichier s\u00E9lectionn\u00E9 n'a pas une extension autoris\u00E9e.\nAutoris\u00E9es : xxxextension_requisesxxx").replace(/xxxextension_requisesxxx/, extension_requises));
                return false;
            }
        }
        return true;
    }


    /** @brief Recupere la valeur d'un champ quelquesoit sont type
     *  @param champ Le champ
     */
    function getChampValue(champ) {
        if (!champ) {
            return false;
        }
        if (champ.length) {
            if (champ.type && champ.type == 'select-one') {
                if (champ.selectedIndex >= 0) {
                    return champ[champ.selectedIndex].value;
                } else {
                    return '';
                }
            }
            for (var i = 0; i < champ.length; i++) {
                if ((champ[i].type == 'checkbox' || champ[i].type == 'radio') && champ[i].checked) {
                    return champ[i].value;
                }
                else if (champ.type == 'select-multiple' && champ[i].selected) {
                    return champ[i].value;
                }
                else if (getChampValue(champ[i]) != '') {
                    return getChampValue(champ[i]);
                }
            }
        } else {
            if (champ.type == 'text' || champ.type == 'password' || champ.type == 'file' || champ.type == 'textarea' || champ.type == 'hidden') {
                return Trim(champ.value);
            }
            else if ((champ.type == 'checkbox' || champ.type == 'radio') && champ.checked) {
                return champ.value;
            }
        }
        return '';
    }

    /** @brief Test que la valeur d'un champ soit egale a une valeur donnee, ou que cette valeur soit selectionnee dans le cas des choix multiple
     *  @param champ Le champ
     *  @param valeur La valeur
     */
    function testChampValue(champ, valeur) {
        if (!champ) {
            return false;
        }
        if (champ.length) {
            if (champ.type && champ.type == 'select-one') {
                return champ[champ.selectedIndex].value == valeur;
            }
            for (var i = 0; i < champ.length; i++) {
                if ((champ[i].type == 'checkbox' || champ[i].type == 'radio') && champ[i].checked && champ[i].value == valeur) {
                    return true;
                }
                else if ((champ[i].type == 'select-one' || champ[i].type == 'selectmultiple') && champ[i].selected && champ[i].value == valeur) {
                    return true;
                }
            }
        } else {
            if (champ.type == 'text' || champ.type == 'hidden') {
                return champ.value == valeur;
            }
            else if ((champ.type == 'checkbox' || champ.type == 'radio') && champ.checked) {
                return champ.value == valeur;
            }
        }
        return false;
    }

    /** @brief Affiche un mailto
     *  @param avant Le nom de l'email
     *  @param apres Le domaine de l'email
     *  @param texte Le texte du lien
     *  @param classe La class du lien
     */
    function writeMailto(avant, apres, texte, classe) {
        texte = texte || avant + '@' + apres;
        document.write('<a href="mailto:' + avant + '@' + apres + '"' + (classe ? 'class="' + classe + '"' : '') + '>' + texte + '</a>');
    }

    /** @brief Affiche des informations lisibles pour une variable js
     *  @param obj L'objet javascript
     *  @param fin_ligne Le texte/caractere de fin de ligne
     */
    function print_r(obj, fin_ligne) {
        fin_ligne  = fin_ligne || "<br>\n";
        var result = "";
        if (typeof(obj) == 'string') {
            return obj;
        }
        for (var i in obj) {
            result += i + " = " + obj[i] + fin_ligne;
        }
        return result;
    }

    /** @brief Fonction de controle de double champ select multiple
     *  Ajoute un choix
     *  @param champ Le nom du champ
     *  @param theform Optionnel. Le formulaire contenant le champ
     */
    function AjouterSelectMultiple(champ, theform) {
        theform  = theform || document.TheForm;
        var tab1 = theform.elements[champ + '_ini[]'];
        var tab2 = theform.elements[champ + '[]'];
        for (count = 0; count < tab1.options.length; count++) {
            if (tab1.options[count].selected) {
                var nomoption       = new Option(tab1.options[count].text, tab1.options[count].value, 0, 0);
                tab1.options[count] = null;
                count--;
                if (tab2.options[0].value == -1) {
                    tab2.options[0] = nomoption;
                } else {
                    var taille = tab2.length;
                    tab2.options[taille] = nomoption;
                }
            }
        }
    }

    /** @brief Fonction de controle de double champ select multiple
     *  Supprime un choix
     *  @param champ Le nom du champ
     *  @param theform Optionnel. Le formulaire contenant le champ
     *  @param lib_passel Optionnel. Le libellé à afficher si aucune sélection
     */
    function SupprimerSelectMultiple(champ, theform, lib_passel) {
        lib_passel     = lib_passel || "--- " + Novius.translate('Pas de s\u00E9lection') + " ---";
        theform        = theform || document.TheForm;
        var tab1       = theform.elements[champ + '_ini[]'];
        var tab2       = theform.elements[champ + '[]'];
        for (count = 0; count < tab2.options.length; count++) {
            if (tab2.options[count].selected) {
                if (tab2.options.length == 1) {
                    tab1.options[tab1.length] = new Option(tab2.options[0].text, tab2.options[0].value, 0, 0);
                    tab2.options[0] = new Option(lib_passel, "-1", false, false);
                } else {
                    tab1.options[tab1.length] = new Option(tab2.options[count].text, tab2.options[count].value, 0, 0);
                    tab2.options[count]       = null;
                    count--;
                }
            }
        }
    }

    /** @brief Fonction de controle de double champ select multiple
     *  Ajout ou enleve tous les choix
     *  @param champ Le nom du champ
     *  @param remplir Booleen indiquant s'il faut remplir ou vider le champ
     *  @param theform Optionnel. Le formulaire contenant le champ
     *  @param lib_passel Optionnel. Le libellé à afficher si aucune sélection
     */
    function AjouterTousSelectMultiple(champ, remplir, theform, lib_passel) {
        if (arguments.length < 2) {
            remplir = true;
        }
        theform    = theform || document.TheForm;
        lib_passel = lib_passel || "--- " + Novius.translate('Pas de s\u00E9lection') + " ---";
        if (remplir) {
            var tab1 = theform.elements[champ + '_ini[]'];
            var tab2 = theform.elements[champ + '[]'];
        } else {
            var tab2 = theform.elements[champ + '_ini[]'];
            var tab1 = theform.elements[champ + '[]'];
        }
        for (count = 0; count < tab1.options.length; count++) {
            if (tab1.options[0].value == -1) {
                continue;
            }
            var nomoption       = new Option(tab1.options[count].text, tab1.options[count].value, 0, 0);
            tab1.options[count] = null;
            count--;
            if (tab2.options[0] && tab2.options[0].value == -1) {
                tab2.options[0] = nomoption;
            } else {
                var taille = tab2.length;
                tab2.options[taille] = nomoption;
            }
        }
        if (!remplir) {
            tab1.options[0] = new Option(lib_passel, "-1", false, false);
        }
    }

    /** @brief Fonction de controle de double champ select multiple
     *  Monte un choix
     *  @param champ Le nom du champ
     *  @param theform Optionnel. Le formulaire contenant le champ
     */
    function MonterSelectMultiple(champ, theform) {
        theform = theform || document.TheForm;
        var tab = theform.elements[champ + '[]'];
        for (count = 0; count < tab.options.length; count++) {
            if (tab.options[count].selected) {
                if (count > 0) {
                    var tmp_text = tab.options[count - 1].text;
                    var tmp_value = tab.options[count - 1].value;
                    tab.options[count - 1].text     = tab.options[count].text;
                    tab.options[count - 1].value    = tab.options[count].value;
                    tab.options[count].text         = tmp_text;
                    tab.options[count].value        = tmp_value;
                    tab.options[count - 1].selected = true;
                    tab.options[count].selected     = false;
                } else {
                    return;
                }
            }
        }
    }

    /** @brief Fonction de controle de double champ select multiple
     *  Descend un choix
     *  @param champ Le nom du champ
     *  @param theform Optionnel. Le formulaire contenant le champ
     */
    function DescendreSelectMultiple(champ, theform) {
        theform = theform || document.TheForm;
        var tab = theform.elements[champ + '[]'];
        for (count = tab.options.length - 1; count >= 0; count--) {
            if (tab.options[count].selected) {
                if (count < tab.options.length - 1) {
                    var tmp_text = tab.options[count + 1].text;
                    var tmp_value = tab.options[count + 1].value;
                    tab.options[count + 1].text     = tab.options[count].text;
                    tab.options[count + 1].value    = tab.options[count].value;
                    tab.options[count].text         = tmp_text;
                    tab.options[count].value        = tmp_value;
                    tab.options[count + 1].selected = true;
                    tab.options[count].selected     = false;
                } else {
                    return;
                }
            }
        }
    }
}

