//Error validation for forms throughout the site

//global variables
var blnError = false;
var ErrorFields = ""; // array to hold the fields which are invalid
var ErrorTypes = ""; // array to hold the errors
var FormName; // variable to hold the Form Name
var Field; // variable to hold the Field Name
var Type; // variable to hold the Field Type
var ValType; // variable to hold the Validation Type
var blnsubOnce = "";
var errorMsg;

//add error to list
function addErr(){
	ErrorFields += Field+"^";
    ErrorTypes += Type + "%" + errorMsg + "^";
}

// Function for catching errors
function catchError(getFormName,getField,getType,getValType,getErrorMsg) {
	// get field value
	FormName = getFormName;
	Field = getField;
	Type = getType;
	ValType = getValType;
	var expn = eval("document."+FormName+"."+Field+".value");
	var hasError = false;
	errorMsg = getErrorMsg;
	//default to 0 if not passed in
	if (typeof errorMsg == "undefined") {errorMsg = 0;}
	
	//error checking based on type
	switch (Type) {
		case "chkmodel":
		    if(!validateModelChecklist()){ addErr(); }
			break;
		case "currency":
			if(!validateCurrency(expn)){ addErr(); }
			break;
		case "day":
			if(!validateNumeric(expn, 1, 31)){ addErr(); }
			break;
		case "email":
			if(!validateEmail(expn)){ addErr(); }
			break;
		case "intrate":
		    if(!validateIntRate(expn)){ addErr(); }
			break;
		case "month":
			if(!validateNumeric(expn, 1, 12)){ addErr(); }
			break;
		case "numeric":
			if(!validateNumeric(expn, "", "")){ addErr(); }
			break;
		case "password":
		    if(!validatePassword(expn)){ addErr(); }
			break;
		case "phone":
			if(!validatePhone(expn)){ addErr(); }
			break;
		case "selectone":
			if(!validateSelect(expn)){ addErr(); }
			break;
		case "selectradio":
		    if(!validateButton(expn)){ addErr(); }
			break;
		case "textnotempty":
			if(!validateForBlank(expn)){ addErr();}
		    break;
		case "time":
		    if(!validateTime(expn)){ addErr(); }
		    break;
		case "vin":
		    if(!validateVIN(expn)){ addErr(); }
		    break;
		case "year":
			if(!validateYear(expn)){ addErr(); }
			break;
		case "zip":
		    if(!validateZip(expn)){ addErr(); }
		    break;
	}
}

// function for submitting the form only once (To allow multiple submissions pass "true")
function submitThis(allowMultiple){
  	if(!blnError){ // no errors
  		if((blnsubOnce == "") || (allowMultiple == "true")){
    		var FormToSubmit = eval("document."+FormName);
			try{
				if(cacheDLFormInfo)
					cacheDLFormInfo();
			} catch(e) {}
    		FormToSubmit.submit();
	 		blnsubOnce = "no";
		}
	} else {
	    generateErrorPage();
	    // reset the values
	    blnError = false;
	    ErrorFields = "";
	    ErrorTypes = "";
		blnsubOnce = "";
	}
}

//function to pop up error
function ErrorPopup(url, name, width, height) {
  var str = "height=" + height + ",innerHeight=" + height;
  str += ",width=" + width + ",innerWidth=" + width;
  if (window.screen) {
    var ah = screen.availHeight - 30;
    var aw = screen.availWidth - 10;

    var xc = (aw - width) / 2;
    var yc = (ah - height) / 2;

    str += ",left=" + xc
    str += ",top=" + yc
  }
  window.open(url, name, str);
}

//validation functions
//*************************************************************************************

//***check MSRP***
function checkMSRP(getFormName,getMSRP,getCashdown,getTradein,getType,getErrorMsg){
	var expn1 = eval("document."+getFormName+"."+getCashdown+".value");
	var expn2 = eval("document."+getFormName+"."+getTradein+".value");
	var msrp = eval("document."+getFormName+"."+getMSRP+".value");

	if(!isBlank(expn1) || !isBlank(expn2) || !isBlank(msrp)){
		expn1 = removeDots(removeComma(appendDot(expn1)));
		expn2 = removeDots(removeComma(appendDot(expn2)));
		msrp = removeDots(removeComma(appendDot(msrp)));
		var temp1 = 0;
		var temp2 = 0;

		if(!isBlank(expn1) || !isNumeric(removeDots(removeComma(expn1)))){
			temp1 = parseInt(expn1);
		}

		if(!isBlank(expn2) ||!isNumeric(removeDots(removeComma(expn2)))){
			temp2 = parseInt(expn2);
		}

		if((temp1+temp2) > parseInt(msrp)){
			Field = getCashdown;
			Type = getType;
			errorMsg = getErrorMsg;
			addErr();
			blnError = true;
		}
	}
}

//***make sure 2 password fields match***
function matchPassword(getFormName,getField1,getField2,getType,getErrorMsg){
	var expn1 = eval("document."+getFormName+"."+getField1+".value");
	var expn2 = eval("document."+getFormName+"."+getField2+".value");
	if(expn1 != expn2){
		Field = getField1;
		Type = getType;
		errorMsg = getErrorMsg;
		addErr();
		blnError = true;
	}
}

//***Radio Button Validation***
function validateButton(expn){
var radio_error = true;
var general = eval("document."+FormName+"."+Field);
for (i = 0; i < general.length; i++){
	if (general[i].checked){
		radio_error = false;
	}
}
if (radio_error){
	blnError = true;
	return false;
		}
	    else{
	      return true;
		}

}

//***validates currency fields***
function validateCurrency(expn){
	if((ValType == "R") || (!isBlank(expn))){
		if ((isBlank(expn)) || (!isNumeric(removeDots((removeComma(appendDot(expn)))))) || !hasMoreDots(expn)){
			blnError = true;
			return false;
		} else {
			return true;
		}
	} else {
      return true;
	}
}

//***validates e-mail address***
function validateEmail(emailStr) {
	//regular expressions
	var emailPat=/^(.+)@(.+)$/								//check for user@domain format/separate username and domain
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"		//check for special characters (not allowed)
	var validChars="\[^\\s" + specialChars + "\]"			//allowed user/domain characters (specifies chars not allowed)
	var firstChars=validChars								//range allowed for first character of user/domain
	var quotedUser="(\"[^\"]*\")"							//used for quoted string username (anything allowed)
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/	//for IP addresses (joe@[123.124.233.4]) 
																			//NOTE: square brackets are required. 
	var atom="(" + firstChars + validChars + "*" + ")"		//Represents an atom (series of non-special characters.)
	var word="(" + atom + "|" + quotedUser + ")"			//one word in username (in john.doe@somewhere.com, john and doe).
															//Basically, either an atom or quoted string.
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$")	// Describes the structure of the user
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")	//Describes a normal symbolic domain(non-IP).
	
	/* break up user@domain */
	var matchArray=emailStr.match(emailPat)
	if (matchArray==null) {
	  /* Missing @'s; not a valid e-mail address. */
		blnError = true;
		return false
	}
	var user=matchArray[1]
	var domain=matchArray[2]
	
	// See if "user" is valid 
	if (user.match(userPat)==null) {
		// user is not valid
		blnError = true;
		return false
	}
	
	/* if e-mail address is at an IP address make sure it is valid. */
	var IPArray=domain.match(ipDomainPat)
	if (IPArray!=null) {
		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				blnError = true;
				return false
			}
		}
	    return true
	}
	
	// Domain is symbolic name
	var domainArray=domain.match(domainPat)
	if (domainArray==null) {
		blnError = true;
		return false
	}
	
	/* Break up the domain to see how many atoms it consists of. */
	var atomPat=new RegExp(atom,"g")
	var domArr=domain.match(atomPat)
	var len=domArr.length
	if (domArr[domArr.length-1].length<2 || domArr[domArr.length-1].length>4 || (len<2)) {
		// address must end in a 2, 3, or 4 letter word (4 for .info, .name, etc.).
		// also check to make sure more than one atom in domain
		blnError = true;
		return false
	}

	// If we've gotten this far, everything's valid!
	return true;
}

//***check for blank (required fields only)***
function validateForBlank(expn){
	if (isBlank(expn)){
		blnError = true;
		return false;
    } else {
		return true;
    }
}

//***validate interest rate***
function validateIntRate(expn){
	var arrInt;
	if((ValType == "R") || (!isBlank(expn))){
		if(expn.indexOf(".")>0){
			arrInt = (expn).split(".");
			if ((!isNumeric(arrInt[0])) || (!isNumeric(arrInt[1])) || (expn < 0.01) || (expn > 99.99) || (!hasMoreDots(expn))){
				blnError = true;
				return false;
			} else {
				return true;
			}
		} else {
			blnError = true;
			return false;
		}
	} else {
      return true;
	}
}

//***check that at least one model is checked***
function validateModelChecklist(){

  var ls430 =  eval("document."+FormName+".ls430");
  var gs430 =  eval("document."+FormName+".gs430");
  var gs300 =  eval("document."+FormName+".gs300");
  var es300 =  eval("document."+FormName+".es300");
  var is300e =  eval("document."+FormName+".is300e");
  var is3005 =  eval("document."+FormName+".is3005");
  var is300sc =  eval("document."+FormName+".is300sc");
  var rx300 =  eval("document."+FormName+".rx300");
  var gx470 =  eval("document."+FormName+".gx470");
  var lx470 =  eval("document."+FormName+".lx470");
  var sc430 =  eval("document."+FormName+".sc430");

	if ((!ls430.checked) && (!gs430.checked) && (!gs300.checked) && (!es300.checked) && (!is300e.checked) && (!is3005.checked) && (!is300sc.checked) && (!rx300.checked) && (!gx470.checked) && (!lx470.checked) && (!sc430.checked)){
		blnError = true;
		return false;
	} else {
		return true;
	}
}

//***check numeric. Can pass in low and high values.***
function validateNumeric(expn, low, high){
	if((ValType == "R") || (!isBlank(expn))){
		if ((isBlank(expn)) || (!isNumeric(expn))){
			blnError = true;
			return false;
		} else if ((low != "") && (high != "")) {
			if ((expn < low) || (expn > high)) {
				blnError = true;
				return false;
			} else {
			return true;
			}
		} else {
			return true;
		}
	} else {
		return true;
	}
}

//***validate password field***
function validatePassword(expn){
  if(ValType == "R"){
    if (((getLength(expn) < 6)) || ((getLength(expn) > 10))){
      blnError = true;
      return false;
    }
    else{
      return true;
    }
  }
}

//***validate 10 digit phone number***
function validatePhone(expn){
	if((ValType == "R") || (!isBlank(expn))){
		if ((getLength(expn) != 10) || (!isNumeric(expn))){
			blnError = true;
			return false;
		} else {
			return true;
		}
	} else {
		return true;
	}
}

//***validate dropdown select***
function validateSelect(){
	var selectExpn =  eval("document."+FormName+"."+Field);
	if (selectExpn.options[selectExpn.selectedIndex].value == ""){
		blnError = true;
		return false;
	} else {
		return true;
	}
}

//***check time***
function validateTime(expn){
	var arrTime;
	if((ValType == "R") || (!isBlank(expn))){
		if(expn.indexOf(":")>0){
			arrTime = (expn).split(":");
			if ((!isNumeric(arrTime[0])) || (!isNumeric(arrTime[1]))){
				blnError = true;
				return false;
			} else {
				return true;
			}
		} else {
			blnError = true;
			return false;
		}
	} else {
		return true;
	}
}

//***validates VIN***
function validateVIN(expn){

	var invalidText = /([^a-zA-Z_0-9_])/;
	var Last = expn.substr(getLength(expn)-6);

	if(ValType == "R"){
		if ((invalidText.test(expn)) || (!isNumeric(Last)) || (getLength(expn) != 17) || (isBlank(expn))){
			blnError = true;
			return false;
		} else {
			return true;
		}
	} else if(!isBlank(expn)){
		if ((invalidText.test(expn)) || (getLength(expn) != 17)){
			blnError = true;
			return false;
		} else {
			return true;
		}
    } else {
		return true;
	}
}

//***check year to be numeric and > current year
function validateYear(expn){
	var d = new Date();
	var year = d.getYear();
	year = (year.toString()).substr(2,2);

	if((ValType == "R") || (!isBlank(expn))){
		if ((parseInt(expn) > parseInt(year)) || !isNumeric(parseInt(expn))){
			blnError = true;
			return false;
		} else {
			return true;
		}
	} else {
      return true;
	}
}


//***validate zip code***
function validateZip(expn){
	//alert("!");
	if((ValType == "R") || (!isBlank(expn))){
		if ((isBlank(expn)) || (getLength(expn) != 5) || (!isNumeric(expn))){
			//alert(expn);
			blnError = true;
			return false;
		} else {
			return true;
		}
	} else {
		return true;
	}
}


// supporting functions
//*************************************************************************************
function appendDot(val){
  var temp = val;
  if(temp.indexOf(".") == -1){
    temp = temp + ".00";
  }
  val = temp;
  return val;
}

function getLength(expn){
	return expn.length;
}

function hasMoreDots(val){
	val = val.toString();
	if(((val.toString()).substring(((val.toString()).indexOf(".")+1))).indexOf(".") >= 0){
		return false;
	} else {
		return true;
	}
}

function isBlank(expn){
	if(expn == ''){
		return true;
	} else {
		return false;
	}
}

function isNotZero(expn){
	if(expn == "00000"){
		return false;
	} else {
		return true;
	}
}

function isNumeric(val){
	for(i=0; i<val.length; i++){
		if (val.substring(i, i+1)<"0" || val.substring(i, i+1)>"9"){
			return false;
		}
	}
	return true;
}

function removeComma(val){
	var temp = val;
	while((position = temp.indexOf(',')) != -1){
		temp = val.substring(0, position) + val.substring(position + 1, val.length);
		val = temp;
	}
	return val;
}

function removeDots(val){
	var temp = val;
	while((position = temp.indexOf('.')) != -1){
		temp = val.substring(0, position) + val.substring(position + 1, val.length);
		val = temp;
	}
	return val;
}
