(function ($) {
	$(function() {
		$('#teaselect input[type=submit], #teaselect input[type=image], #teaselect button').click(function() {
			var form = $(this).parents('form');
			var g_quantityCount = 0;
			var valid = true;
			
			// VALIDATE EACH REQUIRED FIELD
			form.find('.required').each(function () {
				var self = $(this);
				var wrapper = self.parents('div.row');
				var error = wrapper.find('label.error');
				wrapper.removeClass('error');
				error.hide();
				
				if ((self.attr('type') == 'text' && self.val() == '') || (self.attr('type') == 'checkbox' && self.is(':not(:checked)'))) {
					wrapper.addClass('error');
					if (wrapper.find('label.error').size() <= 0) {
						wrapper.append('<label class="error" for="' + self.attr('id') + '">Required field.</label>');
					} else {
						error.show();
					}
					valid = false;
				}
			});

			// VALIDATE POSITIVE INTEGERS
			form.find('.positive_integer').each(function () {
				var self = $(this);
				var wrapper = self.parents('div.row');
				var error = wrapper.find('label.error');
				wrapper.removeClass('error');
				error.hide();

				var positiveInt = /^\d+$/;

				if (!self.val().match(positiveInt)) {
					wrapper.addClass('error');
					if (wrapper.find('label.error').size() <= 0) {
						wrapper.append('<label class="error" for="' + self.attr('id') + '">Invalid value</label>');
					} else {
						error.show();
					}
					valid = false;
				}
			});
			
			// VALIDATE TOTAL QUANTITY > 0
			form.find('.quantity').each(function () {
					var self = $(this);
					g_quantityCount += parseInt(self.val());
			});
			
			if(g_quantityCount == 0) {
				form.find('div.general_error').each(function () {
					var self = $(this);
					var error = $(this);
					
					if (self.html().length <= 0) {
						self.html('<p>Please select an item to buy</p>');
					} else {
						error.show();
					}
					valid = false;
				});
			}
			return valid;
		});
		
		$('#customer_details input[type=submit], #customer_details input[type=image], #customer_details button').click(function() {
			var form = $(this).parents('form');
			var valid = true;
			var g_quantityCount = 0;
			
			// VALIDATE REQUIRED FIELDS
			form.find('.required').each(function () {
				var self = $(this);
				var wrapper = self.parents('div.row');
				var error = wrapper.find('label.error');
				wrapper.removeClass('error');
				error.hide();

				if ((self.attr('type') == 'text' && self.val() == '') || (self.attr('type') == 'checkbox' && self.is(':not(:checked)'))) {
					wrapper.addClass('error');
					if (wrapper.find('label.error').size() <= 0) {
						wrapper.append('<label class="error" for="' + self.attr('id') + '">Required field.</label>');
					} else {
						error.show();
					}
					valid = false;
				}
			});

			// VALIDATE TELEPHONE INTEGERS
			form.find('.telephone').each(function () {
				var self = $(this);
				var wrapper = self.parents('div.row');
				var error = wrapper.find('label.error');
				wrapper.removeClass('error');
				error.hide();

				var positiveInt = /^[\d| ]+$/;

				if (self.val().length != 0 && (!self.val().match(positiveInt) || self.val().length < 11)) {
					wrapper.addClass('error');
					if (wrapper.find('label.error').size() <= 0) {
						wrapper.append('<label class="error" for="' + self.attr('id') + '">Invalid telephone number</label>');
					} else {
						error.show();
					}
					valid = false;
				}
			});
			
			// VALIDATE EMAIL ADDRESSES
			form.find('.email').each(function () {
				var self = $(this);
				var wrapper = self.parents('div.row');
				var error = wrapper.find('label.error');
				wrapper.removeClass('error');
				error.hide();
				
				// VALIDATION TAKEN FROM 
				// http://docs.jquery.com/Plugins/Validation/Methods/email

				if (!/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i.test(self.val()))
				{
					wrapper.addClass('error');
					if (wrapper.find('label.error').size() <= 0) {
						wrapper.append('<label class="error" for="' + self.attr('id') + '">Please enter a valid email address</label>');
					} else {
						error.show();
					}
					valid = false;
				}
			});
			
			
			form.find('.postcode').each(function () {
				var self = $(this);
				var wrapper = self.parents('div.row');
				var error = wrapper.find('label.error');
				wrapper.removeClass('error');
				error.hide();
				self.val(self.val().toUpperCase());
				if (!/\b([A-PR-UWYZ][A-HK-Y0-9][A-HJKSTUW0-9]?[ABEHMNPRVWXY0-9]?)*[0-9][ABD-HJLN-UW-Z]{2}\b/.test(self.val()))
				{
					wrapper.addClass('error');
					if (wrapper.find('label.error').size() <= 0) {
						wrapper.append('<label class="error" for="' + self.attr('id') + '">Please specify a valid postcode</label>');
					} else {
						error.show();
					}
					valid = false;
				}
			});
			
			return valid;
		});
		
		
		
		$('#use_billing_details').click(function() {
			// COPY BILLING ADDRESS DETAILS TO SHIPPING ADDRESS DETAILS
			var form = $(this).parents('form');
			var self = $(this);

			if($('#use_billing_details:checked').val() == "on")
			{
				$('#shipping_first_name').val($('#billing_first_name').val()); 
				$('#shipping_surname').val($('#billing_surname').val());
				$('#shipping_address1').val($('#billing_address1').val());
				$('#shipping_address2').val($('#billing_address2').val());
				$('#shipping_town').val($('#billing_town').val());
				$('#shipping_postcode').val($('#billing_postcode').val());
				$('#shipping_telephone').val($('#billing_telephone').val());
			}
		});
	});
})(jQuery);
