
$jquer(document).ready(function()
{
	$jquer('.validateform').livequery(function()
	{
		$jquer(this).validation();
	});
});


(function($){

	$.fn.validation = function(p) 
	{ 
		var thisForm = this;
		var isAjax = false;
		
		/* Je recupere tous les objets avec la classe validate */
		var objItemsForm = $(thisForm).find("[class*=validate]");
		var isScroll	= false;
			
		/* les parametres */
		p = $.extend({
			bind 	: true 
		}, p);
	
		/* Le bind est t'il actif sur les items du form ?*/
		if (p.bind)
		{
			$(thisForm).find("[class*=validate]").not("[type=checkbox]").bind("blur", function(obj) { loadValidation(this) });
			$(thisForm).find("[class*=validate]").find(":checkbox").bind("click", function(obj){loadValidation(this)});
		}
		
		/* Le formulaire est t'il en ajax ? */
		var onSubmitForm = $(thisForm).attr("onsubmit");
		
		if ($.trim(onSubmitForm) != "" && (onSubmitForm.indexOf('ajax') || onSubmitForm.indexOf('.post') || onSubmitForm.indexOf('.load') || onSubmitForm.indexOf('.get') ))
			isAjax = true;
	
		/* J'ajoute un bind sur le bouton pour empecher la validation */
		/* Si le formulaire est un ajax alors je return false sinon true. */
		$(thisForm).find(":submit").bind("click", function(caller)
		{
			if(submitFormValid(objItemsForm))
			{
				thisForm.trigger('onsubmit');
				if (!isAjax)
					return true;
					
				isScroll = true;	
			}
			
			return false;
		});
		
		/* Fonction pour valider le formulaire lors du submit. y compris en ajax */
		var submitFormValid = function (objForm)
		{
			var isOk = true;
			isScroll = false;	/* pour positionner */
			/* Parcours du formulaire pour verifier les erreurs */
			objForm.each( function () 
			{
				var returnValidation = loadValidation(this);
				if (!returnValidation) isOk = false;
			});
			
			return isOk;
			
		};
		
		/* la validation de l'objet */
		var loadValidation = function (obj)
		{
			/* Lance la validation sur l'objet */
			var classObj = $(obj).attr('class');
			regExp = /\[(.*)\]/;
			getRegExp = regExp.exec(classObj);
			return checkValidation(getRegExp[1], obj );
		};
		
		/* verifie */
		var checkValidation = function (rule, obj)
		{
			var itemRule 	= rule.split(',');
			var returnErr 	= "";
			var typeObj 	= $(obj).attr("type");
			
			for (iCpt = 0; iCpt < itemRule.length; iCpt++)
			{
				if (itemRule[iCpt] == "required")	
				{
					returnErr = isEmpty(obj);
				}
				else if (itemRule[iCpt] == "email")
				{
					if ($(obj).val() != '')
						returnErr = isMail($(obj).val());
				}
				else if (itemRule[iCpt].indexOf("confirm") >= 0)
				{
					regExp = /\[(.*)\]/;
					getRegExp = regExp.exec(itemRule[iCpt]);
					returnErr = isSameText($(obj).val(), $('#'+getRegExp[1]).val() );
				}					
				
			}
			
			/* Une erreur */
			if (returnErr != '')
			{
				if ($(obj).size() > 0 && typeObj == "radio")
				{
					obj = $("input[id="+$(obj).attr('id')+"]:first");
				}
				
				addError(obj, returnErr);
					
				return false;
			}
			else
			{
				removeError(obj);
			}
			return true;
			
			/***********  Les fonctions ************/ 
			/* Est-ce un mail ? */
			function isMail (value) 
			{
			
				if (value.match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})$/) == null) 
				{
					return "Invalid email adress";
				} 
				return "";
			};
			
			/* Est-ce un numerique */
			function isNumeric (value)
			{
				if (value.match(/^[0-9]+$/) == null) 
				{
					return "This field is only numeric";
				}
				return "";
			};
			
			/* Le champ est-il requis ? */
			function isEmpty (obj)
			{
				var typeObj 	= $(obj).attr("type");
				
				/* Selon le type d'objet pas le meme traitement */
				if (typeObj== "checkbox" || typeObj == "radio")
				{
					if($('input[name='+$(obj).attr('name')+']:checked').size() == 0) 
					{
						if (typeObj == 'checkbox')
							return "Please confirm this check";
						if (typeObj == 'radio')
							return "Please select an option";
					}
				}
				
				/* Type input text */
				if (typeObj == "text" || typeObj == "textarea" || typeObj == "password")
				{
					if ($(obj).attr('title') == "tinyMCE" )
					{
						try
						{
							if (trim(tinyMCE.activeEditor.getContent()) == "")
								return "This field is required";
						}
						catch (Erreur)
						{
							alert(Erreur);
						}
					}
					else
					{
						var val 		= $(obj).val();
						if (val == "") 
						{
							return "This field is required";
						}
					}
				}
				if (typeObj == "select-one")
				{
					if ($(obj).val() == "")
						return "This field is required";
				}
				
				return "";
				
			};
			
			/* Le champ est'il identique avec l'autre */
			function  isSameText (value, value2) 
			{
				if (value != value2) 
				{
					return "Please confirm";
				}
				return "";
			}
			
			/* La fonction pour ajouter l'erreur */
			function addError (obj, message)
			{
				/* Si l'objet existe deja on ne le créer pas on update le texte */
				var span = $('.formError'+$(obj).attr('name'));
				if (span.size() >0 )
				{
					$(span).html(message);
					$(obj).addClass('formError');
					if (!isScroll)
						$('html,body').animate({scrollTop: ($('[class*=formError]').offset().top)-30}, 500);
						
					isScroll = true;	
					return;
				}
				var spanError = document.createElement('span');
				$(spanError).addClass("positionLeft errorForm formError" + $(obj).attr('name') );
				$(spanError).html(message);
				$(spanError).animate({ opacity: 'show' }, "slow", "linear");
				$(obj).parent().append(spanError);
				$(obj).addClass('formError');
								
				if (!isScroll)
					$('html,body').animate({scrollTop: ($('[class*=formError]').offset().top)-30}, 500);
				
				isScroll = true;
				/*$('html,body').animate({scrollTop: ($(obj).offset().top)-10}, 500);*/
			};
			
			/* La fonction pour enlever l'erreur */
			function removeError (obj)
			{
				/* Aucune erreur on enleve les objets qui ont pu apparaitre */
				$('.formError'+$(obj).attr('name')).animate({ opacity: 'hide' }, "slow", "linear");
				$('.formError'+$(obj).attr('name')).remove();
				$(obj).removeClass('formError');
				
				isScroll = false;
			};
					
		};
		
		
	};

})(jQuery);

jQuery.fn.check = function(mode) 
{
	var mode = mode || 'on';
   
	return this.each(function() 
	{
		switch(mode) 
		{
			case 'on':
				this.checked = true;
			break;
			case 'off':
				this.checked = false;
			break;
			case 'toggle':
				this.checked = !this.checked;
			break;
		}
	});
};

