/*****************************************
Script pour valider les champs d'un formulaire avec l'aide de jQuery

Créé par Yannick Bélanger
Dernière mise à jour: 2011-07-07

Utilisation: $(form).validateForm(classe_erreur, obj_erreur, message_erreur, affiche_erreur, change_contenu, obj_erreur_contenu)
classe_erreur -> Classe ajoutée au champs pour indiquer une erreur (optionnel)
obj_erreur -> Objet utilisée pour affiché les erreurs. Si vide, un alert va afficher les erreurs (optionnel)
message_erreur -> Message à afficher avant les erreurs si il y en a (optionnel)
affiche_erreur -> Affiche ou non les erreurs. par défaut, affiche (optionnel)
change_contenu -> Indique si le contenu de obj_erreur doit être modifié ou non. Utile pour les erreurs avec messages "statiques". Par défaut, affiche (optionnel)
obj_erreur_contenu -> ID du contenu(généralement à l'intérieur de l'obj_erreur) à modifier pour afficher les erreurs. Affecté seulement si change_contenu est positif (optionnel)

Attributs spéciaux pour les champs:
- required -> indique si le champs est requis (valeur "1"). Si valeur est "0", vérification de la validité de la valeur du champs seulement si ce dernier n'est pas vide
- regexp -> expression régulière servant à vérifier la validité de la valeur du champs (text_field, email, tel, pc, zip, money, creditcard, postalzip ou personnalisé)
- errname -> Nom du champs à afficher lorsqu'il y a une erreur
- equals -> Nom du champs dont la valeur doit être pareil

* Manque validation pour radio et checkbox
*****************************************/

var validateForm_return_value = true;
var validateForm_err_msg = new Array();
var validateForm_form_object = "";
      
function _validateForm_regexp(regx, value){
	switch (regx){
		case "text_field":
			for(var i = 0; i < value.length; i++){
				if(value[i] == '{' || value[i] == '}' || value[i] == '`' || value[i] == '~' || value[i] == '?' || value[i] == '&' || value[i] == '*' || value[i] == '>' || value[i] == ';' || value[i] == '"' || value[i] == '/' || value[i] == '\\' || value[i] == '>' || value[i] == '=' || value[i] == '!' || value[i] == '#' || value[i] == '+'){return false;}
			}
			return true;
		case "email":
		 //return ((/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,5})+$/).test(value));
		 return ((/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/).test(value));
      case "tel":
		 return ((/^([0-9]{3}[\- ])?[0-9]{3}[\- ]?[0-9]{4}$/).test(value));
		case "pc":
		 return ((/^[a-z]\d[a-z] ?\d[a-z]\d$/i).test(value));
		case "zip":
		 return ((/^\d{5}$/).test(value));
		case "money":
		 return ((/^\d+([\.]\d\d)?$/).test(value));
		case "creditcard":
		 return (!isNaN(value));
		case "postalzip":
		 if(value.length == 6 || value.length == 7)
		    return((/^[a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d$/).test(value));
		 if(value.length == 5 || value.length == 10)
		    return((/^\d{5}(\-\d{4})?$/).test(value));
		break;
		case "password":
         if (value.length < 6)
            return false;
         else
            return true;
      break;
		default:
		 //alert(regx)
   		nBegin = 0; nEnd = regx.length-1;
   		if (regx.charAt(0) == "/") nBegin=1;
   		if (regx.charAt(regx.length-1) == "/") nEnd=regx.length-1;

         regexp = new RegExp(regx.slice(nBegin, nEnd));
         return (regexp.test(value));
	}
}

function _validateForm_equals(equals, value){
   var input = validateForm_form_object.find('[name='+equals+']');
   
   // Only if there's one instance
   if ($(input).length == 1 && $(input).val() == value){
      return true;
   }else{
      return false;
   }
}

function _validateForm_gotError(obj, errName, err_class){
   if (err_class != ""){
      $(obj).addClass(err_class);
   }
   validateForm_return_value =  false;
   
   index = validateForm_err_msg.length;
   
   name = $(obj).attr('name');

   if (errName == null || errName == ''){
      validateForm_err_msg[index] = name;
   }else{
      validateForm_err_msg[index] = errName;
   }
}
/*
case "text":
case "password":
case "textarea":
alert(_getError(field, "err_enter"));
//obj.focus();
break;
case "select-one":
case "select-multiple":
case "radio":
case "checkbox":
case "hidden":
*/

(function( $ ){
   $.fn.validateForm = function(err_class, err_obj, msg_err, show_err, change_content, err_obj_content) {
      validateForm_return_value = true;
      validateForm_err_msg = new Array();
      validateForm_form_object = this;
      var validateForm_radioList = new Array();
      
      
      if (err_class != ""){
         this.find('*').removeClass(err_class);
      }
      
      if (msg_err == null){
         msg_err = "";
      }

      if (show_err == null){
         show_err = 1;
      }

      if (change_content == null){
         change_content = 1;
      }

      if (err_obj != ""){
         $('#'+err_obj).hide();
      }
                              
      this.find(':input').each(function(){
         var type = $(this).attr('type');
         var required = $(this).attr('mandatory');
         var value = $(this).val();
         var regexp = $(this).attr('regexp');
         var errName = $(this).attr('errname');
         var name = $(this).attr('name');
         var exclude = $(this).attr('exclude');
         var equals = $(this).attr('equals');
      
         // Obligatoire
         if (required == '1'){
            switch(type){
               case 'select-one':
                  // Select
                  if (exclude != null){
                     if (exclude == value){
                        _validateForm_gotError(this, errName, err_class);          
                     }   
                  }
                  break;
               case 'text':
               case 'textarea':
               case 'hidden':
               case 'password':           
                  if (equals != null && equals != "" && !_validateForm_equals(equals, value)){
                     _validateForm_gotError(this, errName, err_class);
                  }else if (value == "" || (regexp != null && !_validateForm_regexp(regexp, value))){
                     _validateForm_gotError(this, errName, err_class);
                  }
                  break;
               case 'checkbox':           
                     if (!$(this).attr('checked')){
                        _validateForm_gotError(this, errName, err_class);
                     }
                  break;
               case 'radio':           
                     b_radioInList = false;
                     index = validateForm_radioList.length;

                     for(var i=0; i < index; i++){
                        // Nom du bouton radio déjà dans l'array
                        if (name == validateForm_radioList[i].name){
                           b_radioInList = true;
                           
                           // Une option de choisie? On n'affiche pas d'erreur pour ce bouton radio
                           if ($(this).attr('checked')){
                              validateForm_radioList[i].showError = 0;   
                           }   
                        }
                     }
                     
                     // Bouton radio pas dans l'array,  on l'ajoute
                     if (!b_radioInList){
                        validateForm_radioList[index] = {name : name, error : errName, showError: ($(this).attr('checked') ? 0 : 1)};
                     }
                  break;
               default:
                  if (value == ""){
                     _validateForm_gotError(this, errName, err_class);
                  }                              
            }
          
         }else if (required == '0'){
            switch(type){
               case 'select-one':
                  // Select
                  if (exclude != null){
                     if (exclude == value){
                        _validateForm_gotError(this, errName, err_class);          
                     }   
                  }
                  break;
               case 'text':
               case 'textarea':
               case 'hidden':
               case 'password':           
                  if (value != "" && (regexp != null && !_validateForm_regexp(regexp, value))){
                     _validateForm_gotError(this, errName, err_class);
                  }
                  break;
               default:
                  if (value != ""){
                     _validateForm_gotError(this, errName, err_class);
                  }
            }
         } 
         //alert(type+ ' --- ' +required+ ' -- ' +value)
      });

      // Aller chercher les erreurs pour les boutons radio
      if (validateForm_radioList.length > 0){
         for(var i=0; i < validateForm_radioList.length; i++){
            //alert(validateForm_radioList[i].showError)
            if (validateForm_radioList[i].showError){
               _validateForm_gotError('[name='+validateForm_radioList[i].name+']', validateForm_radioList[i].error, err_class);
            }
         }
      }               
                 
      if (show_err && validateForm_err_msg.length > 0){
         error_text = '';
         
         if (err_obj != ""){
            if (change_content){
               if (msg_err != ''){
                  error_text += msg_err+'<br>';
               }
               error_text += '<p>'+validateForm_err_msg.join('</p><p>')+'</p>';

               if (err_obj_content != null){
                  $('#'+err_obj_content).html(error_text);
               }else{
                  $('#'+err_obj).html(error_text);
               }
            }
            $('#'+err_obj).show();
         }else{
            if (msg_err != ''){
               error_text += msg_err+'\n\n';
            }
            error_text += validateForm_err_msg.join('\n');
            
            alert(error_text)
         }
      }
      return validateForm_return_value;
   }
})( jQuery )
