/*--------------------------------------------------------------------------------------*/
// BBForms 0.5
// A developper:
//	- Regle pour les numeros de telephone en fonction du pays
//	- Check pour les numeros de telephone portable ?
//	- Regle pour les codes postaux en fonction du pays
//	- Check password -> definir les regles dans les BBSettings?
//	- Check nom de domaine
//	- Ameliorer le check des mails
//	- Implementer l appel des fonctions de check specifique
//	- Check des selects
//	- Check de l age
//	- Check de la longueur des valeurs
// BUGs
//	- Check de la date ne fonctionne pas sous Chrome
//	- A priori il y a aussi une erreur a identifiee sous Chrome sur la page de livraison
//	- IE6 genere une erreur si on lui indique des caracteres accentues dans les regExp
/*--------------------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------------------*/
// Dans le HTML
// Propriete pour la balise form

// check:			true/false
//					Indique si le formulaire doit etre checke avant le post

// haltOnError:		true/false
//					Inqique si on doit s arreter dans le check du form des la rencontre d une erreur

// checkFunction:	string
//					Fonction a executer pour le check des inputs en plus de la fonction de check standard

// errorDsp:		input/alert/overlay/layer/over

// 					input:		dans un layer positionne "autour" de l input
//					alert:		dans une fenetre d'alert js
//					overlay:	dans une popup js avec overlay
//					layer:		dans un layer dont l'ID est specifie dans checkFormErrorLayer
//								si aucun ID n'est specifie un layer est cree a la volee et insere juste avant le formulaire
//					over:		dans un tooltip au survol de l'input

// Propriete des balises input

// WARNING: La valeur d'un champ n'est pas postee si l'input n'a pas ses proprietes "check" et "required" renseignees

// required:		true/false
//					Champs requis ou pas. 
//					NB.: Un champ peut etre checke meme s il n est pas requis

// check:			?(expr)/alpha/aNum/num/mail/phone/zip/pass/date/cBox/true
//					?(expr):	regle specifique
//								L expression entre paranthese est evaluee
//								Les expressions entre [] sont remplacees par la valeur de l'input dont l'ID est la valeur entre []
//								?([mail1]==[mail2]) -> Verifie si la valeur de l'input dont l'id est "mail1" est egale a la valeur de l'input dont l'id est "mail2"
//					alpha:		characteres
//					aNum:		alpha numerique
//					num:		chiffre ou nombre
//					mail:		adresse email
//					phone:		numero de telephone(uniquement pour la france pour le moment, pas de difference entre portable, fax et fixe)
//					zip:		code postal(uniquement pour la france pour le moment)
//					pass:		password(a definir)
//					date:		date
//					cBox:		checkbox
//					true:		Verifie si la valeur de l'input n'est pas vide

// label:			String
//					Le label qui sera affiche dans les messages quand un input est en erreur

// msg:				String
//					Message a afficher si l input est en erreur.
//					Permet de renseigner des messages d erreurs plus specifiques que "Vous devez rentrez le champ: nom"
//					Ex.: Pour les CGVs, permet d afficher un message du genre "Vous devez acceptez les CGVs pour continuer"

// WARNING!!!		Si aucune de ces proprietes n est renseignee, l HTML du label dont la propriete "for" correspondant a l ID de l input est utilise
//					Ex.: <label for="nom">Votre nom</label> <input id="nom">
//						Si l input est en erreur le message d erreur affichera "Vous devez remplir le champ: Votre nom"

// target:			String
//					Permet de specifier l ID d un contener pour afficher le message d erreur
//					Peut servir a afficher des messages d erreur pour des inputs "hidden"

// process:			expression
//					Permet de specifier un pre-traitement de la valeur d un input avant de la checker
//					Les expressions entre [] sont remplacees par la valeur de l'input dont l'ID est la valeur entre []

//					Mix des fonctionnalites
//					Ex.: Date de naissance
//					On place 3 SELECTs dont les IDs respectifs sont "jour", "mois", "annee"
//					On rajoute un champ de type "hidden" dont l ID est date_naissance
//					On initialise son attribut "process" avec cette valeur "[jour]+[mois]+[annee]" et son attribut "check" a "date"
//					On initialise ensuite l attribut "msg" a "Vous devez saisir une date de naissance valide" et l attribut "target" a "birthDate_errorLayer" qui un div situe dans la page en dessous des SELECTs
//					Au moment du post du form, la valeur de l input "date_naissance" va etre reinitialisee avec la concatenation des valeurs des inputs dont les IDs sont "jour", "mois" et "annee"
//					La valeur ainsi recuperee sera checkee comme une date.
//					Si valeur est erronee le message "Vous devez saisir une date de naissance valide" sera affichee dans le layer dont l ID est "birthDate_errorLayer"
//					Si l affichage des messages d erreur du form est "over", on mettra le layer "birthDate_errorLayer" devrait entourer les SELECTs afin que l affichage du message d erreur se fasse au survol des 3 SELECTs
/*--------------------------------------------------------------------------------------*/

// Fonction de check des valeurs
function BBTool_check( type, inputValue) {


	//On test si le type de check a effectuer n est pas une formule
	if(type.indexOf("?")!=-1) {
		// On recupere la formule en virant le "?"
		var rule = type.slice(1,type.length);
			type = "rule";
	}
	switch(type) {
	
		// Formule
		// Les formules commencent par un ? et sont notees entre ()
		// Les expressions entre [] sont remplacees par les valeurs des champs dont le nom est indique entre []
		// Ex: [mail]==[mail2] -> Test si la valeur du champ dont l'ID est "mail" est la meme que celle du champ dont l'ID est "mail2"
		case "rule":
			var regExp = /\[([^\]]+)\]/g;
			return !eval(rule.replace(regExp, "$('#$1').attr('value')"));
			break;
			
		// Texte uniquement
		case "alpha":
		  	//return !inputValue.match("/^[a-zA-Z-' éèêïîëôûüàâöäèòìóñÑ]+$/");
			//return !inputValue.match(/^[a-zA-Z-' ]+$/);
			return false;
			break;
			
		// Alpha numerique
		case "aNum":
			return !inputValue.match(/^[0-9a-zA-Z-' ]+$/);
			break;
			
		// Numerique
		case "num":
			return !inputValue.match(/^[0-9]+$/);
			break;
			
		// Adresse email
		case "mail":
			
			var invalidChars	= '\/\'\\ ";:?!()[]\{\}^|';
			var atPos			= inputValue.indexOf('@',0);
			var suffix			= inputValue.substring(inputValue.lastIndexOf('.')+1);
			for (i=0; i<invalidChars.length; i++) {
	   			if (inputValue.indexOf(invalidChars.charAt(i),0) > -1) return true
			}
			for (i=0; i<inputValue.length; i++) {
	   			if (inputValue.charCodeAt(i)>127) return true;
	   		}
			if (atPos <= 0 || inputValue.indexOf('@', atPos + 1) > - 1 || inputValue.indexOf('.', atPos) == -1 || inputValue.indexOf('@.',0) != -1 || inputValue.indexOf('.@',0) != -1 || inputValue.indexOf('..',0) != -1) 
				return true;
			if (suffix.length != 2 && suffix != 'com' && suffix != 'net' && suffix != 'org' && suffix != 'edu' && suffix != 'int' && suffix != 'mil' && suffix != 'gov' && suffix != 'arpa' && suffix != 'biz' && suffix != 'aero' && suffix != 'name' && suffix != 'coop' && suffix != 'info' && suffix != 'pro' && suffix != 'museum')
				return true;
			return false;
			break;
			
		// Numero de telephone
		case "phone":
			var inputValue = inputValue.replace(/ /g, "");
				inputValue = inputValue.replace(/\./g, "");
				inputValue = inputValue.replace(/\-/g, "");
			if (BBVars.currentCountry == 'fr' && inputValue.length != 10) return true;
		  	return !inputValue.match(/^[0-9]+$/);
			break;
			
		// Code postal
		case "zip":
			if(BBVars.currentCountry == 'fr') {
				if (inputValue.length != 5 || !inputValue.match(/^[0-9]+$/)) return true;
			}
			return false;
		
		// Mot de passe
		case "pass":
			/*if(BBVars.currentCountry == 'fr') {
				if (inputValue.length != 5 || !inputValue.match(/^[0-9]+$/)) return true;
			}*/
			return false;
			
		// Date
		case "date":
			var inputValue = inputValue.replace(/ /g, "");
				inputValue = inputValue.replace(/\./g, "");
				inputValue = inputValue.replace(/\-/g, "");
				inputValue = inputValue.replace(/\//g, "");
				inputValue = inputValue.replace(/\\/g, "");
			if(BBVars.currentCountry == 'fr') {
				if (inputValue.length != 8 || !inputValue.match(/^[0-9]+$/)) return true;
			}
			return false;
			
		// Checkbox
		case "cBox":
			return !inputValue;
			break;
		default:
			return false;
			break;
	}
	return false;
}

// Fonction de manipulation des valeurs d inputs
function BBTool_processInput(input, inputs) {

	// On applique la formule passe en parametre a la valeur de l input
	// Les expressions entre [] sont remplacees par la valeur de l input dont l id est indique entre []
	var regExp = /\[([^\]]+)\]/g;
	var inputProcess = $(input).attr("process");
	var inputValue = eval(inputProcess.replace(regExp, "$('#$1').attr('value')"));
	
	// On reatribut a l input HTML la valeur manipulee pour permettre a cold de la traiter apres le post
	$(input).attr("value",inputValue);

}

function TTip_out() {
	
}

function TTip_hover( event, msg ) {

	var scrollPos = BBTool_getPageScroll();
	var toolTip = $("#"+BBSettings.defaultHintID);
	var tTipWidth = toolTip.width();
	var tTipHeight = toolTip.height();
			
	var xPos 	= (tTipWidth+event.pageX+20<BBVars.windowWidth+scrollPos[0])
				? event.pageX + 20
				: event.pageX - 20 - tTipWidth;
				
	var yPos 	= (tTipHeight+event.pageY+20<BBVars.windowHeight+scrollPos[1])
				? event.pageY + 20
				: BBVars.windowHeight + scrollPos[1] - tTipHeight;
	
	$("#"+BBSettings.defaultHintID)
			.html(msg)
			.css({"top": yPos + "px", "left": xPos + "px"})
			.show();
			
	/*$("#"+BBSettings.defaultHintID).html($(msg).wrap(BBSettings.defaultErrorMsgCont)).css({
		"top":		yPos + "px",
		"left":		xPos + "px",
		"display":	"block"
	});*/

}

// Fonction de gestion des messages d'erreur
function errorMsgHandler( input, msg, errorDspType) {

	$(input).addClass("error");
	
	if(typeof(msg) != undefined && msg != "") {

		switch(errorDspType) {
	
			// Layer autour de l'input
			case "input":

				// Si le contener du message d erreur n existe pas on le cree
				// On se base sur la classe pour la selection
				// L input ayant deja la classe error, si le contener existe deja la selection devrait retourner 2 elements
				if(jQuery(".error", jQuery(input).parent()).length==1) {
					jQuery(input).wrap(BBSettings.defaultErrorMsgCont)
						.after(jQuery(BBSettings.defaultErrorMsgTpl)
							.addClass("error")
							.text(msg)
						);
				} else {
					// Le contener du message d erreur est l element suivant dans le code HTML
					jQuery(input).next().html(msg);
				}
				return "";
				break;

			// Alert JS
			case "alert":
				return (msg + "\n");
				break;

			// Popup avec overlay
			case "overlay":

				// On met le template de message d erreur autour du message
				// On utilise un 'p' comme contener temporaire, on retourne l HTML qu il contient
				return jQuery("<p></p>").append(jQuery(BBSettings.defaultErrorMsgTpl).append(msg)).html();
				break;

			// Layer d'erreur
			case "layer":

				// On met le template de message d erreur autour du message
				// On utilise un 'p' comme contener temporaire, on retourne l HTML qu il contient
				return jQuery("<p></p>").append(jQuery(BBSettings.defaultErrorMsgTpl).append(msg)).html();
				break;

			// Tootlip sur l'input
			case "over":
			
				// Si le toolTiup n existe pas on le cree a la volee
				if($("#"+BBSettings.defaultHintID).length==0) {
					
					// On le met dans le body du doc et on initialise ses proprietes css(au cas ou elle ne le serait pas deja dans la css)
					// En prenant bien soin de mettre son display a 'none' afin qu il ne soit pas visible
					$('body').append(
						$('<div id="' + BBSettings.defaultHintID + '"></div>')
							.css({
								"position":	"absolute",
								"top":		"0",
								"left":		"0",
								"z-index":	10000,
								"display":	"none"
							})
					);
				}
				
				// On rajoute la gestion d evenements sur l input pour faire apparaitre le toolTip au survol
				$(input).css("cursor", "pointer")
						.bind("mouseenter mousemove mouseover focus mouseup mousedown click", function(e) {TTip_hover(e, msg);})
						.bind("mouseleave mouseout blur", function(e) {$("#"+BBSettings.defaultHintID).hide()});
				break;
	
			// Alert JS
			default:
				return "";
				break;
		}
		
	}
	
	return "";

}

// Fonction de check de l'ensemble des inputs
function BBTool_checkForm(formID, inputs, haltOnError, errorDspType, checkCallback) {

	/*
	var currentForm = jQuery("#"+formID);
	if(currentForm.length > 0) inputs = 
*/
	// On memorise l ID du form en train d etre checke
	BBVars.currentFormID = formID;
	
	
	// Erreur dans le formulaire
	var hasError = false;
	
	// Message d'erreur
	var inputErrorString = "";
	
	// Check de chaque input
	$(inputs).each( function() {
	
		// Recuperation du nom de l input pour l affichage des messages d erreur
		// Si l input n a pas de propriete "label", on recupere le contenu HTML du label dont la propriete "for" est la meme que la propriete "id" de l input
		var inputName		= ( $(this).attr("label")=="" || $(this).attr("label")==null ) ? $("label[for='"+$(this).attr("id")+"']").html() : $(this).attr("label");
		
		// Erreur pour l'input courant
		var inputError = false;	
		
		// Indique si l input est necessaire au post
		// Un input peut etre optionnel mais malgre tout check avant le post
		var inputRequired	= ( jQuery(this).attr("mandatory")=="true" ) ? true : false;
		
		// Type de check a effecteur sur la valeur de l input
		var inputCheck		= ( jQuery(this).attr("check")=="" || jQuery(this).attr("check")==null ) ? "" : jQuery(this).attr("check");
		
		// Message a affiche si la valeur saisie est incorrecte
		var inputMessage	= ( jQuery(this).attr("msg")=="" || jQuery(this).attr("msg")==null ) ? "" : jQuery(this).attr("msg");
		
		// Conteneur ou doit s'afficher le message d'erreur
		var inputMsgTarget	= ( jQuery(this).attr("target")=="" || jQuery(this).attr("target")==null ) ? this : jQuery("#"+jQuery(this).attr("target"));
		
		// Indique si la valeur a traiter doit d abord etre manipulee avant check
		// Ex: Date -> On construit la date avec les valeurs des inputs "jour", "mois", "annee"
		var inputProcess	= ( jQuery(this).attr("process")=="" || jQuery(this).attr("process")==null ) ? false : true;
		if(inputProcess) BBTool_processInput(jQuery(this));
 
		// Recuperation de la valeur definitive a traiter
		// Si c est une checkbox, on recupere l'attribut checked
		var inputValue		= ( jQuery(this).attr("type")=="checkbox" ) ? jQuery(this).attr("checked") : jQuery(this).attr("value");
		
		// Comme on est dans une boucle on ne lance pas de test supplementaire si on a deja des erreurs
		if(haltOnError&&hasError) return false;
		
		// Champ obligatoire valeur null ou vide
		else if(inputRequired) {
			if(inputValue==""||inputValue==null) {
				inputError = true;
				if(inputMessage=="") inputMessage = BBLabels.label_errorEmptyField + " " +inputName;
			} else {
				$.each( inputCheck.split(","), function( index, checkOp) {
					
					// On envoie la valeur et le check courant a effectuer
					if(BBTool_check(checkOp, inputValue)) {
						inputError = true;
						if(inputMessage=="") inputMessage = BBLabels.label_errorFieldValue + " " +inputName;
						if(haltOnError) return false;
					}
				});
			}
		
		// Si on a une valeur a checker
		} else if(inputValue!="") {
		
			// On effectue tous les checks pour la meme valeur
			$.each( inputCheck.split(","), function( index, checkOp) {
				
				// On envoie la valeur et le check courant a effectuer
				if(BBTool_check(checkOp, inputValue)) {
					inputError = true;
					if(inputMessage=="") inputMessage = BBLabels.label_errorFieldValue + " " +inputName;
					if(haltOnError) return false;
				}
			});
		}
		//alert(errorMsgHandler((inputMsgTarget)?$("#"+inputMsgTarget):this, inputMessage))
		hasError |= inputError;
		
		//BBTool_trace("<strong>checked</strong>:"+inputName+"<br><strong>error</strong>:"+inputError+"<br><strong>msg</strong>:"+inputMessage);
		
		if(inputError&&inputMessage!="") inputErrorString += errorMsgHandler(inputMsgTarget, inputMessage, errorDspType);
		else {
			switch(errorDspType) {
		
				// Layer autour de l'input
				case "input":
					if(jQuery(".error",jQuery(inputMsgTarget).parent()).length>0) 
						jQuery(inputMsgTarget).parent().replaceWith(jQuery(inputMsgTarget).removeClass("error"));
					break;
				
				// Tootlip sur l'input
				case "over":
					$("#"+BBSettings.defaultHintID).BBFadeOut();
					$(inputMsgTarget).removeClass("error")
						.unbind("mouseover")
						.unbind("mouseoleave")
						.unbind("mousemove");
						
				default:
					$(inputMsgTarget).removeClass("error")
					break;
					
			}
		}
		
		//alert(hasError+" "+inputError+" "+inputName+" "+inputMessage);
			
		//inputErrorString += errorMsgHandler((inputMsgTarget)?$("#"+inputMsgTarget):this, inputMessage, errorDspType);
	});
	
	if(hasError&&inputErrorString!="") {
		// Affichage des messages d'erreur
		switch(errorDspType) {
			// L affichage est deja fait, on ne fait rien
			case "input":
				break;
			// Alert JS
			case "alert":
				BBTool_openMsgBox(inputErrorString, false);
				break;
			// Popup avec overlay
			case "overlay":
				var popupData 		= '<div id="ajaxData" status="0" callback=""><div id="msgLabel">'+BBLabels.label_error+'</div><div id="msgBody">&nbsp;</div>';
					popupData		+= '<div id="msgData"><div class="msgData" target="none" append="false">' + inputErrorString;
					popupData		+= '</div></div></div>';
				BBTool_openMsgBox(jQuery(popupData), true);
				break;
			// Layer d'erreur
			case "layer":
				jQuery("#"+BBVars.currentFormID+BBSettings.checkFormErrorLayer)
						.html(jQuery(BBSettings.defaultErrorMsgCont).append(inputErrorString))
						.animate(
							{ height: jQuery("#"+BBVars.currentFormID+BBSettings.checkFormErrorLayer).contents().height() },
							BBSettings.defaultEffectSpeed
						);
				break;
			// Tootlip sur l'input
			case "over":
				break;
			// Alert JS
			default:
				BBTool_openMsgBox(inputErrorString, false);
				break;
		}
		
	}
	
	//if(inputError) BBTool_openMsgBox(inputErrorString, false);
	if($.isFunction(eval(checkCallback)))
		eval(checkCallback+"("+hasError+")");
	else
		return hasError;
		
}

function BBTool_formPost( formID, isAjax) {

	// Formulaire a poster
	var BBTool_form				= $("#"+formID);
		BBVars.currentFormID	= formID;

	// Action du formulaire / URL
	var BBTool_formAction		= BBTool_form.attr("action");

	// Type de check du formulaire
	//var BBTool_formCheck		= (BBTool_form.attr("check")=="true") ? true : false;
	var BBTool_formCheck		= (BBTool_form.attr("check")==null||BBTool_form.attr("check")=="false") ? false : BBTool_form.attr("check");

	// Arret du check sur une erreur
	var BBTool_haltOnError		= (BBTool_form.attr("haltOnError")=="true") ? true : false;

	// Fonction appelee pour le check du formulaire. Si non specifiee ou erronee utilise BBTool_checkForm() pour le check des champs
	var BBTool_checkFunction	= (BBTool_form.attr("checkFunction")=="") ? "BBTool_checkForm" : BBTool_form.attr("checkFunction");
	var BBTool_extCheck			= (BBTool_form.attr("checkFunction")=="") ? false : true;

	// L ensemble des "inputs" du formulaire (comprend les balises "hidden", "select", "textarea")
	var BBTool_formInputs		= $(":input[check]",BBTool_form);
	/*var html = "";
	$(BBTool_formInputs).each( function(i) {
		html += $(this).attr("name")+" "+$(this).attr("check")+" "+$(this).attr("value")+" "+$(this).attr("required")+"\n";
	})
	alert(html);*/

	// Si le form est checke en temps reel, on recupere les erreurs courantes
	var BBTool_formError		= (typeof(BBVars.currentFormError)!=undefined&&BBVars.currentFormError!="") ? BBVars.currentFormError : false;
	
	// On check si le form a une methode d affichage des messages d erreur specifique, ou on attribue la valeur par defaut des BBSettings
	var BBTool_errorDsp			= (BBTool_form.attr("errorDsp")==""||BBTool_form.attr("errorDsp")==null) ? BBSettings.checkFormErrorDsp : BBTool_form.attr("errorDsp");
	
	// Si aucune methode de check definie, on verifie dans les settings si une methode generale n est pas definie
	if(BBTool_form.attr("check")=="") 
		BBTool_formCheck = (typeof(BBSettings.checkFormErrorDsp)!=undefined) ? BBSettings.checkFormErrorDsp : false;

	// Recuperation du "template" a appliquer aux messages d'erreur
	if(typeof(BBSettings.defaultErrorMsgTpl)!=undefined) {
				
		// Récupération de l'ID du template en enlevant le ':'
		if(BBSettings.defaultErrorMsgTpl.indexOf(":")!=-1)
			BBVars.currentErrorMsgTpl = $("#" + BBSettings.defaultErrorMsgTpl.slice(1,BBSettings.defaultErrorMsgTpl.length));
			
		// Récupération de l'HTML du template en enlevant le '?'
		if(BBSettings.defaultErrorMsgTpl.indexOf("?")!=-1) 
			BBVars.currentErrorMsgTpl = BBSettings.defaultErrorMsgTpl.slice(1,BBSettings.defaultErrorMsgTpl.length);

	}
	
	// Si aucun "template" n a ete defini
	if(typeof(BBSettings.defaultErrorMsgTpl)==undefined||BBSettings.defaultErrorMsgTpl=="") {
	
		// Creation d un "template" par defaut a appliquer aux messages d'erreur
		BBVars.currentErrorMsgTpl = $(document.createElement("p")); //.css({"position":"relative","border":"1px solid red"});

	}
	
	// Si le formulaire doit etre checke et qu il n a pas ete checke en temps reel
	//if(BBTool_formCheck&&BBTool_formCheck!="rt") {
	if(BBTool_formCheck) {
		if(BBTool_formCheck||BBTool_formCheck=="std") {

			// On appelle la fonction de check si elle est definie avant les checks classiques
			if($.isFunction(eval(BBTool_checkFunction)) && BBTool_extCheck) 
				BBTool_formError = eval(BBTool_checkFunction+"(formID,BBTool_formInputs, BBTool_haltOnError,BBTool_errorDsp)");

			// Checks classiques
			BBTool_formError |= BBTool_checkForm(formID,BBTool_formInputs, BBTool_haltOnError,BBTool_errorDsp);
		} else if(BBTool_formCheck=="ajax") {
			// On se laisse la possibilite de rajouter une methode de check des erreurs
			// Eventuellement un check ajax		
		}
	}
	
	// Si les inputs sont correctement renseignes on post
	if(!BBTool_formError) {

		// Post en AJAX
		// On utilise "serialize" pour automatiser le post de chacun des inputs
		if(isAjax) {
			$.post(
				BBTool_formAction,
				BBTool_form.serialize(),
				function(data) {BBTool_openMsgBox(data, true)},
				"html"
			);
		} else BBTool_form.submit();
	} else {
		
		if(BBVars.formCheckHintDsp) {

			// Affichage de l'aide a la saisie
			switch(BBVars.formCheckHintDsp) {

				// Layer autour de l'input
				case "input":
					break;

				// Tooltip sur l'input
				case "over":
					break;

				// Tooltip sur picto autour de l'input
				case "pict":
					break;

				// Layer d'erreur
				case "layer":
					break;

				// Layer autour de l'input
				default:
					break;
			}
		}
	}
}

function BBTool_checkCallback() {

	var form = "#" + BBVars.currentFormID;

	jQuery(form).attr("check", (jQuery(form +" .error").length>0) ? false : true);
	
	var dspError = !(jQuery(form).attr("check")=="true") ? true : false;

	if(!eval(jQuery(form).attr("check"))) {
		if(jQuery(".BBSubmit", form).attr("href").search("BBTool")!=-1) {
			jQuery(".BBSubmit", form).attr("href", "javascript: alert('"+BBLabels.label_formError+"')");
		}
	} else {
		jQuery(".BBSubmit", form).attr("href", jQuery(form).attr("submitURL"));
	}
}

function BBTool_initRTForms( target ) {

	var targetForm = ( typeof(target)!="undefined" ) ? jQuery(target) : jQuery("form[check='rt']");

	targetForm.each( function() {
	
		var callback		= (jQuery(this).attr("checkFunction")==""||jQuery(this).attr("checkFunction")==null) ? BBSettings.RTCheckCallback : jQuery(this).attr("checkFunction");
		var haltOnError		= (jQuery(this).attr("haltOnError")=="true") ? true : false;
		var errorDspType	= (jQuery(this).attr("errorDsp")==""||jQuery(this).attr("errorDsp")==null) ? BBSettings.checkFormErrorDsp : jQuery(this).attr("errorDsp");
		var currentForm		= jQuery(this);
		
		if(typeof(currentForm.attr("submitURL"))=="undefined") currentForm.attr("submitURL", jQuery(".BBSubmit", currentForm).attr("href"));
		currentForm.attr("check", true);
		BBTool_checkForm( currentForm.attr("id"), $(":input[check]",this), haltOnError, errorDspType, callback);
		
		// Une fois qu on a recupere un form a checker en temps reel on change la valeur du champ check pour indiquer qu il est en erreur et ne peut etre poste
		currentForm.attr("check", false);
		
		jQuery(":input[check]", this)
			.bind( BBSettings.BBForms.checkEvtList, function(e) {
				BBTool_checkForm( currentForm.attr("id"), this, haltOnError, errorDspType, callback);
			});
			
	});

}
