$j('document').ready(function() {
	$j('.field').blur(function() {
		validate($j(this));
	});
	
	$j('.field').focus(function() {
		if ($j(this).is($j('select'))) {
			$j(this).parent().parent().find('.notification').remove();
		} else {
			$j(this).parent().find('.notification').remove();
		}
	});
	
	$j('#wpCat').change(function() {
		var orderField = $j('#order');
		if ($j(this).val() != 'Please select...') {
			$j.get('ordercheck.php', { cat: $j(this).val() }, function(order) {
				order = order.replace(' ', '');
				orderField.val(order);
				orderField.parent().find('.error').remove();
			});
		} else {
			orderField.val(1);
			orderField.parent().find('.error').remove();
		}
	});
	
	$j('form:not(#addBookingForm)').submit(function() {
		$j(this).find('.field').each(function(){
			validate($j(this));
		});
					
		if ($j(this).find('span.error').length > 0) {
			alert("Some data is missing or incorrect. Please correct the errors and try again.");
			return false;
		}
	});
});

function validate(field) {
	var value = field.val();
	var errorMsg;
	
	if (value == '' || value == 'Please select&#8230;') {
		if (!field.attr('title') || field.attr('title') == '') {
			errorMsg = error('This is a required field');
		} else {
			errorMsg = error(field.attr('title'));
		}
	} else {
		if (field.hasClass('whole')) {
			// Field must be a number
			if (!validateWholeNumber(value)) {
				errorMsg = error('Please enter a number without decimals');
			}
		} else if (field.hasClass('decimal')) {
			// Field must be a number
			if (!validateDecimalNumber(value)) {
				errorMsg  = error('Please enter a number');
			}
		} else if (field.hasClass('slug')) {
			// Validate URL slug
			if (!validateSlug(value)) {
				errorMsg  = error('Invalid URL slug');
			} else {
				$.get('slugcheck.php', { slug: value }, function(response) {
					if (response > 0) {
						errorMsg = error('This URL slug is already in use');
						field.parent().find('.error').remove();
						$j(errorMsg).insertAfter(field);
					}
				});   
			}
		} else if (field.hasClass('postcode')) {
			// Field must be a postcode
			if (!validatePostcode(value)) {
				errorMsg  = error('Invalid UK postcode');
			}
		} else if (field.hasClass('phone')) {
			// Field must be a UK telephone number
			if (!validateUKTelephoneNumber(value)) {
				errorMsg  = error('Telephone no. must include UK area code');
			}
		} else if (field.hasClass('mobile')) {
			// Field must be a UK mobile number
			if (!validateMobileNumber(value)) {
				errorMsg  = error('Mobile no. must be 11 digits starting \'07\'');
			}
		} else if (field.hasClass('email')) {
			// Field must be an email address
			if (!validateEmailAddress(value)) {
				errorMsg  = error('Invalid email address');
			}
		} else if (field.hasClass('url')) {
			// Field must be a website URL
			if (!validateURL(value)) {
				errorMsg  = error('Invalid website URL');
			}
		} else if (field.hasClass('date') || field.hasClass('datepast')) {
			// Field must be a website URL
			if ($j('#ui-datepicker-div').not(':visible')) {
				if (!validateDate(value)) {
					errorMsg = error('Date must be formatted as dd/mm/yyyy');
				}
			}
		}
	}
		
	if (errorMsg && field.is($j('select'))) {
		field.parent().parent().find('.error').remove();
		$j(errorMsg).insertAfter(field.parent());
	} else {
		field.parent().find('.error').remove();
		if (errorMsg) {
			$j(errorMsg).insertAfter(field);
		}
	}
}

function validateDate(v) {
	// Check that date is in the format DD/MM/YYYY form 01/01/1900 to 31/12/2099
	var result = v.match(/^(01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31){1}\/(01|02|03|04|05|06|07|08|09|10|11|12){1}\/(19|20){1}[0-9]{2}$/);
	return result;
}

function validateWholeNumber(v) {
	var result = v.match(/^[0-9]+$/);
	return result;
}

function validateDecimalNumber(v) {
	var result = v.match(/^[0-9]+\.{1}[0-9]+$/);
	return result;
}

function validateUKTelephoneNumber(v) {
	var result = v.match(/^((\(?0\d{4}\)?\s?\d{3}\s?\d{3})|(\(?0\d{3}\)?\s?\d{3}\s?\d{4})|(\(?0\d{2}\)?\s?\d{4}\s?\d{4}))(\s?\#(\d{4}|\d{3}))?$/);
	return result;
}

function validateMobileNumber(v) {
	var result = v.match(/(^()07\d{9}$)|(^()07\d{3}\s?\d{3}\s?\d{3}$)|(^()07\d{2}\s?\d{4}\s?\d{3}$)|(^()07\d{2}\s?\d{3}\s?\d{4}$)/);
	return result;
}

function validateEmailAddress(v) {
	var result = v.match(/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/);
	return result;
}

function validatePostcode(v) {
	var result = v.match(/^([A-Za-z]{1,2}[0-9][0-9A-Za-z]{0,1} ?[0-9][A-Za-z]{2})$/);
	return result;
}

function validateSlug(v) {
	var result = v.match(/^[A-Za-z0-9]+(-{1}[A-Za-z0-9]+)*$/);
	return result;
}

function validateURL(v) {
	var result = v.match('/^((https?)://)?(www\.)?[A-Za-z0-9\.]+$/');
	return result;
}

function error(msg) {
	var notification = '<span class="error">'+msg+'</span>';
	return notification;
}
