(function ($) {
	// add custom validation methods
	$.validator.addMethod('state', function (value, el) {
		return this.optional(el) || /^([a-z]|[A-Z]){2}$/.test(value);
	}, 'Please enter a valid two-character state code.');
	
	$.validator.addMethod('phone', function (value, el, params) {
		return this.optional(el) || /^[01]?[- .]?\(?[2-9]\d{2}\)?[- .]?\d{3}[- .]?\d{4}$/.test(value);
	}, 'Not a valid phone number.');
	
	$.validator.addMethod('email', function (value, el, params) {
		return this.optional(el) || /^([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})(\]?)$/.test(value);
	}, 'Please enter a valid email address.');
	
	$.validator.addMethod('postalCode', function (value, el) {
		return this.optional(el) || /^((\d{5}-\d{4})|(\d{5})|([A-Z]\d[A-Z]\s\d[A-Z]\d))$/.test(value);
	}, 'Please enter a valid US or Canadian postal code.');
	
	$.validator.addMethod('dependsOn', function (value, el, params) {
		return ($(params.el).val() !== params.being) || $(el).is(':filled');
	}, 'This field is required.');
	
	// add custom validation rules
	$.validator.addClassRules({
		name: {
			required: true,
			rangeLength: [3, 24]
		},
		phoneDependent: {
			dependsOn: {
				el: '#method',
				being: 'phone'
			},
			phone: true
		},
		emailDependent: {
			dependsOn: {
				el: '#method', 
				being: 'email'
			},
			email: true
		},
		phoneDependent2: {
			dependsOn: {
				el: '#method2',
				being: 'phone'
			},
			phone: true
		},
		emailDependent2: {
			dependsOn: {
				el: '#method2', 
				being: 'email'
			},
			email: true
		},
		address: {
			required: true,
			rangeLength: [3, 24]
		},
		city: {
			required: true,
			rangeLength: [3, 24]
		},
		state: {
			required: true,
			state: true
		},
		postalCode: {
			required: true,
			postalCode: true
		},
		password: {
			required: true,
			minLength: 5
		},
		password2: {
			required: true,
			minLength: 5,
			equalTo: '#password'
		}
	});
})(jQuery);