(function( $ ){

	$.fn.extend ({
	
		validator : function (options){
			
			// Options
			var defaults = {
				validate: "empty",
				fields: {},
				error: "This field cannot be blank",
				error2: "Cannot be blank",
				speed: "fast",
				country: "",
				capitalize: false,
				cb: function () {}
			};
			
			// Load the default Variables
			var o = jQuery.extend(defaults, options);
			
			var _display = 
			{
				error : function (data, text, type) 
				{
					if (type){
						$(type+data).after("<span class=\"errorfld\">"+text+"</span>");
						$(type+data).addClass('fielderror');
					} else {
						$("input"+data).after("<span class=\"errorfld\">"+text+"</span>");
						$("input"+data).addClass('fielderror');
					}
				},
				
				removeErrors : function ()
				{
					$("form span.errorfld").remove();
					$("input").removeClass('fielderror');
				}
			}
			
			var _check = 
			{
				// Check for EMPTY
				empty : function(value, message, type)
				{
					if ($(value).val() == "")
					{
						if (!message)
							message = "Cannot be blank";
						_display.error(value, message, type);
						return true;
					}
					return false;
				},
				
				// Check for MATCH
				match : function(value1, value2, message)
				{
					if ($(value1).val() != $(value2).val() )
					{
						if (!message)
							message = "Does not match";
						_display.error(value2, message);
						return true;
					}
					return false;
				},
				
				// Reg Exp Test. Value, the reg Exp (arr, str), error message
				regExpTest : function (value, regex, message)
				{
					var str = $(value).val();
					var checker = false;
					if ($.isArray(regex)){
						$.each(regex, function(index, value) { 
							var newValue = new RegExp(value);
						   	if(newValue.test(str.toLowerCase())){
						   		if (checker == false) checker = true;
						   	}
						});
					} else {
						var newValue = new RegExp(regex);
						if(!newValue.test($(value).val()))
							if (checker == false) checker = true;
					}
					if (checker){
						if (!message)
							message = "Format incorrect";
				   		_display.error(value, message);
						return true;
					} else { 
						return false; 
					}
				},
				
				isEmpty : function (value, message, type)
				{
					if ($(value).val() == "")
					{
						if (!message)
							message = "Cannot be blank";
						//_display.error(value, message, type);
						return true;
					}
					return false;
				},
				
				compareDateToday : function (strdate)
				{
					// Check Current Date +1.
					var myDate = new Date();
					var today = new Date();
					
					today.setDate(today.getDate()+1);
					
					var splitty = $(strdate).val().split('/');
					var day = splitty[1];
					var month = splitty[0];
					var year = splitty[2];
					
					myDate.setFullYear(year,month-1,day);
					
					if (myDate<today)
					{
						message = "Must be from tomorrow's date onwards";
						_display.error(strdate, message);
						return true;
					}
					return false;
				}
			}
			
			//return o.cb(validateForm());
			return validateForm();
			
			function validateForm()
			{
				
				// Registration Form
				var strname = "#strname";
				var stremail = "#inf_field_Email";
				var strphone = "#inf_field_Phone1";
				var strcompany = "#inf_field_Company";
				
				var strnameFT = "#strnameFT";
				var stremailFT = "#inf_field_EmailFT";
				var strphoneFT = "#inf_field_Phone1FT";
				var strcompanyFT = "#inf_field_CompanyFT";
				
								
				// RegExp, arrays, misc.
				var emailstr = /^[a-zA-Z0-9]+[a-zA-Z0-9_.-]+[a-zA-Z0-9_-]+@[a-zA-Z0-9]+[a-zA-Z0-9.-]+.[a-z]{2,4}$/;
				var numeric = /^[0-9]{1,2}$/;
				var numericPC = /^[0-9]{4,5}$/;
				var numericCVC = /^[0-9]{3,3}$/;
				var numericCC = /^[0-9]{16}$/;
				var numericQty = /^[0-9]{1,2}$/;
				var stateCH = /^[a-zA-Z]{2,5}$/;
				var numericPh = /^([0-9]{2}|\([0-9]{2}\))(\s?)([0-9]{8}|[0-9]{4}(\s?)[0-9]{4}|[0-9]{2}(\s?)([0-9]{6}|[0-9]{3}(\s?)[0-9]{3}))$/;
				var strvalidate = /^\d{2}\/\d{2}\/\d{4}$/;
				
				_display.removeErrors()
				
				switch (o.validate) 
				{	
					case "trybeforeyoubuy":
						var error = false;
						
						// Checks for Blanks
						if (_check.empty(strname)){ error = true; }
						if (_check.empty(strcompany)){ error = true; }
						if (_check.empty(strphone)){ error = true; } else {
							
							// Check for Valid Phone Number
							if (_check.regExpTest(strphone, numericPh, "not a valid Phone Number")){ error = true; }
						
						}
						if (_check.empty(stremail)){ error = true; } else {
						
							// Check for Valid email address
							if (_check.regExpTest(stremail, emailstr, "not a valid email address")){ error = true; }
						
						}
						if (error == true)
							return false;
						else
							return true;
					break;
					
					case "freetrial":
						var error = false;
						
						// Checks for Blanks
						if (_check.empty(strnameFT)){ error = true; }
						if (_check.empty(strcompanyFT)){ error = true; }
						/*
						if (_check.empty(strphoneFT)){ error = true; } else {
							
							// Check for Valid Phone Number
							if (_check.regExpTest(strphoneFT, numericPh, "not a valid Phone Number")){ error = true; }
						
						}
						*/
						if (_check.empty(stremailFT)){ error = true; } else {
						
							// Check for Valid email address
							if (_check.regExpTest(stremailFT, emailstr, "not a valid email address")){ error = true; }
						
						}
						if (error == true)
							return false;
						else
							return true;
					break;
				
				}
			}
		}
		
	});
})(jQuery);
