/*
(c) 2006.  Qcorps Residential, Inc. dba WhiteFence.  All Rights Reserved
Author: Ken Myers
Date: 09-09-2006

This script is used for form validation.
*/
var emailexp = /^[a-z][a-z_0-9\-\.]+@[a-z_0-9\.\-]+\.[a-z]{2,3}$/i
var phoneexp =  /^\d{10}$/

function CRLF () {
	return String.fromCharCode(10) + String.fromCharCode(13);
}

function TAB(howMany) {
	var tempStr
	for (count = 0; count < howMany; count++) {
		tempStr = tempStr & String.fromCharCode(9);
	}
}

function validateEmail(str) {
	return emailexp.test(str)
}

function isErrorField(str) {
	return emailexp.test('err_*')
}

function validatePhone(str) {
	return phoneexp.test(str)
}

function StripChars(ItemsToStrip, str) {
	returnString = "";
	for (i = 0; i < str.length; i++) {
		var c = str.charAt(i);
        	if (ItemsToStrip.indexOf(c) == -1) returnString += c;
	}
	return returnString;
}

function AllSpace(str) {   //Makes String Blank if noting but spaces
	for (i=0; i < str.length; i++) {
		if (str.charAt(i) != " ") {
			return str;
		}
	}
	return "";
}

function SetDec(str, places) { //chops decimal places to max number of places
	if (isNaN(str)) {
		return str;
	}
	if (str.indexOf(".") != -1) {
	    if (places > 0) {
		str = str.substring(0, eval(str.indexOf(".")) + eval(places) + eval(1));
	    } else {
		str = str.substring(0, str.indexOf("."));
	    }
	}
	return str;
}

function DateFormat(dateVal) {
	DayVal = dateVal.getDate();
	MonthVal = dateVal.getMonth();
	YearVal = dateVal.getYear();
	if (YearVal.length <= 2) {
		YearVal = eval(YearVal) + 1900;
	}
	tempStr = eval(MonthVal + 1) + "/" + DayVal + "/" + YearVal;
	return tempStr;
}

function stripNonDigits(str) {
	return str.replace(/[^0-9]/g,"")
}

function getErrTag(form){

}

function showErr(form,elename,content) {
    var x;
    var c;
    var f;
    for (x=0; x < form.elements.length; x++ ) {
	fieldError = false;
	if (content!=""){
    		c = "<table class='formtextsmall'><tr><td><font color='#CC0000'>" + content + "</td></tr></table>";
    	}
    	else
    	{
    		c="";
    	}
	errname = "err_" + elename;
	f=document.getElementById(errname);
	if(f){
		f.innerHTML=c;
	}
    	//if (form.elements[x].name==errname){
    	//   form.elements[x].innerHTML=content;
    	//}
	}
}

function showErr2(form,elename,content) {
    var x;
    var c;
    var f;
    for (x=0; x < form.elements.length; x++ ) {
	fieldError = false;
	if (content!=""){
    		c = "<table class='formtextsmall'><tr><td><font color='#CC0000'>" + content + "</td></tr></table>";
    	}
    	else
    	{
    		c="";
    	}
	f=document.getElementById(elename);
	if(f){
		f.innerHTML=c;
	}
    	//if (form.elements[x].name==errname){
    	//   form.elements[x].innerHTML=content;
    	//}
	}
}

function checkOldAdd(form) {

    var f;
    var s;
    var flag=true;
	var srcElement;

	srcElement = document.getElementById("OldResponseInfo");
	if (srcElement) {
		if (srcElement.innerHTML!="") {
			    return false;
		}
	}

    f=document.getElementById("oldAddress")
    if (f.value==""){
	flag=false;
    }

    f=document.getElementById("oldCity")
    if (f.value==""){
	flag=false;
    }

    f=document.getElementById("oldState")
    s=f.value;
    if (s.match(/\-\-/) != null)
    {
        flag=false;
    }
    
    if (f.value==""){
	flag=false;
    }

    f=document.getElementById("oldZip")
    if (f.value==""){
	flag=false;
    }

    if (flag==false)
    {
    	showErr2(form,"OldResponseInfo","Old Address Required");
    }
    else
    {
    	showErr2(form,"OldResponseInfo","");
    }

    return flag;
}

function checkNewAdd(form) {

    var f;
    var s;
    var flag=true;
	var srcElement;

	srcElement = document.getElementById("NewResponseInfo");
	if (srcElement) {
		if (srcElement.innerHTML!="") {
			    return false;
		}
	}

    f=document.getElementById("newAddress")
    if (f.value==""){
	flag=false;
    }

    f=document.getElementById("newCity")
    if (f.value==""){
	flag=false;
    }

    f=document.getElementById("newState")
    s=f.value;
    if (s.match(/\-\-/) != null)
    {
        flag=false;
    }

    if (f.value==""){
	flag=false;
    }

    f=document.getElementById("newZip")
    if (f.value==""){
	flag=false;
    }

    if (flag==false)
    {
    	showErr2(form,"NewResponseInfo","New Address Required");
    }
    else
    {
    	showErr2(form,"NewResponseInfo","");
    }

    return flag;
}

function validateUSDate( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains only
    valid dates with 2 digit month, 2 digit day,
    4 digit year. Date separator can be ., -, or /.
    Uses combination of regular expressions and
    string parsing to validate date.
    Ex. mm/dd/yyyy or mm-dd-yyyy or mm.dd.yyyy

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.

REMARKS:
   Avoids some of the limitations of the Date.parse()
   method such as the date separator character.
*************************************************/
  var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/

  //check to see if in correct format
  if(!objRegExp.test(strValue))
    return false; //doesn't match pattern, bad date
  else{
    var strSeparator = strValue.substring(2,3) //find date separator
    var arrayDate = strValue.split(strSeparator); //split date into month, day, year
    //create a lookup for months not equal to Feb.
    var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
                        '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
    var intDay = parseInt(arrayDate[1],10);

    //check if month value and day value agree
    if(arrayLookup[arrayDate[0]] != null) {
      if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
        return true; //found in lookup table, good date
    }

    //check for February (bugfix 20050322)
    //bugfix  for parseInt kevin
    //bugfix  biss year  O.Jp Voutat
    var intMonth = parseInt(arrayDate[0],10);
    if (intMonth == 2) {
       var intYear = parseInt(arrayDate[2]);
       if (intDay > 0 && intDay < 29) {
           return true;
       }
       else if (intDay == 29) {
         if ((intYear % 4 == 0) && (intYear % 100 != 0) ||
             (intYear % 400 == 0)) {
              // year div by 4 and ((not div by 100) or div by 400) ->ok
             return true;
         }
       }
    }
  }
  return false; //any other values, bad date
}

function validateUSPhone( subject ) {
    if (subject.match(/\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})/)) {
	return true;
    } else {
	return false;
    }
        return false;
    }

function subtractMilliseconds(ms){
        var tdat = new Date();
        var yday = tdat.getTime();
        yday = yday - ms;
        tdat.setTime(yday);
        return tdat;
}

function subtractDays(d){
	var DAYS_CF = 86400000;       // 24 * 60 * 60 * 1000
	var tdat = subtractMilliseconds(d * DAYS_CF);
  	return tdat;
}

//forward date must be later than today
function todayOrAfter(testDate) {

	var tdat = new Date(); // today
	var dat = new Date(testDate); // the forward date
	var ydat = subtractDays(1);
    var ldat = subtractDays(-92);

	if (dat>=ydat && dat<=ldat){
		return true;
	}
	else
	{
		return false;
	}
}


//Email Check
function checkEmailAddy(form,d) {

    var c;
    var f;
    var flag=true;

    flag=validateEmail(d);
    if (flag==false)
    {
    	showErr2(form,"err_emailaddr","Valid Email Address Required");
    }
    else
    {
    	showErr2(form,"err_emailaddr","");
    }

    return flag;
}

//forwarding_start_date
function checkForwardDate(form,d) {

    var c;
    var f;
    var flag=true;

    for (x=0; x < form.elements.length; x++ ) {
    }

    flag=validateUSDate(d);
    if (flag==false)
    {
    	showErr2(form,"err_forwarding_start_date","Start Date Required");
    }
    else
    {
	if (todayOrAfter(d)==false){
	    showErr2(form,"err_forwarding_start_date","Start Date Out of Range");
	    flag=false;
	   }
	   else{
    		showErr2(form,"err_forwarding_start_date","");
    	   }
    }

    return flag;
}

//check the authorization
function checkAuth(form) {

    var c;
    var f;
    var flag=true;

    for (x=0; x < form.elements.length; x++ ) {
	if(form.elements[x].name=="Authorization"){
		if (form.elements[x].checked == false){
    			showErr(form,"Authorization","Authorization Required");
			flag=false;
		}
		else
		{
			showErr(form,"Authorization","");
		}
	}
    }

    return flag;
}

//check the authorization
function clearMsg(form,elename,errname) {

    var c;
    var f;
    var flag=true;

    for (x=0; x < form.elements.length; x++ ) {
	if(form.elements[x].name==elename){
		if (form.elements[x].value!=""){
    			showErr(form,errname,"");
    			flag=true;
		}
		else{
			flag=false;
		}
	}
    }

    return flag;
}

//Test the phone number
function checkPhone(form) {
    var x;
    var c;
    var f;
    var flag=true;
    var acode;
    var lcode;
    var pnum;

    for (x=0; x < form.elements.length; x++ ) {

	if (form.elements[x].name=="phone_area_code"){
	    acode=form.elements[x].value;
	}

	if (form.elements[x].name=="phone_local_number"){
	    lcode=form.elements[x].value;
	}
    }

    pnum = acode + lcode;
    flag = validateUSPhone( pnum );

    if (flag==false)
    {
    	showErr2(form,"err_phone_area_code","");
    	showErr2(form,"err_phone_local_number","Phone Number Required");
    }
    else
    {
    	showErr2(form,"err_phone_area_code","");
    	showErr2(form,"err_phone_local_number","");
    }

    return flag;
}


function checkform(form, errColor, startColor, showAlert, showErrors, fontStyle) {
    Error = false;
    alertStr = "";
    var errname;
    var content;
    var addchk;
	var srcElement;

    addchk = checkNewAdd(form);
    if (addchk==false){
	Error = true;
	fieldError = true;
    }

    addchk = checkOldAdd(form);
    if (addchk==false){
	Error = true;
	fieldError = true;
    }

    addchk = checkPhone(form);
    if (addchk==false){
	Error = true;
	fieldError = true;
    }

    addchk=checkAuth(form);
    if (addchk==false){
        Error = true;
	fieldError = true;
    }

    for (x=0; x < form.elements.length; x++ ) {

	//fieldError = false;
	errname = "err_" + form.elements[x].name;

	srcElement = document.getElementById(errname);
	if (srcElement) {
		//alert(srcElement.innerHTML);
		if (srcElement.innerHTML!="") {
			    //alert(srcElement.innerHTML);
			    Error = true;
			    fieldError = true;
			    continue;
			    return false;
		}
	}

	if(form.elements[x].name=="forwarding_start_date"){
		addchk=checkForwardDate(form,form.elements[x].value);
		if (addchk==false){
		    Error = true;
		    fieldError = true;
		}
		continue;
	}


	if(form.elements[x].name=="emailaddr"){
		addchk=checkEmailAddy(form,form.elements[x].value);
		if (addchk==false){
		    Error = true;
		    fieldError = true;
		}
		continue;
	}

	if (form.elements[x].type == "text" || form.elements[x].type == "select-one" || form.elements[x].type == "password"  || form.elements[x].type == "textarea") {

	    //if (form.elements[x].name!="phone_area_code" && form.elements[x].name!="phone_local_number" && form.elements[x].name!="forward_start_date" && form.elements[x].name!="emailaddr"){
	    //	showErr(form,form.elements[x].name,"");
	    //}

	    if (x+1 < form.length && form.elements[x+1].name.charAt(0) == "@") {
		paramStr = form.elements[x+1].name.substring(1, form.elements[x+1].name.length);
		params = null;
		params = paramStr.split("_");

		if (params[7] != null) {
			backColor = params[7];
		} else {
			backColor = startColor;
		}

		if (params[6] != null && AllSpace(params[6]) != "" ) {
			defaultValue = params[6];
		} else {
			defaultValue = "";
		}
		if (params[1] == "NoBlank" && form.elements[x].value == "" && defaultValue == "") {
			//alertStr = alertStr + "The " + params[2] + " field must not be blank." + CRLF();
			content=params[2];
            		showErr(form,form.elements[x].name,content);
			Error = true;
			fieldError = true;

		} else if (params[1] == "NoBlank" && form.elements[x].value == "" && defaultValue != "") {
			form.elements[x].value = defaultValue;

		} else if (params[0] == "email") {
			if (!validateEmail(form.elements[x].value) && form.elements[x].value != "") {
				//alertStr = alertStr + "The " + params[2] + " field does not contain a valid email address." + CRLF();
				//showErr(form,errname,"The " + params[2] + " field must not be blank.");

    				content=params[2];
                		showErr(form,form.elements[x].name,content);
				Error = true;
				fieldError = true;
			}
		} else if (params[0] == "number" && form.elements[x].value != "") {
			form.elements[x].value =  StripChars("$,%", form.elements[x].value);
			if (params[3] != null) {
				form.elements[x].value = SetDec(form.elements[x].value, params[3]);
			}
			if (isNaN(form.elements[x].value)) {
			 	//alertStr = alertStr + "The " + params[2] + " field does not contain a valid numeric value." + CRLF();
    				content=params[2];
                		showErr(form,form.elements[x].name,content);
				Error = true;
				fieldError = true;
			} else {
				if (params[4] != null) {
					if (eval(form.elements[x].value) < eval(params[4])) {
						//alertStr = alertStr + "The " + params[2] + " field must be greater than " + params[4] + CRLF();
            					content=params[2];
                        			showErr(form,form.elements[x].name,content);
						Error = true;
						fieldError = true;
					}
				}
				if (params[5] != null) {
					if (eval(form.elements[x].value) > eval(params[5])) {
						//alertStr = alertStr + "The " + params[2] + " field must be less than " + params[5] + CRLF();
            					content=params[2];
                        				showErr(form,form.elements[x].name,content);
						Error = true;
						fieldError = true;
					}
				}
			}

		} else if (params[0] == "age" && form.elements[x].value != "") {

			form.elements[x].value = SetDec(form.elements[x].value,0);
			if (eval(form.elements[x].value) < 0 || eval(form.elements[x].value) > 120) {
				//alertStr = alertStr + "The " + params[2] + " field doesn't appear to be a valid age." + CRLF();
    				content=params[2];
                		showErr(form,form.elements[x].name,content);
				Error = true;
				fieldError = true;
			}
		} else if (params[0] == "date" && form.elements[x].value != "") {
			dateYear = new String();
			curDate = new Date();
			tempDate = new Date(form.elements[x].value);
			dateYear = dateYear + tempDate.getYear();
			if (dateYear.length <= 2) {
				dateYear = eval(dateYear) + eval(1900);
			}
			if (form.elements[x].value != "") {
			    if (tempDate == "NaN") {
				//alertStr = alertStr + "The " + params[2] + " field is not a valid date." + CRLF();
    				content=params[2];
                		showErr(form,form.elements[x].name,content);
				Error = true;
				fieldError = true;
			    } else if (params[4] != null && dateYear < eval(curDate.getYear()) - eval(params[4])) {
				//alertStr = alertStr + "The " + params[2] + " field is too low." + CRLF();
    				content=params[2];
                		showErr(form,form.elements[x].name,content);
				Error = true;
				fieldError = true;

			    } else if (params[5] != null && dateYear > eval(curDate.getYear()) + eval(params[5])) {
				//alertStr = alertStr + "The " + params[2] + " field is too high." + CRLF();
    				content=params[2];
                		showErr(form,form.elements[x].name,content);
				Error = true;
				fieldError = true;

			    } else {
				form.elements[x].value = DateFormat(tempDate);
			    }
			}
		} else if (params[0] == "phone" && form.elements[x].value != "") {
			form.elements[x].value = stripNonDigits(form.elements[x].value)
			if (validatePhone(form.elements[x].value)) {
			    	tempP = form.elements[x].value
			    	form.elements[x].value = "(" + tempP.substring(0, 3) + ") " + tempP.substring(3,6) + "-" + tempP.substring(6, 10)
			} else {
			    	//alertStr = alertStr + "The " + params[2] + " field is invalid.  Please include the full phone number including area code." + CRLF();
    			content=params[2];
                showErr(form,form.elements[x].name,content);
				Error = true;
				fieldError = true;
			}
		} else if (params[0] == "fixnumber" && form.elements[x].value != "") {
			form.elements[x].value =  StripChars("$,%", form.elements[x].value);
			if (params[3] != null) {
				form.elements[x].value = SetDec(form.elements[x].value, params[3]);
			}
			if (isNaN(form.elements[x].value)) {
			 	//alertStr = alertStr + "The " + params[2] + " field does not contain a valid numeric value." + CRLF();
            	content=params[2];
                showErr(form,form.elements[x].name,content);
				Error = true;
				fieldError = true;
			} else {
				if (params[4] != null) {
					if (eval(form.elements[x].value.length) < eval(params[4])) {
						//alertStr = alertStr + "The " + params[2] + " field must at least " + params[4] + " digits." + CRLF();
                    	content=params[2];
                        showErr(form,form.elements[x].name,content);
						Error = true;
						fieldError = true;
					}
				}
				if (params[5] != null) {
					if (eval(form.elements[x].value.length) > eval(params[5])) {
						//alertStr = alertStr + "The " + params[2] + " field must be less than " + params[5] + " digits." + CRLF();
                    	content=params[2];
                        showErr(form,form.elements[x].name,content);
						Error = true;
						fieldError = true;
					}
				}
			}
		}
	    }
	}
    }

    //var oform = document.orderForm;
    if (Error == true) {
	return false;
    }

    if (fieldError == true) {
	return false;
    }
}
