// ========================================
//            TRIM FUNCTIONS
// ========================================
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}
String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
}
String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
}
function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}
function ltrim(stringToTrim) {
	return stringToTrim.replace(/^\s+/,"");
}
function rtrim(stringToTrim) {
	return stringToTrim.replace(/\s+$/,"");
}



// ========================================
//         VALIDATOR CONSTRUCTOR
// ========================================
function Validator()
{
	this.validatePrefix = validatePrefix ;
	this.validateFirstName = validateFirstName ;
	this.validateMiddleInitial = validateMiddleInitial ;
	this.validateLastName = validateLastName ;
	this.validateSuffix = validateSuffix ;
	this.validateAddress1 = validateAddress1 ;
	this.validateAddress2 = validateAddress2 ;
	this.validateCity = validateCity ;
	this.validateState = validateState ;
	this.validateZipCode = validateZipCode ;
	this.validatePhone = validatePhone;
	this.validateEmailAddress = validateEmailAddress ;
	



// ========================================
//        FIELD VALIDATION FUNCTIONS
// ========================================

    
	function validatePrefix(myField)
	{
	    var retVal = true;
	    var errormsg = "";
		var myValue = getValue(myField);
		if (!(hasNoDigits(myValue)))
		{
			myField.className = "error" ;
			throwError(myField,"Cannot contain digits.");
		    retVal = false;
		}
		if (!(hasNoSpaces(myValue)))
		{
			myField.className = "error" ;
			throwError(myField,"Cannot contain spaces.");
		    retVal = false;
		}
		if (!(hasNoFicoDelimeter(myValue)))
		{
			myField.className = "error" ;
			throwError(myField,"Cannot contain the character { .");
		    retVal = false;
		}
		if (!(hasNoCrLf(myValue)))
		{
			myField.className = "error" ;
			throwError(myField,"Cannot contain carriage returns.");
		    retVal = false;
		}
		if (!(maxLength(myValue,4)))
		{
			myField.className = "error" ;
			throwError(myField,"Cannot exceed 4 characters in length.");
		    retVal = false;
		}
		if (retVal == true)
		{
			myField.className = null;
			throwError(myField,null);
		}
		return retVal
	}
    
	function validatePrefix_old(myField)
	{
		if ( (hasNoDigits(myValue)) && 
		     (hasNoSpaces(myValue)) &&
			 (hasNoFicoDelimeter(myValue)) &&
			 (hasNoCrLf(myValue)) &&  
			 (maxLength(myValue,4))  )
		{
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}
	
	function validateFirstName(myField)
	{
		var myValue = getValue(myField);
		if ( (isNotNull(myValue)) && 
			 (hasNoDigits(myValue)) && 
			 (hasNoCrLf(myValue)) &&  
			 (hasNoFicoChars(myValue)) && 
			 (hasNoFicoDelimeter(myValue)) &&
			 (notATitle(myValue)) && 
			 (notATestWord(myValue)) &&
			 (notTripleRepeat(myValue)) &&
			 (minLength(myValue,2)) && 
			 (maxLength(myValue,20))   )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}

	function validateMiddleInitial(myField)
	{
		var myValue = getValue(myField);
		if ( (hasNoDigits(myValue)) && 
			 (isAlpha(myValue)) &&
			 (hasNoSpaces(myValue)) && 
			 (hasNoFicoDelimeter(myValue)) &&
			 (hasNoCrLf(myValue)) &&  
			 (maxLength(myValue,1))   )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}

	function validateLastName(myField)
	{
		var myValue = getValue(myField);
		if ( (isNotNull(myValue)) && 
			 (hasNoCrLf(myValue)) &&  
			 (hasNoDigits(myValue)) && 
			 (hasNoFicoChars(myValue)) &&
			 (hasNoFicoDelimeter(myValue)) &&
			 (notTripleRepeat(myValue)) &&
			 (maxLength(myValue,20)) && 
			 (minLength(myValue,2))  )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}

	function validateSuffix(myField)
	{
		var myValue = getValue(myField);
		if ( (hasNoCrLf(myValue)) &&  
			 (hasNoFicoDelimeter(myValue)) &&
			 (maxLength(myValue,4))   )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}

	function validateAddress1(myField)
	{
		var myValue = getValue(myField);
		if ( (isNotNull(myValue)) &&  
			 (hasNoCrLf(myValue)) &&  
			 (hasNoFicoDelimeter(myValue)) &&
			 (maxLength(myValue,50))   )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}

	function validateAddress2(myField)
	{
		var myValue = getValue(myField);
		if ( (hasNoCrLf(myValue)) &&  
			 (hasNoFicoDelimeter(myValue)) &&
			 (maxLength(myValue,50))   )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}
	
	function validateCity(myField)
	{
		var myValue = getValue(myField);
		if ( (isNotNull(myValue)) &&  
			 (hasNoCrLf(myValue)) && 
			 (hasNoFicoDelimeter(myValue)) &&
			 (minLength(myValue,1)) && 
			 (maxLength(myValue,20)) )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}

	function validateState(myField)
	{
		var myValue = getValue(myField);
		if ( (isNotNull(myValue)) &&  
			 (hasNoCrLf(myValue)) && 
			 (hasNoDigits(myValue)) && 
			 (hasNoFicoDelimeter(myValue)) &&
			 (isValidState(myValue)) && 
			 (minLength(myValue,2)) && 
			 (maxLength(myValue,2)) )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}
	
	function validateZipCode(myField)
	{
		var myValue = getValue(myField);
		if ( (isNotNull(myValue)) && 
			 (hasNoSpaces(myValue)) && 
			 (hasNoCrLf(myValue)) && 
			 (hasNoFicoDelimeter(myValue)) &&
			 (minLength(myValue,5)) && 
			 (maxLength(myValue,10)) && 
			 (isValidZipCode(myValue)) )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}

	function validatePhone(myField)
	{
		var myValue = getValue(myField);
		if ( (isNotNull(myValue)) && 
			 (hasNoSpaces(myValue)) && 
			 (hasNoCrLf(myValue)) && 
			 (hasNoFicoDelimeter(myValue)) &&
			 (minLength(myValue,10)) && 
			 (maxLength(myValue,14)) && 
			 (isValidPhone(myValue)) )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}

	function validateEmailAddress(myField)
	{
		var myValue = getValue(myField);
		if ( (isValidEmailAddress(myValue)) && 
			 (hasNoSpaces(myValue)) && 
			 (hasNoCrLf(myValue)) )
		{
		  myField.className = null;
			return true;
		} else {
			myField.className = "error" ;
			return false;
		}
	}





// ========================================
//        BASE  VALIDATOR FUNCTIONS
// ========================================

	function getValue(myField)
	{
		var myValue = '';
		switch(myField.type)
		{
			case "button" :
				myValue = myField.value;
			case "checkbox" :
				if (myField.checked) {
					myValue = myField.value;
				}
			case "file" :
				myValue = myField.value;
			case "hidden" :
				myValue = myField.value;
			case "password" :
				myValue = myField.value;
			case "radio" :
				if (myField.checked) {
					myValue = myField.value;
				}
			case "reset" :
				myValue = myField.value;
			case "select-one" :
				var si = myField.selectedIndex;
				if (si >= 0) {
					myValue = myField.options[si].value;
				}
			case "select-multiple" :
				myValue = myField.value;
			case "text" :
				myValue = myField.value;
			case "textarea" :
				myValue = myField.value;
			default : 
				myValue = myField.value;
		}
		return myValue;
	}
	
	function throwError(myField, myMessage)
	{
	    var errorContainer = null ;
	    if (document.getElementById("error_" + myField.name))
	    {
	        var rmElem = document.getElementById("error_" + myField.name);
	        rmElem.parentNode.removeChild(rmElem);
	    }
	    if ((myMessage) && (myMessage.length > 0))
	    {
            errorContainer = document.createElement("div");
            errorContainer.setAttribute("id","error_" + myField.name);
	        errorContainer.className = "errorContainer";
            errorContainer.appendChild(document.createTextNode(myMessage));
            myField.parentNode.insertBefore(errorContainer,myField.nextSibling);
        }
	}

	function isNotNull(myText)
	{
		if ( (myText.length > 0) && (trim(myText).length > 0) ) {
			return true;
		} else {
			// alert("Not Null!");
			return false;
		}
	}

	function isNumeric(myText)
	{
		var charpos = myText.search("[^0-9]"); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("Non-Numeric character at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}

	function isAlpha(myText)
	{
		var charpos = myText.search("[^A-Za-z]"); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("Non-Alpha character at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}

	function isAlphaNumeric(myText)
	{
		var charpos = myText.search("[^A-Za-z0-9]"); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("Non-AlphaNumeric character at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}

	function hasNoDigits(myText)
	{
		var charpos = myText.search("[0-9]"); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("Numeric character at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}

	function hasNoSpaces(myText)
	{
		var charpos = myText.search(/\s/); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("Space at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}

	// HAS NO SPACES - OLD
	function hasNoSpaces_v1(myText)
	{
		var InvalidChars = " ";
		var Char;
		for (i = 0; i < myText.length; i++) 
		{ 
			Char = myText.charAt(i); 
			if (InvalidChars.indexOf(Char) != -1) 
			{
				// alert("Space!");
				return false;
			}
		}
		return true;
	}
	
	function hasNoCrLf(myText)
	{
		var charpos = myText.search(/\r\n/); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("Carriage Return or Line Feed at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}

	function notATitle(myText)
	{
		var regTitle = /^(CAPT|COL|DR|FR|LT|MISS|MS|MRS|MR|MJR|REV|SIST|AGENCY)$/i ;
		if (regTitle.test(myText))
		{
			// alert("Name is a Title. Please correct and submit again.");
			return false;
		}
		return true;
	}
	
	function notATestWord(myText)
	{
		var regTest = /^(TEST|TESTING|FIRST)$/i ;
		if (regTest.test(myText))
		{
			// alert("Name is a Test Word. Please correct and submit again.");
			return false;
		}
		return true;
	}
	
	function notTripleRepeat(myText)
	{
		var charpos = myText.search(/^([0-9a-zA-Z])\1\1/i); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("Triple Alpha Character " + myText.charAt(charpos) + " at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}
	
	function hasNoFicoDelimeter(myText)
	{
		var charpos = myText.search(/{/); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("FICO Delimeter Character " + myText.charAt(charpos) + " at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}
	
	function hasNoFicoChars(myText)
	{
		var charpos = myText.search(/@|#|\$|%|\*|\^|!|{|}|\[|\]|\?|\+|-|=|\\|\/|,|\.|\"/); 
		if(myText.length > 0 && charpos >= 0) 
		{		  
			// alert("Invalid Character " + myText.charAt(charpos) + " at position " + eval(charpos + 1)); 
			return false; 
		}
		return true;
	}
	
	function hasNoFicoChars_old(myText)
	{
		var InvalidChars = "@#$%*^!{}[]?+-=/,.\"";
		var Char;
		for (i = 0; i < myText.length; i++) 
		{ 
			Char = myText.charAt(i); 
			if (InvalidChars.indexOf(Char) != -1) 
			{
				// alert("Invalid Character " + Char + " at " + eval(myText.indexOf(Char) + 1) );
				return false;
			}
		}
		return true;
	}

	function maxLength(myText,myMaxLength)
	{
		if (myText.length > myMaxLength)
		{
			// alert("More than " + myMaxLength + "!");
			return false;
		} else {
			return true;
		}
	}

	function minLength(myText,myMinLength)
	{
		if (myText.length < myMinLength)
		{
			// alert("Less than " + myMinLength + "!");
			return false;
		} else {
			return true;
		}
	}

	function isValidZipCode(myText)
	{
		var regZip = new RegExp(/(^\d{5}$)|(^\d{5}-\d{4}$)/);
		if (!regZip.test(myText))
		{
			// alert("Zip Code Is Not Valid");
			return false;
		}
		return true;
	}

	function isValidPhone(myText)
	{
		var regPhone = new RegExp(/(^(\(\d{3}\)|\d{3})-?\d{3}-?\d{4}$)/);
		if (!regPhone.test(myText))
		{
			// alert("Phone Is Not Valid");
			return false;
		}
		return true;
	}

	function isValidEmailAddress(myText)
	{
		var regEmail = /^(([\_\+\-\w]+)\.?)+@(([\-\w]+)\.?)+\.[a-zA-Z]{2,4}$/;
		var regex = new RegExp(regEmail);
		if (!regex.test(myText))
		{
			// alert("Email Address Is Not Valid");
			return false;
		}
		return true;
	}

	function isValidDate(myText)
	{
		var regDate=/^\d{2}\/\d{2}\/\d{4}$/ ;
		if (!regDate.test(myText))
		{
			// alert("Invalid Date Format (MM/DD/YYYY). Please correct and submit again.");
			return false;
		}
		return true ;
	}

	function isValidPhoneNumber(myText)
	{
		var regPhone = /^\(?\d{3}\)?\s|-\d{3}-\d{4}$/ ;
		if (!regPhone.test(myText))
		{
			// alert("Invalid Phone Format (###-###-####). Please correct and submit again.");
			return false;
		}
		return true;
	}
	
	function isValidState(myText)
	{
		if (!regState.test(myText))
		{
			// alert("Invalid State Abbreviation. Please correct and submit again.");
			return false;
		}
		return true;
	}
	
	
	function isValidSSN(myText)
	{
		var regSSN = /^\d{3}\-?\d{2}\-?\d{4}$/ ;
		if (!regSSN.test(myText))
		{
			// alert("Invalid SSN (###-##-####). Please correct and submit again.");
			return false;
		}
		return true;
	}






}



