/**
 * jQuery Formulaire
 * Version 1.0 - 06/05/2009
 * @author Flavien Bucheton
 *
 * Permet de gérer la validation d'un formulaire
 *
 **/

(function($) {
	var myself = $(this);
	
	//Callback par défaut pour la gestion d'erreur du captcha
	var erreurCapt = function(obj, txt, code){
		alert(txt);
		$('#'+code).val("");
		$('#'+code).focus();
	};
	
	//Callback par défaut pour la gestion d'erreur
	var erreurForm = function(obj, txt){
		alert(txt);
		obj.focus();
	};
	
	var Remplace = function(expr,a,b) {
		var i=0;
		while (i!=-1) {
			i=expr.indexOf(a,i);
			if (i>=0) {
				expr=expr.substring(0,i)+b+expr.substring(i+a.length);
				i+=b.length;
			}
		}
		return expr;
	};

	var getUnite = function(format){
		switch(format.charAt(0)){
			case "j":
			case "d":
				return "j";
			break;
			case "m":
				return "m";
			break;
			case "a":
			case "y":
				return "a";
			break;
		}
	};

	var verifDate = function(val, format){
		if(format==null){ format = "jj/mm/aaaa"; }
		var regSeparateurDate = new RegExp("[\\.,;: _\\-/\\\\]", "ig");
		var sep = regSeparateurDate.exec(format);
		var regFormat = new RegExp(sep, "ig");
		var tabFormat = format.split(regFormat);
		var part1 = tabFormat[0].charAt(0)=="j" || tabFormat[0].charAt(0)=="d" || tabFormat[0].charAt(0)=="m" ? "\\d{1,2}" : "\\d{2,4}";
		var part2 = tabFormat[1].charAt(0)=="j" || tabFormat[1].charAt(0)=="d" || tabFormat[1].charAt(0)=="m" ? "\\d{1,2}" : "\\d{2,4}";
		var part3 = tabFormat[2].charAt(0)=="j" || tabFormat[2].charAt(0)=="d" || tabFormat[2].charAt(0)=="m" ? "\\d{1,2}" : "\\d{2,4}";
		
		var regTest = new RegExp("^"+part1+sep+part2+sep+part3+"$", "ig");
		if(!regTest.test(val)) return false;
		else{
			var tabDate = val.split(regFormat);
			for(var i=0; i<3; i++){
				switch(tabFormat[i].charAt(0)){
					case "j":
					case "d":
						var jour = parseInt(tabDate[i]);
					break;
					case "m":
						var mois = parseInt(tabDate[i]);
					break;
					case "a":
					case "y":
						var annee = parseInt(tabDate[i]);
						if(annee.length<4){
							annee += 2000;
						}
					break;
				}
			}
			
			var nbJourMax=31;
			if (jour>0 && mois>0 && mois<=12)
			{
				if (mois==2)
				{
					if (annee%4==0)
						nbJourMax=29;
					else
						nbJourMax=28;
				}	
				else if (mois==4 || mois==6 || mois==9 || mois==11)
				{
					nbJourMax=30;
				}
			
				if (jour>nbJourMax)	return false;
				else return true;
			}
			else return false;
		}
	};
	
	
	
	$.fn.extend({
		estPresent: function(texterr, callback) {
			if (this.val() == "") {
				var myObj = this;
				if(jQuery.isFunction(callback)){
					callback.call(this, myObj, texterr);
				}else{
					erreurForm(this, texterr);
				}
				return false;
			}
			return true;
		},
		
		
		estValide: function(texterr, type, taille, callback) {
			var erreur = false;
			switch(type){
				case "length":
					if(this.val().length < taille) erreur = true;
				break;
				case "int":
					temp = parseInt(this.val());
					if(isNaN(temp)) erreur = true;
				break;
				case "intPositif":
					temp = parseInt(this.val());
					if (isNaN(temp) || temp < 0) erreur = true;
				break;
				case "float":
					var reg = RegExp(" ","gi");
					var temp = this.val().replace(reg,"");
					temp = Remplace(temp,",",".");
					temp = parseFloat(temp);
					if (isNaN(temp)) erreur = true;
				break;
				case "floatPositif":
					var reg = RegExp(" ","gi");
					var temp = this.val().replace(reg,"");
					temp = Remplace(temp,",",".");
					temp = parseFloat(temp);
					if (isNaN(temp) || temp < 0) erreur = true;
				break;
				case "email":
					var mailReg = new RegExp("^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-zA-Z]{2,4}$");
					if (!mailReg.test(this.val())) erreur = true;
				break;
				case "date":
					if(!verifDate(this.val(), taille)) erreur = true;
				break;
				case "url":
					var urlReg = new RegExp("^^http://([a-zA-Z0-9-]+\.)+([a-zA-Z0-9-]{2,4})(:[0-9]{0,5})?(/[a-zA-Z0-9._-]*)*$");
					if(!urlReg.test(this.val())) erreur = true;
				break;
				case "ip":
					var ipReg = new RegExp("[0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}[\.][0-9]{1,3}");
					if (!ipReg.test(this.val())) erreur = true;
				break;
			}
			
			if (erreur) {
				var myObj = this;
				if(jQuery.isFunction(taille)) callback = taille;				
				if(jQuery.isFunction(callback)){
					callback.call(this, myObj, texterr);
				}else{
					erreurForm(this, texterr);
				}
				return false;
			}
			return true;
		},
		
		
		estIdentique: function(texterr, obj, callback){
			if (this.val() != obj.val()) {
				var myObj = this;
				if(jQuery.isFunction(callback)){
					callback.call(this, myObj, texterr);
				}else{
					erreurForm(this, texterr);
				}
				return false;
			}
			return true;
		},
		
		
		calculAge: function(format){
			if(format==null){ format = "jj/mm/aaaa"; }
			var regSeparateurDate = new RegExp("[\\.,;: _\\-/\\\\]", "ig");
			var sep = regSeparateurDate.exec(format);
			
			var regFormat = new RegExp(sep, "ig");
			var tabFormat = format.split(regFormat);
			var tabDate = $(this).val().split(regFormat);
			
			for(var i=0; i<3; i++){
				switch(tabFormat[i].charAt(0)){
					case "j":
					case "d":
						var jn = parseInt(tabDate[i]);
					break;
					case "m":
						var mn = parseInt(tabDate[i]);
					break;
					case "a":
					case "y":
						var an = parseInt(tabDate[i]);
						if(an.length<4){
							an += 2000;
						}
					break;
				}
			}
			var date_actuelle = new Date();
			var ja = date_actuelle.getDay();
			var ma = date_actuelle.getMonth();
			var aa = date_actuelle.getFullYear();
			
			var age = aa-an;
			if(ma<=mn && ja<jn) age--;
			
			return age;
		},
		
		
		verifCaptcha : function(url, callback, code) {
			var myObj = this;
			if(url==null){ url = "Scripts/response.php"; }
			if(code==null){ code = "code"; }
			
			$.post(url, "code="+$('#'+code).val(), function(data){
				var items_res = data.getElementsByTagName("res")
				var items_val = data.getElementsByTagName("valeur")
				switch(items_res.item(0).firstChild.data){
					case "404":
					case "403":
						var texterr = items_val.item(0).firstChild.data;
						if(jQuery.isFunction(url)) callback = url;
						if(jQuery.isFunction(callback)){
								callback.call(this, myObj, texterr, code);
						}else{
								erreurCapt(this, texterr, code);
						}
						return false;
					break;
					case "200":
						myObj.submit();
					break;
				}
			},"xml");		
		}
	});

})(jQuery);
