	function verifyForm(form)
	{
		// Get all elements
		var elements = form.getElementsByTagName("div");

		// Locate all validators
		var validators = new Array();

		for (var i = 0; i < elements.length; ++i)
		{
			if (elements[i].getAttribute("validator") != null)
			{
				validators[validators.length] = elements[i];
			}
		}
		
		// Test each validator and show the message if a validator fails
		var valid = true;
		
		var focusElement = null;
		
		
		for (var i = 0; i < validators.length; ++i)
		{
			var validator = validators[i];
			var validatorValid = true;
			
			
			
			switch (validator.getAttribute("validator"))
			{
				case null:
					break;
				
				case "required":
					validatorValid = requiredFieldValidator(validator);
					break;
				
				case "regExp":
					validatorValid = regularExpressionValidator(validator);
					break;
					
				default:
					break;
			}
			
			if (!validatorValid)
			{
				valid = false;
				
				if (focusElement == null)
				{
					focusElement = document.getElementById(validator.getAttribute("validatorFor"));
				}
			}
		}
		
		if (!valid)
		{
			focusElement.focus();
		}
		
		return valid;
	}
	
	function attachValidator(element, validator)
	{			
		// Check if the validator exists in the validators array
		var exists = false;
		
		if (typeof(element.validators) == "undefined")
		{
			element.validators = new Array();
		}
		
		for (i = 0; i < element.validators.length; ++i)
		{
			if (element.validators[i] == validator)
			{
				exists = true;
				break;
			}
		}
		
		// Add the validator to the validators array
		if (!exists)
		{
			element.validators[element.validators.length] = validator;
		}
		
		// Create onkeyup event if it doesn't exists
		if (element.onkeyup == null)
		{
			element.onkeyup = function()
			{
				for (i = 0; i < this.validators.length; ++i)
				{
					this.validators[i].validate();
				}
			}
		}
	}
	
	function toggleValidator(validator, valid)
	{
		// Hide the validator if it's valid
		if (valid)
		{
			validator.style.display = "none";
		}
		// Show the validator if the validator fails
		else
		{
			validator.style.display = "inline";
		}
	}
	
	function requiredFieldValidator(validator)
	{
		var element = document.getElementById(validator.getAttribute("validatorFor"));
		var valid = true;
		var type = element.tagName == "input" ? element.type.toLowerCase() : element.tagName.toLowerCase();
		
		validator.validate = function()
		{
			requiredFieldValidator(validator);
		}
			
		attachValidator(element, validator);
		
		switch (element.type)
		{
			case "text":
			case "textarea":
				if (element.value == "")
				{
					valid = false;
				}
				break;
					
			default:
				break;
		}
		
		toggleValidator(validator, valid);
		
		return valid;
	}
	
	function regularExpressionValidator(validator)
	{
		var element = document.getElementById(validator.getAttribute("validatorFor"));
		var regExp 	= new RegExp(validator.getAttribute("validationExpression"));
		var valid = true;
		var type = element.tagName == "input" ? element.type.toLowerCase() : element.tagName.toLowerCase();
		
		validator.validate = function()
		{
			regularExpressionValidator(validator);
		}
		
		attachValidator(element, validator);
		
		switch (element.type)
		{
			case "text":
			case "textarea":
				if (!regExp.test(element.value))
				{
					valid = false;
				}
				break;
					
			default:
				break;
		}
		
		toggleValidator(validator, valid);
		
		return valid;
	}