/** 
 * SAF (Standard Action Forms) Validation 
 * Client-side validation routines for all forms that have a class attribute of
 * saf (ex. <form id="sampleform" action="." method="post" class="saf">).
 *
 * @version 2.0
 *
 * @author Matt Dertinger
 * @author Yun Qian
 *
 * @see /c/06/saf.css for presentation rules
 * @see SAFRULE object within saf/conf.js file for the related validation 
 * rules.
 * @see the SAF_l10._ERRORMSG object within saf/l10n/safmessages_en.js for associated 
 * localized error messages in English
 * @see the SAF_l10._ERRORMSG object within safl10n/safmessages_es.js for associated 
 * localized error messages in Spanish
 * @see the SAF_l10._ERRORMSG object within saf/l10n/safmessages_zh-Hant.js for 
 * associated localized error messages in Chinese
 *
 */

var safTimer = setTimeout('',2000);

function safHandler() {
	/* Member Variables */
	this.f;
	this.fld;
	this.isError = 0;
	this.setSAF = function() { 
		var i, j;
		for (i = document.forms.length; i != 0; i--) {
			if (document.forms[i-1].className == "saf" || (document.forms[i-1].className.indexOf("saf") != -1 && document.forms[i-1].className.indexOf("newwin") != -1)) {
				this.f = document.forms[i-1];
				if (this.f.className.indexOf("newwin") != -1)
					this.f.onsubmit = function() { 
						if(safObj.validateAll(this)){
							if(this.id=='searchZIPShop')
								onClickTrackingById('FindShopPage-' + this.zipcode.value); 
							newWindow.setURL(this,"","","","","","","","","",true);
						}
						else 
							return false;
						};
				else this.f.onsubmit = function() { return safObj.validateAll(this); };
				for (j = this.f.elements.length; j != 0; j--) {
					var el = this.f.elements[j-1];
					/* If <var>el</var> is not a member of the SAFTYPE array 
					 * or the array item is set to false, then continue to 
					 * next form element.
					 *
					 * @see /j/06/constants.js for SAFTYPE array 
					 */
					if (typeof SAFTYPE[el.type] == "undefined" || SAFTYPE[el.type] == 0) continue;
					el.onblur = function() { safObj.setBlur(this); };
					el.onfocus = function() { safObj.setFocus(this); };
					if (el.type == "select-one") {
						el.onchange = function() { safObj.setChange(this); };
					} else if (el.type == "radio" || el.type == "checkbox") {
						el.onclick = function() { safObj.setClick(this); };
					}
					safObj.setLoad(el);
				}
				if(this.f.name=="selectType") setDefault();
				if(document.getElementById('addvehicle')){
					var addVehicleButton = document.getElementById('addvehicle');
					addVehicleButton.onclick = function() { addVehicle(this);return false; }
				}
			}
		}
	}
}

/* SAF Validate Methods */
safHandler.prototype.validate = function() {
	/* Local Variable to store the object reference of the current field being validated */
	var fld = this.fld;
	/* local string variable to store the validation rules assigned to the current field being validated */
	var vRules = fld.className;
	
	/* Match objects for Regular Expression Literals */

	var reMask = /MASK(\S+)/.exec(vRules);
	var reRequiredIf = /IF-(\S+)/.exec(vRules);
	var reCharLimit = /CHARLIMIT(\S+)/.exec(vRules);
	
	/* Local Boolean Variables */
	/* Store validation rules to apply to the current field being validated */
	var isRequired = (vRules.indexOf("REQUIRED") != -1) ? 1 : 0;
	var isRequiredIf = (vRules.indexOf('IF-') != -1) ? 1 : 0;
	var isMask = (vRules.indexOf('MASK') != -1) ? 1 : 0;
	var isCharLimit = (vRules.indexOf('CHARLIMIT') != -1) ? 1 : 0;
	var isMultiple = (vRules.indexOf('HAS') != -1) ? 1 : 0;
	
	/* Store validation results for the current field being validated */
	var isRequiredErr = (isRequired && (fld.value == "" || (fld.type == "radio" && !this.validateChecked(fld.form[fld.name])))) ? 1 : 0;
	
	var isRequiredIfErr = (isRequiredIf && !this.validateRequiredIf(reRequiredIf[1])) ? 1 : 0;
	
	var isMaskErr = (isMask && (fld.value != "" && !this.validateMask(reMask[1]))) ? 1 : 0;
	var isCharLimitErr = (isCharLimit && !this.validateCharLimit(reCharLimit[1])) ? 1 : 0;
	/* Need to finish conditional statement for multipleErr */
	var isMultipleErr = (isMultiple && fld.value == "") ? 1 : 0;
	
	this.isError = (isRequiredErr || isRequiredIfErr || isCharLimitErr || isMaskErr || isMultipleErr) ? 1 : 0;
	
	/* local string variable to store the value of the current field's title attribute */
	var fldTitle = (fld.type == "radio") ? (fld.title? fld.title : fld.form[fld.name][0].title) : fld.title;
	
	/* local string variable to store the text of the message to be returned */
	var vMessage = (isRequiredErr) ? SAF_l10n._ERRORMSG["REQUIRED"] + fldTitle.toLowerCase() : (isRequiredIfErr) ? SAF_l10n._ERRORMSG["REQUIRED"] + fldTitle.toLowerCase() : (isMaskErr) ? fldTitle + SAF_l10n._ERRORMSG[reMask[1]] : (isCharLimitErr) ? fldTitle + SAF_l10n._ERRORMSG["CHARLIMIT0"] + reCharLimit[1] + SAF_l10n._ERRORMSG["CHARLIMIT1"] : "\u00A0";
	
 	this.messageHandler(isMultiple,vMessage);
	if (this.isError) {
		return 0;
	}
	return 1;
}

safHandler.prototype.validateAll = function(f) {
	var i;
	var containsErrors = 0;
	var flds = f.elements;
	for (i = flds.length; i != 0; i--) {
		var fld = flds[i-1];	
		if (typeof SAFTYPE[fld.type] == "undefined" || SAFTYPE[fld.type] == 0) continue;
		this.fld = fld;
		
		if (!this.validate()){containsErrors = 1;}
	}
	if (containsErrors) {
		scrollTo(0,0);
		return false;
	}
	if (document.getElementById('phone')) {
		if (document.getElementById('phone').value != "") {
			this.setHiddenField('phone');
		}
	}
	if (document.getElementById('dealercomments')){
		var dealercomments = document.getElementById('dealercomments');
		if(dealercomments.type == "textarea"){
			dealercomments.value = dealercomments.value.replace(/\%/g," percent");
		}
	}
	
	/*if (window.location.href.indexOf("byo") > -1 && getCookie('doIT')){
		 getRegion(document.forms[document.forms.length-1].zip.value,document.forms[document.forms.length-1]);
		 return false;
	}*/
	
	return true;
}

safHandler.prototype.validateRequiredIf = function(dependencies) {
	var fld = this.fld;
	var depends = dependencies.split('-');
	var dependantField = document.getElementById(depends[0]);
	var dependantValue = depends[1];
	var actualValue = "";

	if(dependantField.type=="radio" || dependantField.type=="checkbox"){
		if (dependantField.checked )
			actualValue = dependantField.value;
	} else actualValue = dependantField.value;

	if (actualValue == dependantValue || (dependantValue == "NOTNULL" && actualValue.length != 0) || (dependantValue == "NULL" && actualValue.length == 0)) {
		if (fld.value == "") return 0;
		return 1;
	}
	return 1;
}

safHandler.prototype.validateMask = function(maskId) {
	if (SAFRULE._MASK[maskId].test(this.fld.value)) { 
		if (maskId == "ZIPCODEPLUS4") { setCookie('zipcode',this.fld.value); }
		return 1;
	}
	return 0;
}

safHandler.prototype.validateCharLimit = function(maxlength) {
	if (this.fld.value.length <= maxlength) return 1;
	return 0;
}

safHandler.prototype.validateChecked = function(obj) {
	for (var i = obj.length; i != 0; i--) if (obj[i-1].checked) return 1; 
	return 0;
}

/* SAF Message Handle, used for display information to the site visitor after a
 * a call the validate() method 
 */
safHandler.prototype.messageHandler = function(isMultiple,str){
	var fld = this.fld;
	var parentDL = getAncestorByTagName(fld,'dl');
	var fldId = (isMultiple || fld.type == "radio") ? fld.id.replace(SAFRULE._MASK["DIGITS"],'') : fld.id;
	var elemMsg;
	if (this.isError) {
		if (document.getElementById(fldId + "Msg")) {
			elemMsg = document.getElementById(fldId + "Msg");
		} else {
			elemMsg = document.createElement('dd');
			elemMsg.id = fldId + "Msg";
			elemMsg.className = "fieldmessage";
			elemMsg.appendChild(document.createTextNode('&#xA0;'));
			parentDL.appendChild(elemMsg);
		}
		if (parentDL.className.indexOf('error') == -1) {
				parentDL.className += " error";
			}
	} else if(parentDL.className.indexOf("error") != -1) {
		parentDL.className = parentDL.className.replace("error","");
	}
	if(elemMsg){
		elemMsg.firstChild.nodeValue = str;
		}
}

/* SAF Event Handler Methods */
safHandler.prototype.setFocus = function(obj) {
	var fld = obj;
	var waitToValidate = (fld.type == "radio" || fld.type == "checkbox" || (fld.className.indexOf('HAS') != -1)) ? 1 : 0;
//	if (waitToValidate && fld.id.lastIndexOf("0") == -1){clearTimeout(safTimer); }
}

safHandler.prototype.setBlur = function(obj) {
	this.fld = obj;
	safTimer = setTimeout("safObj.validate()",200);
}

safHandler.prototype.setChange = function(obj) {
	var fld = obj;
	if (fld.type == "select-one") {
		if (fld.className.indexOf('POPULATE') != -1) {
			this.setOptions(fld);
		}
	}
}

safHandler.prototype.setClick = function(obj) {
	var fld = obj;
	if (fld.type == "radio" || fld.type == "checkbox") {
		if (fld.className.indexOf('RELATEDFIELDSET') != -1) {
			this.setRelatedFieldset(fld);
		}
		if (fld.className.indexOf('POPULATE') != -1) {
			this.setOptions(fld);
		}
		if (fld.className.indexOf('TOGGLEOPTIONS') != -1) {
			this.selectedType(fld);
		}
		if (fld.className.indexOf('SETHIDDENFIELDS') != -1) {
			this.setDealerTypeHiddenFields(fld);
		}
	}
}

safHandler.prototype.setLoad = function(obj) {
	var fld = obj;
	if (fld.className.indexOf('RELATEDFIELDSET') != -1) {
		this.setRelatedFieldset(fld);
	}
}

safHandler.prototype.setRelatedFieldset = function(obj) {
	var fld = obj;
	var relatedFieldset = document.getElementById(fld.id + "-fieldset");

	if (fld.form[fld.name].length > 0) {
		for (var i = fld.form[fld.name].length; i != 0; i--) {
			relatedFieldset = document.getElementById(fld.form[fld.name][i-1].id + "-fieldset");
			if (relatedFieldset != null) {
			/** Matt to look at it **/
				relatedFieldset.className = (fld.form[fld.name][i-1].checked) ? "db" : "dn"; 
			}
		}
	} else {
		if (relatedFieldset != null) {
			relatedFieldset.className = (fld.checked) ? "db" : "dn"; 
		}
	}
}

safHandler.prototype.setOptions = function(obj) {
	var fld = obj;
	var rePopulate = /POPULATE-(\S+)/.exec(fld.className);
	var select;
	try{
		select = document.getElementById(rePopulate[1]);
	}
	catch(e){
	}	
	//get new value from radio button year group
	modelYear = (fld.id.indexOf("yearselect") != -1) ? fld.value : modelYear;
	//get new value from model option
//	modelName = (fld.id == "modelselect" && fld.value != "") ? fld.options[fld.options.selectedIndex].text : modelName;
//	subModelId = (fld.id == "submodelselect" && fld.value != "") ? fld.options[fld.options.selectedIndex].value : "";
	var model = document.getElementById("modelselect");
	var subModel = document.getElementById("submodelselect");
	if(model){
		modelName = model.options[model.options.selectedIndex].text;
		if (window.location.href.indexOf("/byo") > -1){
			if (document.getElementById("model"))
				document.getElementById("model").value = modelName;
		}
		 
	}	
	if(subModel){
		subModelId = subModel.options[subModel.options.selectedIndex].value;
		if (window.location.href.indexOf("/byo") > -1){
			if (document.getElementById("subModel") && (subModel.options[subModel.options.selectedIndex].text != "Select a Style"))
				document.getElementById("subModel").value = subModel.options[subModel.options.selectedIndex].text;
		}
	}
	if (fld.id.indexOf("yearselect") != -1) { 
		setModel();
	} else if (fld.id == "modelselect") {
		setSubModel();
	} else if (fld.id == "submodelselect") {
		setTrim();
	}
}

safHandler.prototype.setHiddenField = function(objId) {
	var fld = document.getElementById(objId);
	var reMask = /MASK(\S+)/.exec(fld.className);
	var phoneType = "day";
	if (fld.id == "phone") {
		if (document.getElementById('timeofday2') && document.getElementById('timeofday2').checked && document.getElementById('eveningphone0') !=null) {
			 phoneType = "evening";
		}
		for(var i=0; i<4; i++){
			document.getElementById('dayphone'+i).value = "";
			if(document.getElementById('eveningphone'+i))
				document.getElementById('eveningphone'+i).value = "";
		}
		if (typeof SAFRULE._MASK[reMask[1]].exec(fld.value)[4] == "undefined" || SAFRULE._MASK[reMask[1]].exec(fld.value)[4] == "") {
			document.getElementById(phoneType + 'phone0').value = SAFRULE._MASK[reMask[1]].exec(fld.value)[1]; 
			document.getElementById(phoneType + 'phone1').value = SAFRULE._MASK[reMask[1]].exec(fld.value)[2];
			document.getElementById(phoneType + 'phone2').value = SAFRULE._MASK[reMask[1]].exec(fld.value)[3];
		} else {
			document.getElementById(phoneType + 'phone0').value = SAFRULE._MASK[reMask[1]].exec(fld.value)[4];
			document.getElementById(phoneType + 'phone1').value = SAFRULE._MASK[reMask[1]].exec(fld.value)[5];
			document.getElementById(phoneType + 'phone2').value = SAFRULE._MASK[reMask[1]].exec(fld.value)[6];
			document.getElementById(phoneType + 'phone3').value = SAFRULE._MASK[reMask[1]].exec(fld.value)[7];
		}
	}
}

safHandler.prototype.setDealerTypeHiddenFields = function(objId) {
	var fld = objId;
	if(fld.value == 'M'){
	/*	document.getElementById('agreementTypeCode').value = "SLS";
		document.getElementById('namePlateCode').value = "001"; */
		fld.form['agreementTypeCode'].value = "SLS";
		fld.form['namePlateCode'].value = "001";
		fld.form['programCode'].value = "";
		fld.form['dealerTypeCode'].value = "R";
	}else if(fld.value == 'L'){
	/*	document.getElementById('agreementTypeCode').value = "SLS";
		document.getElementById('namePlateCode').value = "001";
		document.getElementById('programCode').value = "csv"; */
		fld.form['agreementTypeCode'].value = "SLS";
		fld.form['namePlateCode'].value = "001";
		fld.form['programCode'].value = "csv";
		fld.form['dealerTypeCode'].value = "L";
	}else{
		fld.form['agreementTypeCode'].value = "";
		fld.form['namePlateCode'].value = "";
		fld.form['programCode'].value = "";
		fld.form['dealerTypeCode'].value = "R";
	}
}

var vehicleCount = 2;
function addVehicle(actionButton) {
	if (document.getElementById) {
		var vehicleContainer = document.getElementById("vehicle" + vehicleCount + "Container");
		if (vehicleContainer.className.indexOf("dn") != -1) {
			vehicleContainer.className = vehicleContainer.className.replace("dn","db");
			vehicleCount++
		}
		if (vehicleCount > 4) {
			actionButton.className = "dn";
		}
	}
}