/*------------------------------------------------------------------------------ Validation d'un formulaire form_config : json array [{ "input_id" : "input_id", "label" : "input label", "mandatory" : boolean, "data_type" : "type_of_data", "nb_char" : integer (Nb max de caractères) "max_dec" : integer (Nb max de chiffres après le point décimal) "min" : real (valeur minimum) "greater_than" : real (plus grand que) }] ------------------------------------------------------------------------------*/ function form_validation(form_config){ var value; var pass_confirm; var obj; var err_msg; var is_valid=true; var class_name=''; //Masquer les messages d'erreurs existants document.getElementById('std_error_msg').style.display = 'none'; for(var i = 0; i < form_config.length; i++) { obj = form_config[i]; if(document.getElementById(obj.input_id+'_error')){ document.getElementById(obj.input_id+'_error').style.display='none'; if(obj.data_type=='file'){ }else if(obj.data_type=='date_multi'){ class_name = document.getElementById(obj.input_id+'_day').className; class_name = class_name.replace('error', ''); document.getElementById(obj.input_id+'_day').className = class_name; class_name = document.getElementById(obj.input_id+'_month').className; class_name = class_name.replace('error', ''); document.getElementById(obj.input_id+'_month').className = class_name; class_name = document.getElementById(obj.input_id+'_year').className; class_name = class_name.replace('error', ''); document.getElementById(obj.input_id+'_year').className = class_name; }else{ class_name = document.getElementById(obj.input_id).className; class_name = class_name.replace('error', ''); document.getElementById(obj.input_id).className = class_name; } } } for(var i = 0; i < form_config.length; i++) { err_msg = ''; value = ''; obj = form_config[i]; if(obj.nb_char==undefined){ obj.nb_char=0; } if(obj.max_dec==undefined){ obj.max_dec=0; } if(document.getElementById(obj.input_id) || obj.data_type=='date_multi' || obj.data_type=='file'){ if(obj.data_type=='date_multi'){ value = document.getElementById(obj.input_id+'_year').value+'-'+document.getElementById(obj.input_id+'_month').value+'-'+document.getElementById(obj.input_id+'_day').value; //Valider si donnée obligatoire if(obj.mandatory){ if(document.getElementById(obj.input_id+'_year').value=='' || document.getElementById(obj.input_id+'_month').value=='' || document.getElementById(obj.input_id+'_day').value==''){ err_msg = obj.label+' obligatoire.'; } } }else{ if(obj.data_type=='file'){ value = document.getElementById(obj.input_id+'_text').value; }else{ value = document.getElementById(obj.input_id).value; } //Valider si donnée obligatoire if(obj.mandatory && value==''){ err_msg = obj.label+' obligatoire.'; } } //Valider le type de donnée if(err_msg==''){ err_msg = data_validation(value, obj.data_type, obj.nb_char, obj.max_dec, ''); } //Valider la confirmation de mot de passe if(obj.data_type=='password' && err_msg==''){ pass_confirm = document.getElementById(obj.input_id+'_1').value; if(value != pass_confirm){ err_msg = 'Le mot de passe et la confirmation sont différents.'; } } //Valider la valeur minimum if(obj.min!=undefined && err_msg==''){ if(value < obj.min){ err_msg = 'La valeur doit être plus grande ou égale à '+obj.min; } } if(obj.greater_than!=undefined && err_msg==''){ if(value <= obj.greater_than){ err_msg = 'La valeur doit être plus grande que '+obj.greater_than; } } if(err_msg!=''){ show_input_error(obj.input_id, err_msg, obj.data_type); is_valid=false; } } //Formattage automatique /* if(is_valid && value!=''){ switch(obj.data_type){ case 'phone': value = value.replace(/[^0-9]/g,''); document.getElementById(obj.input_id).value = value.substring(0,2)+' '+value.substring(2,4)+' '+value.substring(4,6)+' '+value.substring(6,8)+' '+value.substring(8,10); break; } } */ } if(!is_valid){ show_std_error_msg('Veuillez corriger les erreurs suivantes.'); } return(is_valid); } /*------------------------------------------------------------------------------ Validation d'une donnée value : valeur à valider data_type : type de donnée nb_char : Nb max de caractères (mettre 0 si ne doit pas être validé) max_dec : Nb max de chiffres après le point décimal (mettre 0 si ne doit pas être validé) S'applique uniquement pour les nombres décimaux format : Format spécifique à respecter Dates : yyyy-mm-dd (default), dd-mm-yyyy ------------------------------------------------------------------------------*/ function data_validation(test_value, data_type, nb_char, max_dec, format){ var err_msg=''; var format_err_msg=''; var re_test; //Valide si le champs est vides if (test_value!=''){ //Validation en fonction du type de données switch (data_type){ //Mot de passe case "password": re_test = /(?=.*\d)(?=.*[a-zA-Z]).{8,}/ is_valid=re_test.test(test_value); if(!is_valid){ format_err_msg='Le mot de passe doit avoir un minimum de 8 caractères et contenir au moins une lettre et un chiffre.'; } break; //Texte seulement case 'alpha': //Vérifie la longueur de la string if ((nb_char==0) || (test_value.length<=nb_char)){ //Vérifie le format re_test = /^([a-zA-Z]*)$/ is_valid = re_test.test(test_value); }else{ is_valid = false; } if(!is_valid){ format_err_msg='Caractères numériques seulement'; if(nb_char!=0){ format_err_msg+=' (Maximum de caractères : '+nb_char+')'; } } break; //Texte et chiffres case 'alphanum': //Vérifie la longueur de la string if ((nb_char==0) || (test_value.length<=nb_char)){ //Vérifie le format re_test = /^(\w*)$/ is_valid = re_test.test(test_value); }else{ is_valid = false; } if(!is_valid){ format_err_msg='Caractères alpha-numériques seulement'; if(nb_char!=0){ format_err_msg+=' (Maximum de caractères : '+nb_char+')'; } } break; //Entier positif case 'unsigned': //Vérifie la longueur de la string if ((nb_char==0) || (test_value.length<=nb_char)){ //Vérifie le format re_test = /^(\d*)$/ is_valid = re_test.test(test_value); }else{ is_valid = false; } if(!is_valid){ format_err_msg='Nombre entier positif seulement'; if(nb_char!=0){ format_err_msg+=' (Maximum de caractères : '+nb_char+')'; } } break; //Entier case 'integer': //Vérifie la longueur de la string if ((nb_char==0) || (test_value.length<=nb_char)){ //Vérifie le format re_test = /^[\+\-]?\d*$/ is_valid = re_test.test(test_value); }else{ is_valid = false; } if(!is_valid){ format_err_msg='Nombre entier seulement'; if(nb_char!=0){ format_err_msg+=' (Maximum de caractères : '+nb_char+')'; } } break; //Réel case 'real': //Vérifie la longueur de la string if ((nb_char==0) || (test_value.length<=nb_char)){ //Vérifie le format avec le nombre max de décimales si applicable if (max_dec > 0){ re_test = new RegExp('^[\\+\\-]?\\d*\\.?\\d{0,' + max_dec + '}$',''); }else{ re_test = /^[\+\-]?\d*\.?\d*$/ } is_valid = re_test.test(test_value); }else{ is_valid = false; } if(!is_valid){ format_err_msg='Nombre seulement'; if(nb_char>0 && max_dec>0){ format_err_msg+=' (Nombre seulement : '+nb_char+', Maximum de décimales : '+max_dec+')'; }else if(nb_char>0){ format_err_msg+=' (Maximum de caractères : '+nb_char+')'; }else if(max_dec>0){ format_err_msg+=' (Maximum de décimales : '+max_dec+')'; } } break; //date case "date_multi": case 'date': switch(format){ case 'dd-mm-yyyy': //Vérifie le format de date re_test = /^(\d{1,2})\-(\d{1,2})\-(\d{4})$/ is_valid = re_test.test(test_value); //Vérifie le nombre de jour et le nombre de mois if (is_valid){ if (RegExp.$1 > 31 || RegExp.$2 > 12){is_valid=false;} } //Vérifie si date valide var dt_test = new Date(RegExp.$3, Number(RegExp.$2-1), RegExp.$1); if (dt_test.getMonth() != Number(RegExp.$2-1)){is_valid=false;} if(!is_valid){ format_err_msg='Date (jj-mm-aaaa)'; } break; default: //Vérifie le format de date re_test = /^(\d{0,4})\-(\d{0,2})\-(\d{0,2})$/ is_valid = re_test.test(test_value); //Vérifie le nombre de jour et le nombre de mois if (is_valid){ if (RegExp.$3 > 31 || RegExp.$2 > 12){ is_valid=false; format_err_msg='Date (aaaa-mm-jj)'; } } //Vérifie si date valide var dt_test = new Date(RegExp.$1, Number(RegExp.$2-1), RegExp.$3); if (dt_test.getMonth() != Number(RegExp.$2-1)){ is_valid=false; format_err_msg='Date non valide'; } break; } break; //Temps case 'time': //Vérifie de format de temps re_test = /^(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/ is_valid = re_test.test(test_value); //Vérifie les heures, minutes, secondes if (is_valid){ if (RegExp.$1 > 24 || RegExp.$2 > 59 || RegExp.$3 > 59){is_valid=false;} } if(!is_valid){ format_err_msg='Temps (hh:mm:ss)'; } break; case 'time_hm': //Vérifie de format de temps re_test = /^(\d{1,2})\:(\d{1,2})$/ is_valid = re_test.test(test_value); //Vérifie les heures, minutes, secondes if (is_valid){ if (RegExp.$1 > 24 || RegExp.$2 > 59){is_valid=false;} } //Si pas valide, valider sans les : if (!is_valid){ re_test = /^(\d{0,4})$/ is_valid = re_test.test(test_value); var heures=0; var minutes=0; if(test_value.length>2){ heures = parseInt(test_value.substring(0,(test_value.length-2))); minutes = parseInt(test_value.substring((test_value.length-2),test_value.length)); }else{ minutes=test_value; } if (is_valid){ if (heures > 23 ||minutes > 59){is_valid=false;} } if (is_valid){ im_ctrl.value = heures+':'+minutes; } } //Format le temps if(!is_valid){ format_err_msg='Heure (hh:mm)'; } break; case 'time_ms': //Vérifie de format de temps re_test = /^(\d{1,2})\:(\d{1,2})$/ is_valid = re_test.test(test_value); //Vérifie les heures, minutes, secondes if (is_valid){ if (RegExp.$1 > 59 || RegExp.$2 > 59){is_valid=false;} } //Si pas valide, valider sans les : if (!is_valid){ re_test = /^(\d{0,4})$/ is_valid = re_test.test(test_value); var minutes=0; var secondes=0; if(test_value.length>2){ minutes = parseInt(test_value.substring(0,(test_value.length-2))); secondes = parseInt(test_value.substring((test_value.length-2),test_value.length)); }else{ secondes=test_value; } if (is_valid){ if (minutes > 59 ||secondes > 59){is_valid=false;} } if (is_valid){ im_ctrl.value = minutes+':'+secondes; } } if(!is_valid){ format_err_msg='Temps (mm:ss)'; } break; case 'email': re_test = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/ is_valid = re_test.test(test_value); if(!is_valid){ format_err_msg='Courriel'; } break; case 'phone': //re_test = /^0[1-9]([-. ]?[0-9]{2}){4}$/ //re_test = /^(\(?\+?[0-9]*\)?)?[0-9_\- \(\)]*$/ re_test = /^([0-9-. ()+]*)$/ is_valid = re_test.test(test_value); if(!is_valid){ format_err_msg='Numéro de téléphone valide'; } break; case 'zip': //re_test = /^[0-9]{5}$/ re_test = /^([A-Za-z0-9- ]*)$/ is_valid = re_test.test(test_value); if(!is_valid){ format_err_msg='Code postal valide'; } break; //Tous les autres types (tous les caractères) default: //Vérifie la longueur de la string if ((nb_char==0) || (test_value.length<=nb_char)){ is_valid = true; }else{ is_valid = false; } if(!is_valid){ format_err_msg+=' (Maximum de caractères : '+nb_char+')'; } break; } } if(format_err_msg!=''){ err_msg = 'Veuillez respecter le format suivant : '+format_err_msg; } return(err_msg); }