jQuery.validator.addMethod('maxWords', function(value, element, params) { 
    return !$(element).val() || $(element).val().match(/bw+b/g).length < params; 
}, 'Please enter {0} words or less.'); 
 
jQuery.validator.addMethod('minWords', function(value, element, params) { 
    return !$(element).val() || $(element).val().match(/bw+b/g).length >= params; 
}, 'Please enter at least {0} words.'); 
 
jQuery.validator.addMethod('rangeWords', function(value, element, params) { 
    return !$(element).val() || ($(element).val().match(/bw+b/g).length >= params[0] && $(element).val().match(/bw+b/g).length < params[1]); 
}, 'Please enter between {0} and {1} words.');


jQuery.validator.addMethod("letterswithbasicpunc", function(value, element) {
	return !jQuery.validator.methods.required(value, element) || /^[a-z-.,()'\"s]+$/i.test(value);
}, "Letters or punctuation only please");  

jQuery.validator.addMethod("alphanumeric", function(value, element) {
	return !jQuery.validator.methods.required(value, element) || /^w+$/i.test(value);
}, "Letters, numbers, spaces or underscores only please");  

jQuery.validator.addMethod("lettersonly", function(value, element) {
	return !jQuery.validator.methods.required(value, element) || /^[a-z]+$/i.test(value);
}, "Letters only please"); 

jQuery.validator.addMethod("nowhitespace", function(value, element) {
	return !jQuery.validator.methods.required(value, element) || /^S+$/i.test(value);
}, "No white space please"); 

jQuery.validator.addMethod("anything", function(value, element) {
	return !jQuery.validator.methods.required(value, element) || /^.+$/i.test(value);
}, "May contain any characters."); 

jQuery.validator.addMethod("integer", function(value, element) {
	return !jQuery.validator.methods.required(value, element) || /^d+$/i.test(value);
}, "Numbers only please");

jQuery.validator.addMethod("phone", function(value, element) {
	// Declaring required variables
	var digits = "0123456789";
	// non-digit characters which are allowed in phone numbers
	var phoneNumberDelimiters = "()-.xX ";
	// characters which are allowed in international phone numbers (a leading + is OK)
	var validWorldPhoneChars = phoneNumberDelimiters + "+";
	// Minimum no of digits in an international phone no.
	var minDigitsInIPhoneNumber = 10;
	
	s=stripCharsInBag(value,validWorldPhoneChars);
	
	var isPhone = this.required(element) || (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
	
	// Format phone number
	if(isPhone)
	{
		var txtField = $('input[name="'+element.name+'"]');
		
		var phone = getDigits(s);
		
		if(phone.indexOf('1') == 0 || phone.indexOf('0') == 0)
			phone = phone.substr(1, phone.length - 1);
		
		var formatted = '('+phone.substr(0,3)+')'+' '+phone.substr(3,3)+'-'+phone.substr(6,4);
		
		if(value.indexOf(formatted) != 0)
			txtField.val(formatted);
	}
	
	return isPhone;

	function isInteger(s)
	{   var i;
	    for (i = 0; i < s.length; i++)
	    {
	        // Check that current character is number.
	        var c = s.charAt(i);
	        if (((c < "0") || (c > "9"))) return false;
	    }
	    // All characters are numbers.
	    return true;
	}

	function stripCharsInBag(s, bag)
	{   var i;
	    var returnString = "";
	    // Search through string's characters one by one.
	    // If character is not in bag, append to returnString.
	    for (i = 0; i < s.length; i++)
	    {
	        // Check that current character isn't whitespace.
	        var c = s.charAt(i);
	        if (bag.indexOf(c) == -1) returnString += c;
	    }
	    return returnString;
	}
	
	function getDigits(s)
	{
		return s.replace('[^0-9]');
	}
	
}, "Please enter phone numbers in this format: (888) 555-1234");

jQuery.validator.addMethod("ziprange", function(value, element) {
	return !jQuery.validator.methods.required(value, element) || /^90[2-5]\d\{2}-\d{4}$/.test(value);
}, "Your ZIP-code must be in the range 902xx-xxxx to 905-xx-xxxx");
