/*
* File : forms.js
* Date : 01/09/2004
* Author : Bertrand AGIER
* Compagny : Enyware
* Comment : Vérification des données soumises dans les formulaires
*/

/* Date : 14/12/04
* Author : Bertrand AGIER
* Comment : ajout de CHK_RADIO_SELECTED pour vérifier les bouton radio 
*/

/* Date : 04/01/2005
* Author : Bertrand AGIER
* Comment : ajout de la vérification que le champs de config existe bien (on sort avec alerte s'il n'existe pas)
*/

/*
* Date : 12/01/2005
* Author : Bertrand AGIER
* Comment : Ajout de CHK_EXTENSION + changement de la structure
*/

/*
* Date : 13/01/2005
* Author : Bertrand AGIER
* Comment : Modification de CHK_DATE : les 3 champs jour, mois, annee sont passé dans un tableau
*/

/* Date : 17/07/2006
* Author : Nicolas VIGIER
* Comment : ajout de la vérification de saisie d'au moins 1 des 2 champs données
*/

/************************ 
  Common vars
*************************/

// Types de vérifications
var CHK_NON_EMPTY 		= 1;
var CHK_FLOAT 	    	= 2;
var CHK_INT	 			= 3;
var CHK_EXTENSION 		= 4;
var CHK_SELECT 			= 5;
var CHK_EMAIL       	= 6;
var CHK_DATE        	= 7;
var CHK_PASSWD_CONFIRM  = 8;
var CHK_PHOTO           = 9;
var CHK_RADIO_SELECTED  = 10;
var CHK_ATLEAST_ONE_NON_EMPTY = 11;

//Messages d'erreur
chk_err_msg = new Array();
chk_err_msg[CHK_NON_EMPTY]      = "Vous devez remplir le champs '<#field_name#>'.";
chk_err_msg[CHK_FLOAT]          = "Le champs '<#field_name#>' doit être un nombre flottant.\nUtilisez le point et non la virgule séparateur.";
chk_err_msg[CHK_INT]            = "Le champs '<#field_name#>' doit être un nombre entier.";
chk_err_msg[CHK_EXTENSION]      = "Le fichier du champs '<#field_name#>' doit avoir une des extensions suivantes : ";
chk_err_msg[CHK_SELECT]         = "Vous devez sélectionner un élément pour le champs '<#field_name#>'.";
chk_err_msg[CHK_EMAIL]          = "L'adresse email saisie dans le champs '<#field_name#>' n'est pas valide.\nVous devez utiliser une adresse de type utilisateur@domaine.com";
chk_err_msg[CHK_DATE]           = "La date saisie dans le champs '<#field_name#>' n'est pas valide.\nVous devez utiliser le format jj mm aaaa";
chk_err_msg[CHK_PASSWD_CONFIRM] = "Le mot de passe du champs '<#field_name#>' et sa confirmation ne correspondent pas.";
chk_err_msg[CHK_PHOTO]          = "Le fichier du champs '<#field_name#>' doit être une photo au format JPEG.\nL'extension du fichier doit être .jpg ou .jpeg";
chk_err_msg[CHK_RADIO_SELECTED] = "Vous devez selectionner une option pour le champs '<#field_name#>'.";
chk_err_msg[CHK_ATLEAST_ONE_NON_EMPTY] = "Il faut au moins un numéro de téléphone.";

var wrongInput_bgColor = "#e6edd2";

// write out styles for wrong input
document.write('<style type="text/css">\n');
document.write('.formValidation-wrong-field{background-color:' + wrongInput_bgColor +';}\n');
document.write('</style>\n');

/************************ 
   User functions
*************************/

function form_verif(form,check_config){
	/*alert('check submit');*/
	var err_msg = new String();
	for (var i=0;i<check_config.length;i++){
        check_type  = check_config[i][0];   
		check_libelle = check_config[i][1];        
		check_object = check_config[i][2]; 
		
		/* Si un champs dans config n'exisre pas dans le form on sort avec alerte */
		
		if(typeof(check_object) == "object"){			
			//Si le champs a tester est un tableau (date par exemple)
			for(var k=0;k<check_object.length;k++){
				if( typeof(form.elements[check_object[k]]) != "object"){
					alert('form.config Error : Le champs \''+check_object[k]+'\' n\'existe pas !');
					return false;
				}
			}
		}else{
			if( typeof(form.elements[check_object]) != "object"){
				alert('form.config Error : Le champs \''+check_object+'\' n\'existe pas !');
				return false;			
			}else{
				check_obj   = form.elements[check_object];
			}
		}
		
				
		
		switch(check_type){
             
            case CHK_NON_EMPTY:                                 
				
                    check_value = check_obj.value;
					
					verif_function  = function(){
						err_msg = get_err_msg(check_type,check_libelle);
						return !isEmpty(check_obj.value);
					}
					                                
                break;
                                    
            case CHK_SELECT:                
            	verif_function  = function(){
						err_msg = get_err_msg(check_type,check_libelle);
						return isEmptyListe(check_obj.value);
				}               
                break;
			
			case CHK_RADIO_SELECTED:
				verif_function  = function(){
						err_msg = get_err_msg(check_type,check_libelle);
						return getRadioValue(check_obj) != '';
				} 			
				break;
				
            case CHK_FLOAT:
				verif_function  = function(){
					if(!(isEmpty(check_obj.value)) && !(isFloat(check_obj.value))){ 
						err_msg = get_err_msg(check_type,check_libelle);
						return false;
					}else{ return true; }
				} 					
				break;
            
            case CHK_INT:
				verif_function  = function(){
					if(!(isEmpty(check_obj.value)) && !(isInt(check_obj.value))){
						err_msg = get_err_msg(check_type,check_libelle);
						return false;
					}else{ return true; }
				}				            
			break;
                
            case CHK_EMAIL:
				verif_function  = function(){
					if(!(isEmpty(check_obj.value)) && !(isMail(check_obj.value))){
						err_msg = get_err_msg(check_type,check_libelle);
						return false;
					}else{ return true; }
				}			            
			break;
            
            case CHK_PASSWD_CONFIRM:
                if( typeof(form.elements[check_config[i][2]]) == "object" && typeof(form.elements[check_config[i][3]]) == "object"){
                    
					
					check_obj_passwd   = form.elements[check_config[i][2]];  
                    check_obj_passwd2   = form.elements[check_config[i][3]];                      
                    field_label = check_config[i][1];
                    verif_function = function(){
						if(!(isEmpty(check_obj_passwd.value)) && !(isEmpty(check_obj_passwd2.value)) && !(check_obj_passwd.value == check_obj_passwd2.value)){
							err_msg = get_err_msg(check_type,field_label);
							return false;
						}else{ return true;}
					}
				}
				break;
            
            case CHK_EXTENSION:
				var valid_extensions = new Array();
				var verif_function  = function(){
					resultat = true;
					if(!(isEmpty(check_obj.value))){
						resultat = false;
						valid_extensions = check_config[i][3]; 
						if(!valid_extensions.length > 0){
								alert('ERREUR CONFIG CHK_EXTENSION');
								return false;
						}else{
							resultat = false;
							for(var k=0;k<valid_extensions.length;k++){
								if(check_extension(check_obj.value,valid_extensions[k])){
									resultat = true;
								}
							}							
						}
					}
					if(resultat == false){
					   	err_msg = get_err_msg(check_type,check_libelle);
						err_msg = err_msg + valid_extensions.join(", "); //Ajoute la liste des extensions valide en fin de message...
					  }
					return resultat;
				}								
				break;
				
			case CHK_DATE:
                
				objet_date = check_config[i][2];
				
                if( typeof(objet_date) == "object" && objet_date.length == 3){
                    
					
                    check_obj_day   = form.elements[objet_date[0]];
                    check_obj_month   = form.elements[objet_date[1]];                    
                    check_obj_year   = form.elements[objet_date[2]];
                    
                    day = check_obj_day.value;
                    month = check_obj_month.value;
                    year = check_obj_year.value;
                    
                    //field_label = check_config[i][1];
					check_obj = check_obj_day; //Pour mettre l'alerte sur le champs jour
					
                    verif_function  = function(){
						if( ((!isEmpty(year)) || (!isEmpty(month)) || (!isEmpty(day))) && !(isValidDate(year,month,day))){
								err_msg = get_err_msg(check_type,check_libelle);
								return false;
						}else{ return true; }
					}				
                }else{
					alert('Erreur dans config de CHK_DATE.\n L\'argument 3 doit etre un tableau [\"jour\",\"mois\",\"annee\"].');
					return false;
				}
                
                break;
            
            case CHK_PHOTO:
				verif_function  = function(){
					if(!(isEmpty(check_obj.value)) && !(checkJpegExtension(check_obj.value))){ 
						err_msg = get_err_msg(check_type,check_libelle);
						return false;
					}else{ return true; }
				}				
			break;
			
			case CHK_ATLEAST_ONE_NON_EMPTY:			
                if( typeof(form.elements[check_config[i][2]]) == "object" && typeof(form.elements[check_config[i+1][2]]) == "object" && typeof(form.elements[check_config[i+2][2]]) == "object"){
                	check_first_object   = form.elements[check_config[i][2]]; 
                    check_second_object   = form.elements[check_config[i+1][2]]; 	
					           check_third_object   = form.elements[check_config[i+2][2]]; 	
                    field_label = check_config[i][1];					
                    verif_function = function(){
						if((isEmpty(check_first_object.value)) && (isEmpty(check_second_object.value)) && (isEmpty(check_third_object.value))){
							err_msg = get_err_msg(check_type,field_label);
							return false;
						}else{ return true;}
					}					
				}
				break;
        } //Fin du switch
		
		// On exécute la fonction de vérification sur ce champs
		if(typeof(verif_function) == "function"){
			if(verif_function() == false){
				alert(err_msg);					
				if(check_type == CHK_ATLEAST_ONE_NON_EMPTY){					
					higlightWrongField(form.elements[check_config[i][2]]);
					higlightWrongField(form.elements[check_config[i+1][2]]);
					higlightWrongField(form.elements[check_config[i+2][2]]);
				}else{					
					higlightWrongField(check_obj);
				}
				return false;
			}else{
				unHighLightWrongField(check_obj);
			}
		}
        
    }
}


function higlightWrongField(object){
	/* Cette fonction met en valeur le champ de formulaire erroné */
	for(var j=0;j<arguments.length;j++){
            
            //On met le focus sur le premier champ en erreur
            if(j == 0){
                try{arguments[j].focus();}catch(e){}
            }
            //try{arguments[j].select();};
            try{
							var oldclass = arguments[j].className;
							arguments[j].className=arguments[j].className;+" formValidation-wrong-field";
							
						}catch(e){}			
        }
}

function unHighLightWrongField(object){
	/* Cette fonction enlève la mise en valeur due à un champs erroné */
	for(var j=0;j<arguments.length;j++){
            try{
								arguments[j].className=arguments[j].className.replace(" formValidation-wrong-field", "");
						}catch(e){}
        }
}

function get_err_msg(check_type,field_name){     
    /* Remplace le nom du champ par sa valeur dans le message d'erreur */    
    var reg = new RegExp("<#field_name#>", "g");
    err_msg = chk_err_msg[check_type].replace(reg,field_name);
    return err_msg;
}

function dump_object(objet){
   /* Pour dumper un objet */
   for(var list in objet){       
         try{alert(list+' : '+list.value+'\n');}catch(e){}
   }   
}

/********************************************************************************
 Private functions to check values
*********************************************************************************/

function isValidDate (year, month, day) {        
	// month argument must be in the range 1 - 12
    month = month - 1; // javascript month range : 0- 11
    var tempDate = new Date(year,month,day);
    
    if (!((year == tempDate.getFullYear()) && (month == tempDate.getMonth()) &&	(day == tempDate.getDate()))){
            return false;
    }
    return true;
}

//verifie qu'une option de la liste est sélectionné
//le 0 n'est pas une valeur valide (Exemple ==> correspond à Choisir le Pays)
function isEmptyListe(value){
	if(value=='' || value==0)
	{
		return false;
	}
	else
	{
		return true;
	}
}

function isEmpty(value){
	return (trim(value) == "");
}
//Vérifie la syntaxe d'une adresse email
function isMail(email) {
	r = email.match(/^[A-Za-z0-9_.-]+@([A-Za-z0-9_-]+\.)+[A-Za-z]{2,4}$/)!=null;
	return r;
	
}

//Vérifie que la chaine passée finie par .jpg pou .jpeg
function checkJpegExtension(fileName) {
	return fileName.match(/^(.)*(.jpg|.jpeg|.JPG|.JPEG)$/)!=null;
}

function check_extension(filename,extension,case_sensitive){
	if(case_sensitive == true){
		var expr = new RegExp("^(.)*(" + extension + ")$");
	}else{
		var expr = new RegExp("^(.)*(" + extension + ")$","i");
	}
	return expr.test(filename);
}

function isInt(elm) {
    if (elm == "") {
        return false;
    }
    for (var i = 0; i < elm.length; i++) {
        if (elm.charAt(i) < "0" || elm.charAt(i) > "9") {
            return false;
        }
    }
    return true;
}

function isFloat (s){
  var decimalPointDelimiter = "." ;
  var i;
  var seenDecimalPoint = false;
  if (isEmpty(s)) 
    if (isFloat.arguments.length == 1) return defaultEmptyOK;
    else return (isFloat.arguments[1] == true);
  if (s == decimalPointDelimiter) return false;
  for (i = 0; i < s.length; i++){   
    var c = s.charAt(i);
    if ((c == decimalPointDelimiter) && !seenDecimalPoint) 
	  seenDecimalPoint = true;
    else if (!isDigit(c)) return false;
  }
  return true;
}

function isDigit (c){
  return ((c >= "0") && (c <= "9"))
}

function getRadioValue(radios) {
  for(var i=0; i<radios.length; ++i) {
    if(radios[i].checked){
			return radios[i].value;
	}
  } 
  return '';
}

function trim(s){
  while (s.substring(0,1) == ' '){
    s = s.substring(1,s.length);
  }
  while (s.substring(s.length-1,s.length) == ' '){
    s = s.substring(0,s.length-1);
  }
  return s;
}
