/****** BEGIN LICENSE BLOCK *****
 * 
 * Permet le controle automatique du formulaire. Est appelé automatiquement sur l'evenement onsubmit du formulaire
 *
 * <label for="nom" class="isNotEmpty">* Nom :</label>
 * <input type="text" name="nom" id="nom">
 *
 * <label for="age" class="isInt">Age :</label>
 * <input type="text" name="age" id="age">
 *
 * <label for="password" class="isNotEmpty">* Mot de passe :</label>
 * <input type="text" name="password" id="password">
 *
 * <label for="confirmpass" class="isNotEmpty extendedCtrl">* Confirmation du mot de passe :</label>
 * <input type="text" name="confirmpass" id="confirmpass">
 *
 *
 ***** END LICENSE BLOCK ******/
 /**
  *
  * Indique toutes les erreur d'un coup
  *
  */

String.prototype.trim = function()
{
	return this.replace(/(^\s*)|(\s*$)/g, "");
}
String.prototype.removeSpaces= function () {
   return this.replace(/\s+/g,"");
}

  
function formControlListener(form) {
	var aFormCtrlSchemes = [["isNotEmpty","Veuillez renseigner le champ \"%s\"."],
		["isNotEmptyOr0","Veuillez renseigner le champ \"%s\"."],
		["isPostCode","Veuillez saisir un code postal valide."],
		["isCgvChecked","Veuillez valider les conditions générales des ventes."],
		["isInt","Veuillez saisir un nombre entier dans le champ \"%s\" ."],
		["isDate","Veuillez saisir la date au format \"jj/mm/aaaa\" dans le champ \"%s\" ."],
		["isFrenchPhoneNumber","Veuillez saisir un numéro de téléphone valide (10 chiffres sans espaces)"],
		["noAccentuedChar","Merci de ne pas sasir de caractères accentués dans le champ \"%s\" ."],
		["trim",""],
		["isEmail","Veuillez saisir un e-mail valide.<br/><br/>Première visite sur le site en tant qu'abonné ?<br/> Suivez le lien &laquo;besoin d'aide&raquo;.<br/><br/>"]];
	var cLabels = form.getElementsByTagName("label");
	var nField;
	var nFieldFocus=null;
	var bIsAllValid=true;
	for (var i=0; i<cLabels.length; i++) {
		var bIsValide = true;
		if ((cLabels[i].htmlFor=="") ||
			!(nField=document.getElementById(cLabels[i].htmlFor))) continue;
		for (var j=0;aFormCtrlSchemes[j]; j++) {
			if (hasClassName(cLabels[i],aFormCtrlSchemes[j][0])) {
				if (nField.disabled == false){
					if (!eval(aFormCtrlSchemes[j][0]+"(nField)")) {
						bIsValide = false;
						var textContent = getTextContent(cLabels[i]).replace(/\s{2,}/g," ");
						textContent = textContent.replace(/^[\s:*]+|[\s:*]+$/g,"");
						var message;
						message = aFormCtrlSchemes[j][1].replace("%s",textContent) + "\n";
						if (aFormCtrlSchemes[j][0]=="isCgvChecked"){
							alert(message);
						}else{
							printErrorMsg(nField,message);
						}
						break;
					}
				}
			}
		}
		if (bIsValide && hasClassName(cLabels[i],"extendedCtrl")) {
			bIsValide = eval("extendedCtrl_"+nField.id.replace(/[-:]/g,"")+"(nField)");
		}
		if (bIsValide==false && nFieldFocus == null) {
			nFieldFocus=nField;
			bIsAllValid=false;
		}
		if (bIsValide){
			setLabelHighlight(cLabels[i],false);
			setFieldHighlight(nField,false);
		}else{
			setLabelHighlight(cLabels[i],true);
			setFieldHighlight(nField,true);
		}
		
	}
    if (!bIsAllValid) {
    	try{
    		nFieldFocus.focus();
    	}catch(e){
    	//
    	}
    	// initialiser les tooltips ajoutés sur les champs en erreur
		tt_Init();
  	}
    return bIsAllValid;
}

function printErrorMsg(nField,message) {
	// mettre les erreurs en tooltips
	// ajouter le span avec le message ...
	var spanId = nField.id + '-err';
	var mondiv = document.getElementById(spanId);
	if (mondiv == null){
		mondiv=document.createElement("SPAN");
		mondiv.innerHTML=message;
		mondiv.id=spanId;
		mondiv.style.display="none";
		document.body.appendChild(mondiv);
	}else{
		mondiv.innerHTML=message;
	}	
	
//	nField.title=message;
	
	nField.onchange= function() {setFieldHighlight(this,false);};
	nField.onmouseover= function() {TagToTip(spanId,DELAY, 0,FADEIN,50,FADEOUT,300);};
	nField.onmouseout= function() {UnTip();};
//	tt_Init();
}

function trim(s) {s.value=s.value.trim();return true;}
function isNotEmpty(s) {return s.value.replace(/^\s.value+|\s.value+$/g,"")!="";}
function isNotEmptyOr0(s) {return (s.value.replace(/^\s.value+|\s.value+$/g,"")!="" && s.value!="0");}
function isInt(s) {return isNotEmpty(s)?parseInt(s.value, 10)==s.value:true;}
function isPostCode(s) {
	if (s.value==""){
		return true;
	}else{
		s.value=s.value.removeSpaces();
		if (s.value.search(/^([0-9]{5})$/) != -1)
			return true ;
	}
	return false ;
	}
function isFrenchPhoneNumber(s){
	if (s.value==""){
		return true;
	}else{
		s.value=s.value.removeSpaces();
		if (s.value.search(/^0[1-9][0-9]{8}$/) != -1)
			return true ;
	}
	return false ;
}
function isDate(s){
	if (s.value==""){
		return true;
	}else{
	    mot=s.value;
	    if (mot.length!=10){return false;}
	    else{
		    motjour=mot.substring(0,2);
		    motmois=mot.substring(3,5);
	    	motan=mot.substring(6,10);
	    	motsep=mot.charAt(2)+mot.charAt(5);
	    }
	    if (isNaN(motjour+motmois+motan)|| motan>3000 || motsep!="//"){
	    	return false;
	    } else {
	    	choix="";
		    if (motan-(parseInt(motan/4)*4)==0){
		    	choix="bi";
		    }
		    if (motan-(parseInt(motan/4)*4)==0&&motan-(parseInt(motan/100)*100)==0) {
			    choix="";
			}
			if (motan-(parseInt(motan/4)*4)==0&&motan-(parseInt(motan/400)*400)==0) {
				choix="bi";
			}
		    switch (motmois){
			    case "01":if(motjour<1 || motjour>31){return false;};
				    break;
			    case"02":if(choix=="bi"){if(motjour<1 || motjour>29){return false;}}
				    else{if(motjour<1 || motjour>28){return false;}};
				    break;
			    case "03":if(motjour<1 || motjour>31){return false;};
				    break;
			    case "04":if(motjour<1 || motjour>30){return false;};
				    break;
			    case "05":if(motjour<1 || motjour>31){return false;};
				    break;
			    case "06":if(motjour<1 || motjour>30){return false;};
				    break;
			    case "07":if(motjour<1 || motjour>31){return false;};
				    break;
			    case "08":if(motjour<1 || motjour>31){return false;};
				    break;
			    case "09":if(motjour<1 || motjour>30){return false;};
				    break;
			    case "10":if(motjour<1 || motjour>31){return false;};
				    break;
			    case "11":if(motjour<1 || motjour>30){return false;};
				    break;
			    case "12":if(motjour<1 || motjour>31){return false;};
				    break;
			    default:return false;
	    	}
	    }
	}
    return true;
}

function isEmail(s){
	if (s.value==""){
		return true;
	}else{
		if (s.value.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]{2,6}$/) != -1)
			return true ;
	}
	return false ;
}
function noAccentuedChar(s) {
	if (s.value==""){
		return true;
	}else{
		if (s.value.search(/[àáâãäåçèéêëìíîïðòóôõöùúûüýÿ]/i) == -1)
			return true ;
	}
	return false ;
}

function isCgvChecked(s) {return s.checked==true}
function hasClassName(oNode,className) {
    return ((" "+oNode.className+" ").indexOf(" "+className+" ")!=-1);
}
function hasStartClassName(oNode,startClassName) {
    return ((" "+oNode.className+" ").indexOf(" "+startClassName+"_")!=-1);
}
function getTextContent(oNode) {
	if (typeof(oNode.textContent)!="undefined") {return oNode.textContent;}
	switch (oNode.nodeType) {
		case 3: // TEXT_NODE
		case 4: // CDATA_SECTION_NODE
			return oNode.nodeValue;
			break;
		case 8: // COMMENT_NODE
		case 7: // PROCESSING_INSTRUCTION_NODE
			if (getTextContent.caller!=getTextContent) {
				return oNode.nodeValue;
			}
			break;
		case 9: // DOCUMENT_NODE
		case 10: // DOCUMENT_TYPE_NODE
		case 12: // NOTATION_NODE
			return null;
			break;
	}
	var _textContent = "";
	oNode = oNode.firstChild;
	while (oNode) {
		_textContent += getTextContent(oNode);
		oNode = oNode.nextSibling;
	}
	return _textContent;
}
/*
Ne fonctionne pas avec jsf... (onsubmit non appelé)
window.onload = function() {
  var cForms = document.forms;
  for (var i=0; cForms[i]; i++) {
    cForms[i].onsubmit = formControlListener;
  }
}
*/
function extendedCtrl_nfformconfirm_mp(nField) {
  var result = true;
  if (nField.value!=document.getElementById("nfform:mp").value) {
    result = false;
	printErrorMsg(nField,'La confirmation du mot de passe doit être identique à la valeur saisie dans le champ "Mot de passe".\n');
  }
  return result;
}
function extendedCtrl_nfformconfirm_identifiant(nField) {
  var result = true;
  if (nField.value!=document.getElementById("nfform:identifiant").value) {
    result = false;
	printErrorMsg(nField,'La confirmation de l\'email doit être identique à la valeur saisie dans le champ "E-mail".\n');
  }
  return result;
}
function extendedCtrl_nfform2passeabonneconf(nField) {
  var result = true;
  if (nField.value!=document.getElementById("nfform2:passe-abonne").value) {
    result = false;
	printErrorMsg(nField,'La confirmation du mot de passe doit être identique à la valeur saisie dans le champ "Mot de passe".\n');
  }
  return result;
}

/**
 * Set focus on the element of the given id.
 * @param id The id of the element to set focus on.
 */
function setFocus(id) {
    var element = document.getElementById(id);
    if (element && element.focus) {
        element.focus();
    }
}

/**
 * Set highlight on the elements of the given ids. It basically sets the classname of the elements
 * to 'highlight'. This require at least a CSS style class '.highlight'.
 * @param ids The ids of the elements to be highlighted, comma separated.
 */
	function setFieldsHighlight(ids) {
	    var idsArray = ids.split(",");
	    for (var i = 0; i < idsArray.length; i++) {
	        setFieldHighlight(document.getElementById(idsArray[i]),true);
	  	}
	}

	function setFieldHighlight(element,highlight) {
		addStyleClass(element,highlight,'fieldhighlight');
	}

	/**
	 * Ajoute ou supprime une class a un élément (sans supprimer les autres classes existantes)
	 *
	 */
	function addStyleClass(element,add,className) {
        if (element) {
       		var classes=element.className.split(' ');
       		var newclasses="";
       		var addClass=add;
       		for(var j=0;j<classes.length;j++){
 	      		if (classes[j]==className){
 	      			addHighlight=false;
 	      			if (add){
	  	      			newclasses=newclasses+classes[j]+" ";
	  	      		}
  	      		}else{
  	      			newclasses=newclasses+classes[j]+" ";
  	      		}
       		}
       		if (addClass){
  	      		newclasses=newclasses+className;
 	      	}
            element.className = newclasses;
        }
	}
	function setLabelsHighlight(ids) {
	    var idsArray = ids.split(",");
	    for (var i = 0; i < idsArray.length; i++) {
	        setLabelHighlight(document.getElementById(idsArray[i]),true);
	  	}
	}
	
	function setLabelHighlight(element,highlight) {
		addStyleClass(element,highlight,'labelhighlight');
	}
	
	function setLabelsHighlightByFieldIds(ids) {
	    var idsArray = ids.split(",");
		var cLabels = document.getElementsByTagName("label");
	    for (var i = 0; i < idsArray.length; i++) {
	        var nField=document.getElementById(idsArray[i]);
	        if (nField!=null){
				for (var j=0; j<cLabels.length; j++) {
					var bIsValide = true;
					var nFieldFor=null;
					if ((cLabels[j].htmlFor=="") ||
						!(nFieldFor=document.getElementById(cLabels[j].htmlFor)) ||
						nFieldFor!=nField) continue;
			        setLabelHighlight(cLabels[j],true);
		        }
		    }
	  	}
	}

	function verifDate(elt){
		formatDate = new RegExp("^[0-9]{2}/[0-9]{2}/[0-9]{4}$");
		if (elt.value.match(formatDate))
	 		return true;
		else
			return false;
	}
	
