$(function(){
	$.validator.setDefaults({
		onfocusout: false,
		errorPlacement: function(error, element) {
			var fs = element.parents('fieldset');
			var li = element.parents('li');
			if (fs.length) {
				error.appendTo( fs );
			} else if (li.length) {
				var hint = li.find('span.hint');
				if (hint.length) {
					error.insertBefore( hint );
				} else {
					error.appendTo( li );
				}
			} else {
				error.insertAfter( element );
			}
		},
		highlight: function(element, errorClass) {
			$(element).parents('fieldset').andSelf().addClass(errorClass);
		},
		unhighlight: function(element, errorClass) {
			$(element).parents('fieldset').andSelf().removeClass(errorClass);
		},
		groups: {
			dateofbirth: "dob_d dob_m dob_y"
		},
		messages: {
			email: {
				email: "Please enter a valid e-mail address."
			},
			new_password_2: {
				equalTo: "Please enter the same password again."
			},
			agree_to_terms: {
				required: "You must agree to the terms &amp; conditions."
			}
		}
	});
	
	$('form.validate').submit(function() {
		var the_form = $(this);
		
		if (!the_form.valid()) {
			$('li.addr_full').show();
			$('li.addr_picker').hide();
			$('li.addr_picker_street').filter(':visible').hide().addClass('activated');
			$('li.addr_selector').hide();
		}
		
		if (the_form.hasClass('popup')) {
			if (!the_form.valid()) {
				alert("Sorry, something\'s not quite right. Please check the highlighted fields and try again.");
			}
		} else {
			var warnings = the_form.children('ul.msg_warning');
			warnings.remove();
			if (!the_form.valid()) {
				the_form.prepend('<ul class="msg_warning"><li>Sorry, something\'s not quite right. Please check the highlighted fields and try again.</li></ul>');
			} else if (warnings.length) {
				the_form.prepend('<ul class="msg_confirm"><li>Thank you - submitting your form now...</li></ul>');
			}
		}
	});
	
	$('input.novalidate').click(function(){
		$(this.form).unbind();
	});
	
	// a custom method for validating the date range
	$.validator.addMethod("dateofbirth", function() {
		var d = $('#dob_d').val();
		var m = $('#dob_m').val();
		var y = $('#dob_y').val();
		var min_age = $('#dob_minAge').val();
		var noneSelected = d.length == 0 && m.length == 0 && y.length == 0;
		var allSelected = d.length && m.length && y.length;
		var dateIsValid = false;
		
		if (allSelected) {
			var sDate = (m+'/'+d+'/'+y);
			var dDate = $.CreateDate(y,m,d);
			dateIsValid = $.IsDate(sDate) && (!min_age || $.DateDiff('yyyy',dDate,new Date()) >= min_age);
		}
		
		return (!min_age && noneSelected) || (allSelected && dateIsValid);
	}, "Please select a valid date.");
	
	$.validator.addMethod("postcode", function(value, element) {
		var country = $('#country_id');
		var isUk = !country.length || country.val() == 13;
		return this.optional(element) || !isUk || /^(BFPO.+|GIR ?0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW]) *[0-9][ABD-HJLNP-UW-Z]{2})$/i.test(value);
	}, "Please enter a valid UK postcode.");
	
	$.validator.addMethod("urlWithDefault", function(value, element) {
		return this.optional(element) || value == "http://" || /^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([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])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(value);
	}, "Please enter a valid address.");
	
	/*
	$.validator.addMethod("hiddenAddress", function() {
		var addr_err_hidden = $('li.addr_full:hidden input').valid();
		return addr_err_hidden;
	}, "Please enter an address.");
*/

});



jQuery.extend({
	CreateDate: function(y,m,d){
		var rd = new Date();
		rd.setFullYear(y);
		rd.setMonth(m-1);
		rd.setDate(d);
		rd.setHours(0);
		rd.setMinutes(0);
		rd.setSeconds(0);
		return rd;
	},
	DateDiff: function(dp,d1,d2){
		var dt1 = new Date(d1);
		var dt2 = new Date(d2);
		var iDiffMS = dt2.valueOf() - dt1.valueOf();
		var dtDiff = new Date(iDiffMS);
		var nYears  = dt2.getUTCFullYear() - dt1.getUTCFullYear() - ( (dt2.getUTCMonth() < dt1.getUTCMonth()) || (dt2.getUTCMonth() == dt1.getUTCMonth() && dt2.getUTCDate() < dt1.getUTCDate()) ? 1 : 0 );
		var nMonths = dt2.getUTCMonth() - dt1.getUTCMonth() + (nYears!==0 ? nYears*12 : 0);
		var nQuarters = nMonths / 3;
		var nMilliseconds = iDiffMS;
		var nSeconds = iDiffMS / 1000;
		var nMinutes = nSeconds / 60;
		var nHours = nMinutes / 60;
		var nDays  = nHours / 24;
		var nWeeks = nDays / 7;
		var iDiff = 0;
		switch(dp.toLowerCase()){
			case "yyyy": return nYears;
			case "q": return nQuarters;
			case "m": return nMonths;
			case "y": return nDays;
			case "d": return nDays;
			case "w": return nDays;
			case "ww":return nWeeks;
			case "h": return nHours;
			case "n": return nMinutes;
			case "s": return nSeconds;
			case "ms":return nMilliseconds;
			default: return "invalid interval: '" + dp + "'";
		}
	},
	IsDate: function(d){
		var datePat 	= /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
		var matchArray 	= d.toString().match(datePat);
		if (matchArray === null) {
			return false;
		}
		var month 	= matchArray[1];
		var day 	= matchArray[3];
		var year 	= matchArray[5];
		var isleap = (year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0));
		if (month < 1 || month > 12) {
			return false;
		}
		if (day < 1 || day > 31) {
			return false;
		}
		if ((month==4 || month==6 || month==9 || month==11) && day==31) {
			return false;
		}
		if (month == 2) {
			if (day > 29 || (day==29 && !isleap)) {
				return false;
			}
		}
		return true;
	}
});
