/*
* 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
*/

/* Date : 25/01/2007
* Author : Benoit MONTUELLE
* Comment : ajout support CSS externe
*/

/* Date : 25/01/2007
* Author : Benoit MONTUELLE
* Comment : ajout de CHK_NON_NULL
*/

/* Date : 26/01/2007
* Author : Benoit MONTUELLE
* Comment : ajout de la vérification de l'antériorité d'une date sur une autre (début<fin)
*/

/* Date : 29/01/2007
* Author : Benoit MONTUELLE
* Comment : ajout du support des tableaux de champs pour les types CHK_NON_EMPTY, CHK_NON_NULL, CHK_INT, CHK_FLOAT
* avant ca ne marchais que pour les premier champ (Firefox), maintenant ca marche pour tous, seule la coloration reste encore à faire
*/


/************************ 
  Common vars
*************************/
//CSS
var FORM_TEXT_CLASS = 'input_commande';
var FORM_DATE_CLASS = 'form_date';
var FORM_TEXTAREA_CLASS = 'form_textarea';

var FORM_TEXT_CLASS_HL = 'form_text_hl';
var FORM_DATE_CLASS_HL = 'form_date_hl';
var FORM_TEXTAREA_CLASS_HL = 'form_textarea_hl';

//Type de champs 
var TYPE_TEXT = 0;
var TYPE_DATE = 1;
var TYPE_TEXTAREA = 2;

var CSS = new Array();
CSS[TYPE_TEXT] =  FORM_TEXT_CLASS;
CSS[TYPE_DATE] = FORM_DATE_CLASS;
CSS[TYPE_TEXTAREA] = FORM_TEXTAREA_CLASS;
var CSS_HL = new Array();
CSS_HL[TYPE_TEXT] =  FORM_TEXT_CLASS_HL;
CSS_HL[TYPE_DATE] = FORM_DATE_CLASS_HL;
CSS_HL[TYPE_TEXTAREA] = FORM_TEXTAREA_CLASS_HL;

// 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;
var CHK_NON_NULL = 12;
var CHK_DATE_ANTE = 13;
//var CHK_NON_EMPTY_ARRAY = 14;

//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_NON_EMPTY_ARRAY] = "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_DATE_ANTE]			= "La date saisie dans le champ '<#field_name#>' doit être antérieure à la date saisie dans le champ 'date de fin'";
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_NON_NULL] = "La valeur du champ '<#field_name#>' ne doit pas être nulle.";
chk_err_msg[CHK_ATLEAST_ONE_NON_EMPTY] = "Au moins un des champs <#field_name#> doit être rempli.";


chk_err_msg_uk = new Array();
chk_err_msg_uk[CHK_NON_EMPTY]      = "You must complete this '<#field_name#>' field before we continue.";
//chk_err_msg_uk[CHK_NON_EMPTY_ARRAY] = "You must complete this '<#field_name#>' field before we continue.";
chk_err_msg_uk[CHK_FLOAT]          = "You must use a floating number for this '<#field_name#>' field.\nPlease use a comma as a separator.";
chk_err_msg_uk[CHK_INT]            = "You must use an integer number for this '<#field_name#>' field.";
chk_err_msg_uk[CHK_EXTENSION]      = "You must use one of the following file types for this '<#field_name#>' field: ";
chk_err_msg_uk[CHK_SELECT]         = "You must select an answer for the field '<#field_name#>'.";
chk_err_msg_uk[CHK_EMAIL]          = "You must use a valid e-mail address.\nPlease make sure that the one in this '<#field_name#>' field matches the user@domain.com format.";
chk_err_msg_uk[CHK_DATE]           = "You must use a valid date.\nPlease make sure that the one in this '<#field_name#>' field matches the dd/mm/yyyy format.";
chk_err_msg_uk[CHK_DATE_ANTE]			= "The date in field '<#field_name#>' must be set before the field 'End date'";
chk_err_msg_uk[CHK_PASSWD_CONFIRM] = "Your password -'<#field_name#>' field- and confirmation don’t match.\nPlease re-type them, and submit again.";
chk_err_msg_uk[CHK_PHOTO]          = "You must use a JPEG format picture in this '<#field_name#>' field.\nPlease check the file extension, and submit again.";
chk_err_msg_uk[CHK_RADIO_SELECTED] = "You must select an option in this field '<#field_name#>'.";
chk_err_msg_uk[CHK_NON_NULL] = "The value in field '<#field_name#>' can't be null.";
chk_err_msg_uk[CHK_ATLEAST_ONE_NON_EMPTY] = "At least one of the fields <#field_name#> must be filled.";

var wrongInput_bgColor = "#00AEC3";


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

function form_verif(form,check_config,langue){
	
	if(langue=='')
	{
		langue='fr';
	}
	
	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"){
					if(langue=='uk')
					{
						alert('form.config Error : The field \''+check_object[k]+'\' doesn\'t exist!');
					}
					else
					{
						alert('form.config Error : Le champs \''+check_object[k]+'\' n\'existe pas !');
					}
					
					return false;
				}
			}
			check_obj   = form.elements[check_object];
		}else{
			if( typeof(form.elements[check_object]) != "object"){
				if(langue=='uk')
					{
						alert('form.config Error : The field \''+check_object+'\' doesn\'t exist!');
					}
					else
					{
						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:                                 
									//alert();
                check_value = check_obj.value;
							if (check_obj.length > 0) {
								verif_function  = function(){
									
									err_msg = get_err_msg(check_type,check_libelle,langue);

									for (var i = 0; i < check_obj.length; i++) {
										//alert('field array value : ' + check_obj[i].value);
										if (isEmpty(check_obj[i].value)) {
											return false;
										}
									}
									return true;
								}
								
							}
							else {
								verif_function  = function(){
									err_msg = get_err_msg(check_type,check_libelle,langue);
									return !isEmpty(check_obj.value);
								}
							}
					 break;

					case CHK_NON_NULL:
							check_value = check_obj.value;
							if (check_obj.length > 0) {
								verif_function  = function(){
									
									err_msg = get_err_msg(check_type,check_libelle,langue);

									for (var i = 0; i < check_obj.length; i++) {
										//alert('field array value : ' + check_obj[i].value);
										if (isNull(check_obj[i].value)) {
											return false;
										}
									}
									return true;
								}
								
							}
							else {
								verif_function  = function(){
									err_msg = get_err_msg(check_type,check_libelle,langue);
									return !isNull(check_obj.value);
								}
							}
                          
           break;
                                    
            case CHK_SELECT:                
            	verif_function  = function(){
						err_msg = get_err_msg(check_type,check_libelle,langue);
						return !isEmpty(check_obj.value);
				}               
                break;
			
			case CHK_RADIO_SELECTED:
				verif_function  = function(){
						err_msg = get_err_msg(check_type,check_libelle,langue);
						return getRadioValue(check_obj) != '';
				} 			
				break;
				
            case CHK_FLOAT:
							if (check_obj.length > 0) {
								verif_function  = function(){
									
									err_msg = get_err_msg(check_type,check_libelle,langue);

									for (var i = 0; i < check_obj.length; i++) {
										//alert('field array value : ' + check_obj[i].value);
										if (!isFloat(check_obj[i].value)) {
											return false;
										}
									}
									return true;
								}
								
							}
							else {
								verif_function  = function(){
									if(!(isEmpty(check_obj.value)) && !(isFloat(check_obj.value))){ 
										err_msg = get_err_msg(check_type,check_libelle,langue);
										return false;
									}else{ return true; }
								} 			
							}
				break;
            
            case CHK_INT:
						if (check_obj.length > 0) {
								verif_function  = function(){
									
									err_msg = get_err_msg(check_type,check_libelle,langue);

									for (var i = 0; i < check_obj.length; i++) {
										//alert('field array value : ' + check_obj[i].value);
										if (!isInt(check_obj[i].value)) {
											return false;
										}
									}
									return true;
								}
								
							}
							else {
								verif_function  = function(){
									if(!(isEmpty(check_obj.value)) && !(isInt(check_obj.value))){
										err_msg = get_err_msg(check_type,check_libelle,langue);
										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,langue);
						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,langue);
							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,langue);
						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,langue);
								return false;
						}else{ return true; }
					}				
                }else{
					if(langue=='uk')
					{
						alert('Error in config of CHK_DATE.\n The third argument must be an array [\"jour\",\"mois\",\"annee\"].');
					}
					else
					{
						alert('Erreur dans config de CHK_DATE.\n L\'argument 3 doit etre un tableau [\"jour\",\"mois\",\"annee\"].');
					}
					
					return false;
				}
                
                break;
								
						case CHK_DATE_ANTE:
								//alert('config ok');
                
								objet_date = check_config[i][2];
				
             if( typeof(objet_date) == "object" && objet_date.length == 6){
                    
					
                    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;
                    
										check_obj_day2   = form.elements[objet_date[3]];
                    check_obj_month2   = form.elements[objet_date[4]];                    
                    check_obj_year2   = form.elements[objet_date[5]];
                    
                    day2 = check_obj_day2.value;
                    month2 = check_obj_month2.value;
                    year2 = check_obj_year2.value;
										
                    //field_label = check_config[i][1];
					check_obj = check_obj_day; //Pour mettre l'alerte sur le champs jour
					
                    verif_function  = function(){
						if( !isBeforeDate(year, month, day, year2, month2, day2) ){
								err_msg = get_err_msg(check_type,check_libelle,langue);
								return false;
						}else{ return true; }
					}				
                }else{
					if(langue=='uk')
					{
						alert('Error in config of CHK_DATE_ANTE.\n The third argument must be an array [\"jour\",\"mois\",\"annee\", \"jour\",\"mois\",\"annee\"].');
					}
					else
					{
						alert('Erreur dans config de CHK_DATE_ANTE.\n L\'argument 3 doit etre un tableau [\"jour\",\"mois\",\"annee\", \"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,langue);
						return false;
					}else{ return true; }
				}				
			break;
			
			case CHK_ATLEAST_ONE_NON_EMPTY:			
				verif_function = function() {
					fields = check_config[i][2];
					for (var j = 0; j < fields.length; j++) {
						le_field = form.elements[fields[j]];
					//	alert(le_field.name);
						if (le_field.name && !isEmpty(le_field.value)) {
								return true;																	 
						}
					}	
				//	alert('nothin right, cancelling submit');
					err_msg = get_err_msg(check_type,check_libelle,langue);
				//	alert(err_msg);
					return false;
				}
			break;
				
    } //Fin du switch
		
		// On exécute la fonction de vérification sur ce champs
		if(typeof(verif_function) == "function"){
			var input_type = TYPE_TEXT;

			if (check_config[i][3] && ((check_config[i][3] == TYPE_TEXT) || (check_config[i][3] == TYPE_DATE) || (check_config[i][3] == TYPE_TEXTAREA))){
				input_type = check_config[i][3];
			}
		//	alert (input_type);
			
		//	alert(" input_type=" + input_type); 
			if(verif_function() == false){
				alert(err_msg);					
				className = CSS_HL[input_type];
				
				//a revoir
				if(check_type == CHK_ATLEAST_ONE_NON_EMPTY){					
					return false;
					/*higlightWrongField(form.elements[check_config[i][2]], class);
					higlightWrongField(form.elements[check_config[i+1][2]], class);
					higlightWrongField(form.elements[check_config[i+2][2]], class);*/
				}
					
					higlightWrongField(check_obj, className);
				///}
				return false;
			}else{
				className = CSS[input_type];
				unHighLightWrongField(check_obj, className);
			}
		}
        
    }
}


function higlightWrongField(object, className){
	if (!className) {
		className = FORM_TEXT_CLASS_HL;
	}
	/* 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{arguments[j].className=className;}catch(e){}			
        }
}

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

function get_err_msg(check_type,field_name,langue){     
    /* Remplace le nom du champ par sa valeur dans le message d'erreur */    
    var reg = new RegExp("<#field_name#>", "g");
	if(langue=='uk')
	{
		 err_msg = chk_err_msg_uk[check_type].replace(reg,field_name);   
	}
	else
	{
		 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;
}

function isBeforeDate (year, month, day, year2, month2, day2) {        
	// month argument must be in the range 1 - 12
    month = month - 1; // javascript month range : 0- 11
		month2 = month2 - 1;
		var dt1 = new Date();
		dt1.setYear(year);
		dt1.setMonth(month);
		dt1.setDate(day);
    var dt2 = new Date();
		dt2.setYear(year2);
		dt2.setMonth(month2);
		dt2.setDate(day2);

		dt1 = Date.parse(dt1);
		dt2 = Date.parse(dt2);
	
	//alert (dt1 + '::' + dt2);
		if (dt1 < dt2) return true;
		return false; 
}

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 isNull(s) {
	if (parseFloat(s) == 0) {
		return true;
	}
	return false;
}

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;
}
