/*
#################################################
## TITRE:	Librairie de validation de formulaire & soumission AJAX
## VERSION:	1.0
## DATE:	Mai 2009
## LANGUAGE:JavaScript
## AUTEUR:	Francois Mazerolle 
##			fmaz008@gmail.com
##
## DESCRIPTION:
## Ce système valide le formulaire et soumet
## en AJAX(POST) à une page pour ensuite afficher
## les données retournées par cette page dans un
## élément de la page actuelle.
##
## LICENCE D'UTILISATION:
## Droit d'utilisation attribués au projet Alu-Rex
## sans droit de réutilisation ou de reproduction
## autre que dans le cadre d'une sauvegarde.
## Toute utilisation exédant les limitation de 
## cette licence doit être approuvé par écrit
## par l'auteur et peut faire l'objet de frais
## supplémentaires.
#################################################


Comment installer le script:
-----------------------------
//Inclure les librairies:
<script src="../js/jquery-1.3.2.min.js" type="text/javascript"></script> //Peut être une version plus récente
<script src="../js/ajaxForm.js" type="text/javascript"></script>

//Ajouter l'évènement onsubmit sur votre formulaire:
<form action="submitForm.php" onsubmit="return submitForm(this, 'elemIdAModifier');"> 

elemIdAModifier : Il s'agit de l'ID de l'élément à l'intérieur duquel on désire que le
					contenu soit remplacé par celui recu de la page correspondant à
					l'attribut action du formulaire ( submitForm.php dans ce cas-ci )

Comment configurer le script:
------------------------------
// Il suffit d'attribuer des classes aux éléments INPUT du formulaire.
oblig			: Pour valider si l'élément est rempli (non-vide)
email			: Pour valider si l'adresse email est syntaxiquement exacte (implicite avec email1 et email2)
email1 & email2	: Pour valider si les 2 emails sont identique
pass1 & pass2	: Pour valider si les 2 mots de passes sont identique
checklist1		: Si vous avez une liste de case à cocher dont au moins 1 case doit être cochée

Exemple #1:
<input type="text" name="nawak" class="oblig email" />

Exemple #2:
<input type="text" name="bob" class="oblig pass1" />
<input type="text" name="jule" class="oblig pass2" />

Exemple #3:
<script type="text/javascript">ajaxForm_checkListMinSel = 2;</script>
<input type="checkbox" name="c1" class="checklist1" />
<input type="checkbox" name="c2" class="checklist1" />
<input type="checkbox" name="c2" class="checklist1" />
<input type="checkbox" name="c2" class="checklist1" />


Options globales:
-------------------------------
Les options globales peuvent être défini directement sur la page
afin de changer leur valeur par défaut, ou d'utiliser des valeurs
différentes selon la page sans modifier la librairie.
C'est ce qui est fait dans l'exemple 3
##############################################################
*/


// CONFIGURATION:

var ajaxForm_ErrorNo;

var ajaxForm_checkListMinSel = 1;

var ajaxForm_arrMsg = new Array();
ajaxForm_arrMsg[0] = "Vous devez remplir tous les champs requis du formulaire.";
ajaxForm_arrMsg[1] = "Vous devez saisir une adresse courriel valide.";
ajaxForm_arrMsg[2] = "Les adresses courriel doivent correspondre.";
ajaxForm_arrMsg[3] = "Les mots de passe doivent correspondre.";
ajaxForm_arrMsg[4] = "Vous devez choisir au moins un élément.";
ajaxForm_arrMsg[5] = "Vous devez cocher cet élément.";



//###############################################
// /!\ ATTENTION /!\
// TOUTE MODIFICATION DU CODE QUI SUIT EST À LA
// RESPONSABILITÉ DU CLIENT UNIQUEMENT.
//###############################################


function submitForm(formObj, updateElemId){

	
	if(checkForm(formObj)===false)
		return false;
	
	$.post(
			formObj.action,
			genParam(formObj),
 			function(data, textStatus){
 				if(textStatus!="success")
 					alert("Ajax Error");
 				else
 					$("#"+updateElemId).html(data);
	  		},
	  		"html"
	  	);
	return false;
}

function checkForm(formObj)
{
	var formValid = validateForm(formObj);
	if( formValid!==true)
	{
		formValid.focus();
		
		alert(ajaxForm_arrMsg[ajaxForm_ErrorNo]);
		return false;
	}
	
	return true;
}

function validateForm(formObj){
	var obj = false;
	
	$(".oblig:input", formObj).each(function(i) { //Tout les champs obligatoires
	
		$(this).css("background-color",""); //Mettre la couleur de fond par défaut (au cas ou on re-valide le formulaire
		
		//Validation de la syntaxe d'une adresse
		if($(this).hasClass("email") || $(this).hasClass("email1") || $(this).hasClass("email2")){
			var emailRegex = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
			str = this.value;
			if(!str.match(emailRegex)){
				if(obj===false){ //Retourner le premier élément comme fautif ( il sera focussé )
					obj = this;
					ajaxForm_ErrorNo = 1; //Vous devez entrer une adresse email valide
				}
			
				$(this).css("background-color","#FF6666"); //Mettre le fond de couleur
			}
		}
		
		
		//Valider les checkbox
		if(this.type=="checkbox" && !this.checked){
			if(obj===false){ //Retourner le premier élément comme fautif ( il sera focussé )
				obj = this;
				ajaxForm_ErrorNo = 5; //Vous devez cocher la case
			}
		}
		
		
		//Valider les champs texte
		if(this.type=="text" && trim(this.value)==""){
			if(obj===false){ //Retourner le premier élément comme fautif ( il sera focussé )
				obj = this;
				ajaxForm_ErrorNo = 0; //Vous devez remplir tous les champs
			}
			$(this).css("background-color","#FF6666"); //Mettre le fond de couleur
			//return false; //Break du each
		}
	});
	
	
	//Valider emails identiques
	if(obj===false){
		if ( $(".oblig.email1:input", formObj).length==1 && $(".oblig.email2:input", formObj).length==1 ){ //Si existant
			if($(".oblig.email1:input", formObj).val() != $(".oblig.email2:input", formObj).val()){ //Si !égal
				obj = $(".oblig.email1:input", formObj);
				ajaxForm_ErrorNo = 2;
			}
		}
	}
	
	//Valider mots de passe identique
	if(obj===false){
		if ( $(".oblig.pass1:input", formObj).length==1 && $(".oblig.pass2:input", formObj).length==1 ){ //Si existant
			if($(".oblig.pass1:input", formObj).val() != $(".oblig.pass2:input", formObj).val()){ //Si !égal
				obj = $(".oblig.pass1:input", formObj);
				ajaxForm_ErrorNo = 3;
			}
		}
	}	
	
	//Liste de case à cocher dont ont doit sélectionner au moins {ajaxForm_checkListMinSel} case(s)
	var found=0;
	if(obj===false){
		if ( $(".checklist1:input", formObj).length>0 ){
			$(".checklist1:input", formObj).each(function(i) { //Tout les champs obligatoires
				if(obj===false)
					obj = this;
					
				if(this.checked)
					found++;
			});
			
			if(found<ajaxForm_checkListMinSel)
				ajaxForm_ErrorNo = 4;
			else
				obj = false;
		}
	}
	
	return (obj===false) ? true : obj;
}


function genParam(formObj){
	var params = "";
	var firstElem = true;
	$(":input", formObj).each(function(i) {
		if(this.type=="checkbox"){
			if(this.checked){
				if(!firstElem)
						params += "&";
				params += this.name + "=" + encodeURIComponent(this.value);
				firstElem = false;
			}
				
		}else{
			if(!firstElem)
						params += "&";
			params += this.name + "=" + encodeURIComponent(this.value);
			firstElem = false;
		}
		
	});
	return params;
}

/**
 * @source: http://blog.stevenlevithan.com/archives/faster-trim-javascript
 */
function trim(str)
{
	str = str.replace(/^\s+/, '');
	for (var i = str.length - 1; i >= 0; i--)
	{
		if (/\S/.test(str.charAt(i)))
		{
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;
}
