/* 
 * Author  : Bob Smits 2008
 * Version : 1.0
 */

/*
 * Lees de comments en je komt een heel eind :-P zie verder naar onder om nieuwe validaties toe te voegen
 */


FormValidator = {
	

	emailRegExp 	: /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.([a-z]){2,4})$/,
	dateRegExp		:  /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/, 
	errorMessage 	: 'Zorg dat alle velden correct zijn ingevuld',
	errorColor		: '#ff0000',
	borderColor		: '#c0c0c0',
	
 	//Het voor die gesubmit moet worden wordt geset bij het aanroepen van validate
	form 			: null,
	
	//Het aantal ajax requests word hierin geplaatst we kunnen niet eerder submitten voordat deze allemaal voltooid zijn.
	pendingAjaxRequests	: 0,
	
	//als er een validatie niet gepasseerd is wordt de error op true gezet
	error			: false,
	
	
	AlternateSubmit : 'none',
	
	
	validate : function ( form ) 
	{
		//form zetten
		this.form = document.getElementById(form)
		
		//Error weer uitzetten
		this.error = false;
		
		//Aantal Ajax requests weer op nul zetten
		this.pendingAjaxRequests = 0;

		
		//foutmelding als het form niet gevonen is
		if(!this.form)
			alert('form not found')
		
		
		
		//alle form element
		var elements = this.form.elements;
		
		//Alle form elementen doorlopen
		for ( var i=0 ; i< elements.length; i++ ) 
		{
			
			//kijken of die een validatie heeft	
			if (elements[i].getAttribute('validate') )
			{
				//spaties weghalen
				var validations =  elements[i].getAttribute('validate').replace(/\s/,'');
				
				//valid prop van het element op true zetten deze wordt gebruikt zodat een andere validatie weet 
				//dat hij de border niet goed moet kleuren als een eerdere validatie niet gepasseerd is dan wordt het var namelijk false.
				elements[i].valid = true;
				
				//de verschillende validaties splitsen en in een array stoppen 
				validations = validations.split(',')
			
				//de verschillende validaties doorlopen
				for (var j = 0; j < validations.length; j++) 
				{
					//validatie en zijn optionele waarde spliten
					var validation = validations[j].split(':')
					
					//kijken of de validaite bestaat
					if ( this [ validation[0] ] )
					{
						//validatie aanroepen met eventuele parameter
						if ( !this [ validation[0] ] ( elements[i] , validation[1] ) )
						{
							this.setElementInvalid ( elements[i] )
						}
						else
						{
							this.setElementValid ( elements[i] )
						}
					}
					else
					{
						alert('unknow validation : ' + validation[0] )	
					}
				}
			}
	  	}
		
		if ( this.error )
		{
			alert ( this.errorMessage )
		}
		else
		{
			
			//Als er nog ajax request lopen mogen we niet submittern
			if ( this.pendingAjaxRequests == 0 ) 
			{
				if ( this.AlternateSubmit == 'none' )		
					this.form.submit();
				else
					this.AlternateSubmit();
			}
			
		}	
	},
	
	setElementValid : function ( element )
	{
		//border goed zetten als er geen eerdere validaties zijn afgekeurd
		if ( element.valid ) 
		{
			element.style.borderColor = this.borderColor;
		}
	},
	
	
	setElementInvalid : function ( element )
	{
		//Ellement zijn error op false zetten zodat een tweede validatie het veld niet weer goed kleurt
		element.valid = false;
		
		//border naar error zetten
		element.style.borderColor = this.errorColor;
		
		//Doorvoeren dat er een fout gevonden is
		this.error = true;
	},
	
	
	/*
	 * Validaties
	 * 
	 * Om een validatie toe te voegen maak je gewoon net als hieronder een functie aan, deze wordt automatisch aangeroepen
	 * als die tussen de validaties staat. 
	 * 
	 * Het eerst argument dat je krijgt is het input element het tweede argument is de eventuele waarde die
	 * je na de : mee kan geven.
	 * 
	 * Zorg gewoon dat die true terug geeft als die de validatie gepasseerd is en false als de waarde niet klopt.
	 */
	
	
	notEmpty : function ( element )
	{
		return element.value.length > 0 ? true : false;
	},
	
	nietLeeg : function ( element )
	{
		return element.value.length > 0 ? true : false;
	},
	
	
	minLength : function ( element, length )
	{
		return element.value.length >= length ? true : false;
	},
	
	
	maxLength : function ( element, length )
	{
		return element.value.length <= length ? true : false;
	},
	
	
	email : function ( element )
	{
		return this.emailRegExp.test( element.value );
	},
	
	
	compare : function ( element , checkElement )
	{
		checkElement = document.getElementById(checkElement);
		return element.value == checkElement.value ? true : false; 
	},
	
	date : function ( element )
	{
		return this.dateRegExp.test( element.value );
	},
	
	ajaxReq : function ( element , page )
	{	

	
		//dit ajax request bij de pendingAjaxRequest optellen
		this.pendingAjaxRequests ++;
		
		//url maken http:// toevoegen gaat niet in html vanwege ':'
		var url = page;
		if( url.indexOf('.') > 0 ) {
			url = 'http://' + url;
		}

		//request genereren doormiddel van Prototype ajax
		ajaxRequest = new Ajax.Request( 
			url, 
			{  
				method: 'get', 
				parameters: { field : element.name, value : element.value  }, 
				onComplete: function ( transport ) { 
					FormValidator.checkAjaxReturnValue ( transport.responseText , transport.request.element );
				},
				onLoading: function( transport ) { 
				}
			}
			
		)
		
		
		
		//Aan het ajax request het element toevoegen waar het om gaat
		ajaxRequest.element = element;
		
		//true returnen anders krijgen we een foutmelding voordat je weet of de ajax validatie geslaagt is.
		return true;
	},
	
	
	checkAjaxReturnValue : function ( value , element )
	{
		
		//Dit ajax request van het aantal ajax requests afhalen
		this.pendingAjaxRequests--
		//Als de tekst die terug komt true is is die goedgekeurd

		value = value.replace(/^\s*|\s*$/g,'');
		
		if (value == 'true')
		{
			//borders goedzetten
			this.setElementValid ( element )
			
			//Als er geen error is en als alle ajax req zijn uitgevoerd submitten
			if ( this.pendingAjaxRequests == 0 && !this.error ) 
			{
				this.form.submit();
			}
		}
		//Als die anders dan dat is is die false en niet valid
		else
		{ 
			//Als er nog geen alert error is geweest printen we die
			if (!this.error) 
			{
				alert( this.errorMessage )
				//Er is een error geweest 
				this.error = true;
			}
			//Als er iets anders dan true wordt terug gestuurd zien we dat als een melding en alerten we die.
			if ( value.length > 0 )
			{
				alert(value);
			}
			//Element kleuren
			this.setElementInvalid ( element )
		}
	}
}


