(function($) {

	$.extend($.expr[":"], {
		regex: function(elem, index, match) {
			var matchParams = match[3].split(",");
			var validLabels = /^(data|css):/;
			var attr = {
				method: matchParams[0].match(validLabels) ? matchParams[0].split(":")[0] : "attr"
				, property: matchParams.shift().replace(validLabels, "")
			};
			var regex = new RegExp(matchParams.join("").replace(/^\s+|\s+$/g, ""), "ig");
			return regex.test($(elem)[attr.method](attr.property));
		}
	});
	
	$.fn.checkEmail = function() {
		var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
		return emailPattern.test(this.val());
	}
	
	$.fn.checkColor = function() {
		var colorPattern = /^\#[a-fA-F0-9]{6}$/;
		return colorPattern.test(this.val());
	}
	
	$.fn.checkDate = function() {
		var datePattern = /^\d{4}(\-|\/|\.)\d{2}\1\d{2}$/;
		if (!datePattern.test(this.val())) {
			return false;
		}
		else {
			var strSeparator = this.val().substring(4,5);
			
			var arrayDate	= this.val().split(strSeparator);
			var intYear		= parseInt(arrayDate[0], 10);
			var intMonth	= parseInt(arrayDate[1], 10);
			var intDay		= parseInt(arrayDate[2], 10);
			
			var arrayLookup	= {
				"1": 31
				, "3": 31
				, "4": 30
				, "5": 31
				, "6": 30
				, "7": 31
				, "8": 31
				, "9": 30
				, "10": 31
				, "11": 30
				, "12": 31
			}
			
			var daysInMonth = arrayLookup[intMonth.toString()];
			
			if (daysInMonth != null) {
				if (intDay <= daysInMonth && intDay != 0) {
					return true;
				}
			}
			
			if (intMonth == 2) {
				if (intDay > 0 && intDay < 29) {
					return true;
				}
				else if (intDay == 29) {
					if ((intYear % 4 == 0) && (intYear % 100 != 0) || (intYear % 400 == 0)) {
						return true;
					}
				}
			}
			
			return false;
		}
	}
	
}) (jQuery);
