﻿	// validator.js

    // available types for input tag, validate attribute, 
    //     example: <input type="text" name="UserName" id="txtUserName" value="" required validate="alphaNum" validationname="User Name">

    // alphaNum
	// alphaNumSpace
	// alphaNumSpaceExt
	// Numeric
	// Real
	// zipCode
	// Currency
	// Time
	// emailAddress
	// phoneNumber
	// phoneNumberInternational
	// ipAddress
	// Date
	// State
	// SSN
	// Filepath
	
	// custom --------------------------------------
	// assetNumber
	// Password
	// alphaNumName
	// numericRange
	// Build


    // Validator Object
    var valid = new Object();
    
   
    // REGEX Elements
		// alpha-numeric
		valid.alphaNum = /^[a-zA-Z0-9_\-.#]*$/;
		valid.alphaNumDesc = "alpha-numeric string"
		valid.alphaNumFormat = "\nof these characters only:\na-z  A-Z  0-9  _-.#"
		valid.alphaNumSpace = /^[a-zA-Z0-9_\-.#\s]*$/;
		valid.alphaNumSpaceDesc = "alpha-numeric string (with spaces)"
		valid.alphaNumSpaceFormat = "\nof these characters only:\na-z  A-Z  0-9  _-.#<space>"
		valid.alphaNumSpaceExt = /^[a-zA-Z0-9_\-.#\s()\*\+\[\]\{\}\?<>/]*$/;
		valid.alphaNumSpaceExtDesc = "alpha-numeric string (with spaces)"
		valid.alphaNumSpaceExtFormat = "\nof these characters only:\na-z  A-Z  0-9  _-.#()<>{}[]*+/<space>"
		//Numeric
		valid.Numeric = /^[0-9]*$/;
		valid.NumericDesc = "numeric string"
		valid.NumericFormat = "\nof these numbers only:\n0-9"
		//Grade
		valid.Real = /^[0-9.]*$/;
		valid.RealDesc = "grade"
		valid.RealFormat = "\nof these numbers only:\n0-9 including decimals"
        // matches zip codes
        valid.zipCode = /^\d{5}(-?\d{4})?$/;   
        ///\d{5}(-\d{4})?/;						
        valid.zipCodeFormat = "#####-####"
        valid.zipCodeDesc = "ZIP Code"
        // matches $17.23 or $14,281,545.45 or ...
        valid.Currency = /\$\d{1,3}(,\d{3})*\.\d{2}/;
        valid.CurrencyFormat = "$###,###.##"
        valid.CurrencyDesc = "Currency"      
        valid.Time = /^(\d{1,2}):(\d{2})(:(\d{2}))?(\s?(AM|am|PM|pm))?$/;
        valid.TimeFormat = "##:##"
        valid.TimeDesc = "Time"
        //matches email
        valid.emailAddress = /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/;
        valid.emailAddressFormat = "xxx@xxx.xxx"
        valid.emailAddressDesc = "Email Address"
        // matches phone ###-###-####
        valid.phoneNumber = /^1?\s*-?\s*((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}$/;
        //valid.phoneNumber =   /^1?\s*-?\s*(\d{3}|\(\s*\d{3}\s*\))\s*-?\s*\d{3}\s*-?\s*\d{4}$/;							
        valid.phoneNumberFormat = "\n###-#### or (###)###-#### or ###-###-#### etc..."
        valid.phoneNumberDesc = "Phone Number"
        // International Phone Number
        valid.phoneNumberInternational = /^\d(\d|-){7,20}/;
        // IP Address
        valid.ipAddress = /^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;
        // Date xx/xx/xxxx
					
        valid.Date = /^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/;
        // /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/;
        valid.DateDesc = "Date"
        valid.DateFormat = "mm/dd/yyyy or mm-dd-yyyy"
        // State Abbreviation
        valid.State = /^(AK|AL|AR|AZ|CA|CO|CT|DC|DE|FL|GA|HI|IA|ID|IL|IN|KS|KY|LA|MA|MD|ME|MI|MN|MO|MS|MT|NB|NC|ND|NH|NJ|NM|NV|NY|OH|OK|OR|PA|RI|SC|SD|TN|TX|UT|VA|VT|WA|WI|WV|WY)$/i;
        valid.StateFormat = "XX"
        valid.StateDesc = "State"
        // Social Security Number        
        valid.SSN = /^\d{3}\-\d{2}\-\d{4}$/;    
        valid.SSNDesc = "Social Security Number"
        valid.SSNFormat = "###-##-####"
        // File path
        valid.Filepath = /^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\([^/\\:\*\?"<>|]*))+\.[^/\\:\*\?"<>|]+$/;
        valid.FilepathDesc = "path to a file"
        valid.FilepathFormat = "\ndriveLetter:\\[folder]\\file.ext OR \\\\sharename\\[folder]\\file.ext \nand the filename must not use the characters: / \\ : * ? \" < > |"                
            
		// custom --------------------------------------
		
		// assetNumber
		valid.assetNumber = /^[0-9][0-9][0-9]$/;
		valid.assetNumberDesc = "3-digit number"
		valid.assetNumberFormat = "\nof these numbers only:\n000-999"

		// Password
		valid.Password = /^[a-zA-Z0-9!\?\.\$&\*]*$/;
		valid.PasswordDesc = "password"
		valid.PasswordFormat = "\nof these characters only:\na-z  A-Z  0-9  !?.$&*"
		
		//Text such as names, addresses that may contain a single quote
		valid.alphaNumName = /^[a-zA-Z0-9_\-.#'\s]*$/;
		valid.alphaNumNameDesc = "alpha-numeric string"
		valid.alphaNumNameFormat = "\nof these characters only:\na-z  A-Z  0-9  '_-.#"

		//Text such as names, addresses that may contain a single quote
		valid.numericRange = /^(\d+-\d+)$|^(\d+)$/;
		valid.numericRangeDesc = "numeric range"
		valid.numericRangeFormat = "\nin this format only: n-n where n is an integer\nor a single integer n"

		//Build
		valid.Build = /^[0-9]\.[0-9]\.[0-9]{3}$/;
		valid.BuildDesc = "build number"
		valid.BuildFormat = "\nin this format only: 0.0.000"

    function validateText(validateType, txtBox, required) {    
            
		var v = validateType;        
		var thePat = valid[v]; 
		var gotIt = thePat.exec(txtBox.value); 
		if(! gotIt){
		   return 'You must use a valid ' + valid[v+'Desc'] + ' in the form ' + valid[v+'Format'];                  
		   txtBox.select();
		   txtBox.focus(); 
		   return false;
		}
		 return true;
    }
  function isValidDate(dateStr) {

      var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
      var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/  
   // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
   if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }
   var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
   // Check to see if the 3 parts end up making a valid date
   var mm = parts[0];   
   var dd = parts[1];   
   var yy = parts[2];
   if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
   if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
   var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
   if (parseFloat(dd) != dt.getDate()) { return false; }
   if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
   return true;
}

function isEmpty(str) {
	// Check whether string is empty.
	for (var intLoop = 0; intLoop < str.length; intLoop++)
	   if (" " != str.charAt(intLoop))
	      return false;
	return true;
}

function highlightField(tf, wrong)
{
	if (wrong)
	{
		//tf.style.backgroundColor='white';
		//tf.style.borderColor='#FFCC33';
		tf.style.backgroundColor='#C0C0C0';
		//tf.style.color='black';
	}
	else
	{
		tf.style.backgroundColor='white';
		//tf.style.color='black';
	}
}
function checkPage(f) {
	var strError = "";
	var strInvalid = "";
	var strMissing = "";
	var strOutOfRange = "";
	var valueOkay;
	var focusElement = "";	
	for (var intLoop = 0; intLoop<f.elements.length; intLoop++)
	{
		valueOkay = true;

		if ((f.elements[intLoop].type == "text") || (f.elements[intLoop].type == "file")  || (f.elements[intLoop].type == "password") || (f.elements[intLoop].type == "textarea"))  {
			if (f.elements[intLoop].visible = true) {
				// Trim spaces first 			
				if (null==f.elements[intLoop].getAttribute("notrim")) 
					f.elements[intLoop].value = f.elements[intLoop].value.replace(/^\s+|\s+$/g,"");									
					
				//Check if required
				if (null!=f.elements[intLoop].getAttribute("required")) 
					if (isEmpty(f.elements[intLoop].value) && f.elements[intLoop].value==f.elements[intLoop].value.replace(/^\s+|\s+$/g,"")) {
						valueOkay = false;
						if (focusElement == "")
							focusElement = f.elements[intLoop];
						highlightField(f.elements[intLoop], true);
						//strMissing += "  " + f.elements[intLoop].name + "\n";
						strMissing += "  " + f.elements[intLoop].getAttribute("validationname") + "\n";
					}

				if (!isEmpty(f.elements[intLoop].value)) {
					//Check length on textareas
					if (f.elements[intLoop].type == "textarea") {						
						if (null!=f.elements[intLoop].getAttribute("maxlength")) {
							var maxlen = f.elements[intLoop].getAttribute("maxlength")
							if (f.elements[intLoop].value.length > maxlen) {
								if (focusElement == "")
									focusElement = f.elements[intLoop];
								//strInvalid += f.elements[intLoop].name + ' can not contain more than ' + maxlen + ' characters.\n';
								strInvalid += f.elements[intLoop].getAttribute("validationname") + ' can not contain more than ' + maxlen + ' characters.\n';
							}
						}
					}
					
					//Check length on file path
					if (f.elements[intLoop].type == "file") {						
						if (null!=f.elements[intLoop].getAttribute("maxlength")) {
							var maxlen = f.elements[intLoop].getAttribute("maxlength")
							if (f.elements[intLoop].value.length > maxlen) {
								if (focusElement == "")
									focusElement = f.elements[intLoop];
								//strInvalid += f.elements[intLoop].name + ' can not contain more than ' + maxlen + ' characters.\n';
								strInvalid += f.elements[intLoop].getAttribute("validationname") + ' can not contain more than ' + maxlen + ' characters.\n';
							}
						}
					}
					
					// Check for text validation 
					if (null!=f.elements[intLoop].getAttribute("validate")) 	{				
						var v = f.elements[intLoop].getAttribute("validate");        
						var thePat = valid[v]; 
						var gotIt = thePat.exec(f.elements[intLoop].value); 
						
						if(! gotIt){
							valueOkay = false;
							if (focusElement == "")
								focusElement = f.elements[intLoop];
							highlightField(f.elements[intLoop], true);						
							//strInvalid += f.elements[intLoop].name + ' requires a valid ' + valid[v+'Desc'] + ' in the form ' + valid[v+'Format'] + '\n';                  
							strInvalid += f.elements[intLoop].getAttribute("validationname") + ' requires a valid ' + valid[v+'Desc'] + ' in the format of ' + valid[v+'Format'] + '\n';                  
							
						}			   
					}	
					//Check for valid numeric range
					//Don't check if it didn't validate correctly
					if (valueOkay == true) {
						if (null!=f.elements[intLoop].getAttribute("minmax")) {
							aMinMax = f.elements[intLoop].getAttribute("minmax").split(",");
							if ((Number(f.elements[intLoop].value) < Number(aMinMax[0])) || (Number(f.elements[intLoop].value) > Number(aMinMax[1]))) {
								valueOkay = false;
								if (focusElement == "")
									focusElement = f.elements[intLoop];
								highlightField(f.elements[intLoop], true);
								//strOutOfRange += f.elements[intLoop].name + " must be between ";
								strOutOfRange += f.elements[intLoop].getAttribute("validationname") + " must be between ";
								strOutOfRange += aMinMax[0] + " and " + aMinMax[1] + " inclusive.\n";
								
							}	  
						}
					}
					//Check for valid date range
					if (valueOkay == true) {
						if ('Date'==f.elements[intLoop].getAttribute("validate")) {							
							sStartDate = '1/1/1900';
							sEndDate='6/6/2079';
							sDate = f.elements[intLoop].value;
							dDate = new Date(f.elements[intLoop].value);
							dStartDate = new Date(sStartDate);
							dEndDate = new Date(sEndDate); 
	
							lDate = dDate.getTime();
							lStartDate = dStartDate.getTime();
							lEndDate = dEndDate.getTime(); 
							if  (Number(sDate.substring(sDate.length-4,sDate.length)) < 1900 || ((lStartDate - lDate)>0||(lDate-lEndDate)>0)){
								valueOkay = false;
								if (focusElement == "")
									focusElement = f.elements[intLoop];
								highlightField(f.elements[intLoop], true);
								//strOutOfRange += f.elements[intLoop].name + " must be between 1/1/1900 and 6/6/2079 inclusive.\n";
								strOutOfRange += f.elements[intLoop].getAttribute("validationname") + " must be between 1/1/1900 and 6/6/2079 inclusive.\n";
							}							
						} 
					}
				} // empty
				if (valueOkay == true) {
						highlightField(f.elements[intLoop], false);
					//Reset if marked bad
					//f.elements[intLoop].style.backgroundColor=='white';
					if (f.elements[intLoop].style.backgroundColor=='#FFCC33') { //original line
					//if (f.elements[intLoop].style.borderColor=='#FFCC33' ) { //update 4/27/05
						highlightField(f.elements[intLoop], false);
					}
				}	
			}	
		} // Text Box
	} // For
	
	if ("" != strMissing)
		strError = "Required data is missing:\n" + strMissing;

	if ("" != strInvalid) {
		if ("" != strError)
			strError += "\n";
		strError += strInvalid;
	}
		
	if ("" != strOutOfRange) {
		if ("" != strError)
			strError += "\n";
		strError += strOutOfRange;
	}
	
	if ("" != strError) {
		alert(strError);
		focusElement.select();
		focusElement.focus();
		return false;
	}
	return true;
}
