function notJustSpace(value) {
    return value.replace(/^\s+|\s+$/g, '') !== "";
}

jQuery.validator.addMethod("notjustspace", function(value, element, param) {
	return notJustSpace(value);
}, jQuery.validator.messages.required);

jQuery.validator.addMethod("requiredWhen", function(value, element, param) {
	var params = param.split("=");
	if ((value == '') && ($(params[0]).val() == params[1])) {
		return false;
	} else {
		return true;
	}
}, "");

jQuery.validator.addMethod("beLessThan", function(value, element, param) {
    var i = parseInt(value);
    var j = parseInt($(param).val());
    return i < j;
}, "");

jQuery.validator.addMethod("beLessThanFloat", function(value, element, param) {
    var i = parseFloat(value);
    var j = parseFloat($(param).val());
    return i < j;
}, "");

jQuery.validator.addMethod("requiredselect", function(value, element) {
    return $(element)[0].selectedIndex != 0;
}, "");

jQuery.validator.addMethod("noareacode", function(value, element) {
	return this.optional(element) || /^[0-9]{3}[\- ]?[0-9]{4}$/i.test(value);
}, "Please enter a valid phone number.");   

jQuery.validator.addMethod("ssn", function(value, element) {
	return this.optional(element) || /^[0-9]{3}[\- ]?[0-9]{2}[\- ]?[0-9]{4}$/i.test(value);
}, "Please enter a valid social security number.");  

jQuery.validator.addMethod("letterswithbasicpunc", function(value, element) {
	return this.optional(element) || /^[a-z-.,()'\"\s]+$/i.test(value);
}, "Only letters and punctuation please.");



jQuery.validator.addMethod("lettersonly", function(value, element) {
	return this.optional(element) || /^[a-z]+$/i.test(value);
}, "Only letters please."); 

jQuery.validator.addMethod("nowhitespace", function(value, element) {
	return this.optional(element) || /^\S+$/i.test(value);
}, "No white space please."); 

jQuery.validator.addMethod("zip", function(value, element) {
	return this.optional(element) || /^\d{5}$|^\d{5}-\d{4}$/.test(value);
}, "Please enter a valid zip code.");

jQuery.validator.addMethod("phoneUS", function(phone_number, element) {
    phone_number = phone_number.replace(/\s+/g, ""); 
	return this.optional(element) || phone_number.length > 9 &&
		phone_number.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
}, "Please enter a valid phone number");

$.validator.addClassRules("cvv", { digits:true, maxlength: 4, minlength: 3 });
$.validator.addClassRules("year", { digits:true, maxlength: 4, minlength: 4 });
$.validator.addClassRules("requiredselect", { requiredselect: true });
$.validator.addClassRules("required", { required: true, notjustspace: true });
$.validator.addClassRules("min2", { minlength: 2 });
$.validator.addClassRules("max1", { maxlength: 1 });
$.validator.addClassRules("email", { email: true });
$.validator.addClassRules("dateUS", { date: true });
$.validator.addClassRules("ssn", { ssn: true });
$.validator.addClassRules("zip", { zip: true });
$.validator.addClassRules("phoneUS", { phoneUS: true });
$.validator.addClassRules("noareacode", { noareacode:true, minlength:7, maxlength:8 });
$.validator.addClassRules("areacode", { digits: true, minlength: 3, maxlength:3 });
$.validator.addClassRules("creditcard", { creditcard: true });
$.validator.addClassRules("url", { url: true });
$.validator.addClassRules("nowhitespace", { nowhitespace: true });
$.validator.addClassRules("letters", { lettersonly: true });
$.validator.addClassRules("digits", { digits: true });
$.validator.addClassRules("decimalnumber", { number: true });
$.validator.addClassRules("csv", { accept: "csv" });
$.validator.addClassRules("imagefile", { accept: "png|jpe?g|gif" });
$.validator.addClassRules("jpg", { accept: "jpe?g" });
