/*
* Validation Form for jQuery
*
* Copyright (c) 2009 SYNETIK Développement
* Dual licensed under the MIT (MIT-LICENSE.txt) 
* and GPL (GPL-LICENSE.txt) licenses.
 
**************************************************
Documention
**************************************************

Installer les TAG d'appel :
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script>
<script type="text/javascript" src="http://code.synetik.net/jquery/checkform.js"></script>

Appliquer le controle du formulaire :
<form class="checkForm" id="ident"></form>

Supprimer le message d'alerte sur un champs
<input type="text" required="#true" libelleAlert="false" />
Défault : true

Personnaliser le message d'alerte :
<input type="text" required="#true" title="Ce champs est obligatoire merci." />

Personnaliser la CSS du champs input controlé :
.checkFormInputFailed {
	border:1px solid red;
}
.checkFormInputPassed {
	border:1px solid green;
}

Personnaliser le DIV d'error général :
.checkFormDivError {
	display:inline;
	padding-left:10px;
	vertical-align:center;
	color:red;
}

Personnaliser le DIV d'error du champs controlé :
<input type="text" required="#true" errorClass="checkFormcheckFormDivErrorSearch" />

.checkFormcheckFormDivErrorSearch {
	color:green;
	background-color:yellow;
}

Controler un champs :
<input type="text" required="#true" />

Controler un champs Date (format : JJ/MM/AAAA) :
<input type="text" required="#true #date" />

Controler un champs URL (format : http://domain.ltd) :
<input type="text" required="#true #url" />

Controler un champs Email (format : email@domain.ltd) :
<input type="text" required="#true #email" />

Controler un champs Numérique :
<input type="text" required="#true #numeric" />

Controler un champs Alpha :
<input type="text" required="#true #alpha" />

Controler le nombre de caractères d'un champs :
<input type="text" required="#true #mini" mini="1" maxi="10" />

Comparer la valeur d'un champs avec un autre :
<input type="text" required="#true" id="password" />
<input type="text" required="#true #equal" equalTo="password" id="passwordConfirm" />

Controler une case à cocher :
<input type="checkbox" required="#true #checkbox" />

Controler un champs de fichier :
<input type="file" required="#true" />

Controler une select case :
<select required="#true">
<option value="">---</option>
<option value="value1">Value1</option>
<option value="value2">Value2</option>
</select>

**************************************************
Exemple :
**************************************************

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.pack.js"></script>
<script type="text/javascript" src="http://code.synetik.net/jquery/checkform.js"></script>
<style type="text/css">
.checkFormInputFailed {
	border:1px solid red;
}
.checkFormInputPassed {
	border:1px solid green;
}
.checkFormDivError {
	display:inline;
	padding-left:10px;
	vertical-align:center;
	color:red;
}
.checkFormDivErrorSearch {
	color:green;
	background-color:yellow;
}
</style>
<form action="ident.php" method="post" class="checkForm" id="ident">
	Password : <input type="text" required="#true #email" mini="2" maxi="5" name="login" id="login" />
	<br />
	Répéter : <input type="text" required="#true #email #equal" equalTo="login" name="login2" id="login2" />
	<br />
	<input type="submit" value="envoyer" class="buttonValid" />
</form>

<form action="search.php" method="post" class="checkForm" id="search">
	Keyword : <input type="text" required="#true" name="search" id="search" errorClass="checkFormDivErrorSearch" />
	<input type="submit" value="envoyer" class="buttonValid" />
</form>

*/

function strpos( haystack, needle, offset)
{
	var i = haystack.indexOf( needle, offset );
	return i;
}

function strlen(chaine) 
{
	var i = 0, a = 0;

	while (chaine[i++]) {
		a++;
	}
	
	return a;
}

function verifEmail(chaine)
{
	var reg = /^[a-z0-9._-]+@[a-z0-9.-]{2,}[.][a-z]{2,3}$/
	return (reg.exec(chaine)!=null)
}

function verifNumeric(chaine)
{
	var exp = new RegExp("^[0-9]*$","g");
	return exp.test(chaine);
}

function verifAlpha(chaine)
{
	var exp = new RegExp("^[a-zA-Z]*$","g");
	return exp.test(chaine);
}

function verifDate(chaine)
{
	var exp = new RegExp("^[0-9]{1,2}\/[01]?[0-9]\/[0-9]{4}$","g");
	return exp.test(chaine);
}

function verifUrl(chaine)
{
	var exp = new RegExp("/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/","g");
	return exp.test(chaine);
}

function verifInput(input, i, checkColor)
{
	if($(input).val() == "")
	{
		if($(input).attr("title"))
		{
			var errorMsg = $(input).attr("title");
		}
		else
		{
			var errorMsg = "<div id='errorTraitement' style='display:inline;vertical-align:center'> Champs obligatoire.</div>";
		}
				
		// APPLICATION COULEUR
		$(input).removeClass("checkFormInputPassed");
		$(input).addClass("checkFormInputFailed");
		
		if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
		{
			$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
			
			if($(input).attr('errorClass') != undefined)
			{
				$(".thisError" + i).removeClass("checkFormDivError");
				$(".thisError" + i).addClass($(input).attr('errorClass'));
			}
		}
		else 
		{
			if($(input).attr('libelleAlert') == "true")
			$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
			
			if($(input).attr('errorClass') != undefined)
			{
				$(".thisError" + i).removeClass("checkFormDivError");
				$(".thisError" + i).addClass($(input).attr('errorClass'));
			}
		}
		
		return false;
	}
	else
	{
		// APPLICATION COULEUR
		$(input).removeClass("checkFormInputFailed");
		$(input).addClass("checkFormInputPassed");
		
		return true;
	}
}

function checkInput(options, input, i, count)
{
	if(typeof(options) != 'undefined')
	{
		var reg = new RegExp("[,]+", "g");
		var tabOptions = options.split(reg);
		for (var iOptions=0; iOptions<tabOptions.length; iOptions++)
		{
			var reg = new RegExp("[:]+", "g");
			var tab = tabOptions[iOptions].split(reg);
			
			var checkColor = tab[1];
		}
	}
	
	var checkForm = 0;
	if($(input).attr("required"))
	{
		$(".thisError" + i).remove();
		
		// VERIFICATION DE VALEUR
		if($(input).attr("required") == "#true")
		{
		
			if(!verifInput(input, i, checkColor))
			checkForm = 1;
		}
		
		// VERIFICATION D'UNE CHECKBOX
		if(strpos($(input).attr("required"), 'checkbox', 0) > 0 || $(input).attr("required") == "#checkbox")
		{
			if($(input).attr("checked") == "")
			{
				if($(input).attr("title"))
				{
					var errorMsg = $(input).attr("title");
				}
				else
				{
					var errorMsg = '*';
				}
					
				checkForm = 1;
				
				// APPLICATION COULEUR
				$(input).removeClass("checkFormInputPassed");
				$(input).addClass("checkFormInputFailed");
				
				if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
				{
					$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
					
					if($(input).attr('errorClass') != undefined)
					{
						$(".thisError" + i).removeClass("checkFormDivError");
						$(".thisError" + i).addClass($(input).attr('errorClass'));
					}
				}
				else 
				{
					if($(input).attr('libelleAlert') == "true")
					$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
					
					if($(input).attr('errorClass') != undefined)
					{
						$(".thisError" + i).removeClass("checkFormDivError");
						$(".thisError" + i).addClass($(input).attr('errorClass'));
					}
				}
			}
			else
			{
			
				// APPLICATION COULEUR
				$(input).removeClass("checkFormInputFailed");
				$(input).addClass("checkFormInputPassed");
			}
		}
		
		// VERIFICATION D'EMAIL
		if(strpos($(input).attr("required"), 'email', 0) > 0 || $(input).attr("required") == "#email")
		{
			if(strpos($(input).attr("required"), 'true', 0) > 0 && checkForm == 0)
			{
				if(!verifInput(input, i, checkColor))
				checkForm = 1;
			}
			
			if(checkForm == 0 && $(input).val() != "")
			{
				if(!verifEmail($(input).val()) && $(input).val() != "")
				{
					if($(input).attr("title"))
					{
						var errorMsg = $(input).attr("title");
					}
					else
					{
						var errorMsg = '* Email obligatoire.';
					}
					
					checkForm = 1;
					
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputPassed");
					$(input).addClass("checkFormInputFailed");
					
					if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
					{
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
					else 
					{
						if($(input).attr('libelleAlert') == "true")
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
				}
				else if($(input).val() == "")
				{
					// Do Nothing
				}
				else
				{
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputFailed");
					$(input).addClass("checkFormInputPassed");
				}
			}
		}

		// VERIFICATION DE NOMBRE
		if(strpos($(input).attr("required"), 'numeric', 0) > 0 || $(input).attr("required") == "#numeric")
		{
			if(strpos($(input).attr("required"), 'true', 0) > 0 && checkForm == 0)
			{
				if(!verifInput(input, i, checkColor))
				checkForm = 1;
			}
			
			if(checkForm == 0 && $(input).val() != "")
			{
				if(!verifNumeric($(input).val()) && $(input).val() != "")
				{
					if($(input).attr("title"))
					{
						var errorMsg = $(input).attr("title");
					}
					else
					{
						var errorMsg = '* Nombre obligatoire.';
					}
					
					checkForm = 1;
					
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputPassed");
					$(input).addClass("checkFormInputFailed");
					
					if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
					{
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
					else 
					{
						if($(input).attr('libelleAlert') == "true")
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
				}
				else if($(input).val() == "")
				{
					// Do Nothing
				}
				else
				{
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputFailed");
					$(input).addClass("checkFormInputPassed");
				}
			}
		}
		
		// VERIFICATION DE CARACTERE
		if(strpos($(input).attr("required"), 'alpha', 0) > 0 || $(input).attr("required") == "#alpha")
		{
			if(strpos($(input).attr("required"), 'true', 0) > 0 && checkForm == 0)
			{
				if(!verifInput(input, i, checkColor))
				checkForm = 1;
			}
			
			if(checkForm == 0 && $(input).val() != "")
			{
				if(!verifAlpha($(input).val()) && $(input).val() != "")
				{
					if($(input).attr("title"))
					{
						var errorMsg = $(input).attr("title");
					}
					else
					{
						var errorMsg = '* Caractère obligatoire.';
					}
					
					checkForm = 1;
					
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputPassed");
					$(input).addClass("checkFormInputFailed");
					
					if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
					{
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
					else 
					{
						if($(input).attr('libelleAlert') == "true")
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
				}
				else if($(input).val() == "")
				{
					// Do Nothing
				}
				else
				{
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputFailed");
					$(input).addClass("checkFormInputPassed");
				}
			}
		}
		
		// VERIFICATION DE NOMBRE DE CARACTERES
		if(strpos($(input).attr("required"), 'mini', 0) > 0 || $(input).attr("required") == "#mini")
		{
			if(strpos($(input).attr("required"), 'true', 0) > 0 && checkForm == 0)
			{
				if(!verifInput(input, i, checkColor))
				checkForm = 1;
			}
			
			if(checkForm == 0 && $(input).val() != "")
			{
				// Check du nombre mini
				if($(input).attr("mini") != 'undefined' && strlen($(input).val()) < $(input).attr("mini"))
				{
					if($(input).attr("title"))
					{
						var errorMsg = $(input).attr("title");
					}
					else
					{
						var errorMsg = 'Nombre mini de caractères ('+$(input).attr("mini")+')';
					}
					
					checkForm = 1;
					
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputPassed");
					$(input).addClass("checkFormInputFailed");
					
					if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
					{
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
					else 
					{
						if($(input).attr('libelleAlert') == "true")
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
				}
				else if($(input).val() == "")
				{
					// Do Nothing
				}
				else
				{
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputFailed");
					$(input).addClass("checkFormInputPassed");
				}
				
				// Check du nombre maxi
				if($(input).attr("maxi") != 'undefined' && strlen($(input).val()) > $(input).attr("maxi"))
				{
					if($(input).attr("title"))
					{
						var errorMsg = $(input).attr("title");
					}
					else
					{
						var errorMsg = 'Nombre maxi de caractères ('+$(input).attr("maxi")+')';
					}
					
					checkForm = 1;
					
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputPassed");
					$(input).addClass("checkFormInputFailed");
					
					if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
					{
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
					else 
					{
						if($(input).attr('libelleAlert') == "true")
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
				}
				else if($(input).val() == "")
				{
					// Do Nothing
				}
				else
				{
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputFailed");
					$(input).addClass("checkFormInputPassed");
				}
			}
		}

		// VERIFICATION DE DATE
		if(strpos($(input).attr("required"), 'date', 0) > 0 || $(input).attr("required") == "#date")
		{
			if(strpos($(input).attr("required"), 'true', 0) > 0 && checkForm == 0)
			{
				if(!verifInput(input, i, checkColor))
				checkForm = 1;
			}
			
			if(checkForm == 0 && $(input).val() != "")
			{
				if(!verifDate($(input).val()) && $(input).val() != "")
				{
					if($(input).attr("title"))
					{
						var errorMsg = $(input).attr("title");
					}
					else
					{
						var errorMsg = '* Date obligatoire (format : JJ/MM/AAAA).';
					}
					
					checkForm = 1;
					
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputPassed");
					$(input).addClass("checkFormInputFailed");
					
					if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
					{
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
					else 
					{
						if($(input).attr('libelleAlert') == "true")
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
				}
				else if($(input).val() == "")
				{
					// Do Nothing
				}
				else
				{
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputFailed");
					$(input).addClass("checkFormInputPassed");
				}
			}
		}
		
		// VERIFICATION  EGALITE AVEC UN AUTRE CHAMPS
		if(strpos($(input).attr("required"), 'equal', 0) > 0 || $(input).attr("required") == "#equal")
		{
			if(strpos($(input).attr("required"), 'true', 0) > 0 && checkForm == 0)
			{
				if(!verifInput(input, i, checkColor))
				checkForm = 1;
			}
				
			var champEqual = $(input).attr("equalTo");
			if(checkForm == 0 && $(input).val() != "")
			{
				if($(input).val() != $("#" + champEqual).val())
				{
					if($(input).attr("title"))
					{
						var errorMsg = $(input).attr("title");
					}
					else
					{
						var errorMsg = '*';
					}
					
					checkForm = 1;
					
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputPassed");
					$(input).addClass("checkFormInputFailed");
					
					if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
					{
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
					else 
					{
						if($(input).attr('libelleAlert') == "true")
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
				}
				else if($(input).val() == "")
				{
					// Do Nothing
				}
				else
				{
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputFailed");
					$(input).addClass("checkFormInputPassed");
				}
			}
		}
		
		// VERIFICATION D'URL
		if(strpos($(input).attr("required"), 'url', 0) > 0 || $(input).attr("required") == "#url")
		{
			if(strpos($(input).attr("required"), 'true', 0) > 0)
			{
				if(!verifInput(input, i, checkColor))
				checkForm = 1;
			}
			
			if(checkForm == 0 && $(input).val() != "")
			{
				if(!verifUrl($(input).val()) && $(input).val() != "")
				{
					if($(input).attr("title"))
					{
						var errorMsg = $(input).attr("title");
					}
					else
					{
						var errorMsg = '* URL obligatoire.';
					}
					
					checkForm = 1;
					
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputPassed");
					$(input).addClass("checkFormInputFailed");
					
					if(($(input).attr('libelleAlert') == "true" || $(input).attr('libelleAlert') == null))
					{
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
					else 
					{
						if($(input).attr('libelleAlert') == "true")
						$(input).after("<div class='checkFormDivError thisError" + i + "'>" + errorMsg + "</div>");
						
						if($(input).attr('errorClass') != undefined)
						{
							$(".thisError" + i).removeClass("checkFormDivError");
							$(".thisError" + i).addClass($(input).attr('errorClass'));
						}
					}
				}
				else if($(input).val() == "")
				{
					// Do Nothing
				}
				else
				{
					// APPLICATION COULEUR
					$(input).removeClass("checkFormInputFailed");
					$(input).addClass("checkFormInputPassed");
				}
			}
		}
	}

	if(count == "True")
		return checkForm;
}


// checkColor : true/false
// => Affiche couleur red/green
$(document).ready(function()
{
	
	jQuery.fn.extend({
		
		checkForm: function(options,thos,numberForm) {
			
			var checkForm = 0;
			var thos = thos;
			
			$(".checkForm input,textarea,select").each(function (i) {
				if(numberForm == this.form.getAttribute('id'))
				{
					checkInput(options, this, i, "False");
					checkForm += checkInput(options, this, i, "True");
				}
			});
			
			checkForm = checkForm / 2;
			
			if(checkForm > 0.4)
			{
				return false;
			}
			else
			{
				return true;
			}
		}
		
	});

	$(".checkForm .buttonValid").click(function () {
		
		var numberForm = this.form.getAttribute('id');
		if(!$(this).checkForm("checkColor:false", '', numberForm))
		{
			return false;
		}
		
		$($(this).parent()).submit();
		
	});

	$(".checkForm input,textarea").keyup(function () {
		
		var numberForm = this.form.getAttribute('id');
		if(!$(this).checkForm("checkColor:false", '', numberForm))
		{
			return false;
		}
		
	});
	
	$(".checkForm input,select").change(function () {
		
		var numberForm = this.form.getAttribute('id');
		if(!$(this).checkForm("checkColor:false", '', numberForm))
		{
			return false;
		}
		
	});
	
});