//Version 2.3

//----------DECLARED ONLY ON REFRESH OF PAGE---------------------------------------------------------------------
var regexArray= new Array();
var errorArray= new Array();



regexArray["text_01"] = /^(?!.*(?:\-\-)).*$|^$/;
regexArray["username_01"] = /^[a-zA-Z0-9|_]+$|^$/;
regexArray["email_username_01"] = /^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$|^$/;
regexArray["password_01"] = /(?!^[0-9]*$)(?!^[a-zA-Z]*$)^([a-zA-Z0-9]{4,15})$|^$/;
regexArray["first_address_01"] = /^[#@!'|._-]{0,1}([a-zA-Z0-9\s]+[#@!'|._-]{0,1})*$|^$/;
regexArray["second_address_01"] = /^([a-zA-Z0-9|.|\s|,]*(')*)*$|^$/;
regexArray["city_01"] = /^([a-zA-Z0-9|\s]*)*$|^$/;
//regexArray["zipcode_01"] = /(^(?!0{5})(\d{5})(?!-?0{4})(-?\d{4})?$)/;
regexArray["zipcode_01"] = /^(?!.*(?:\-\-|\#|\•|\!|\@|\$|\%|\^|\&|\*|\(|\)|\+|\=|\||\\|\{|\}|\[|\]|\:|\"|\;|\'|\<|\>|\,|\?|\/|\~|\`|\©|\»|_)).*$|^$/;
//regexArray["phone_01"] =/^\(?[\d]{3}\)?[\s-]?[\d]{3}[\s-]?[\d]{4}$|^$/;
regexArray["phone_01"] = /(?!.*(?:\-\-)).[0-9\-\+\s\(\)]$|^$/
regexArray["fax_01"] = regexArray["phone_01"] ;
regexArray["http_url_01"] = /^((http|https):\/\/)*[\w-_]+(\.[\w-_]+)?([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$|^$/
regexArray["https_url_01"] = /^(https):\/\/[\w-_]+(\.[\w-_]+)?([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$|^$/ ;  
regexArray["decimal"] = /^\-?\(?([0-9]{0,3}(\,?[0-9]{3})*(\.?[0-9]*))\)?$/ ;
regexArray["variable_name_01"] = /^[a-zA-Z0-9|_]+$|^$/;
regexArray["email_01"] =   /^([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6}$|^$/;
regexArray["smtp_01"] =  /^(([a-zA-Z0-9]*smtp[a-zA-Z0-9]*|[a-zA-Z0-9]*mail[a-zA-Z0-9]*)\.([\w\-]+)\.[\w\-]{2,3}$|^localhost$|$^)$/;
regexArray["int"] =  /^[-]?[0-9]*$/;
regexArray["float"] = /^\-?\(?([0-9]{0,3}(\,?[0-9]{3})*(\.?[0-9]*))\)?$/ ;
regexArray["boolean"] = /^(^false$|^true$|^TRUE$|1|0|^FALSE$|^True$|^False$|^on$|^off$)$/;
regexArray["image_url_01"] = /^[a-zA-Z0-9\s._\-\'\&\$]*$|^$/;
regexArray["date_01"] = /^([0-9]{1,2})[\/]([0-9]{1,2})[\/]([0-9]{4})$|^$/
regexArray["html_color_01"] = /^[#]{1}([a-fA-F0-9]{6})$|^$/
regexArray["license_number_01"] = /^[a-zA-Z0-9]+$|^$/

errorArray["text_01"] = "Invalid text. No -- allowed";
errorArray["username_01"]= "Username is invalid";
errorArray["email_username_01"] = "Invalid username.";
errorArray["password_01"] = "Sorry, please enter a valid password.\n"+
	"A password must:\n"+
	" 1) Contain at least one number and letter.\n"+
	" 2) Must be at least 4 and no more than 15 characters long.";
errorArray["first_address_01"] = "Invalid First Address";
errorArray["second_address_01"] = "Invalid Second Address\n Valid Example: Burbank, CA 91529";
errorArray["city_01"] = "Invalid City";
errorArray["zipcode_01"] = "Invalid ZipCode";
errorArray["phone_01"] = "Sorry, only the following characters are allowed: 0 to 9, + , - , ( , ) , and spaces";
errorArray["fax_01"] = errorArray["phone_01"];
errorArray["http_url_01"] = "Must begin with http:// to be a valid url.";
errorArray["https_url_01"] = "Must begin with https:// to be a valid url.";
errorArray["decimal"] = "Not a Decimal"
errorArray["variable_name_01"] = "Invalid Variable Name"
errorArray["email_01"] =   "Invalid Email"
errorArray["smtp_01"] = "SMTP Server Invalid"
errorArray["int"] = "Invalid Int"
errorArray["float"] = "Not a Float"
errorArray["boolean"] = "Not a boolean";
errorArray["image_url_01"] = "Not a Image URL";
errorArray["html_color_01"] = "Not a Color Code";
errorArray["date_01"] = "Is not in MM/DD/YYYY format or is an invalid date.";
errorArray["license_number_01"] = "Not a valid license";

var hasError = false, errorMsg = "", elm, errorTagName="", errorValue="";
//----------DECLARED ONLY ON REFRESH OF PAGE-----------------

function regexVerify(form)
{
	if (!form.getAttribute)
	{
		return true; // browser does not support DOM
	}

	//Must reset global variables once when we enter function for the first time upon function call
	hasError = false; //reset
	errorMsg = ""; //reset
	errorTagName = ""; //reset
	errorValue=""; //reset
	
	for (var i = 0; i < form.elements.length && !hasError; i++)
	{
		
		elm = form.elements[i];
		var elmValue = elm.value;
		var elmName = elm.name;
		
		//alert(i+"Name:"+elmName+", Value:"+elmValue)

	
		if (elm.getAttribute("regex") && !hasError)
		{
		
			if (!elm.value.match(elm.getAttribute("regex")))
			{
				hasError = true;
				errorTagName = elm.tagName;
				errorValue=elm.value;
				if (elm.getAttribute("errormsg"))
				{
					errorMsg = elm.getAttribute("errormsg");
				}
				else if( elm.getAttribute("error_msg_type") ){
					errorMsg = errorArray[elm.getAttribute("error_msg_type")];
				}
				else if (elm.getAttribute("fieldname")){
					errorMsg = "Error in your form, [ " + elm.getAttribute("fieldname") + " ] does not validate.";
				}
				else if (errorMsg == '')
				{
					errorMsg = "Error in your form, [ " + elm.name + " ] does not validate.";
				}
			}
		}
		
		if (elm.getAttribute("required") && !hasError )
		{
			if (elm.value == "")
			{
				hasError = true;
				errorTagName = elm.tagName;
				errorValue=elm.value;
				var fieldName = elm.getAttribute("fieldname") 
				if(fieldName){
					errorMsg = "Error: '" + fieldName + "' is required.";
				}
				else{
					errorMsg = "Error: " + elm.name + " is required.";
				}
				
				//break;
			}
		}
        
		//Password: <input type="password" name="pass" required="1" confirm="1" />
        //Confirm Password: <input type="password" name="confirm_pass" />
		if (elm.getAttribute("confirm") && !hasError)
		{
			if (typeof(form.elements["confirm_" + elm.name]) == 'undefined' || elm.value != form.elements["confirm_" + elm.name].value)
			{
				hasError = true;
				errorTagName = elm.tagName; // or elm.nodeName will do the same
				errorValue=elm.value;
				errorMsg = "Error: " + elm.name + " and confirmation do not match.";
				//break;
			}
		}
		
		
				
		//--------------------------------------------------------------------------------------------
		// VALIDATION FIELDS BEGIN
		//--------------------------------------------------------------------------------------------
		
		//eg:<input type="text" name="my_email" regextype="email" />
		validateRegexType("regextype", "username_01", elm);
		validateRegexType("regextype", "text_01", elm);
		validateRegexType("regextype", "first_address_01", elm);
		validateRegexType("regextype", "second_address_01", elm);
		validateRegexType("regextype", "city_01", elm);
		validateRegexType("regextype", "zipcode_01", elm);
		validateRegexType("regextype", "phone_01", elm);
		validateRegexType("regextype", "fax_01", elm);
		validateRegexType("regextype", "http_url_01", elm);
		validateRegexType("regextype", "https_url_01", elm);		
		validateRegexType("regextype", "email_username_01", elm);
		validateRegexType("regextype", "password_01", elm);
		validateRegexType("regextype", "decimal", elm);
		validateRegexType("regextype", "variable_name_01", elm);
		validateRegexType("regextype", "email_01", elm);
		validateRegexType("regextype", "smtp_01", elm);
		validateRegexType("regextype", "int", elm);
		validateRegexType("regextype", "float", elm);
		validateRegexType("regextype", "boolean", elm);
		validateRegexType("regextype", "html_color_01", elm);													
		validateRegexType("regextype", "date_01", elm);
		validateRegexType("regextype", "image_url_01", elm);	
		
		//--------------------------------------------------------------------------------------------
		// VALIDATION FIELDS END
		//--------------------------------------------------------------------------------------------		
		//<input type="text" name="my_email" testtype="email" />
		if ((elm.getAttribute("testtype") == "email" ) && !hasError)
		{
			if (!/^.+@.+\..{2,}$|^$/.test(elm.value))
			{
				hasError = true;
				errorTagName = elm.tagName;
				errorMsg = "Please enter a valid email address.";
			}
		}
		
	}//END FOR LOOP
	
	if (hasError)
	{
		alert(errorMsg);
		//alert("[tagname:"+errorTagName+"], "+errorMsg+"\nValue:["+errorValue+"]");
		if(errorTagName != "SELECT"){
			elm.select(); //won't work on select tags
		}
		return false;
	}
	
	return true;
}

function filterSpecialChar(str){
	var filteredStr = ""
	str = str+"";
	for(i=0;i<str.length; i++){
		if( (str.charCodeAt(i) != 13) && (str.charCodeAt(i) != 10)){
			filteredStr = filteredStr + str.charAt(i)
		}		
	}
	return filteredStr;
}

//validateField(element.value, regexType) [eg validateField("My Input Field Data", "email")]
function validateField(testValue, regexType){
		if(!regexArray[regexType]){
			alert("Error! Not supported: " + regexType)
		}
		var re = new RegExp(regexArray[regexType]);
		testValue = filterSpecialChar(testValue);
		//alert(testValue);
		if (!testValue.match(re)) //if it doesn't match, it's an error
		{	
			return false;	
		}
		/*
		if (!testValue.match(regexArray[regexType])) //if it doesn't match, it's an error
		{	
			return false;	
		}
		*/	
		return true;

		
}




//validateRegexType("regextype", "email", elm)
function validateRegexType(name, value, element){
		if ((element.getAttribute(name) == value) && !hasError)
		{
			if (!validateField(element.value, value))
			{
				hasError = true;
				errorTagName = element.tagName;
				errorValue=element.value;
				var errorString = element.getAttribute("errormsg") 
				if(errorString){
					errorMsg = errorString;
				}
				else{
					if(elm.getAttribute("fieldname")){
						errorMsg = element.getAttribute("fieldname") + ": ";
					}
					else{
						errorMsg = element.name + ": ";
					}				
					errorMsg = errorMsg + errorArray[value] ;
				}
				//break;
			}
		}
}