	function initialise(){
		// Grab each form element
		$("label[title]").each(function(){
			$(this).append('<div class="infopop">');	
			titletext = $(this).attr("title");
			$(this).removeAttr("title");
			$(".infopop",this).css({opacity:0}).html(titletext);
			$("input",this).focus(function(){
				// Mouseover
				doFocus(this);
			}).blur(function(){
				// MouseOut
				doBlur(this);
			});
			$("textarea",this).focus(function(){
				// Mouseover
				doFocus(this);
			}).blur(function(){
				// MouseOut
				doBlur(this);
			});
			if ($("input",this).attr('name') == filled[num]){
				$("input",this).focus();
				$("input",this).blur();
			}
			if ($("textarea",this).attr('name') == filled[num]){
				$("textarea",this).focus();
				$("textarea",this).blur();
			}
			num++;	
		});
	}
	
	function doFocus(obj) {
		$(obj).addClass("active").parents("label").addClass("active").find(".infopop").animate({opacity:1,left:492},500);
	}
	
	function doBlur(obj) {
		if (validate(obj)) { 
			//isGood(obj);
		}
	}
	
	function reportErr(obj, message) {
		$(obj).addClass("error").parents("label").removeClass("isgood").addClass("required").addClass("error").find(".infopop").html(message).addClass("errorpop").animate({opacity:1,left:492},500);
	}
	
	function isGood(obj, message) {
		$(obj).removeClass("error").removeClass("active").parents("label").addClass("isgood").removeClass("error").removeClass("active").find(".infopop").html(message).removeClass("errorpop").animate({opacity:0,left:513},500);
	}
	
	function isGoodCaptcha(obj, message) {
		$(obj).removeClass("error").removeClass("active").parents("label").addClass("isgood").removeClass("error").removeClass("active").find(".infopop").html(message).removeClass("errorpop").animate({opacity:0,left:513},500);
		//.removeClass("errorpop").animate({opacity:0,left:513},500)
	} 
	
	function validate(obj) {
		// Extend jQuery object to include Regular expression masks assigned to properties
		mask = jQuery.extend({textfieldmask: /^[a-z\.\s-]{1,}$/i,messagemask: /^[a-z\.\s-]{1,}$/i,emailmask:/^([a-z0-9\+_\-]+)(\.[a-z0-9\+_\-]+)*@([a-z0-9\-]+\.)+[a-z]{2,6}$/, captchamask: /^[a-z\.\s-]{1,}$/i});
		// Extend jQuery object to include error messages assigned to properties
		errmsg = jQuery.extend({textfielderr:"Enter a name",messageerr: "Enter a message",emailerr:"Invalid email address",captchaerr:"Enter the captcha"});
		
		goodmsg = jQuery.extend({nameGood:"Name validated",msgGood: "Message validated",emailGood:"Email address validated",captchaGood:"Captcha entered"});
	
		// Set up variables to hold details of which mask to use and whether the field should match another field
		var masktouse = null;
		var mustmatch = null;
		// Determine the type of mask we're going to validate against
		switch(obj.name) {
			case "name": 							masktouse="textfieldmask"; 			errtouse="textfielderr";	gooduse="nameGood"; 		break;
			case "message": 						masktouse="messagemask"; 			errtouse="messageerr"; 		gooduse="msgGood";			break;
			case "email": 							masktouse="emailmask"; 				errtouse="emailerr"; 		gooduse="emailGood";		break;
			case "recaptcha_response_field": 		masktouse="captchamask"; 			errtouse="captchaerr"; 		gooduse="captchaGood";		break;
		}
		// Check that the element is a required field before validating against it.
		if($(obj).parents("label").hasClass("required") && masktouse) {
			// Set up a quick way of accessing the object we're validating
			pointer = $(obj);
			// Test the value of the field against the Regular Expression
			if (mask[masktouse].test(pointer.val())) {
				// The field validated successfully!
				
				// Check to see if the field needs to match another field in the form
				if (mustmatch) {
					// It does need to match, so grab the object it needs to match
					matchobj = $("#"+mustmatch);
					if (matchobj.val()!='' && matchobj.val()!=pointer.val()) {
						// The fields don't match, so report an error on both of them
						reportErr(obj,errmsg["matcherr"]);	
						reportErr(matchobj,errmsg["matcherr"]);
					}
					else {
						// Either the fields match, or the other field hasn't been completed yet
						// If the other field has been completed, call the isGood function to clear any error message showing
						if (matchobj.val()!='') {
							isGood(matchobj);
						}
						return true;
					}
				}
				else {
					// No match is required, so return true - validation passed!
					if (obj.name == 'recaptcha_response_field'){
						isGoodCaptcha(obj, goodmsg[gooduse]);
					}else{
						isGood(obj, goodmsg[gooduse]);
					}
					return true;
				} 
			}
			else { 
				// The field failed to validate against the Regular Expression
				reportErr(obj,errmsg[errtouse]);
				return false; 
			}
		} 
		else {	
			// This isn't a required field, so we won't validate it against anything			
			return true;
		}
	}

function validateAll(form){
	var valid = true
	$(':input', form).each(function(){
		if (!validate(this)){
			valid = false;
		}
	});
	return valid;
}