(function($) {


	$.validator.addMethod("needLength", function(value, element, param) {
		return this.optional(element) || this.getLength(value, element) == param;
	}, $.format("Please enter a value of {0} characters."));


	$.validator.addMethod("requiredGroup", function(value, element, param) {
		var result = false;
		var context = this;
		$(param).each(function() {
			switch (this.nodeName.toLowerCase()) {
				case "select":
					var options = $("option:selected", this);
					result |= options.length > 0 && (this.type == "select-multiple" || ($.browser.msie && !(options[0].attributes["value"].specified) ? options[0].text : options[0].value).length > 0);
					break;
				case "input":
					result |= context.getLength(this.value, this) > 0;
					break;
				default:
					result |= this.value.length > 0;
					break;
			}
			return !result;
		});
		return result;
	}, "At least one field in this group is required.");


	$.validator.addMethod("dateAU", function(value, element) {
		var check = false;
		if (/^\d{1,2}\/\d{1,2}\/\d{4}$/.test(value)) {
			var adata = value.split('/');
			var dd = parseInt(adata[0], 10);
			var mm = parseInt(adata[1], 10);
			var yyyy = parseInt(adata[2], 10);
			var xdata = new Date(yyyy, mm - 1, dd);
			check = !isNaN(xdata) && (xdata.getFullYear() == yyyy) && (xdata.getMonth() == mm - 1) && (xdata.getDate() == dd);
		}
		return this.optional(element) || check;
	}, "Please enter a valid date (dd/mm/yyyy).");


	$.validator.addMethod("regEx", function(value, element, param) {
		return this.optional(element) || (param.constructor != RegExp ? new RegExp(param) : param).test(value);
	}, "Please enter a valid value.");


})(jQuery);
