/**************
Copyright (c) 2002 Dany Boisvert 

Fichier de validation des champs de saisie des formulaires HTML.

Utilisation : 

Mettre le code suivant dans le tag <HEAD> :
	<script src="vFields.js"></script>
	
Ensuite il suffit de faire l'appel à la fonction booléenne chkField() pour
chacun des champs à valider de la façon suivante :

	function chkFormFields(){
		// vérifier que les champs username et password ne sont pas vide
	 
  	if(chkField(document.form.fldUsername, '<%=Replace(username,"'","\'")%>', 'text', 'text', 'true', '', '', '')){
   		if(chkField(document.form.fldPassword, '<%=Replace(password,"'","\'")%>', 'text', 'text', 'true', '', '', '')){
     		return true;
   		} else return false;
  	} else return false;  
	}

N.B. La fonction chkFormFields() est appelée avec le onSubmit()	

***************/


function chkField(field, etiquette, inputType, dataType, mandatory, max, condition, msg){  
  /********************************************************************************
  	 
  Fonction qui crée un objet avec les propriétés du champ à valider
  La fonction chkField() prend les paramètres suivants :
	Champ* 		: Lien sur le champ. Ex: document.form.fldNom
	Étiquette       : Nom de l'étiquette devant le champ. Ex: "Téléphone"
	Type composant* : Type du champ (text, textarea, radio, checkbox, select-one, select-multiple)
	Type donnée*	: Validation du type de donnée (text, number,phone, postal_code, email)
	Obligatoire* 	: Booléen (true/false) qui indique si le champ est obligatoire
	Max caractères  : Nombre maximale de caractères		
	Condition	: Cas spécifique dans lequel la validation doit être faites
			  			ex: "document.form.fldDate2 > document.form.fldDate1"	
	Msg erreur	: Message d'erreur à afficher (nom de la constante texte)
				  			Non requis pour validation du champ obligatoire car le message
				  			d'erreur est préconfiguré de la façon suivante:
				  			"Le champ [** etiquette **] est requis."
		
	* Champs obligatoires	
	
	NOTE : Les messages d'erreurs son sauvegardés dans le fichier msg_const.js. Certains de ces
	       messages son génériques mais une section est réservée pour les messages spécifiques.
	       Cette façon de faire facilite la maintenabilité des messages.	
	       
	*********************************************************************************/
	       
    this.field = field;					
    this.etiquette = etiquette;  
    this.inputType = inputType;
    this.dataType = dataType;
    this.mandatory = mandatory;
    this.max = max;
    this.condition = condition;
    this.msg = msg;
    
    return validate(this);	
  
}


function validate(obj){
  // Fonction booléenne qui fait la validation d'un champ selon les critères
  // sélectionnés pour ce champ. Elle retourne vraie si l'ensemble des conditions
  // sont respectées. Faux sinon.
  
  var bool = true;
  
  // champ obligatoire	
  //alert("valide " + obj.etiquette + " : [" + obj.condition + "] -> " + obj.field.value.length);
  if(obj.mandatory == 'true' && (obj.field.value == '' || obj.field.value.length == 0)){     
    error_alert(obj, msg_mandatoryField);
    obj.field.focus(); 
    bool = false;     	
  }
  // valide la longueur max du champ
  else if(bool && (obj.inputType == 'text' || obj.inputType == 'textarea') && !isNaN(parseInt(obj.max))){
  	if(obj.field.value.length > obj.max){    	  
      error_alert(obj, msg_ToMuchChar);
      obj.field.focus(); 
      return false;  	
    }
  }
  
  // Si c'est une adresse email on valide si elle a le bon format
  else if(bool && obj.dataType == "email" && (obj.mandatory == 'true' || obj.condition == 'true') && isEmail(obj.field.value) == false){
	alert(this.msg);	
	obj.field.focus();
	bool = false; 
  }
  
  // Si c'est un numéro de téléphone on valide si il a le bon format  
  else if(bool && obj.dataType == "phone" && (obj.mandatory == 'true' || obj.condition == true) && (isInternationalPhone(obj.field.value) == false)){
  	alert(this.msg);	
	obj.field.focus();
	bool = false; 
  }
  
  // Si c'est un numéro de carte de crédit on valide si il a le bon format  
  else if(bool && obj.dataType == "cc_number" && (obj.mandatory == 'true' || obj.condition == true) && (CheckCardNumber(document.form) == false)){
  	obj.field.focus();
	bool = false; 
  }
  
  return bool;    
}

function error_alert(obj, msg){
	// fonction qui formate les messages d'erreur.
	// Les messages sont définis dans le fichier msg_const.js et
	// ils doivent respecter la convention décrite dans l'en-tête de ce fichier.
	// Ex. de msg : 'Le champ [** etiquette **] est requis.'
	
	while(msg.indexOf("[**") != -1){
		if(msg.indexOf("[**")){
			var newmessage = msg.substr(0,msg.indexOf("[**"));
			var rest = msg.substr(msg.indexOf("[**") + 3);
			var param = rest.substr(0,rest.indexOf("**]"));
			param = eval("obj." + param);
			newmessage += param;
			newmessage += rest.substr(rest.indexOf("**]") + 3);
			msg = newmessage;
			}
		}
	msg = msg.replace("'","\'");	
	alert(msg);		
}

function setFocus(){
  	// Met le focus surle premier élément de type
	// text, radio, select, texarea ou  dans la page 
	if(document.forms[0]){
		for(var i=0;i<document.forms[0].elements.length;i++){
			var elem = document.forms[0].elements[i]; 
			if(elem.type == "text" || elem.type == "radio" || elem.type == "select-one" || elem.type == "select-multiple" || elem.type == "texarea" || elem.type == "checkbox"){
				elem.focus();
				break;
			}
		}
	}    
}

function isEmail(email)
{
  var bool = false
  var theStr = new String(email)
  var index = theStr.indexOf("@");
  if (index > 0)
  {
    var pindex = theStr.indexOf(".",index);
    if ((pindex > index+1) && (theStr.length > pindex+1))
	bool = true;
  }
  return bool;
}




function replace(completeStr, subStr1, subStr2, scope){
	// Replace 'scope' occurance of subStr1 by subStr2 in completeStr
	// scope can take values : ALL (default) or ONE
	
	var index = completeStr.indexOf(subStr1);
			
	if(index != -1){
		var tmp_substr1 = completeStr.substring(0, index);
		var tmp_substr2 = completeStr.substring((index + subStr1.length), completeStr.length);
		var new_str = tmp_substr1 + subStr2 + tmp_substr2;
		
		if(scope == "ONE"){
			alert(new_str);//return new_str;
		}
		else{
			// replace ALL
			replace(new_str, subStr1, subStr2, "ALL");
		}
		
	}
	else alert(completeStr);//return completeStr;
	
}

function setList(field, arrName){
	// Fonction qui utilise le contenu d'un tableau (arrName)
	// pour remplir une liste déroulante (field)
	
	field.length = 0;  // la liste est vide 
	for(var i=0;i<arrName.length;i++){      
     field.options[i] = new Option();
     field.options[i].text = arrName[i];      
     field.options[i].value = i;      
   }  
}

function addToList(field, content, val){
	// Fonction qui permet d'ajouter dynamiquement,
	// sans refresh, un élément dans une liste déroulante
	
	var index = field.length;
	field.options[index] = new Option();
  	field.options[index].text = content;      
  	field.options[index].value = val;
}

function addToInnerHTML(elem, str){
	// Fonction qui permet d'ajouter dynamiquement
	// du text dans une balise ayant un innerHTML.
	
	var obj = eval('document.all("' + elem + '")');
	obj.innerHTML = str;
}

function getSelectedIndex(obj){
	// Fonction qui retourne l'index sélectionné dans une liste.
	// Retourne -1 si aucun index n'est sélectionné.
	
	var index = -1;
	for(var i=0;i<obj.length;i++){
		if(obj.options[i].selected == true){
			index = i;
			break;	
		}
	}
	
	return index;
}


/**
 * DHTML phone number validation script. Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/)
 */

// Declaring required variables
var digits = "0123456789";
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- ";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone no.
var minDigitsInIPhoneNumber = 10;

function isInteger(s)
{   var i;
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function isInternationalPhone(strPhone){
	s=stripCharsInBag(strPhone,validWorldPhoneChars);
	return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
}

/**
  * END DHTML phone number validation script.
  */

function isAlphaNum(val)
    {
    // True if val is alphanumeric, any case. Disallows blanks.

    var re = /^([a-zA-Z0-9])+$/;
    return (re.test(val)); 
    }

