﻿


// ========================================
//            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+$/,"");
}

var myValidator = new Validator();

// ========================================
//         VALIDATOR CONSTRUCTOR
// ========================================
function Validator()
{

    this.validateName = validateName;
	this.validateRegistration = validateRegistration;
	this.validateEmailAddress = validateEmailAddress;
	this.validatePhone = validatePhone;
	this.validateSelect = validateSelect;



// ========================================
//        FIELD VALIDATION FUNCTIONS
// ========================================

    // If test evaluates to true, return 0, else return 1
    // Used to facilitate counting boolean input validation functions
    function addError(test)
    {
        if (test) 
            return 0;
        else
            return 1;
    }
    


    
    function validateRegistration(valForm)
    {
        var totalErrors = 0;
        switch(valForm) {
            case "share":
                totalErrors += addError(myValidator.validateEmailAddress(d("txtRecipientEmail"), "l_recipientEmail"));
                totalErrors += addError(myValidator.validateEmailAddress(d("txtYourEmail"), "l_yourEmail"));
                totalErrors += addError(myValidator.validateName(d("txtYourName"), "l_yourName"));
                totalErrors += addError(myValidator.validateName(d("txtRecipientName"), "l_recipientName"));
                break;
            case "call":
                totalErrors += addError(myValidator.validateName(d("txtFirstName"), "l_firstName"));
                totalErrors += addError(myValidator.validatePhone(d("txtPhone"), "l_phone"));
                totalErrors += addError(myValidator.validateSelect(d("selTime"), "l_time"));
                totalErrors += addError(myValidator.validateSelect(d("selType"), "l_type"));
                break;
            default:
                break;
            }

        if (totalErrors == 0)
            return true;        // Everything validated
        else
            return false;       // One or more didn't validate
    }
    
    


	function validateEmailAddress(myField, myLabel)
	{
		var myValue = getValue(myField);
		if ( (isValidEmailAddress(myValue)) && 
			 (hasNoSpaces(myValue)) && 
			 (hasNoCrLf(myValue)) &&
			 (maxLength(myValue,50)) )
		{
            toggleError(myLabel, "norm");
			return true;
		} else {
			toggleError(myLabel, "error_state");
			return false;
		}
	}
	
	function validateName(myField, myLabel)
	{
		var myValue = getValue(myField);
		if ( (isNotNull(myValue)) && 
			 (maxLength(myValue,50)) )
		{
            toggleError(myLabel, "norm");
			return true;
		} else {
			toggleError(myLabel, "error_state");
			return false;
		}
	}
    
    function validateSelect(myField, myLabel)
    {
        var myValue = getValue(myField);
        if (myValue > 0){
            toggleError(myLabel, "norm");
			return true;
		} else {
		    toggleError(myLabel, "error_state");
			return false;
		}
    }
   
    function validatePhone(myField, myLabel)
    {
        var myValue = getValue(myField);
        if ( (isNotNull(myValue)) && 
			 (isValidPhoneNumber(myValue)) &&
			 (myValue != "000-000-0000") )
	    {
            toggleError(myLabel, "norm");
			return true;
		} else {
		    toggleError(myLabel, "error_state");
			return false;
		}
    }
   
// ========================================
//        ERROR HANDLING/CLEARING
// ========================================

	function toggleError(myLabel, myClass)
	{
	    if (d(myLabel))
	    {
	        var el = d(myLabel);
	        el.className = myClass;
	    }
	}
	

// ========================================
//        BASE  VALIDATOR FUNCTIONS
// ========================================

	function getValue(myField)
	{
		var myValue = '';
		switch(myField.type)
		{
			case "checkbox" :
				if (myField.checked) 
					myValue = myField.value;
				break;
			case "radio" :
				if (myField.checked) 
					myValue = myField.value;
                break;
			case "select-one" :
				var si = myField.selectedIndex;
				if (si >= 0)
					myValue = myField.options[si].value;
				break;
			case "button" :
			case "file" :
			case "hidden" :
			case "password" :
            case "reset" :
			case "select-multiple" :
			case "text" :
			case "textarea" :
			default : 
				myValue = myField.value;
				break;
		}
		return myValue;
	}
	
	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;
	}

	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 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 notTitleWord(myText)
	{
		var regTest = /^(CAPT|COL|DR|FR|LT|MISS|MS|MRS|MR|MJR|REV|SIST|AGENCY)$/i ;
		if (regTest.test(myText))
		{
			// alert("Name inclues a title 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 hasNoSpecialChars(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 hasNoSpecialCharsST(myText)
	{
	    var charpos
	
	    var regTest = /^(ST.)$/i ;
		if (regTest.test(myText.substring(0,3)))
		{
			charpos = myText.search(/@|#|\$|%|\*|\^|!|{|}|\[|\]|\?|\+|=|\\|\/|,|\"/); 
		    if(myText.length > 0 && charpos >= 0) 
		    {		  
			    // alert("Invalid Character " + myText.charAt(charpos) + " at position " + eval(charpos + 1)); 
			    return false; 
		    }
		}
		else
		{
		    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 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 isValidEmailAddress(myText)
	{
		//var regEmail = "^[\\w-_\.]*[\\w-_\.]\@[\\w]\.+[\\w]+[\\w]$";
		var regEmail = "\\w+([-+.']\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
		var regex = new RegExp(regEmail);
		if (!regex.test(myText))
		{
			// alert("E-mail 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 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;
	}
	
	function d(fieldName)
	{
        var x;
        return (x = document.getElementById(fieldName)) ? x : alert(fieldName + " not found");
    }

}



