/* ************************
 *
 * Validation helpers
 * utilisés dans DataFoem.validate()
 *
 * ************************ */

/* Vérifie le format d'une adresse email */
function format_email(email) {
    var re = /[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 (re.exec(email) != null)
}

/* Vérifie le format d'un numéro de SIRET
 * piqué sur http://www.javascriptfr.com/codes/VERIFICATION-VALIDITE-CODES-SIRET-SIREN-ALGO-LUHN_16330.aspx
 */
function format_siret(siret) {
    if (/[0-9]{14}/.exec(siret) == null) 
        return false
    // Donc le SIRET est un numérique à 14 chiffres
    // Les 9 premiers chiffres sont ceux du SIREN (ou RCS), les 4 suivants
    // correspondent au numéro d'établissement
    // et enfin le dernier chiffre est une clef de LUHN. 
    var somme = 0
    var tmp
    for (var i = 0; i < siret.length; i++) {
        if ((i % 2) == 0) {                // Les positions impaires : 1er, 3è, 5è, etc...
            tmp = siret.charAt(i) * 2    // On le multiplie par 2
            if (tmp > 9)
                tmp -= 9                // Si le résultat est supérieur à 9, on lui soustrait 9
        } else
            tmp = siret.charAt(i)
        somme += parseInt(tmp)
    }
    return ((somme % 10) == 0)            // Si la somme est un multiple de 10 alors le SIRET est valide
}

/* Vérifie le format d'un numéro de SIREN
 * piqué sur http://www.javascriptfr.com/codes/VERIFICATION-VALIDITE-CODES-SIRET-SIREN-ALGO-LUHN_16330.aspx
 */
function format_siren(siren) {
    if (/[0-9]{9}/.exec(siren) == null) 
        return false
    // Donc le SIREN est un numérique à 9 chiffres
    var somme = 0
    var tmp
    for (var i = 0; i < siren.length; i++) {
        if ((i % 2) == 1) {                // Les positions paires : 2ème, 4ème, 6ème et 8ème chiffre
            tmp = siren.charAt(i) * 2    // On le multiplie par 2
            if (tmp > 9)
                tmp -= 9                // Si le résultat est supérieur à 9, on lui soustrait 9
        } else
            tmp = siren.charAt(i)
        somme += parseInt(tmp)
    }
    return ((somme % 10) == 0)            // Si la somme est un multiple de 10 alors le SIREN est valide
}

/* **************************************************************
 * DataForm
 *
 * Classe contenant les infos de validation des champs de la page
 * "validation des données de l'entreprise" (index_html)
 *
 * ************************************************************** */
netservices.DataForm = function(params) {
    var D = this

    /* mapping de l'état des champs */
    D.field_list = new Array()
    D.bound = new Array()

    /* (ré)active et dégrise tous les submits de la page */
    D.enable_submits = function() {
        $('input').filter('[type=submit]').css('background-color','').removeAttr('disabled')
    }

    /* désactive (disabled) et grise tous les submits de la page */
    D.disable_submits = function() {
        $('input').filter('[type=submit]').css('background-color','gray').attr('disabled','disabled')
    }

    /* Retourne l'état global de la validation, peut-on continuer ou pas ? */
    D.get_validation_state = function() {
        for (var key in D.field_list) {
            if (!D.field_list[key]) return false
        }
        return true
    }

    /* active/désactive les submits */
    D.toggle_submits = function() {
        s = D.get_validation_state()
        // if (console) console.log('validation state is', s)
        if (s) {
            D.enable_submits()
        } else {
            D.disable_submits()
        }
    }

    /* ************************************************
     *
     * Validation des données sur index_html
     * field : l'objet input
     * mandatory : (bool) le champ est-il obligatoire ?
     *
     * ************************************************ */
    D.validate = function(field, mandatory) {
        // if (console) console.log('starting validation of', field.id)
        var input = document.getElementById(field.id)
        var msgid = field.id+'_valid'

        // cache le message d'erreur pendant le traitement
        $('#'+msgid).fadeOut('fast')

        var ok = true
        var ok_msg = ''
        var nok_msg = 'Valeur incorrecte'

        // Champs requis
        if (mandatory && field.value == '') {
            nok_msg = 'Requis'
            ok = false
        }

        // Validation propre à chaque champ (repéré par son id)
        switch (field.id) {
            case 'code_postal' :                // Validation des données de l'entreprise
                if (!ok) break
                var re = /[0-9]{4,5}/
                ok = (re.exec(field.value) != null)
                break
            case 'telephone' :
            case 'telecopie' :
                if (!ok) break
                nok_msg = 'Format : 10 chiffres'
                var re = /[^0-9]/g
                field.value = field.value.replace(re, '')
                ok = (/[0-9]{10}/.exec(field.value) != null)
                break
            case 'code_convention' :            // Validation des données de l'entreprise
                if (!ok) break
                // if (!field.value) break      // Code vide autorisé (#101)
                ok_msg = $.ajax({
                    url: '/get_convention',
                    data: ({ 'idcc' : field.value || 9999 }),
                    async: false
                    }).responseText
                ok = (ok_msg != '')
                break
            case 'code_naf2' :                  // Validation des données de l'entreprise
                if (!ok) break
                ok = ($.ajax({
                    url: '/get_naf_court',
                    data: ({ 'id_naf' : field.value }),
                    async: false
                    }).responseText != '')
                if (ok) field.value = field.value.toUpperCase()
                // var re = /[0-9a-zA-Z]{5}/
                // ok = (re.exec(field.value) != null)
                break
            case 'email_responsable' :         // Validation des données de l'entreprise
                if (!ok) break
                ok = format_email(field.value)
                break
            case 'email_comptable' :
            case 'mail_resp' :                  // Demande d'identifiant
                if (!ok) break
                ok = (!mandatory && field.value == '') || format_email(field.value)
                break
            case 'activite' :                  // Validation des données de l'entreprise
                if (!ok) break
                nok_msg = 'Requis'
                ok = (field.value != '0') 
                break
            case 'nb_salarie' :                // Validation des données de l'entreprise
                if (!ok) break
                var re = /^[0-9]+$/
                ok = (Number(field.value) > 0)
                ok = ok && (re.exec(field.value) != null)
                break
            case 'seuil_10' :                  // Validation des données de l'entreprise
                nb_salarie = document.getElementById('nb_salarie')
                if (!D.validate(nb_salarie)) {
                    nok_msg = 'Nombre de salari&eacute;s incorrect'
                    ok = false
                    break
                }
                if (Number(nb_salarie.value) > 9) {
                    var re = /[0-9]{4}/
                    ok = (re.exec(field.value) != null)
                    break
                }
                break
            case 'seuil_20' :                  // Validation des données de l'entreprise
                nb_salarie = document.getElementById('nb_salarie')
                if (!D.validate(nb_salarie,false)) {
                    nok_msg = 'Nombre de salari&eacute;s incorrect'
                    ok = false
                    break
                }
                if (Number(nb_salarie.value) > 19) {
                    var re = /[0-9]{4}/
                    ok = (re.exec(field.value) != null)
                    if (ok) {
                        seuil_10 = document.getElementById('seuil_10')
                        if (!D.validate(seuil_10,false)) {
                            nok_msg = 'Seuil de franchissement de 10 salari&eacute;s incorrect'
                            ok = false
                            break
                        }
                        nok_msg = 'Le seuil de franchissement de 20 salari&eacute;s doit &ecirc;tre sup&eacute;rieur ou &eacute;gal au seuil de franchissement de 10 salari&eacute;s'
                        ok = (Number(field.value) >= Number(seuil_10.value))
                        break
                    }
                }
                break
            case 'dep' :                       // Demande d'identifiant
                if (!ok) break
                var re = /[0-9]{2}[0-9]?/
                ok = (re.exec(field.value) != null)
                break
            case 'siret' :                     // Validation des données de l'entreprise
            case 'siretid' :                   // Demande d'identifiant
                if (!ok) break
                nok_msg = 'Numéro de SIRET ou de SIREN invalide'
                ok = format_siren(field.value) || format_siret(field.value)
                break
        }

        if (ok) {
            // ajustement du CSS
            $('#'+input.id).removeClass('ok').removeClass('nok').addClass('ok')
            // remplissage et affichage du message OK
            $('#'+msgid).html('<b class="ok"><img src="ok.png" alt="OK" title="OK"/> '+ok_msg+'</b>').fadeIn('slow')
        } else {
            // ajustement du CSS
            $('#'+input.id).removeClass('ok').removeClass('nok').addClass('nok')
            // remplissage et affichage du message d'erreur
            $('#'+msgid).html('<b class="nok">'+nok_msg+'</b>').fadeIn('slow')
        }

        // On rebinde cette fonction de validation sur l'input
        // en gardant la trace des champs qu'on a déjà bindés.
        // En effet, sous firefox binder la fonction ne coûte pas cher
        // mais sous IE la chanson n'est pas la même. On s'assure donc
        // qu'on ne fait cette opération qu'une seule fois par champ.
        if (D.bound[input.id] === undefined || !D.bound[input.id]) {
            $('#'+input.id).change(function() { D.validate(this, mandatory) })
            D.bound[input.id] = true
        }

        // et je mets à jour le mapping de l'état des champs
        D.field_list[input.id] = ok
        D.toggle_submits()
        return ok
    }
}

///* (ré)active et dégrise tous les submits de la page */
//function enable_submits() {
//    $('input').filter('[type=submit]').css('background-color','').removeAttr('disabled')
//}
//
///* désactive (disabled) et grise tous les submits de la page */
//function disable_submits() {
//    $('input').filter('[type=submit]').css('background-color','gray').attr('disabled','disabled')
//}
///* ************************************************
// *
// * Validation des données sur index_html
// * field : l'objet input
// * mandatory : (bool) le champ est-il obligatoire ?
// *
// * ************************************************ */
//function validate(field, mandatory) {
//
//    var input = document.getElementById(field.id)
//    var msgid = field.id+'_valid'
//
//    // cache le message d'erreur pendant le traitement
//    $('#'+msgid).fadeOut('fast')
//
//    var ok = true
//    var ok_msg = ''
//    var nok_msg = 'Valeur incorrecte'
//
//    // Champs requis
//    if (mandatory && field.value == '') {
//        nok_msg = 'Requis'
//        ok = false
//    }
//
//    // Validation propre à chaque champ (repéré par son id)
//    switch (field.id) {
//        case 'code_postal' :                // Validation des données de l'entreprise
//            if (!ok) break
//            var re = /[0-9]{4,5}/
//            ok = (re.exec(field.value) != null)
//            break
//        case 'telephone' :
//        case 'telecopie' :
//            if (!ok) break
//            nok_msg = 'Format : 10 chiffres'
//            var re = /[^0-9]/g
//            field.value = field.value.replace(re, '')
//            ok = (/[0-9]{10}/.exec(field.value) != null)
//            break
//        case 'code_convention' :            // Validation des données de l'entreprise
//            if (!ok) break
//            // if (!field.value) break      // Code vide autorisé (#101)
//            ok_msg = $.ajax({
//                url: '/get_convention',
//                data: ({ 'idcc' : field.value || 9999 }),
//                async: false
//                }).responseText
//            ok = (ok_msg != '')
//            break
//        case 'code_naf2' :                  // Validation des données de l'entreprise
//            if (!ok) break
//            ok = ($.ajax({
//                url: '/get_naf_court',
//                data: ({ 'id_naf' : field.value }),
//                async: false
//                }).responseText != '')
//            if (ok) field.value = field.value.toUpperCase()
//            // var re = /[0-9a-zA-Z]{5}/
//            // ok = (re.exec(field.value) != null)
//            break
//        case 'email_responsable' :         // Validation des données de l'entreprise
//            if (!ok) break
//            ok = format_email(field.value)
//            break
//        case 'email_comptable' :
//        case 'mail_resp' :                  // Demande d'identifiant
//            if (!ok) break
//            ok = (!mandatory && field.value == '') || format_email(field.value)
//            break
//        case 'activite' :                  // Validation des données de l'entreprise
//            if (!ok) break
//            nok_msg = 'Requis'
//            ok = (field.value != '0') 
//            break
//        case 'nb_salarie' :                // Validation des données de l'entreprise
//            if (!ok) break
//            var re = /^[0-9]+$/
//            ok = (Number(field.value) > 0)
//            ok = ok && (re.exec(field.value) != null)
//            break
//        case 'seuil_10' :                  // Validation des données de l'entreprise
//            nb_salarie = document.getElementById('nb_salarie')
//            if (!validate(nb_salarie)) {
//                nok_msg = 'Nombre de salari&eacute;s incorrect'
//                ok = false
//                break
//            }
//            if (Number(nb_salarie.value) > 9) {
//                var re = /[0-9]{4}/
//                ok = (re.exec(field.value) != null)
//                break
//            }
//            break
//        case 'seuil_20' :                  // Validation des données de l'entreprise
//            nb_salarie = document.getElementById('nb_salarie')
//            if (!validate(nb_salarie,false)) {
//                nok_msg = 'Nombre de salari&eacute;s incorrect'
//                ok = false
//                break
//            }
//            if (Number(nb_salarie.value) > 19) {
//                var re = /[0-9]{4}/
//                ok = (re.exec(field.value) != null)
//                if (ok) {
//                    seuil_10 = document.getElementById('seuil_10')
//                    if (!validate(seuil_10,false)) {
//                        nok_msg = 'Seuil de franchissement de 10 salari&eacute;s incorrect'
//                        ok = false
//                        break
//                    }
//                    nok_msg = 'Le seuil de franchissement de 20 salari&eacute;s doit &ecirc;tre sup&eacute;rieur ou &eacute;gal au seuil de franchissement de 10 salari&eacute;s'
//                    ok = (Number(field.value) >= Number(seuil_10.value))
//                    break
//                }
//            }
//            break
//        case 'dep' :                       // Demande d'identifiant
//            if (!ok) break
//            var re = /[0-9]{2}[0-9]?/
//            ok = (re.exec(field.value) != null)
//            break
//        case 'siret' :                     // Validation des données de l'entreprise
//        case 'siretid' :                   // Demande d'identifiant
//            if (!ok) break
//            nok_msg = 'Numéro de SIRET ou de SIREN invalide'
//            ok = format_siren(field.value) || format_siret(field.value)
//            break
//    }
//
//    if (ok) {
//        // ajustement du CSS
//        $('#'+input.id).removeClass('ok').removeClass('nok').addClass('ok')
//        // remplissage et affichage du message OK
//        $('#'+msgid).html('<b class="ok"><img src="ok.png" alt="OK" title="OK"/> '+ok_msg+'</b>').fadeIn('slow')
//        // dégrisage des submits
//        enable_submits()
//    } else {
//        // ajustement du CSS
//        $('#'+input.id).removeClass('ok').removeClass('nok').addClass('nok')
//        // remplissage et affichage du message d'erreur
//        $('#'+msgid).html('<b class="nok">'+nok_msg+'</b>').fadeIn('slow')
//        // grisage des submits
//        disable_submits()
//    }
//
//    return ok
//}
