/**************************************************/
/* FORM VALIDATOR                                 */
/*                                                */
/* Author		: A.H. Miedema                    */
/* Copyright	: Eigen & Wijze Communicatie BV   */
/*                Emmakade 70                     */
/*                8933 AV Leeuwarden              */
/*                THE NETHERLANDS                 */
/*                                                */
/* Version		: 0.1.2                           */
/**************************************************/

var TYPE_TEXT     = 0;
var TYPE_SELECT   = 1;
var TYPE_CHECK    = 2;
var TYPE_RADIO    = 3;
var TYPE_EMAIL    = 4;
var TYPE_URL      = 5;

var ERROR_STYLE   = 1;
var ERROR_ALERT   = 2;
var ERROR_MESSAGE = 3;

// This script checks formdata
function FormValidator(formId)
{
	this.errorClass  = 'error';
	this.focusClass  = 'focus';
	this.fields      = new Object();
	this.form        = document.getElementById(formId);
	
	// Check for IE6
	var IE6          = navigator.userAgent.indexOf('MSIE 6.0') != -1
		? true
		: false;
		
	var lScope       = this;
	
	for(var q in this.form.elements)
	{
		var el      = this.form.elements[q];
		
		if(typeof(el) == 'object' && el != null)
		{
			if((el.nodeName == 'INPUT' && el.type == 'text') || el.nodeName == 'TEXTAREA' || el.nodeName == 'SELECT')
			{
				if(!IE6)
				{
					var _focus  = el.getAttribute('onfocus') == null
						? ''
						: el.getAttribute('onfocus');
						
					var _blur   = el.getAttribute('onblur') == null
						? ''
						: el.getAttribute('onblur');
					
					el.setAttribute('onfocus', '_setFocus(this, \'' + this.focusClass + '\'); ' + _focus);
					el.setAttribute('onblur', '_hideFocus(this, \'' + this.focusClass + '\'); ' + _blur);
				} else
				{	
					el.onblur = function()
					{
						lScope.validateField(this.name);
						_hideFocus(this, lScope.focusClass);
					}
					
					el.onfocus = function()
					{
						_setFocus(this, lScope.focusClass);
					}
				}
			}
		}
	}
	
	/// PUBLIC METHODS
	//////////////////////////////////////////////////
	
	this.addValidationField = function(name, type, value, label, required)
	{
		if(!this.fields[name])
		{
			required == undefined 
				? false 
				: required;
			
			this.fields[name] = {name : name, type : type, value : value, label : label, required : required};
		}
		/*
		for(var q in this.fields)
		{
			alert(q);
		}
		*/
	}
	
	this.validate           = function()
	{
		var submitForm = true;
		
		for(var q in this.fields)
		{
			var field = this.fields[q];
			if(!this.validateField(field.name, true))
			{
				submitForm = false;
			}
		}
		
		return submitForm;
	}
	
	this.validateField      = function(field, checkTotal)
	{
		if(!checkTotal) { checkTotal = false; }
		
		if(!this.fields[field])
		{
			
			alert('The field "' + field + '" is not set to be validated and therefor will be seen as valid');
			
			return true;
		}
		
		// The field does exist, so lets start validating
		var form  = this.form;
		var field = this.fields[field];
		var el    = form.elements[field.name];
		
		if(!el)
		{
			// Okay, the element does not exists, so maybe there is a error field with the given name of this element
			var error = document.getElementById('error_' + field.name);
			
			if(!error)
			{
				alert('Het opgegeven veld "' + field.name + '" bestaat niet.');
			} else
			{
				error.style.display = 'block';
				error.innerHTML     = 'Het veld <b>' +field.label + '</b> moet zijn aangemaakt / ingevuld';
			}
			
			return false;
		} else
		{
			var error = document.getElementById('error_' + el.id);
			
			switch(field.type)
			{
				case TYPE_TEXT :
					if(field.required && (el.value == field.value || el.value == ''))
					{
						if(error)
						{
							error.style.display = 'block';
							error.innerHTML     = '<b>' +field.label + '</b> is een verplicht veld';
						}
						
						el.className += ' ' + this.errorClass;
						
						if(checkTotal)
						{
							el.focus();
						}
						
						return false;
					}
					
					break;
				
				case TYPE_SELECT :
					if(el.value.length == 0 && field.required)
					{
						if(error)
						{
							error.style.display = 'block';
							error.innerHTML     = 'U dient een keuze te maken bij  <b>' + field.label + '</b>';
						}
						
						el.className    += ' ' + this.errorClass;
						
						if(checkTotal)
						{
							el.focus();
						}
						
						return false;
					}
					
					break;
				
				case TYPE_CHECK :
				case TYPE_RADIO :
					var checked = false;
					
					if(el.length)
					{
						for(var i = 0; i < el.length; i++)
						{
							if(el[i].checked)
							{
								checked = true;
								break;
							}
						}
					} else {
						var el2 = el;
						var el  = new Array();
						el.push(el2);
						
						if(el[0].checked)
						{
							checked = true;
						}
					}
					
					if(!checked && field.required)
					{
						error = document.getElementById('error_' + el[0].id);
						if(error)
						{
							error.style.display = 'block';
							error.innerHTML     = 'U dient een keuze te maken bij <b>' + field.label + '</b>';
						}
						
						el[0].className    += ' ' + this.errorClass;
						
						/*
						if(checkTotal)
						{
							el[0].focus();
						}
						*/
						
						return false;
					}
					
					break;
				
				case TYPE_EMAIL :
					if(!validateEmail(el.value))
					{
						if(error)
						{
							error.style.display = 'block';
							error.innerHTML     = 'U heeft geen geldig e-mailadres opgegeven bij <b>' + field.label + '</b>';
						}
						
						el.className    += ' ' + this.errorClass;
						if(checkTotal)
						{
							el.focus();
						}
						
						return false;
					}
					
					break;
				
				case TYPE_URL :
					if(!validateURL(el.value))
					{
						if(error)
						{
							error.style.display = 'block';
							error.innerHTML     = 'U heeft geen geldig internetadres ingevoerd bij <b>' + field.label + '</b>';
						}
						
						el.className    += ' ' + this.errorClass;
						if(checkTotal)
						{
							el.focus();
						}
						
						return false;
					}
					
					break;
			}
		
			if(el.length)
			{
				el[0].className = el[0].className.split(this.errorClass).join('');
			} else
			{
				el.className    = el.className.split(this.errorClass).join('');
			}
		}
		
		if(error)
		{
			error.innerHTML     = '';
			error.style.display = 'none';
		}
		
		return true;
	}
}

function validateEmail(email)
{
	var regexp = /^.+\@+..+$/
	return regexp.test(email);
}

function validateURL(url)
{
	var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
	return regexp.test(url);
}

function _setFocus(obj, clazz)
{
	obj.className += ' ' + clazz;
}

function _hideFocus(obj, clazz)
{
	obj.className = obj.className.split(clazz).join('');
}
