

// ####################################
// fonctions contructeur :: debut
//
if(navigator.appVersion.indexOf("Mac")!=-1){isMac=true}else{isMac=false};

function Validator(frmname){
  this.formobj=document.forms[frmname];
	if(!this.formobj){
	  alert("Erreur: Objet du formulaire "+frmname+" introuvable");
		return;
	}
	if(this.formobj.onsubmit){
	 this.formobj.old_onsubmit = this.formobj.onsubmit;
	 this.formobj.onsubmit=null;
	}else{
	 this.formobj.old_onsubmit = null;
	}
	this.formobj.onsubmit=form_submit_handler;
	this.addValidation = add_validation;
	this.setAddnlValidationFunction=set_addnl_vfunction;
	this.clearAllValidations = clear_all_validations;
}



function set_addnl_vfunction(functionname){
  this.formobj.addnlvalidation = functionname;
}


function clear_all_validations(){
	for(var itr=0;itr < this.formobj.elements.length;itr++){
		this.formobj.elements[itr].validationset = null;
	}
}


function form_submit_handler(){
	for(var itr=0;itr < this.elements.length;itr++){
		if(this.elements[itr].validationset && !this.elements[itr].validationset.validate()){return false;}
	}
	if(this.addnlvalidation){
	  str =" var ret = "+this.addnlvalidation+"()";
	  eval(str);
    if(!ret) return ret;
	}
	return true;
}


function add_validation(itemname,descriptor,errstr,page,bookmark){
	if(!this.formobj){
	  alert("Erreur: Objet mal initialisé");
		return;
	}
	var itemobj = this.formobj[itemname];
	if(!itemobj){
	  alert("Erreur: Objet de saisi "+itemname+" introuvable");
		return;
	}
	if(!itemobj.validationset){
	  itemobj.validationset = new ValidationSet(itemobj);
	}
  itemobj.validationset.add(descriptor,errstr,page,bookmark);
}



function ValidationDesc(inputitem,desc,error,page,bookmark){
  this.desc=desc;
	this.error=error;
	this.page=page;
	this.bookmark=bookmark;
	this.itemobj = inputitem;
	this.validate=vdesc_validate;
}



function vdesc_validate(){
 if(!V2validateData(this.desc,this.itemobj,this.error,this.page,this.bookmark)){
    this.itemobj.focus();
		return false;
 }
 return true;
}


function ValidationSet(inputitem){
  this.vSet=new Array();
	this.add= add_validationdesc;
	this.validate= vset_validate;
	this.itemobj = inputitem;
}



function add_validationdesc(desc,error,page,bookmark){
	this.vSet[this.vSet.length] = new ValidationDesc(this.itemobj,desc,error,page,bookmark);
}



function vset_validate(){
	for(var itr=0;itr<this.vSet.length;itr++){
		if(!this.vSet[itr].validate()){
			return false;
		}
	}
	return true;
}

// 
// fonctions contructeur :: fin
// ####################################



// ####################################
// fonction appelé par la routine principale
//

// pour le positionnement de la page 
function goTo(page,sAnchorIN){
		sParameters = "#" + sAnchorIN;
		location.href = page + sParameters;
}

// validation Email
function validateEmailv2(email)
{
// a very simple email validation checking. 
// you can add more complex email checking if it helps 
    if(email.length <= 0)
	{
	  return true;
	}
    var splitted = email.match("^(.+)@(.+)$");
    if(splitted == null) return false;
    if(splitted[1] != null )
    {
      var regexp_user=/^\"?[\w-_\.]*\"?$/;
      if(splitted[1].match(regexp_user) == null) return false;
    }
    if(splitted[2] != null)
    {
      var regexp_domain=/^[\w-\.]*\.[A-Za-z]{2,4}$/;
      if(splitted[2].match(regexp_domain) == null) 
      {
	    var regexp_ip =/^\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]$/;
	    if(splitted[2].match(regexp_ip) == null) return false;
      }// if
      return true;
    }
return false;
}




// validation bouton Radio
function valButton(btn,ErrorDiv,strError,page,bookmark){
    var cnt = -1;
    for (var i=btn.length-1; i > -1; i--){
			if (btn[i].checked){
				cnt = i;
				i = -1;
			}
    }
    if (cnt > -1){
			return true;
		}else{
			document.getElementById(ErrorDiv).innerHTML = strError;
			document.getElementById(ErrorDiv).style.display = "inline";
			goTo (page,bookmark);
if(isMac){alert(strError);}
			return false;
		}
}


// ####################################
//  Routine principale
// ####################################
function V2validateData(strValidateStr,objValue,strError,page,bookmark){ 
	var epos = strValidateStr.search("="); 
	var  command  = ""; 
	var  cmdvalue = ""; 
	if(epos >= 0){ 
		command  = strValidateStr.substring(0,epos); 
		cmdvalue = strValidateStr.substr(epos+1); 
	}else{ 
		command = strValidateStr; 
	} 
	switch(command){ 
		case "req": 
		case "required":
		{ 
			if(eval(objValue.value.length) == 0){ 
				if(!strError || strError.length ==0){ 
					strError = objValue.name + " : Required Field";
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				if(isMac){document.getElementById(ErrorDiv).style.visibility = "visible";}
				//goTo (page,bookmark);
				//alert(strError); 
//
if(isMac){
	//alert(strError);
}else{
	goTo (page,bookmark);
}
//
				return false; 
			}
			break;
		}

		case "maxlength":
		case "maxlen": 
		{ 
			if(eval(objValue.value.length) >  eval(cmdvalue)){
				if(!strError || strError.length ==0){ 
					strError = objValue.name + " : maximum de "+cmdvalue+" charactères permis"; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError + "\n[Nombre de charactères actuel = " + objValue.value.length + " ]"); 
if(isMac){alert(strError);}
				return false; 
			}
			break; 
		}
		
		
		case "minlength": 
		case "minlen": 
		{ 
			if(eval(objValue.value.length) <  eval(cmdvalue)){ 
				if(!strError || strError.length ==0){ 
					strError = objValue.name + " : manimum de "+cmdvalue+" charactères permis "; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError + "\n[ Nombre de charactères actuel = " + objValue.value.length + " ]"); 
if(isMac){alert(strError);}
				return false;
			}
			break; 
		}
		
		
		case "alnum": 
		case "alphanumeric": 
		{
			var charpos = objValue.value.search("[^A-Za-z0-9]"); 
			if(objValue.value.length > 0 &&  charpos >= 0){ 
				if(!strError || strError.length ==0){ 
					strError = objValue.name+": Seul des charactères alpha-numérique sont permis "; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError + "\n [ Erreur à la position " + eval(charpos+1)+" ]"); 
if(isMac){alert(strError);}
				return false; 
			}
			break; 
		}
		
		
		case "num": 
		case "numeric": 
		{ 
			var charpos = objValue.value.search("[^0-9]"); 
			if(objValue.value.length > 0 &&  charpos >= 0){ 
				if(!strError || strError.length ==0){
					strError = objValue.name+": Seul des charactères numérique sont permis "; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError + "\n [ Erreur à la position " + eval(charpos+1)+" ]"); 
if(isMac){alert(strError);}
				return false; 
			}
			break;
		}
		
		
		case "alphabetic": 
		case "alpha": 
		{ 
			var charpos = objValue.value.search("[^A-Za-z]"); 
			if(objValue.value.length > 0 &&  charpos >= 0){ 
				if(!strError || strError.length ==0){ 
					strError = objValue.name+": Seul des charactères alphabetique sont permis "; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError + "\n [ Erreur à la position " + eval(charpos+1)+" ]"); 
if(isMac){alert(strError);}
				return false; 
			}
			break; 
		}
		
		
		case "alnumhyphen":
		{
			var charpos = objValue.value.search("[^A-Za-z0-9\-_]"); 
			if(objValue.value.length > 0 &&  charpos >= 0){ 
				if(!strError || strError.length ==0){
					strError = objValue.name+": Seul les charactères A-Z, a-z, 0-9, - et _  sont permis "; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError + "\n [ Erreur à la position " + eval(charpos+1)+" ]"); 
if(isMac){alert(strError);}
				return false; 
			}
			break;
		}
		
		
		case "email": 
		{ 
			if(!validateEmailv2(objValue.value)){
				if(!strError || strError.length ==0){
					strError = objValue.name+": veuillez inscrire une adresse courriel valide "; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError); 
if(isMac){alert(strError);}
				return false; 
			}
			break; 
		}
		
		
		case "lt": 
		case "lessthan": 
		{ 
			if(isNaN(objValue.value)){
				alert(objValue.name+": doit etre un nombre "); 
				return false; 
			} 
			if(eval(objValue.value) >=  eval(cmdvalue)){ 
				if(!strError || strError.length ==0){ 
					strError = objValue.name + " : la valeur doit etre moin de "+ cmdvalue; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError); 
if(isMac){alert(strError);}
				return false;
			}
			break; 
		}
		
		
		case "gt": 
		case "greaterthan": 
		{ 
			if(isNaN(objValue.value)){ 
				alert(objValue.name+":  doit etre un nombre "); 
				return false; 
			}
			if(eval(objValue.value) <=  eval(cmdvalue)){ 
				if(!strError || strError.length ==0){
					strError = objValue.name + " : la valeur doit etre plus de "+ cmdvalue; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError); 
if(isMac){alert(strError);}
				return false;
			}
			break; 
		}


		case "regexp": 
		{ 
		/* 
		-------------------------------------
			in form use '\\' insted of '\' for phone num. 
			validation : 555-555-5555 use (^\\d{3}-\\d{3}-\\d{4}$)
		------------------------------------------	
		*/		
			if(objValue.value.length > 0){
				if(!objValue.value.match(cmdvalue)){
					if(!strError || strError.length ==0){
						strError = objValue.name+": Caractères invalide trouvés "; 
					}
					ErrorDiv = objValue.name + 'Err';
					document.getElementById(ErrorDiv).innerHTML = strError;
					document.getElementById(ErrorDiv).style.display = "inline";
					goTo (page,bookmark);
					//alert(strError); 
if(isMac){alert(strError);}
					return false;
				}
			}
      break; 
		}
		
		
		case "dontselect": 
		{ 
			if(objValue.selectedIndex == null){ 
				alert("Erreur: Méthode dontselect non applicable pour cet élément"); 
				return false; 
			}
			if(objValue.selectedIndex == eval(cmdvalue)){ 
				if(!strError || strError.length ==0){
					strError = objValue.name+": Veuillez sélectionner une option "; 
				}
				ErrorDiv = objValue.name + 'Err';
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				if(isMac){document.getElementById(ErrorDiv).style.visibility = "visible";}
				//goTo (page,bookmark);
				//alert(strError); 
//
if(isMac){
	//alert(strError);
}else{
	goTo (page,bookmark);
}
//
				return false;
			}
			break; 
		}
	}
	return true; 
}






// ####################################
// autres fonctions diveresses
// ####################################


// Validation d'un Bouton Radio
function getSelectedRadio(buttonGroup) {
   // returns the array number of the selected radio button or -1 if no button is selected
   if (buttonGroup[0]) { // if the button group is an array (one button is not an array)
      for (var i=0; i<buttonGroup.length; i++) {
         if (buttonGroup[i].checked) {
            return i
         }
      }
   } else {
      if (buttonGroup.checked) { return 0; } // if the one button is checked, return zero
   }
   //no radio button is selected
   return -1;
} 



function getSelectedRadioValue(buttonGroup) {
   // returns the value of the selected radio button or "" if no button is selected
   var i = getSelectedRadio(buttonGroup);
   if (i == -1) {
      return "";
   } else {
      if (buttonGroup[i]) { // Make sure the button group is an array (not just one button)
         return buttonGroup[i].value;
      } else { // The button group is just the one button, and it is checked
         return buttonGroup.value;
      }
   }
} 

function RadioButtonIsChecked(buttonGroup){
    var radioObj = document.getElementsByName(buttonGroup);
    for(var i = 0; i < radioObj.length; i++){
        if(radioObj[i].checked == true){return true;}
    }
    alert("\"Community\" are required radio buttons.")
    return false;
}


// ####################################
// ** Validation d'un Checkbox
// ####################################
function getSelectedCheckbox(buttonGroup){
	var retArr = new Array();
	var lastElement = 0;
	if (buttonGroup[0]){
		for (var i=0; i<buttonGroup.length; i++){
			if (buttonGroup[i].checked){
				retArr.length = lastElement;
				retArr[lastElement] = i;
				lastElement++;
			}
		}
	}else{
		if (buttonGroup.checked){
			retArr.length = lastElement;
			retArr[lastElement] = 0;
		}
	}
	return retArr;
}


function getSelectedCheckboxValue(buttonGroup){
	var retArr = new Array(); // set up empty array for the return values
	var selectedItems = getSelectedCheckbox(buttonGroup);
	if (selectedItems.length != 0){
		retArr.length = selectedItems.length;
		for (var i=0; i<selectedItems.length; i++){
			if (buttonGroup[selectedItems[i]]){
				retArr[i] = buttonGroup[selectedItems[i]].value;
			}else{
				retArr[i] = buttonGroup.value;
			}
		}
	}
	return retArr;
}


// ####################################
//  retourne le nombre de Boite selectionnée
// ####################################
function countSelectBox(formField){
	var checkedArr = new Array();
	checkedArr = getSelectedCheckbox(formField);
	return checkedArr.length;
}	


// ####################################
//  fonction commune
//  verifie si le champ est vide
// ####################################
function isEmptyFld(formField)
{
	var result = false;
	if (formField.value == "") result = true;
return result;
}

function isRequiredFld(formField,ErrorDiv,strError,page,bookmark)
{
	if(eval(formField.value.length) == 0){ 
		document.getElementById(ErrorDiv).innerHTML = strError;
		document.getElementById(ErrorDiv).style.display = "inline";
		goTo (page,bookmark);
		if(isMac){alert(strError);}
		formField.focus();
		return false;
	}
	return true;
}




// validation Email
function isValidEmail(formField,ErrorDiv,strError,page,bookmark){
	if(!validateEmailv2(formField.value)){
				document.getElementById(ErrorDiv).innerHTML = strError;
				document.getElementById(ErrorDiv).style.display = "inline";
				goTo (page,bookmark);
				//alert(strError); 
				if(isMac){alert(strError);}
	return false; 
	formField.focus();
	}
	return true;
}



// ####################################
//  valide la selection d'un Bouton Radio
//  et transfert la valeur dans storageField
// ####################################
function StoreRadioSelected(formField,msg,storageField) {
var groupChecked 
	var result = true;
	
	groupChecked = getSelectedRadio(formField);
	if(groupChecked == -1){
			alert(msg);
			result = false;
		}
	if(result) {
		storageField.value = getSelectedRadioValue(formField);
		result = true;
	}
return result;
}


// ####################################
//  validation d'un type date
// ####################################
function isValidDate(formField,spliter)
{
	var result = true;
	var elems = formField.value.split(spliter);
	// doit avoir 3 elements
	result = (elems.length == 3); 
	if (result){
		// ** format DD-MM-YYYY
		var day = parseInt(elems[0], 10);
		var month = parseInt(elems[1], 10);
		var year = parseInt(elems[2], 10);
		result = (!isNaN(month) && (month > 0) && (month < 13)) && (!isNaN(day) && (day > 0) && (day < 32)) && (!isNaN(year) && (elems[2].length == 4));				
	}
  if (!result) return false;
	return result;
}




// ####################################
//  validation du format num. tel.
// ####################################
function IsValidPhone(formField,spliter)
{
	var result = true;
	var elems = formField.value.split(spliter);
	// doit avoir 3 ou 4 elements
	result = (elems.length == 3) || (elems.length == 4); 
 	if (result){
		// ** format 514-555-5555
		if (elems.length == 3){
			var codeRegional = parseInt(elems[0], 10);
			var phonePart1 = parseInt(elems[1], 10);
			var phonePart2 = parseInt(elems[2], 10);
			result = !isNaN(codeRegional) && (elems[0].length == 3) && !isNaN(phonePart1) && (elems[1].length == 3) &&	!isNaN(phonePart2) && (elems[2].length == 4);
		}
		// ** format 1-800-555-5555			
		if (elems.length == 4){
			//alert ("in elems.length == 4");	
			var freeCall = parseInt(elems[0], 10);
			var codeRegional = parseInt(elems[1], 10);
			var phonePart1 = parseInt(elems[2], 10);
  		var phonePart2 = parseInt(elems[3]);
 			result =!isNaN(freeCall) && (elems[0].length == 1) && !isNaN(codeRegional) && (elems[1].length == 3) &&	!isNaN(phonePart1) && (elems[2].length == 3) &&	!isNaN(phonePart2) && (elems[3].length == 4);
		}
	if (!result) return false;
	}
	return result;
}
