;(function($) {
$.each(
  {
	'int': function(value, element, param) {
	  return this.optional(element) || /^-?\d+$/.test(value);
	},
	'float': function(value, element, param) {
	  return this.optional(element) || /^-?(\d+|\d+\.\d+)$/.test(value);
	},
	'money': function(value, element, param) {
	  return this.optional(element) || /^-?\d+(\.\d{1,2})?$/.test(value);
	},
	'moneymax': function(value, element, param) {
	  return this.optional(element) || /^-?\d+(\.\d{1,2})?$/.test(value) && parseFloat(value, 10) < param;
	},			
	'moneymin': function(value, element, param) {
	  return this.optional(element) || /^-?\d+(\.\d{1,2})?$/.test(value) && parseFloat(value, 10) >= param;
	},	
	'date': function(value, element, param) {
	  return this.optional(element) || /^(((0?[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[0-2]))|((0[1-9]|1[0-2])[- /.](0?[1-9]|[12][0-9]|3[01])))[- /.][12]\d{3}$/.test(value);
	},
	'time': function(value, element, param) {
	  return this.optional(element) || /^(([1-9]|10|11|12)|([0-1]\d|2[0-3])):([0-5]\d|00)( ?([aA][mM]|[pP][mM]))?$/.test(value);
	},
	'datetime': function(value, element, param) {
	  return this.optional(element) || /^(((0?[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[0-2]))|((0[1-9]|1[0-2])[- /.](0?[1-9]|[12][0-9]|3[01])))[- /.][12]\d{3} (([1-9]|10|11|12)|([0-1]\d|2[0-3])):([0-5]\d|00)$/.test(value);
	},	
	'dateeu': function(value, element, param) {
	  return this.optional(element) || /^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d$/.test(value);
	},
	'dateusa': function(value, element, param) {
	  return this.optional(element) || /^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$/.test(value);
	},
	'datetimeusa': function(value, element, param) {
	  return this.optional(element) || /^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d (([1-9]|10|11|12)|([0-1]\d|2[0-3])):([0-5]\d|00)( ?([aA][mM]|[pP][mM]))?$/.test(value);
	},
	'datetimeeu': function(value, element, param) {
	  return this.optional(element) || /^(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d (([1-9]|10|11|12)|([0-1]\d|2[0-3])):([0-5]\d|00)( ?([aA][mM]|[pP][mM]))?$/.test(value);
	},	
	'regexp': function(value, element, param) {
	  return this.optional(element) || param.test(value);
	},
	'username': function(value, element, param) {
	  return this.optional(element) || /^[a-z1-9\_\-\.@\:]{4,50}$/i.test(value);
	},
	'password': function(value, element, param) {
	  return this.optional(element) || (/^[^\s]{6,20}$/.test(value) && /\d+/.test(value) && /[a-z]+/i.test(value));
	},
	'maxwords': function(value, element, params) { 
		return this.optional(element) || value.match(/\b\w+\b/g).length < params; 
	},
	'minwords': function(value, element, params) { 
		return this.optional(element) || value.match(/\b\w+\b/g).length >= params; 
	},
	'rangewords': function(value, element, params) { 
		return this.optional(element) || value.match(/\b\w+\b/g).length >= params[0] && value.match(/\b\w+\b/g).length < params[1]; 
	},
	'strippedminlength': function(value, element, param) {
		return this.optional(element) || this.getLength($.trim(value), element) >= param;
	},
	'letterswithbasicpunc': function(value, element) {
		return this.optional(element) || /^[a-z-.,()\'\"\s]+$/i.test(value);
	},
	'alphanumeric': function(value, element) {
		return this.optional(element) || /^[A-Za-z0-9]+$/i.test(value);
	},	
	'lettersonly': function(value, element) {
		return this.optional(element) || /^[a-z]+$/i.test(value);
	},	
	'nowhitespace': function(value, element) {
		return this.optional(element) || /^\S+$/i.test(value);
	},
	'ziprangeusa': function(value, element) {
		return this.optional(element) || /^90[2-5]\d{2}-\d{4}$/.test(value);
	}, 
	'phone': function(value, element, param) {
	  return this.optional(element) || /^(\(?(0\d)?\)?[ -]?\d{4}[ -]?\d{4})$|^(\d{4}[ -]?\d{3}[ -]?\d{3})$/.test(value);
	},
	'phoneusa': function(value, element, param) {
	  return this.optional(element) || /^\(?[2-9]\d\d\)?[ -]?[2-9]\d\d-\d{4}$/.test(value);
	},
	'creditcard': function(value, element, param) {
	  return this.optional(element) || /(5[1-5]\d{14})|(4\d{12}(\d{3})?)|(3[47]\d{13})|(6011\d{14})|((30[0-5]|36\d|38\d)\d{11})$/.test(value);
	},
	'zipusa': function(value, element, param) {
	  return this.optional(element) || /^\d{5}(-\d{4})?$/.test(value);
	},
	'ssn': function(value, element, param) {
	  return this.optional(element) || /^\d{3}-\d{2}-\d{4}$/.test(value);
	},
	'ipaddress': function(value, element, param) {
	  return this.optional(element) || /^(((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}((\d{1,2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))$/.test(value);
	},
	'jpg': function(value, element, param) {
	  return this.optional(element) || /^.+\.([jJ][pP][eE]?[gG])$/i.test(value);
	},
	'file': function(value, element, param) {
	  return this.optional(element) || (/^.+\..+$/i.test(value) && (!param.length || jQuery.inArray(value.split('.').pop().toLowerCase(), param.toLowerCase().split(',')) >= 0));
	},
	'list': function(value, element, param) {
	  return this.optional(element) || /^[^,]+(,[^,]+)*$/i.test(value);
	},
	'numericlist': function(value, element, param) {
	  return this.optional(element) || /^\d+(,\d+)*$/i.test(value);
	},
	'alphanumericlist': function(value, element, param) {
	  return this.optional(element) || /^[a-zA-Z1-9]+(,[a-zA-Z1-9]+)*$/i.test(value);
	},
	'hexcode': function(value, element, param) {
	  return this.optional(element) || /^(([a-f]|[A-F]|[0-9]){3}){2}$/i.test(value);
	}
  },
  function(i) {
	$.validator.addMethod(i, this);  
  }
);
})(jQuery);