$(document).ready(function(){
	/** Inline Validation */
	jQuery.fn.extend({
		/** field is required */
		require: function(failMsg) {
			var element = $(this);
			return $(this).queue('validators', function() {
				if (element.isDefaultValue()) {
					element.data('error', failMsg);
					return false;
				}
				return true;
			});
		},
		/** field is required if account is business */
		requireIfBusiness: function(failMsg) {
			var element = $(this);
			return $(this).queue('validators', function() {
				if ('y' == $("input[name=business]:checked").val()) {
					if (element.isDefaultValue()) {
						element.data('error', failMsg);
						return false;
					}
					return true;
				}
			});
		},
		/** field is required if account is limited business */
		requireIfBusinessLtd: function(failMsg) {
			var element = $(this);
			return $(this).queue('validators', function() {
				if (/limited/i.test($("select[name=business_type] :selected").text())) {
					if (element.isDefaultValue()) {
						element.data('error', failMsg);
						return false;
					}
				}
				return true;
			});
		},
		/** field has a minimum length */
		minimumLength: function(minLength, failMsg) {
			var element = $(this);
			return $(this).queue('validators', function() {
				if (element.val().length < minLength) {
					element.data('error', failMsg);
					return false;
				}
				return true;
			});
		},
		/** field has a maximum length */
		maximumLength: function(maxLength, failMsg) {
			var element = $(this);
			return $(this).queue('validators', function() {
				if (element.val().length > maxLength) {
					element.data('error', failMsg);
					return false;
				}
				return true;
			});
		},
		/**  matches a regular expression */
		matchRegex: function(regex, failMsg) {
			var element = $(this);	
				return $(this).queue('validators', function() {
					if (element.isDefaultValue()) {
						return true;
					} else if (!regex.test(element.val())) {
						element.data('error', failMsg);
						return false;
					}
					return true;
				});				
			
		},
		/** matches value against that of another form element */
		matchElement: function(targetElement, failMsg) {
			var element = $(this);
			return $(this).queue('validators', function() {
				if (element.val() !== targetElement.val()) {
					element.data('error', failMsg);
					return false;
				}
				return true;
			});
		},
		/** Validates select date group */
		checkDateGroup: function(failMsg) {
			var dateSelects = $(this);
			return dateSelects.each(function(){
				$(this).queue('validators', function(element) {
					//check all selects have values
					var valid = true;
					dateSelects.each(function(){
						var select = $(this);
						if (select.isDefaultValue()) {
							valid = false;
						}
					});
					if (!valid) {
						element.data('error', failMsg);
						return false;
					}
					//check valid date
					var date = new Date();
					date.setYear(Number(dateSelects.filter("select[name$='Year']").val()));
					date.setMonth(Number(dateSelects.filter("select[name$='Month']").val()) - 1);
					date.setDate(Number(dateSelects.filter("select[name$='Day']").val()));

					//date object day will not match select value on bad date ie Feb 31
					if (date.getDate() != Number(dateSelects.filter("select[name$='Day']").val())) {
						valid = false;
						element.data('error', 'Please enter a valid date');
						
					}
					return valid;
				});
			});
		},
		/** validate element */
		isValid: function() {
			var validators = $(this).queue('validators');
			for (key in validators) {
				if (!validators[key]($(this))) {
					return false;
				}
			}
			return true;
		},
		/** regex find and replace */
		filterRegex: function(regex, replacement) {
			var element = $(this);
			return $(this).queue('filters', function() {
				var data = element.val();
				element.val(data.replace(regex, replacement));
			});
		},
		/** run data filters on field */
		filterData: function() {
			var filters = $(this).queue('filters');
			for (key in filters) {
				filters[key]($(this));
			}

		},
		/** monitor element and trigger validation when altered */
		watch: function() {
			$(this).bind('blur', function(){
				$(this).filterData();
			});
			$(this).bind('blur change', function(){
				if ($(this).isValid()) {
					$(this).flyoutSuccess();
				} else {
					$(this).flyoutFail($(this).data('error'));
				}
			});
			$(this).bind('focus', function(){
				$(this).flyoutInfo();
			});
		},
		/** check if element is set to its default value */
		isDefaultValue: function() {
			var element = $(this);
			if ('SELECT' == element.attr('tagName')) {
				return (-1 == element.val());
			}
			if ('radio' == element.attr('type')) {
				return (0 == element.filter(':checked').length);
			}
			return ('' == element.val());
		},
		/** Configure flyouts for valid element */
		flyoutSuccess: function () {
			var flyouts = $(this).parents('td').next().children('.flyout');
			flyouts.filter('.bad').hide();
			flyouts.filter('.good').fadeIn('slow', function() {
		        // Animation complete
			});
			flyouts.filter('.info').hide();
		},
		/** Configure flyouts for non-valid element */
		flyoutFail: function (msg) {
			var flyouts = $(this).parents('td').next().children('.flyout');
			if (undefined !== msg) {
				flyouts.filter('.bad').html(msg);
			} 
			flyouts.filter('.bad').fadeIn('slow', function() {
		        // Animation complete
			});
			flyouts.filter('.good').hide();
			flyouts.filter('.info').hide();
		},
		/** Configure flyouts to show info */
		flyoutInfo: function () {
			var flyouts = $(this).parents('td').next().children('.flyout');
			flyouts.filter('.bad').hide();
			flyouts.filter('.good').hide();
			flyouts.filter('.info').fadeIn('slow', function() {
		        // Animation complete
			});
		}
	});

	//filter
	$("input[name=phone1]").filterRegex(/\s/g, '');

	//validators
	$("input[name=firstname]").require('First name is required.').watch();
	$("input[name=lastname]").require('Surname is required').watch();
	$("input[name=email]").matchRegex(/^[\w.\-]+@[\w.\-]+$/, 'Not a valid email address').watch();
//	$("input[name=phone1]").watch();
	$("input[name=phone1]").matchRegex(/^[\d]{10,11}$/, 'Not a valid telephone number').watch();
		
	$("input[name=property]").require('Property required').watch();
	$("input[name=address1]").require('Street is required').watch();
	$("input[name=town]").require('Town/city is required').watch();
	$("input[name=postcode]").require('Postcode required').watch();	
	$("input[name=county]").watch();
	$("input[name=country]").watch();
	

	$("input[name=childfirstname]").require('First name is required.').watch();
	$("input[name=childlastname]").require('Surname is required').watch();
	$("select.dateOfBirth").checkDateGroup('Date of birth is required').each(function(){$(this).watch()});
	$("input[name=yearentry]").require('Prospective year of entry is required').watch();
	$("input[name=yeargroup]").require('Year group is required').watch();
	$("input[name=heard]").watch();
	$("input[name=current]").watch();
	$("textarea[name=information]").watch();


	$("select[name=question_id]").require('Secret question is required').watch();
	$("input[name=answer]").require('Secret answer is required').watch();

	/** Validation Notifications */
	jQuery.fn.extend({
		/** display correct flyouts on load for form elements */
		displayValidationFlyouts: function() {
			var element = $(this);
			if ('' !== element.getValidationErrorMessage()) {
				element.flyoutFail();
			} else {
				if (!element.isDefaultValue()) {
					element.flyoutSuccess();
				}
			}
		},
		/** display correct flyouts on load for radio form elements */
		displayValidationFlyoutsRadio: function() {
			var radios = $(this);
			if ('' !== $(radios[0]).parent().getValidationErrorMessage()) {
				$(radios[0]).parent().flyoutFail();
				return;
			}
			if (1 == radios.filter(':checked').length) {
				$(radios[0]).parent().flyoutSuccess();
			}
		},
		/** get error message from flyout */
		getValidationErrorMessage: function() {
			var errorNode = $(this).parents('td').next().children('.bad');
			if (errorNode.length == 0) {
				return '';
			}
			return errorNode.html().split(' ').join();
		}
	});
	
	$("form#register_account :text").each(function(){$(this).displayValidationFlyouts();});
	$("form#register_account :password").each(function(){$(this).displayValidationFlyouts();});
	$("form#register_account select").each(function(){$(this).displayValidationFlyouts();});
	$("form#register_account input[name=vchGender]").displayValidationFlyoutsRadio();
	$("form#register_account input[name=business]").displayValidationFlyoutsRadio();
	$("form#register_account select[name=business_type]").bind('blur change', function(){
		$("form#register_account input[name=reg_number]").change();
		
	});
});

