// Caratere blanc
var whitespace = " \t\n\r";

var CHAMP_TEXT = "text";
var CHAMP_SELECT = "select";
var CHAMP_RADIO = "radio";
var CHAMP_CHECKBOX = "checkbox";
var CHAMP_TEXTAREA = "textarea";
var CHAMP_SELECT_ONE = "select-one";
var CHAMP_SELECT_MULTIPLE = "select-multiple";
var CHAMP_HIDDEN = "hidden";
var CHAMP_PASSWORD = "password";
var CHAMP_BUTTON = "button";
var CHAMP_RESET = "reset";
var CHAMP_IMAGE = "image";
var CHAMP_FILE = "file";

/***********************************************************
 vérifie si dans la liste il y a au moins un champs non vide
 ou non sélectionné basé sur la méthode estNonNull
 Exemple: var listeChampsAvalider = new Array('nom_resp_chang','adresse_service',...);
          possedeUnChampsNonVide(Form,listeChampsAvalider);
***********************************************************/
function possedeUnChampsNonVide(unFormulaire,uneListe){
	var nbElement = uneListe.length;
	var indiceBoucle = 0;
	var elementTmp = "";
	var resultat = false;

	for(indiceBoucle; indiceBoucle < nbElement; indiceBoucle++){
		elementTmp = uneListe[indiceBoucle];
		if(estNonNull(unFormulaire.elements[elementTmp])){
			resultat = true;
			break;
		}
	}
	return resultat;
}

/***********************************************************
 Retourne l'indice du radiobutton sélectionné, 
 si aucune sélection, retourne -1
***********************************************************/
function radioSelect(groupeBouton) {
	for (var i = 0; i < groupeBouton.length; i++) {
		if (groupeBouton[i].checked) {
			return i
		}
	}
	return -1
}

/***********************************************************
 Identifie le type du champs et évalue s'il est null (ou non coche)
 Valide les champs text, textarea, radio et checkbox
***********************************************************/
function estNonNull(unElement){
	if(unElement.type == CHAMP_TEXT || unElement.type == CHAMP_TEXTAREA){
		if(unElement.value && unElement.value.length > 0)
			return true;
	}
	else{
		if(unElement.type == CHAMP_CHECKBOX){
			if(unElement.checked)
				return true;
		}
		else{
			if( radioSelect(unElement) > -1)
				return true;
		}
	}
	return false;
}

/***********************************************************
  Retourne true si unChamps est vide.
***********************************************************/
function estVide(unChamps){
  return (unChamps.length == 0);
}


/***********************************************************
  Validation de code postal canadien
***********************************************************/
function estCodePostal(codepostal) {

	if (codepostal.search) {
		if (codepostal.search(/^[A-Za-z]\d[A-Za-z]\s*\d[A-Za-z]\d$/) != -1) return true
		else return false;
	}
	return true;
}

/***********************************************************
 Valide qu'une chaine de carateres contient que des lettres
 et des chiffres
***********************************************************/
function estAlphanumerique(string, ignoreWhiteSpace) {
	if (string.search) {
		if ((ignoreWhiteSpace && string.search(/[^\w\s]/) != -1) || (!ignoreWhiteSpace && string.search(/\W/) != -1)) return false;
	}
	return true;
}

/***********************************************************
 Valide qu'une chaine de carateres contient que des lettres
***********************************************************/
function estAlphabetique(string, ignoreWhiteSpace) {
	if (string.search) {
		if ((ignoreWhiteSpace && string.search(/[^a-zA-Z\s]/) != -1) || (!ignoreWhiteSpace && string.search(/[^a-zA-Z]/) != -1)) return false;
	}
	return true;
}

/***********************************************************
 Valide qu'une chaine de carateres contient que des nombres
***********************************************************/
function estNumerique(string, ignoreWhiteSpace) {
	if (string.search) {
		if ((ignoreWhiteSpace && string.search(/[^\d\s]/) != -1) || (!ignoreWhiteSpace && string.search(/\D/) != -1)) return false;
	}
	return true;
}

/***********************************************************
 Valide le champs passé en parametre. Cette fonction valide
 des téléphone, des emails, des dates, des indicatifs et
 des url.
 refElement : représente le champs à valider
 estObligatoire : true ou false => indique si ce champs est
                  essentiel pour la validité du formulaire
 typeChamp : telephone ou email ou date ou indicatif ou url
             Indique le type du champs a valider
***********************************************************/
function validerChamps(refElement, estObligatoire, typeChamp){
	var	estValide	=	true;
	if (estObligatoire &&	refElement.value ==	"")	{
		estValide	=	false;
	}

	if (estValide	&& refElement.value	!= "") {
		// valider seulement si	une	valeur a été spécifiée
		if (typeChamp	== "string") {
		}
		else if	(typeChamp ==	"date")	{
			if (!validerDate(refElement.value))	{
				estValide	=	false;
			}
		}
		else if	(typeChamp ==	"email") {
			var	strReEmailValide;
			strReEmailValide	=	"/^([a-zA-Z0-9._-]+@)";		// utilisateur@
			strReEmailValide +=	"([a-zA-Z0-9.-]+[.])+";		// domaine.
			strReEmailValide +=	"([a-zA-Z0-9.-]{2,4})$/";	// tld
			var	reEmailValide	=	eval(strReEmailValide);
			// vérifie si	l'adresse	est	composée uniquement
			// de	caractères valides et	si elle	est	dans le
			// format	"utilisateur@domaine.tld"
			if (!reEmailValide.test(refElement.value)) {
					estValide	=	false;
			 }
		}
		else if	(typeChamp ==	"telephone") {
			var	reTelephoneValide	=	/^\d\d\d\-\d\d\d\d$/;
			var	reTelephoneValide2	=	/^\d\d\d\d\d\d\d$/;
			// vérifie si	le numéro	de téléphone
			// est dans	le format	"999-9999"
			if (!reTelephoneValide.test(refElement.value) && !reTelephoneValide2.test(refElement.value)) {
				estValide	=	false;
			}
		}
		else if	(typeChamp ==	"indicatif") {
			var	reTelephoneValide	=	/^\d\d\d$/;
			// vérifie si	le numéro	de téléphone
			// est dans	le format	"999"
			if (!reTelephoneValide.test(refElement.value)) {
				estValide	=	false;
			}
		}
		else if	(typeChamp ==	"url") {
			if ((refElement.value.substring(0,7) !=	"http://") &&
					(refElement.value.substring(0,6) !=	"ftp://")	&&
					(refElement.value.substring(0,7) !=	"mailto:"))	{
					estValide	=	false;
			}
		}
	}

	return estValide;
}


/***********************************************************
 Valide le no d'assurance social
***********************************************************/
function NASNumerique(nas) {
	if (nas.search) {
		if (nas.search(/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$/) != -1) return true
		else return false;
	}
	return true;
}


/***********************************************************
 Cette fonction vérifie si la chaine contient seulement des
 chiffres
***********************************************************/
	function isNumberString (InString)  {
		if(InString.length==0)
			return (false);

		RefString="1234567890";
		for (Count=0; Count < InString.length; Count++)  {
			TempChar= InString.substring (Count, Count+1);
				if (RefString.indexOf (TempChar, 0)==-1)
					return (false);
		}
		return (true);
	}

/***********************************************************
 Cette fonction valide l'heure                          
***********************************************************/
function validerHeure(heure) {
  var lngHeure = heure.length;
  var valid = true;
  var message = " Erreur, ";
  // With évite d'avoir à répéter le nom de la variable lors de l'appel de ces méthodes
  with(heure) {
    if (lngHeure < 5)
      {valid = false;message = message +"format d'heure invalide.";}
    else {
      //Validation de l'heure
      if (valid == true && (charAt(0) < '0' ||  charAt(0) > '2')) {valid = false;message = message +"heure invalide.";}
      if (valid == true && (charAt(1) < '0' ||  charAt(1) > '9')) {valid = false;message = message +"annee invalide.";}
      if (valid == true && (charAt(2) != ':')) {valid = false;message = message +"format d'heure invalide, veuillez separer les heure et minute par le symbole suivant : .";}
      if (valid == true && (charAt(3) < '0' ||  charAt(3) > '5')) {valid = false;message = message +"minute invalide.";}
      if (valid == true && (charAt(4) < '0' ||  charAt(3) > '9')) {valid = false;message = message +"minute invalide.";}
	}
  }
  //Message d'alerte si l'heure est invalide
  if (valid == false) {window.alert(message);}
  return valid;
}

/***********************************************************
 Validation complete de l'adresse de courriel. 
***********************************************************/
function adresseCourrielEstValide(uneAdresseEmail) {
	var	strReEmailValide;
	estValide = true;
	indexOfArobas = 0;
	lastIndexOfArobas = 0;
	indexOfPremierPoint = 0;
	lastIndexOfPoint = 0;
	indexOfPointAvantArobas = 0;
	indexOfPointApresArobas = 0;

	indexOfArobas = uneAdresseEmail.indexOf("@");
	lastIndexOfArobas = uneAdresseEmail.lastIndexOf("@");
	indexOfPremierPoint = uneAdresseEmail.indexOf(".");
	lastIndexOfPoint = uneAdresseEmail.lastIndexOf(".");

	indexOfDeuxPoints = uneAdresseEmail.lastIndexOf("..");

	indexOfEspace = uneAdresseEmail.lastIndexOf(" ");

	indexOfPointAvantArobas = uneAdresseEmail.indexOf(".", indexOfArobas - 1);
	indexOfPointApresArobas = uneAdresseEmail.indexOf(".", indexOfArobas);
	
	strReEmailValide	=	"/^([a-zA-Z0-9._-]+@)";		// utilisateur@
	strReEmailValide +=	"([a-zA-Z0-9.-]+[.])+";		// domaine.
	strReEmailValide +=	"([a-zA-Z0-9.-]{2,4})$/";	// tld

	var	reEmailValide	=	eval(strReEmailValide);
	
	// Doit avoir une longueur minimum de 6.
	if (uneAdresseEmail.length < 6) {
		estValide = false;
	} else {

		// vérifie si	l'adresse	est	composée uniquement
		// de	caractères valides et	si elle	est	dans le
		// format	"utilisateur@domaine.tld"
		if (!reEmailValide.test(uneAdresseEmail)) {
			estValide = false;
		}
			
		// Doit contenir au moins un '@'et un '.'.
		if ((indexOfArobas == -1) || (indexOfPremierPoint == -1)) {
			estValide = false;
		}
	
		// Ne doit pas commencer par un '@' ou un '.'.
		if((indexOfArobas == 0) || (indexOfPremierPoint == 0)){
			estValide = false;
		}
	
		// Ne doit pas contenir '..'
		if((indexOfDeuxPoints != -1)){
			estValide = false;
		}
	
		// Ne doit pas contenir d'espace
		if((indexOfEspace != -1)){
			estValide = false;
		}
	
		// Doit contenir au moins un caractère entre le '@' et le '.'.
		if(indexOfArobas + 2 > lastIndexOfPoint){
			estValide = false;
		}
	
		// Ne doit pas se terminer par un '.'.
		if(lastIndexOfPoint == (uneAdresseEmail.length - 1)){
			estValide = false;
		}
	
		// Ne doit contenir qu'un seule '@'.
		if(indexOfArobas != lastIndexOfArobas){
			estValide = false;
		}
	
		//Il doit avoir au moins un caractère entre le "." et le "@"
		//Vérifier le "." avant le "@"
		if (indexOfPointAvantArobas == indexOfArobas - 1) {
			estValide = false;
		}
	
		//Vérifier le "." après le "@"
		if (indexOfPointApresArobas == indexOfArobas + 1) {
			estValide = false;
		}
	}
		
	return estValide;
}

/***********************************************************
 Validation de base de l'adresse de courriel. Elle ne fait
 que valider le format habituel d'un adresse de courriel
***********************************************************/
function adresseCourrielValide(courriel,lngCourriel){
	var	strReEmailValide;
	var estValide = true;
	if(lngCourriel <= 5){ //longueur minimum d'une adresse de courriel
		estValide = false;
	}
	else{
		strReEmailValide	=	"/^([a-zA-Z0-9._-]+@)";		// utilisateur@
		strReEmailValide +=	"([a-zA-Z0-9.-]+[.])+";		// domaine.
		strReEmailValide +=	"([a-zA-Z0-9.-]{2,4})$/";	// tld
		var	reEmailValide	=	eval(strReEmailValide);
		// vérifie si	l'adresse	est	composée uniquement
		// de	caractères valides et	si elle	est	dans le
		// format	"utilisateur@domaine.tld"
		if (!reEmailValide.test(courriel)) 
			estValide = false;
	}
	return estValide;
}


/***********************************************************
 Cette fonction retire les espaces blanc au début et 
 à la fin de la chaine de caractère                     
***********************************************************/
function trim(uneChaine){
	if(uneChaine && uneChaine.length > 0){
		var espaceBlanc = ' ';
		var indiceBoucle = 0;
		//retrait des espaces blanc au début
		while(indiceBoucle < uneChaine.length && uneChaine.charAt(indiceBoucle) == espaceBlanc){
			indiceBoucle++;
		}
		uneChaine = uneChaine.substring(indiceBoucle);
		//retrait des espaces blanc à la fin 
		indiceBoucle = uneChaine.length-1;
		if(indiceBoucle > 0){
			while(indiceBoucle >= 0 && uneChaine.charAt(indiceBoucle) == espaceBlanc){
				indiceBoucle--;
			}
			uneChaine = uneChaine.substring(0,indiceBoucle+1);
		}
	}
	return uneChaine;
}			

/***********************************************************
  Cette fonction vérifie si la valeur est a null, si c'est
  le cas, elle remplace la valeur par la valeurDefaut
***********************************************************/
function nullToString(str, valeurDefaut){
	if ((""+str == "null") || (str == null) || (str == "Non applicable") || 
		(str == "non applicable") || (""+str == "undefined") || (""+str == "")) 				{
		return valeurDefaut;
	}
	else{
		return str;
	}
} 
