// ---------------------------------------------------------------------
// Title: Unica formCheck
// Version: 1.3
// Date: 28-04-2006
// http://www.softcomplex.com/products/tigra_form_validator/
//
// Changelog: 
// 07-04-2009:	- Regular Expression voor 'alphanum' aangepast
//              - Bij alphanum is nu ' toegestaan 
// 09-10-2006:	- Regular Expression voor 'decimaal' aangepast
//				- Decimale getallen mogen geen '.' bevatten, maar wel ','
//
// 28-04-2006: 	- Gehele code beter uitgelijnd
//				- Functie toegevoegd om fouten te markeren
//
// 24-02-2006:	- Minwaarde en maxwaarde optie toegevoegd
//
// 08-02-2006:	- functie formCheckIf toegevoegd
//				- functie formCheckdouble toegevoegd
// ---------------------------------------------------------------------

	// regular expressions or function to validate the format
	var datum = /^(\d{1,2})\-(\d{1,2})\-(\d{4})$/,
	tijd = /^(\d{1,2})\:(\d{1,2})\:(\d{1,2})$/,
	a_soorten = 
	{
		'alpha'   : /^[a-zA-Z\.\-\s]*$/,				// was /^[a-zA-Z\.\-]*$/, dit accepteert ook spaties
		'alphanum': /^(\w|\s|')+$/,						// was /^\w+$/, dit accepteert ook spaties
		'unsigned': /^\d+$/,
		'integer' : /^[\+\-]?\d*$/,
		'real'    : /^[\+\-]?\d*\.?\d*$/,
		'decimaal': /^[\+\-]?\d*[0-9](,\d*[0-9])?$/,	// was /^[\+\-]?\d*[0-9](|.\d*[0-9]|,\d*[0-9])?$/,
		'postcode': /^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/,
		'email'   : /^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,4}$/,
		'afbeelding' : /^([a-zA-Z].*|[1-9].*)\.(jpg|JPG|gif|GIF)$/,
		'telefoon'   : /^((\+?[1-9][0-9])|0) ?(6 ?-? ?[0-9\. ]{8,}|[1-9][0-9]{1,2} ?-? ?[0-9\. ]{7,}|[1-9]{2}[0-9] ?-? ?[0-9\. ]{6,})$/,
		'datum'    : function (s_date)
		{
			if (!datum.test(s_date))
			{
				return false;
			}
			
			// check allowed ranges
			if (RegExp.$1 > 31 || RegExp.$2 > 12)
			{
				return false;
			}
			
			// check number of day in month
			var dt_test = new Date(RegExp.$3, Number(RegExp.$2-1), RegExp.$1);
			if (dt_test.getMonth() != Number(RegExp.$2-1))
			{
				return false;
			}
			
			return true;
		},
		'tijd'    : function validate_time(s_time) 
		{
			// check format
			if (!tijd.test(s_time))
			{
				return false;
			}
			
			// check allowed ranges
			if (RegExp.$1 > 23 || RegExp.$2 > 59 || RegExp.$3 > 59)
			{
				return false;
			}
			
			return true;
		}
	},
	
	
	a_meldingen = [
		'Er is geen formuliernaam aangegeven.',
		'Er is geen array met velden doorgegeven.',
		'Formulier "%form%" kan niet gevonden worden in dit document.',
		'Incompleet "%naam%" veld de omschrijving "label" ontbreekt.',
		'Het veld "%naam%" is niet gevonden.',
		'Het id "%markeer%" om te markeren is niet gevonden.',
		'De vergelijking kan niet uitgevoerd worden. Veld "%gelijkt%" was niet gevonden.',
		'%label% is een verplicht veld',
		'De waarde van %label% moet minimaal %minimaal% tekens bevatten.',
		'De waarde van %label% mag niet meer dan %maximaal% tekens bevatten.',
		'De waarde van %label% is niet geldig.',
		'"%label%" moet gelijk zijn aan  "%ml%"',
		'"%label%" of "%ml%" moet gevuld zijn.',
		'De waarde van %label% mag niet kleiner zijn dan %minwaarde%.',
		'De waarde van %label% mag niet groter zijn dan %maxwaarde%.',
		'16 sdsd'
	]
	
	
	//------------------------------------------------------------------
	// validator construction routine
	//------------------------------------------------------------------
	function formCheck(s_formulier, a_velden)
	{
		this.f_error = formCheck_error;
		this.f_alert = function(s_msg) { alert(s_msg); return false };
		
		// check required parameters
		if (!s_formulier)
		{
			return this.f_alert(this.f_error(0));
		}
		
		this.s_formulier = s_formulier;
		
		if (!a_velden || typeof(a_velden) != 'object')
		{
			return this.f_alert(this.f_error(1));
		}
		
		this.a_velden = a_velden;
		
		this.exec = formCheck_exec;
		
		//--------------------------------------
		// Server-side controle (phpcontrole)
		//--------------------------------------
	    var temp;
		temp = "";
		for (var t_key in a_velden)
		{
			temp = temp + t_key + " => Array(";
		    for ( var s_key in a_velden[t_key])
		    {
				temp = temp + s_key + "=>" + a_velden[t_key][s_key] + ","
			}
			temp = temp + ");";
		}
		document.forms[s_formulier].elements['phpcontrole'].value = temp;
		
		//--------------------------------------
	}
	//------------------------------------------------------------------
	
	
	//------------------------------------------------------------------
	// validator execution method
	//------------------------------------------------------------------
	function formCheck_exec()
	{
		var o_form = document.forms[this.s_formulier];
		if (!o_form)
		{
			return this.f_alert(this.f_error(2));
		}
		
		b_dom = document.body && document.body.innerHTML;
		
		// check integrity of the form fields description structure
		for (var n_key in this.a_velden)
		{
			// check input description entry
			this.a_velden[n_key]['naam'] = n_key;
			if (!this.a_velden[n_key]['label'])
			{
				return this.f_alert(this.f_error(3, this.a_velden[n_key]));
	        }
			o_input = o_form.elements[n_key];
			if (!o_input)
			{
				return this.f_alert(this.f_error(4, this.a_velden[n_key]));
	        }
			this.a_velden[n_key].o_input = o_input;
		}
		
		//	================= Additie =================
		/**
		 * @author 		M. Cuper
		 * @date 		28-04-2006
		 * @description:
		 *	Afkomstig van het originele script, deze functie reset de markering van een fout veld
		 *	Voor werking/implementatie zie: documentatie.
		*/
		
		// reset labels highlight
		if (b_dom)
		{
			for (var n_key in this.a_velden)
			{
				if (this.a_velden[n_key]['markeer'])
				{
					var s_labeltag = this.a_velden[n_key]['markeer'], e_labeltag = get_element(s_labeltag);
					if (!e_labeltag)
					{
						return this.f_alert(this.f_error(5, this.a_velden[n_key]));
					}
					this.a_velden[n_key].o_tag = e_labeltag;
					
					// normal state parameters assigned here
					e_labeltag.className = 'formCheckNormaal';	
				}
			}
		}
		//	================= EIND =================		
		
		
		// collect values depending on the type of the input
		for (var n_key in this.a_velden)
		{
			var s_value = '';
			o_input = this.a_velden[n_key].o_input;
			
			// checkbox
			if (o_input.type == 'checkbox')
			{
				s_value = o_input.checked ? o_input.value : '';
			}
			
			// select
			else if (o_input.type == 'select-one' || o_input.type == 'select-one')
			{
				s_value = (o_input.selectedIndex > -1) ? o_input.options[o_input.selectedIndex].value : '';
				//o_input.options[o_input.selectedIndex].value > -1
				//weggehaald ivm het vergelijken op basis van tekst
			}
			
			// text, password, hidden
			else if (o_input.value)
			{
				s_value = o_input.value;
			}
			
			// radiobutton
			else if (o_input.length > 0)
			{
				for (var n_index = 0; n_index < o_input.length; n_index++)
				{
					if (o_input[n_index].checked)
					{
						s_value = o_input[n_index].value;
						break;
					}
				}
			}
			
			this.a_velden[n_key]['waarde'] = s_value.replace(/(^\s+)|(\s+$)/g, '');
		}
	
		// check for errors
		var n_errors_count = 0,
			n_another,
			o_format_check;
		
		for (var n_key in this.a_velden)
		{
			o_format_check = this.a_velden[n_key]['soort'] && a_soorten[this.a_velden[n_key]['soort']]
				? a_soorten[this.a_velden[n_key]['soort']]
				: null;
				
			// reset previous error if any
			this.a_velden[n_key].n_error = null;
			
			// check required fields
			if (this.a_velden[n_key]['verplicht'] && !this.a_velden[n_key]['waarde'])
			{
				this.a_velden[n_key].n_error = 1;
				n_errors_count++;
			}
			
			// check length
			else if (this.a_velden[n_key]['minimaal'] && this.a_velden[n_key]['waarde'] != '' && String(this.a_velden[n_key]['waarde']).length < this.a_velden[n_key]['minimaal'])
			{
				this.a_velden[n_key].n_error = 2;
				n_errors_count++;
			}
			else if (this.a_velden[n_key]['maximaal'] && String(this.a_velden[n_key]['waarde']).length > this.a_velden[n_key]['maximaal'])
			{
				this.a_velden[n_key].n_error = 3;
				n_errors_count++;
			}
			
			
			//	================= Additie =================
			/**
			 * @author 		E. A. de Regt
			 * @date 		24-02-2006
			 * @contact		00gweb2@unica.nl	<Alleen voor vragen mbt deze functie>
			 * @description:
			 *	Check min-/maxwaarde controleert of de meegegeven waarde niet groter/kleiner is dan toegestaan
			 *	Voor werking/implementatie zie: documentatie.
			*/
			
			//check minwaarde
			else if (this.a_velden[n_key]['minwaarde']!=null && this.a_velden[n_key]['waarde'] != '' && Number(this.a_velden[n_key]['waarde']) < Number(this.a_velden[n_key]['minwaarde']))
			{
				this.a_velden[n_key].n_error = 7;
				n_errors_count++;
			}
			
			//check maxwaarde
			else if (this.a_velden[n_key]['maxwaarde']!=null && this.a_velden[n_key]['waarde'] != '' && Number(this.a_velden[n_key]['waarde']) > Number(this.a_velden[n_key]['maxwaarde']))
			{
				this.a_velden[n_key].n_error = 8;
				n_errors_count++;
			}	
			//	================= EIND =================
			
			
			// check match
			else if (this.a_velden[n_key]['gelijk'])
			{
				for (var n_key2 in this.a_velden)
				{
					if (n_key2 == this.a_velden[n_key]['gelijk'])
					{
						n_another = n_key2;
						break;
					}
				}
				if (n_another == null)
				{
					return this.f_alert(this.f_error(6, this.a_velden[n_key]));
				}
				if (this.a_velden[n_another]['waarde'] != this.a_velden[n_key]['waarde'])
				{
					this.a_velden[n_key]['ml'] = this.a_velden[n_another]['label'];
					this.a_velden[n_key].n_error = 5;
					n_errors_count++;
				}
			}
			
			// check format
			else if (this.a_velden[n_key]['waarde'] && this.a_velden[n_key]['soort'])
			{
				if((typeof(o_format_check) == 'function' && !o_format_check(this.a_velden[n_key]['waarde']))
				|| (typeof(o_format_check) != 'function' && !o_format_check.test(this.a_velden[n_key]['waarde'])))
				{
					this.a_velden[n_key].n_error = 4;
					n_errors_count++;
				}
			}
			
			// check one of two
			else if(this.a_velden[n_key]['of'])
			{
				for (var n_key2 in this.a_velden)
				{
					if (n_key2 == this.a_velden[n_key]['of'])
					{
						n_another = n_key2;
						break;
					}
				}
				
				if (n_another == null)
				{
					return this.f_alert(this.f_error(6, this.a_velden[n_key]));
				}
				
				if (!this.a_velden[n_key]['waarde'] && !this.a_velden[n_another]['waarde'])
				{
					if(!this.a_velden[n_another]['ml'])
					{
						this.a_velden[n_key]['ml'] = this.a_velden[n_another]['label'];
						this.a_velden[n_key].n_error = 6;
						n_errors_count++;
					}
				}
			}
			
			/*
			else if(this.a_velden[n_key]['fckeditor'])
			{
				if (FCKeditorAPI.GetInstance('tekstvak').GetXHTML() == "")
				{
					//this.a_velden[n_key].n_error = 15;
					n_errors_count++;
				}
			}
			*/
		}
	
		// collect error messages and highlight captions for errorneous fields
		var s_alert_message = '',
			e_first_error;
	
		if (n_errors_count != 0)
		{
			for (var n_key in this.a_velden)
			{
				var n_error_type = this.a_velden[n_key].n_error,
					s_message = '';
				
				if (n_error_type)
				{
					s_message = this.f_error(n_error_type + 6, this.a_velden[n_key]);
				}
	
				if (s_message)
				{
					if (!e_first_error)
					{
						e_first_error = o_form.elements[n_key];
					}
					
					s_alert_message += s_message + "\n";
					
					
					//	================= Additie =================
					/**
					 * @author 		M. Cuper
					 * @date 		28-04-2006
					 * @description:
					 *	Afkomstig van het originele script, deze markeert de label van een veld welke fout is
					 *	Voor werking/implementatie zie: documentatie.
					 * 
					 * @date		22-06-2006
					 * @description:
					 *  IF-statement veranderd, nu wordt het tweede 'of-veld' wel goed gekleurd.
					*/
					
					// highlighted state parameters assigned here
					if (b_dom && this.a_velden[n_key].o_tag)
					{
						this.a_velden[n_key].o_tag.className = 'formCheckFout';
						
						
						if (this.a_velden[n_key]['of'])
						{
							if (this.a_velden[n_another]['waarde'] == "" && this.a_velden[n_key]['waarde'] == "")
							{
								this.a_velden[n_another].o_tag.className = 'formCheckFout';
							}
						}
						
						/*
						if (n_another != undefined)
						{
							if (this.a_velden[n_another]['markeer'])
							{
								this.a_velden[n_another].o_tag.className = 'formCheckFout';
							}
						}
						*/
					}
					//	================= EIND =================
				}
			}
			
			alert(s_alert_message);
			
			// set focus to first errorneous field
			if (e_first_error.focus && e_first_error.type != 'hidden'  && !e_first_error.disabled)
			{
				if(e_first_error.style.display != 'none')
					eval("e_first_error.focus()");
			}
			
			// cancel form submission if errors detected
			return false;
		}
		
		/*for (n_key in this.a_2disable)
			if (o_form.elements[this.a_2disable[n_key]])
				o_form.elements[this.a_2disable[n_key]].disabled = true;
		*/
		
		return true;
	}
	//------------------------------------------------------------------
	
	
	function formCheck_error(n_index)
	{
		var s_ = a_meldingen[n_index], n_i = 1, s_key;
		for (; n_i < arguments.length; n_i ++)
		{
			for (s_key in arguments[n_i])
			{
				s_ = s_.replace('%' + s_key + '%', arguments[n_i][s_key]);
			}
		}
		s_ = s_.replace('%form%', this.s_formulier);
		return s_
	}
	
	
	//	================= Additie =================
	/**
	 * @author 		P.Schonewille
	 * @date 		08-02-2006
	 * @contact		p.schonewille@xs4all.nl
	 * @description:
	 *	Deze functie controleert of de opgegegeven checkbox aangevinkt is.
	 *	Vervolgens wordt de bestaande a_fields aangevuld met de verplichte velden.
	 *	Voor werking/implementatie zie: documentatie.
	*/
	function formCheckIf(a_fields, elements)
	{
		//	a_fields aan temp_var toewijzen
		var fields = a_fields;
		//	Per property van de opgegeven elementen een loop starten
		for (veld in elements)
		{
			if(document.getElementById(veld) == null)
				continue;
				
			var type = document.getElementById(veld).type;
						
			if (type == 'radio' || type == 'checkbox')
			{			
				//	Controleren of checkbox aangevinkt is
				if (document.getElementById(veld).checked == true)
				{
					//	Bij ^=ja per property van de property loop starten
					for (koppel_veld in elements[veld])
					{
						fields[koppel_veld] = elements[veld][koppel_veld];
					}
				}			
			}
			else
			{
				//	Controleren of waarde niet leeg is
				if (document.getElementById(veld).value != '')
				{					
					for (koppel_veld in elements[veld])
					{
						fields[koppel_veld] = elements[veld][koppel_veld];
					}
				}			
			}
		}
		// temp_var returnen
		return fields;
	}
	/**
	 * @description:
	 *	Deze functie stelt 'element2' verplicht wanneer 'element1' de waarde heeft van 'waarde'
	*/
	function formCheckdouble(a_fields, element1, element2, waarde, label)
	{
		if(element1.value == waarde)
		{
			a_fields[element2.name] = {'label': label, 'verplicht': true}
		}
		return a_fields;
	}	
	//	================= EIND =================
	//	================= Additie =================
	/**
	 * @author 		P.Schonewille
	 * @date 		28-06-2006
	 * @contact		p.schonewille@xs4all.nl
	 * @description:
	 *	Deze functie maakt het mogelijk om bij een waarde van bepaalde velden-
	 *	andere velden verplicht te maken (in ieder geval toevoegen aan formuliercontrole)
	 * @parameters
	 *		- formulier					Naam van de form-tag
	 *		- a_fields					De velden die altijd verplicht zijn (Zie formCheck gebruik)
	 *		- b_fields					De velden die bij bepaalde waardes, andere velden verplicht stelt
	*/
	function formCheckdouble_dev(formulier ,a_fields, b_fields)
	{
		// Elk veld doorlopen in b_fields
		for (veld in b_fields)
		{
			// Elke waarde doorlopen in het veld
			for (waarde in b_fields[veld])
			{
				// Controleren of het attribuut de waarde heeft waarop gecontroleerd moet worden
				if (document.forms[formulier][veld].value == waarde)
				{
					// Wanneer de waardes gelijk zijn elk koppel_veld toevoegen aan a_fields
					for (koppel_veld in b_fields[veld][waarde])
					{
						// Het toevoegen van de juiste b_fields aan a_fields
						a_fields[koppel_veld] = b_fields[veld][waarde][koppel_veld];
					}
				}
			}
		}
		return a_fields;
	}
	//	================= EIND =================
	
	
	//	================= Additie =================
	/**
	 * @author 		M. Cuper
	 * @date 		28-04-2006
	 * @description:
	 *	Afkomstig van het originele script, deze functie is nodig voor de markeer functie
	 *	Voor werking/implementatie zie: documentatie.
	*/
	function get_element (s_id)
	{
		return (document.all ? document.all[s_id] : (document.getElementById ? document.getElementById(s_id) : null));
	}
	//	================= EIND =================
