/****************
* Validation de formulaires
******************/
var formval={
 defaultErrorMessage:"Ce champ est errone",
 defaultPosition:"beforefield",
 validationFunc:{
  required:function(field) {
   var returnMessage=true;
   switch(field.type) {
    case "text":
    case "file":
    case "password":
    case "textarea":
     if (field.value=="") returnMessage="text";
     break;
    case "checkbox":
    case "radio":
     var sameElt = formval.getSameElements(field);
     var onecheck=false;
     for (var i=0; i<sameElt.length; i++) {
      if (sameElt[i].checked)
       onecheck=true;
     }
     if (!onecheck) returnMessage=field.type;
     break;
    case "select-one":
    case "select-multiple":
     if(field.selectedIndex==0) 
      returnMessage="select";
     break;
   }
   return returnMessage;
  },
  messageEcard:function(field) {
   return (field.value=="");
  },
  email:function(field) {
  	/* il faut compter 5 caratere maxi pour le reste de la chaine (le @ et .xxx)*/
  	var longeurMaxnom=64;
  	var longeurMaxdom=64;
  	var reg=new RegExp("^[a-z0-9._-]{1,"+longeurMaxnom+"}@[a-z0-9.-]{2,"+longeurMaxdom+"}[.][a-z]{2,3}$","g")
   return (field.value=="" || !!field.value.match(reg));
  },
  pseudo:function(field) {
   return !!field.value.match(/^[a-zA-Z0-9_\-]{3,20}$/);
  },
  image:function(field) {
   return (field.value=="" || !!field.value.match(/^.+\.(gif|jpe?g|png)$/));
  },
  codepostal:function(field){
  	/* pour la Belgique, il faut 4 caracteres numeriques : */
  	if((location.href.indexOf("PAYS=34")!=-1&&location.href.indexOf("LANG=EN")==-1)  ||  location.href.indexOf("PAYS=289")!=-1) {
  		if(document.getElementById("paysGM") && document.getElementById("paysGM").value=="236") {return true;} /* Gestion Luxembourg */
  		return !!field.value.match(/^\d{4}$/); 
  	}
  	/* pour les Pays-Bas, il faut 4 chiffres, 1 espace optionnel puis 2 lettres  : */
  	if(location.href.indexOf("PAYS=314")!=-1) {return !!field.value.match(/^\d{4}([\s]?)([a-zA-Z0-9]{2})$/); }
  	/* pour le Canada, il faut 3 caracteres (parmi les valides), 1 espace puis 3 caracteres  : */
  	if(location.href.indexOf("PAYS=61")!=-1) {return !!field.value.match(/^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/); }
  	/* pour la Grande-Bretagne, il faut entre 5 et 8 caracteres : */
  	if(location.href.indexOf("PAYS=341")!=-1) {
  		if(document.getElementById("paysGM") && document.getElementById("paysGM").value=="90") {return true;} /* Gestion Danemark */
  		return !!field.value.match(/^[a-zA-Z0-9\s]{5,9}$/);
  	}
  	/* pour les US, il faut 5 chiffres + 5 caracteres facultatifs commencant par '-' : */
  	if(location.href.indexOf("PAYS=115")!=-1) {return !!field.value.match(/^\d{5}([\-]\d{4})?$/); }
  	/* pour Singapour et Inde, il faut 6 chiffres  */
  	if(location.href.indexOf("PAYS=362")!=-1  ||  location.href.indexOf("PAYS=190")!=-1) {return !!field.value.match(/^\d{6}$/); }
  	/* pour Japon, il faut 7 chiffres et un caractere facultatif : NNNFNNNN ( avec N : caractere numerique et F : caractere facultatif) */
  	if(location.href.indexOf("PAYS=206")!=-1) {return !!field.value.match(/^\d{3}.\d{4}$/); }
  	/* pour la Suisse ou l'Australie, il faut 4 caracteres numeriques : NNNN */
  	if(location.href.indexOf("PAYS=367")!=-1 || location.href.indexOf("PAYS=14")!=-1) {return !!field.value.match(/^\d{4}$/); }
  	/* pour le Portugal, il faut 7 chiffres et un caractere facultatif : NNNNFNNN ( avec N : caractere numerique et F : caractere facultatif) */
  	if(location.href.indexOf("PAYS=320")!=-1) {return !!field.value.match(/^\d{4}.\d{3}$/); }
  	/* pour l'argentine, il faut entre 4 et 8 caracteres */
  	if(location.href.indexOf("PAYS=12")!=-1) {return !!field.value.match(/^[a-zA-Z0-9\s]{4,8}$/); }
  	/* pour le Bresil, il faut 8 chiffres et un caractere facultatif : NNNNNFNNN ( avec N : caractere numerique et F : caractere facultatif) */
  	if(location.href.indexOf("PAYS=42")!=-1) {return !!field.value.match(/^\d{5}.\d{3}$/); }
	/* pour l'Afrique du Sud, il faut 4 ou 5 caractères :*/
	if(location.href.indexOf("PAYS=2")!=-1) {return !!field.value.match(/^[a-zA-Z0-9\s]{4,5}$/); }
	/* et pour la France :*/
   return !!field.value.match(/^\d{5}$/);
  },
	mobilenumber:function(field){
	  	if (field.value=="") return false;
	   	var prefixe = field.getAttribute("prefixe");
	   	var minlengthTel = field.getAttribute("minlength") ;
	   	var maxlengthTel = field.getAttribute("maxlength");
	   	
	   	minlengthTel = parseInt(minlengthTel) - prefixe.length;
	   	maxlengthTel = parseInt(maxlengthTel) - prefixe.length;
	   	if(prefixe == null || typeof prefixe == 'undefined' || prefixe == ""){
	   		prefixe = '';
	   	}
	   	if(minlengthTel == null || typeof minlengthTel == 'undefined' || minlengthTel == ""){
	   		minlengthTel = (field.size - prefixe.length);
	   	}
	   	if(maxlengthTel == null || typeof maxlengthTel == 'undefined' || maxlengthTel == ""){
	   		maxlengthTel = field.size - prefixe.length;
	   	}

	   	var reg=new RegExp("^("+prefixe+")[0-9]{"+minlengthTel+","+maxlengthTel+"}$", "g");
		  if ( !field.value.match(reg) ) {
		  	 field.style.color = "red";
		  	 return false;
		  }
		  return true;
	},
  phonenumber:function(field){
   	if (field.value=="") return true;
   	var minlengthTel = field.getAttribute("minlength");
   	var maxlengthTel = field.getAttribute("maxlength");
   	if(minlengthTel == null || typeof minlengthTel == 'undefined' || minlengthTel == ""){
   		minlengthTel = field.size;
   	}
   	if(maxlengthTel == null || typeof maxlengthTel == 'undefined' || maxlengthTel == ""){
   		maxlengthTel = field.size;
   	}
   	var reg=new RegExp("^[0-9]{"+minlengthTel+","+maxlengthTel+"}$", "g");
	return !!field.value.match(reg);
  },
  nom:function(field){ 
  	if (field.value=="") return true; 
  	return !!field.value.match(/^[a-zA-Z_\- \xC0-\xFF]{1,30}$/); 
  }, 
  prenom:function(field){ 
  	if (field.value=="") return true;
  	return !!field.value.match(/^[a-zA-Z_\- \xC0-\xFF]{1,20}$/); 
  }, 
  gm:function(field){ 
	if (field.value=="") return true; 
	return !!field.value.match(/^\d+$/); 
  },
  birthdateday:function(field){
   var bool = true;
   if (field.value=="") return true;
   else if(!field.value.match(/^\d{1,2}$/)) bool=false;
   else bool=(parseInt(field.value)<32);
   if(bool==false) {
   		alert(field.value+" : Date incorrecte !");
   		 var elm = document.getElementById("label_birth");
    	 elm.className+=" error";
   }
   return bool;
  },
  birthdatemonth:function(field){
  	var bool = true;
  	if (field.value=="")  return true;
  	if(!field.value.match(/^\d{1,2}$/))  bool=false;
    else bool=(parseInt(field.value)<13);
    if(bool==false){
    	 alert(field.value+" : Date incorrecte !");
    	 var elm = document.getElementById("label_birth");
    	 elm.className+=" error";
    }
   	return bool;
  },
  birthdateyear:function(field){
  	var bool = true;
  	if (field.value=="") return true;
  	else bool=!!field.value.match(/^\d{4}$/);
  	if ( parseInt(field.value) > (new Date()).getFullYear() ) { // si annee_naiss > annee_en_cours 
  			bool = false;
  	} else if ( parseInt(field.value) == (new Date()).getFullYear()  &&  
  						  parseInt(document.getElementById("birthMM").value) > ((new Date()).getMonth()+1) ) { // si annee_naiss==annee_en_cours  ET  mois_naiss>mois_en_cours
  					bool = false;
  			 } else if ( parseInt(field.value) == (new Date()).getFullYear()  &&  
  			 					   parseInt(document.getElementById("birthMM").value) == ((new Date()).getMonth()+1)  &&
  			 					   parseInt(document.getElementById("birthDD").value) >= (new Date()).getDate() ) { // si annee_naiss==annee_en_cours  ET  mois_naiss==mois_en_cours  ET  jour_naiss>=jour_en_cours
  			 				bool = false;
  			 		}
  	if(bool==false) {
  		alert(field.value+" : Date incorrecte !");
  		 var elm = document.getElementById("label_birth");
    	 elm.className+=" error";
    }
   	return bool;
  },
  minimum:function(field) {
   if (field.nodeName!="FIELDSET") return true;
   var minNum = field.getAttribute("minimum_num") || 1;
   var properties = field.getAttribute("minimum_field") || "text,femail";
   var properties = properties.split(/,/g);
   var inputs = field.getElementsByTagName("input");
   var counter = 0;
   for (var i=0; i<inputs.length; i++) {
    var x=inputs[i];
    if (x.type==properties[0] && new RegExp(properties[1]).test(x.name) && x.offsetHeight>0) {
     if (formval.validationFunc["required"](x)===true) {
      counter++;
     }
    }
   }
   return counter<minNum ? ([false,minNum]) : true;
  }
 },
 errorMessages:{
  required:{
   checkbox:"Cette case doit etre cochee",
   radio:"Vous devez selectionner une de ces options",
   text:"Attention, ce champ est obligatoire",
   select:"Vous devez selectionner au moins une option"
  },
  requiredoptional:this.required,
  emailDestinataire:"Cette adresse email est erronee",
  emailDest:"Cette adresse email est erronee",
  emailExp:"Cette adresse email est erronee",
  email:"Cette adresse email est erronee",
  codepostal:"Ce code postal est errone",
  birthdate : "La date de naissance ne peut contenir que des chiffres.",
  pseudo:'Attention, votre pseudo doit contenir uniquement 20 caracteres, des lettres et des numeros et les signes "_" et "-"',
  image:"Votre fichier n'est pas au bon format",
  minimum:"Vous devez remplir au moins ## champ"
 },
 getMessagePosition:function(field){
  var element=field;
  var position="";
  if (field.getAttribute("position")) {
   var position = field.getAttribute("position");
   if (!position.match(/^(before|after)(label|parentnode|field)$/)) {
     position = formval.defaultPosition;
   }
   var arrPos = position.match(/^(before|after)(label|parentnode|field)$/);
   switch(arrPos[2]) {
    case "label" : 
     var node = field;
     while(node.nodeName!="LABEL") {
      node=node.previousSibling;
     }
     if (node.nodeName=="LABEL") element=node;
     break;
    case "parentnode" : 
     var parentPos = field.getAttribute("parentnode_pos") ? parseInt(field.getAttribute("parentnode_pos")) : 1;
     var element=field;
     for (var i=0; i<parentPos; i++) {
      element=element.parentNode;
     }     
     break;
   }
   return [arrPos[1],element];
  } else {
   return [formval.defaultPosition.match(/(before|after)(label|parentnode|field)/)[1],element]
  }
 },
 getSameElements:function(field) { //return an array of elements in form who have same nodeName, name and type
  var aReturnElements=[];
  var elt=field.form.elements;
  for (var i=0; i<elt.length; i++) {
   if (elt[i].nodeName==field.nodeName && elt[i].name==field.name && elt[i].type==field.type) {
    aReturnElements.push(elt[i]);
   }
  }
  return aReturnElements;
 },
 check:function(theForm, showOnlyOneMessage, otherReturnValues) {
	var scrollTop = document.body.scrollTop;
	var finalErrorMessage="";
	var hasError=false;
	var elm = theForm.elements;
	for (var i=0; i<elm.length; i++) {
		var x=elm[i];
		if (x.getAttribute("validation")) {
			var validOptions = x.getAttribute("validation").split(/\s+/g);
			finalErrorMessage="";
			for (var j=validOptions.length-1; j>=0; j--) {
				if (typeof(formval.validationFunc[validOptions[j]])=="function") {
					var returnMessage = formval.validationFunc[validOptions[j]](x);
					var quantity = typeof(returnMessage)=="object" && returnMessage.length ? returnMessage[1] : 0;
					returnMessage = typeof(returnMessage)=="object" && returnMessage.length ? returnMessage[0] : returnMessage;
					if (returnMessage==false || typeof(returnMessage)=="string") { //si message erreur ou index de tableau associatif
						hasError=true;
						finalErrorMessage="";
						if (x.getAttribute(validOptions[j]+"_em")!=null) { //si le champ possede un message personnalise pour l'erreur alors on affihce
							finalErrorMessage=x.getAttribute(validOptions[j]+"_em");
						} else { //sinon
							if (typeof(returnMessage)=="string") { //si le message d'erreur est un index de tableau associatif
								finalErrorMessage=formval.errorMessages[validOptions[j]][returnMessage]; //on va chercher le message associe a cet index
							} else {
								if (formval.errorMessages[validOptions[j]] && typeof(formval.errorMessages[validOptions[j]])=="string") { //si le message d'error est false
									finalErrorMessage=formval.errorMessages[validOptions[j]]; //alors on retourne le message d'erreur associe
									if (quantity>0) finalErrorMessage=finalErrorMessage.replace(/\#\#/g,quantity);
								}
								else finalErrorMessage=formval.defaultErrorMessage; //sinon on affiche le message d'erreur par defaut pour tout champ
							}
						}
					} else {
						formval.clearMessage(x);
					}      
				}
			}
			if (finalErrorMessage!="") formval.showMessage(x, finalErrorMessage);
		}
	}
	document.body.scrollTop=scrollTop;
	var secondErrorValue=true;
	if (otherReturnValues) {
		if(typeof(otherReturnValues)=="boolean") {
			secondErrorValue=otherReturnValues;
		} else {
			for (var i=0; i<otherReturnValues.length; i++) {
				if (!otherReturnValues[i]) secondErrorValue = false;
			}
		}
	}
	if (showOnlyOneMessage) {
		var elm = document.getElementById(showOnlyOneMessage);
		if (hasError) {
			elm.className+=" errorAlertShow";
		} else {
			elm.className=elm.className.replace(/\berrorAlertShow\b/g,"");
		}
	}
	return (!hasError && secondErrorValue); //return true si aucune erreur sinon false;
 },
 checkIfErrorMessageBefore:function(field) {
  var node = field;
  var i=0;
  while(node.previousSibling && i<=2) {
   if (node.nodeType==1 && node.className.match(/\berrormsg\b/))
    return node;
   node=node.previousSibling;
   i++;
  }
  return null;
 },
 clearMessage:function(field) {
  if (field.getAttribute("typemessage") && field.getAttribute("typemessage")=="aspect") {
   if (field.getAttribute("rel") && field.getAttribute("rel")!="") {
    var elm = document.getElementById(field.getAttribute("rel"));
    elm.className = elm.className.replace(/\berror\b/g,"");
   }
  } else {
   if (field.associatedErrorMessage) {
    field.associatedErrorMessage.style.display="none";
   }
  }
 },
 insertAfter:function(parent, nodeToInsert, nodeInDom) {
  var node = parent.insertBefore(nodeToInsert, nodeInDom);
  parent.insertBefore(nodeInDom, nodeToInsert);
  return nodeToInsert;
 },
 showMessage:function(field, msg) {
  if (field.getAttribute("typemessage") && field.getAttribute("typemessage")=="aspect") {
   if (field.getAttribute("rel") && field.getAttribute("rel")!="") {
    var elm = document.getElementById(field.getAttribute("rel"));
    elm.className+=" error";
    var libMes= document.getElementById("msgerreur");
    if(libMes!=null){
    	libMes.style.display='';
    }
   }
  } else {
   if (!field.associatedErrorMessage) {
    if (!formval.checkIfErrorMessageBefore(field)) {
     var pos = formval.getMessagePosition(field);
     if (pos[0]=="before") {
      var msgField = pos[1].parentNode.insertBefore(document.createElement("span"),pos[1]);
     } else {
      var msgField = formval.insertAfter(pos[1].parentNode,document.createElement("span"),pos[1]);
     }
     msgField.className="errormsg";
     field.associatedErrorMessage=msgField;
    } else {
     field.associatedErrorMessage = formval.checkIfErrorMessageBefore(field);
    }
   }
   field.associatedErrorMessage.innerHTML=msg;
   field.associatedErrorMessage.style.display=""; 
   //<span class="errormsg">Attention, ce champ est obligatoire</span>
  }
 }
}

function blankField(obj, defaultval) {
	var myvalue = obj.value;

	if  (myvalue == defaultval) {
		obj.value = '';
	}
}

function pasDAutoParrainage(msgParainnage) {
	
	var nomParrain = document.getElementById("nomParrain").value;
	var prenomParrain = document.getElementById("prenomParrain").value;
	var emailParrain = document.getElementById("emailParrain").value;
	var nomFilleul = document.getElementById("nomFilleul").value.toUpperCase();
	var prenomFilleul = document.getElementById("prenomFilleul").value.toUpperCase();
	var emailFilleul = document.getElementById("emailFilleul").value;
	
	if(nomParrain=nomFilleul && prenomParrain==prenomFilleul && emailParrain==emailFilleul){
		alert(msgParainnage);
	 return false;
	}
	return true;
}


// this functin makes sure that that the birth year is valid
// i.e  birthYear is less or equal than current year
function isValidBirthDate(year, month, day) {
		return ( (year <= getFullYear(new Date()))  &&  (month <= getMonth(new Date()))  &&  (Day <= getDate(new Date())) );
}



//
function validMobileNumber(field){
  	if (field.value=="") return false;
   	var prefixe = field.getAttribute("prefixe");
   	var minlengthTel = field.getAttribute("minlength") ;
   	var maxlengthTel = field.getAttribute("maxlength");
   	alert("validMobileNumber 1 : \nminlengthTel = " + minlengthTel + "\nmaxlengthTel = " + maxlengthTel + "\nprefixe = " + prefixe);
   	minlengthTel = parseInt(minlengthTel) - prefixe.length;
   	maxlengthTel = parseInt(maxlengthTel) - prefixe.length;
   	if(prefixe == null || typeof prefixe == 'undefined' || prefixe == ""){
   		prefixe = '';
   	}
   	if(minlengthTel == null || typeof minlengthTel == 'undefined' || minlengthTel == ""){
   		minlengthTel = (field.size - prefixe.length);
   	}
   	if(maxlengthTel == null || typeof maxlengthTel == 'undefined' || maxlengthTel == ""){
   		maxlengthTel = field.size - prefixe.length;
   	}
   	alert("validMobileNumber : \nminlengthTel = " + minlengthTel + "\nmaxlengthTel = " + maxlengthTel + "\nprefixe = " + prefixe);
   	var reg=new RegExp("^("+prefixe+")[0-9]{"+minlengthTel+","+maxlengthTel+"}$", "g");
	  if ( !field.value.match(reg) ) {
	  	 field.style.color = "red";
	  	 return false;
	  }
	  return true;
}

