	$("document").ready(function() {
		$(":input[validate]").bind("change.validate keyup.validate click.validate blur.validate focus.validate",function() {
			var id = $(this).attr("id");
			var state = "valid";
			var val = $(this).val();
			
			if (val == "")
				if ($(this).attr("required") == "true")
					state = "required";
				else
				{
					$(".validation_status[field='" + id + "']").html("Not required");
					$(this).attr("state","valid");
					return;
				}
			
			if ($(this).attr("match"))
				if (val != $("#" + $(this).attr("match")).val())
					state = "unmatched";
			
			if ($(this).attr("min"))
				if (val.length < $(this).attr("min"))
					state = "too_short";
			
			if ($(this).attr("max"))
				if (val.length > $(this).attr("max"))
					state = "too_long";
			
			if ($(this).attr("numeric"))
				if (isCharacter(val))
					state = "non_numeric";
			
			if ($(this).attr("validate_function") && val)
				if (!call_function($(this).attr("validate_function"),val))
					state = "invalid";
			
			$(this).attr("state",state);

			if ($(this).attr("match"))
				if ($("#" + $(this).attr("match")).attr("state") != state)
					$("#" + $(this).attr("match")).change();

			switch(state)
			{
				case "required":
					$(".validation_status[field='" + id + "']").html("<span class=\"ui-icon ui-icon-alert\"><\/span> Required");
					break;
				case "invalid":
					$(".validation_status[field='" + id + "']").html("<span class=\"ui-icon ui-icon-alert\"><\/span> Not valid");
					break;
				case "unmatched":
					$(".validation_status[field='" + id + "']").html("<span class=\"ui-icon ui-icon-alert\"><\/span> No match");
					break;
				case "valid":
					$(".validation_status[field='" + id + "']").html("<span class=\"ui-icon ui-icon-check\"><\/span> Thank you");
					break;
				case "non_numeric":
					$(".validation_status[field='" + id + "']").html("<span class=\"ui-icon ui-icon-alert\"><\/span> Non numeric");
					break;
				case "too_short":
					$(".validation_status[field='" + id + "']").html("<span class=\"ui-icon ui-icon-alert\"><\/span> Too short");
					break;
				case "too_long":
					$(".validation_status[field='" + id + "']").html("<span class=\"ui-icon ui-icon-alert\"><\/span> Too long");
					break;
			}
		});
		
		// Validate all items now
		$(":input[validate]",this).each(function() { $(this).change(); });
		
		$("form").submit(function() {
			var validated = true;
			$(":input[validate]",this).each(function() {
				$(this).change();
				if ($(this).attr("state") != "valid")
					$(this).
					validated = false;
			});
			if (validated)
				return true;
			else
			{
				$.msgBox("Errors with form","There are errors with your form, please review and re-submit",{ OK: null });
				return false;
			}
		});
	});
	
	function call_function(function_name)
	{
		var args = [];
		var gthis = (function(){return this;})();
		for (var i = 1; i < arguments.length; i++)
			args[i - 1] = arguments[i];
		return gthis[function_name].apply(gthis,args);
	}
	
	function check_email(email)
	{
		var mypattern = /^[a-zA-Z0-9_\-\.]+@[a-zA-Z0-9_\-\.]+\.[a-zA-Z0-9_\-\.]+$/; 

		var result = email.match(mypattern);
	
		if(result == null)
			return false;
		else
			return true;
	}

	function check_phone(number)
	{
		// attempts to match phone number.
		var mypattern = /^[0|\+][0-9 ]+$/;

		var result = number.match(mypattern);

		if(result == null)
			return false;
		else
			return true;
	}

	function check_postcode(postcode)
	{
		// attempts to match postcode.
		var mypattern = /^[A-Za-z]{1,2}[0-9][A-Za-z0-9]? ?[0-9]{1}[A-Za-z]{2}$/;

		var result = postcode.match(mypattern);

		if(result == null)
			return false;
		else
			return true;
	}
