/*------------------------------------------------------------------------------
Masque de saisie
À appeler sur OnKeyPress
Paramêtres : 
  event (pour Mozilla)
  Le contrôle à valider
  Le type de données du contrôle
  Le nombre de caractères maximum (mettre 0 ou '' si non-applicable)
  Le nombre de décimales maximum (mettre 0 ou '' si non-applicable)
La fonction annule le KeyPress si l'entrée ne correspond pas au format
------------------------------------------------------------------------------*/
function js_std_input_mask(evt, im_ctrl, data_type, nb_char, decimal){
  var is_valid;
  var re_test;    
  var date_format = "yyyy-mm-dd";
  //var date_format = "dd-mm-yyyy";
  /*var key = (evt.charCode) ? evt.charCode : ((evt.keyCode) ? evt.keyCode : 
        ((evt.which) ? evt.which : 0));*/
  var key = ((evt.charCode) || (evt.charCode ==0)) ? evt.charCode : evt.keyCode;
  var test_value = im_ctrl.value+String.fromCharCode(key);
  if (nb_char == ''){nb_char=0;}
  if (decimal == ''){decimal=0;}
  is_valid = false;
  
  if (key==0){
    is_valid = true;
  }else{
  switch (data_type){
    //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;
      }
      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;
      }
      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;
      }
      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;
      }   
      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 en incluant le nombre de décimal max si nécessaire
        if (decimal > 0){          
          re_test = new RegExp('^[\\+\\-]?\\d*\\.?\\d{0,' + decimal + '}$','');
        }else{
          re_test = /^[\+\-]?\d*\.?\d*$/
        }
        is_valid = re_test.test(test_value);
      }else{
        is_valid = false;
      }         
      break;    
    //Date       
    case 'date':
      switch(date_format){
        case 'yyyy-mm-dd':
          //Vérifie le format : [année]-[mois]-[jour]
          re_test = /^(\d{0,4})\-(\d{0,2})\-(\d{0,2})$/
          is_valid = re_test.test(test_value);
          //Si format non valide, vérifie le format : [année]-[mois]-
          if (!is_valid){
            re_test = /^(\d{0,4})\-(\d{0,2})\-$/
            is_valid = re_test.test(test_value);
          }
          //Si format non valide, vérifie le format : [année]-[mois]
          if (!is_valid){
            re_test = /^(\d{0,4})\-(\d{0,2})$/
            is_valid = re_test.test(test_value);
          }     
          //Si format non valide, vérifie le format : [année]- 
          if (!is_valid){
            re_test = /^(\d{0,4})\-$/
            is_valid = re_test.test(test_value);
          }    
          //Si format non valide, vérifie le format : [année]
          if (!is_valid){
            re_test = /^(\d{0,4})$/
            is_valid = re_test.test(test_value);
          }  
          break;
        case 'dd-mm-yyyy':
          
          break;  
      }  
      break;  
    //Temps
    case 'time':
      //Vérifie le format : [heure]:[minute]:[seconde]
      re_test = /^(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/
      is_valid = re_test.test(test_value);
      //Si format non valide, vérifie le format : [heure]:[minute]:
      if (!is_valid){
        re_test = /^(\d{1,2})\:(\d{1,2})\:$/
        is_valid = re_test.test(test_value);
      }
      //Si format non valide, vérifie le format : [heure]:[minute]
      if (!is_valid){
        re_test = /^(\d{1,2})\:(\d{1,2})$/
        is_valid = re_test.test(test_value);
      }           
      //Si format non valide, vérifie le format : [heure]:
      if (!is_valid){
        re_test = /^(\d{1,2})\:$/
        is_valid = re_test.test(test_value);
      }         
      //Si format non valide, vérifie le format : [heure]
      if (!is_valid){
        re_test = /^(\d{1,2})$/
        is_valid = re_test.test(test_value);
      }                         
      break;
    //Sans type (tous les caractères)
    case '':
      //Vérifie la longueur de la string
      if ((nb_char==0) || (test_value.length<=nb_char)){
        is_valid = true;
      }else{
        is_valid = false;
      }       
      break;                                  
  }
  }
  //alert (is_valid);
  return (is_valid);
}

/*------------------------------------------------------------------------------
Validation d'un champs
À appeler sur onChange
Paramêtres : 
  Le contrôle à valider
  Le type de données du contrôle
  Le nombre de caractères maximum (mettre 0 ou '' si non-applicable)
  Le nombre de décimales maximum (mettre 0 ou '' si non-applicable)
  Le nom du champs à afficher dans le message d'erreur
La fonction affiche un message si la valeur n'est pas valide et la remplacxe par ''
------------------------------------------------------------------------------*/
function std_validation(im_ctrl, data_type, nb_char, max_dec, label, show_msg, del_value, lang){
  if(show_msg == undefined){
    show_msg = true;
  }  
  if(del_value == undefined){
    del_value = true;
  }
  if(lang == undefined){
    lang = 'fr';
  }    
  var is_valid = false; 
  var re_test;
  var test_value = im_ctrl.value;
  var date_format = "yyyy-mm-dd";
  //var date_format = "dd-mm-yyyy";
    
  //Valide si le champs est vides
  if (test_value==''){
    is_valid = true
  }else{  
    //Validation en fonction du type de données
    switch (data_type){
      //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;
        }
        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;
        }
        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;
        }
        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;
        }   
        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;
        }     
        break; 
      //date
      case 'date':
        switch(date_format){
          case 'yyyy-mm-dd':      
            //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;}
            }
            //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 la date
            if (is_valid){format_date(im_ctrl);}
            break;
          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;}
            //Format la date
            if (is_valid){format_date(im_ctrl);}          
            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;}
        }                                  
        //Format le temps
        if (is_valid){format_time(im_ctrl);}
        break;   
      case 'email':
        re_test = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/
        is_valid = re_test.test(test_value);
        break;
      case 'phone':
        re_test = /^\d{3}\-\d{3}\-\d{4}$/        
        is_valid = re_test.test(test_value);
        break;        
      //Sans type (tous les caractères)       
      case '':
        //Vérifie la longueur de la string
        if ((nb_char==0) || (test_value.length<=nb_char)){
          is_valid = true;
        }else{
          is_valid = false;
        }       
        break;           
    }
  }
  
  //Si non valide  
  if (!is_valid){
    if(del_value){
      im_ctrl.value = '';
    }  
    if(show_msg){ 
      switch(lang){
        case "en":
          alert('The value <<'+test_value+'>> for <<'+label+'>> is not valid!');
          break;      
        default:
          alert('La valeur <<'+test_value+'>> entrée pour <<'+label+'>> n\'est pas valide!');
          break;
      }   
    }        
  }
  
  return (is_valid);
}

//Formatage de la date
function format_date(dt_ctrl){
  var date_array=dt_ctrl.value.split("-");
  var date_new_val;
  var date_format = "yyyy-mm-dd";
  //var date_format = "dd-mm-yyyy";  
  
  switch(date_format){
    case 'yyyy-mm-dd':
      //année
      date_new_val = date_array[0]+'-';
      
      //mois
      if (date_array[1].length == 2){
        date_new_val = date_new_val+date_array[1]+'-'
      }else{
        date_new_val = date_new_val+'0'+date_array[1]+'-'
      }
      
      //jour
      if (date_array[2].length == 2){
        date_new_val = date_new_val+date_array[2]
      }else{
        date_new_val = date_new_val+'0'+date_array[2]
      }  
      dt_ctrl.value=date_new_val;
      break;
    case 'dd-mm-yyyy':    
      //jour
      if (date_array[0].length == 2){
        date_new_val = date_array[0]+'-';
      }else{
        date_new_val = '0'+date_array[0]+'-';
      }      
      
      //mois
      if (date_array[1].length == 2){
        date_new_val = date_new_val+date_array[1]+'-';
      }else{
        date_new_val = date_new_val+'0'+date_array[1]+'-';
      }      
      
      //année
      date_new_val = date_new_val+date_array[2];  
      dt_ctrl.value=date_new_val;    
      break;
  }
}

//Formatage du temps hh:mm:ss
function format_time(tm_ctrl){
  var time_array=tm_ctrl.value.split(":");
  var time_new_val;
  
  //Heures
  if (time_array[0].length == 2){
    time_new_val = time_array[0]+':'
  }else{
    time_new_val = '0'+time_array[0]+':'
  }
  //Minutes
  if (time_array[1].length == 2){
    time_new_val = time_new_val+time_array[1]+':'
  }else{
    time_new_val = time_new_val+'0'+time_array[1]+':'
  }
  //Secondes
  if (time_array[2].length == 2){
    time_new_val = time_new_val+time_array[2]
  }else{
    time_new_val = time_new_val+'0'+time_array[2]
  }  
  tm_ctrl.value=time_new_val;
}
