/**
 * This js file is used to load the vehicles in the drop downs.
 */
//GLOBAL VARS
var nodeTags = [ "vehicledata", "brand", "modelyear", "modelfamily", "model" ];
var	attributeTags = [ "id", "desc", "default", "msrp", "imageURL" ];
var serverSideZipValidationStatus = true;
var isPlusProgramAvailable = true;
var cond = false;
var isTopsWorking = true;
var isLeaseProgramAvailable = true;
var xmlZipCode = null;


function NextNodeIndex( p_name ) {
	for ( var count = 0; count < ( nodeTags.length ) - 1; count++ ) {
		if ( p_name == nodeTags[ count ] ) {
			return ( count + 1 );
		}
	}
	return -1;
}

/**
 * Structure to manage Vehicle Tree
 */
function VehicleTree() {
	this.name = null;
	this.code = null;
	this.desc = null;
	this.seq = null;
	this.def = null;
	this.parent = null;
	this.children = new Array();

	this.populateNode = function( p_code, p_desc, p_seq, p_parent, p_nodeName ) {
	this.name = p_nodeName;
	this.code = p_code
	this.desc = p_desc
	this.seq = p_seq
	this.parent = p_parent
	this.def = false
	if ( p_nodeName != nodeTags[ ( nodeTags.length ) - 1 ] ) {
		this.children = new Array();
		}
	};

	this.populateRoot = function( nodeTagsArr, attributeTagsArr ) {
		this.children = new Array();
		this.name = nodeTagsArr[ 0 ];
	};

	this.printData = function() {
		 var str = "{" + this.name + ":[\n";
		 var tmp = this.printChildren( this.children );
		 str = str + tmp + "]}";
		 return str;
	 };

	this.printChildren = function( child ) {
		var str = "";
		for ( var count = 0; count < child.length; count++ ) {
			str = str + "{" + child[ count ].name + ": {\n" + " code : " + child[ count ].code + ", desc : " + child[ count ].desc + ", def : " + child[ count ].def + ", ";
			
			if ( child[ count ].name == nodeTags[ ( nodeTags.length ) - 1 ] ) {
				str = str + " msrp : " + child[ count ].msrp + "}" + " imageURL :" + child[ count ].imageURL + "}\n";
				continue;
			}
			else {
				str = str + "\n";
				var val = this.printChildren( child[ count ].children, str );
				str = str + val + "}\n";
			}
		}
		return str;
	};

}

var VehicleData = {
	tree:new VehicleTree(),
	thisFranchise:null,
	thisYear:null,
	thisModelFamily:null,
	thisBodyModel:null,
	thisSelectedFranchiseCode:null,
	thisSelectedYearCode:null,
	thisSelectedZipCode:null,
	thisMsrp:null,
	thisImageURL:null,
	thisRequestFranchiseCode:null,
	thisRequestFranchiseDesc:null,
	thisSelectedTrimLevel:null,
	thisSelectedFamilyCode:null,
	thisSelectedTrimLevelCode:null,

	getZipCode:function( nodeName, xmlDocument ) {
		var list = xmlDocument.getElementsByTagName( nodeName );
		var zipCode = list[ 0 ].getAttribute( "zip" );
		if ( zipCode != null ) {
		  xmlZipCode = zipCode;
		}
	},

	buildAttributes:function( array, nodeName, parent, xmlDocument ) {
	var list = xmlDocument.getElementsByTagName( nodeName );
	for ( var count = 0; count < list.length; count++ ) {
		array[ count ] = new VehicleTree();
		array[ count ].populateNode( list[ count ].getAttribute( attributeTags[ 0 ] ),
		list[ count ].getAttribute( attributeTags[ 1 ] ), count, parent, nodeName );
		if ( list[ count ].getAttribute( attributeTags[ 2 ] ) ) {
			array[ count ].def = true
		}
		if ( nodeName == nodeTags[ ( nodeTags.length ) - 1 ] ) {
			array[ count ].desc = list[ count ].firstChild.data;
			array[ count ].msrp = list[ count ].getAttribute( attributeTags[ 3 ] );
			array[ count ].imageURL = list[ count ].getAttribute( attributeTags[ 4 ] );
			continue;
		}
		else {
			var index = NextNodeIndex( nodeName );
			if ( index == -1 ) {
				alert ( "ERROR" );
				return ;
			}
			this.buildAttributes( array[ count ].children, nodeTags[ index ], array[ count ], list[ count ] );
		}
	}
	},
	getNodeValue:function( obj, tag ) {
	  return obj.getElementsByTagName( tag ) [ 0 ].firstChild.nodeValue;
	},


	fillFranchiseList:function( form ) {
		i = 1;
		form.FranchiseCode.options.length = 1;
		form.FranchiseCode.options.selectedIndex = 0;
		VehicleData.thisFranchise = null;
		var fC = VehicleData.tree.children;
		form.FranchiseCode.options[ 0 ] = new Option( "Select Make", "-1" );
		for ( fIndex in fC ) {
		form.FranchiseCode.options[ i ] = new Option( fC[ fIndex ].desc, fC[ fIndex ].code );
		if ( VehicleData.thisSelectedFranchiseCode != null &&
		VehicleData.thisSelectedFranchiseCode == i ) {
			if ( form.zipCode != null ) {
			form.zipCode.value = VehicleData.thisSelectedZipCode;
			}
			form.FranchiseCode.selectedIndex = i;
			VehicleData.thisFranchise = fC[ fIndex ];
			VehicleData.fillYearList( form, VehicleData.thisFranchise, null );
		} /*else if (VehicleData.thisSelectedFranchiseCode==null) {
			//form.FranchiseCode.selectedIndex = i;
			//VehicleData.thisSelectedFranchiseCode=form.FranchiseCode.selectedIndex;
			//VehicleData.thisFranchise = fC[fIndex];
			VehicleData.thisSelectedFranchiseCode=i;
			VehicleData.thisFranchise = fC[fIndex];
			//VehicleData.fillYearList(form, fC[fIndex],null);
		}*/
		else if (fC[fIndex].def == true && VehicleData.thisSelectedFranchiseCode==null) {
			form.FranchiseCode.selectedIndex = i;
			VehicleData.thisSelectedFranchiseCode=form.FranchiseCode.selectedIndex;
			VehicleData.thisFranchise = fC[fIndex];
			VehicleData.fillYearList(form, VehicleData.thisFranchise,null);			
		}
		i++; 
		}
		//added by T9750BC to avoid SMART value in the Make dropdown - removes the last value from the options
		
		//alert(form.FranchiseCode.length);
		//alert(form.FranchiseCode.options[0].text);
		//alert(form.FranchiseCode.options[1].text);
		//alert(form.FranchiseCode.options[2].text);
		if(form.FranchiseCode.options[2].text == 'SMART'){
			
			form.FranchiseCode.options[form.FranchiseCode.length -1] = null;
		}else if(form.FranchiseCode.options[1].text == 'SMART'){
		   
		 form.FranchiseCode.options[form.FranchiseCode.length -1] = null;
		}
		form.FranchiseCode.options.selectedIndex = 1;
		this.changeFranchise(form, null);
	},

	
		changeFranchise:function(form, selectedYearCode) {
		selectedYearCode = null;
		VehicleData.thisSelectedYearCode = null;
		VehicleData.thisSelectedFranchiseCode = form.FranchiseCode.selectedIndex;
		var brand = form.FranchiseCode.options[ form.FranchiseCode.selectedIndex ].text;
		if ( brand == 'SMART' ) {
			parent.nestFRAME.document.getElementById( "rowClass" ).style.display = 'none';
			if ( selectedYearCode == null || selectedYearCode == 'undefined' ) {
				VehicleData.resetYearValues( form, true );
				/*VehicleData.resetClassValues(form, true);
				VehicleData.resetBodyValues(form);*/
			}
		} else {
			parent.nestFRAME.document.getElementById( "rowClass" ).style.display = '';
			VehicleData.resetClassValues( form, true );
		}
		if ( form.FranchiseCode.options.selectedIndex > 0 ) {
			VehicleData.thisFranchise = VehicleData.tree.children[ form.FranchiseCode.options.selectedIndex - 1 ];
			/*var d = new Date();
			selectedYearCode = d.getFullYear();*/
			VehicleData.fillYearList( form, VehicleData.thisFranchise, selectedYearCode,true );
		}
		else {
			VehicleData.resetFranchiseValues( form );
		}
	},

	resetFranchiseValues:function( form ) {
		form.FranchiseCode.options.selectedIndex = 0;
		VehicleData.thisSelectedFranchiseCode = null;
		VehicleData.resetYearValues( form, true );
		VehicleData.resetClassValues( form, true );
		VehicleData.resetBodyValues( form );
	},

	resetYearValues:function( form, clearAll ) {
		if ( clearAll ) {
			form.YearCode.options.length = 1;
			form.YearCode.options[ 0 ] = new Option( "Select Year", "" );
		}
		VehicleData.thisSelectedYearCode = null;
		form.YearCode.options.selectedIndex = 0;
		VehicleData.resetClassValues( form, true );
		VehicleData.resetBodyValues( form );
	},

	resetClassValues:function( form, clearAll ) {
		if ( clearAll ) {
			form.ModelFamilyCode.options.length = 1;
			form.ModelFamilyCode.options[ 0 ] = new Option( "Select Class", "" );
		}
		form.ModelFamilyCode.options.selectedIndex = 0;
		VehicleData.thisSelectedFamilyCode = null;
		VehicleData.resetBodyValues( form );
	},

	resetBodyValues:function( form ) {
		form.VehicleCode.options.length = 1;
		VehicleData.thisSelectedTrimLevelCode = null;
		form.VehicleCode.options[ 0 ] = new Option( "Select Body Style", "" );
		form.VehicleCode.options.selectedIndex = 0;
	},

	fillYearList:function( form, p_franchise, selectedYearCode, defaultYear) {
	j = 1;
	form.YearCode.options.length = 1;
	form.YearCode.options.selectedIndex = 0;
	form.YearCode.options[ 0 ] = new Option( "Select Year", "" );
	form.YearCode.options.selectedIndex = 0;
	VehicleData.thisYear = null;
	var brand = form.FranchiseCode.options[ form.FranchiseCode.selectedIndex ].text;
	for ( yIndex in p_franchise.children ) {
	theYear = p_franchise.children[ yIndex ];
	form.YearCode.options[ j ] = new Option( theYear.desc, theYear.code );
	if ( ( selectedYearCode != null ) && ( theYear.code == selectedYearCode ) ) {
		VehicleData.thisYear = p_franchise.children[ yIndex ];
		form.YearCode.options.selectedIndex = j-1;
		if ( brand == 'SMART' ) {
			VehicleData.thisModelFamily = VehicleData.thisYear.children[ 0 ];
			VehicleData.fillBodyModelList( form, VehicleData.thisModelFamily );
		} else {
		VehicleData.fillModelFamilyList( form, VehicleData.thisYear )
		}
	} else {
		if (VehicleData.thisSelectedYearCode != null && VehicleData.thisSelectedYearCode == j ) {
			VehicleData.thisSelectedYearCode = j;
			VehicleData.thisYear = p_franchise.children[ yIndex ];
			form.YearCode.options.selectedIndex = j-1;
			if ( brand == 'SMART' ) {
				VehicleData.thisModelFamily = VehicleData.thisYear.children[ 0 ];
				VehicleData.fillBodyModelList( form, VehicleData.thisModelFamily );
			}
		else {
			VehicleData.fillModelFamilyList( form, VehicleData.thisYear );
		}
		} 
		if (theYear.def == true && VehicleData.thisSelectedYearCode==null && brand != 'SMART') {
			 VehicleData.thisSelectedYearCode=j;
			 VehicleData.thisYear = p_franchise.children[yIndex];
			 form.YearCode.selectedIndex = j;
			 VehicleData.fillModelFamilyList(form, VehicleData.thisYear);
		}else if ( theYear.def == true && VehicleData.thisSelectedYearCode == null && brand == 'SMART' ) {
			 VehicleData.thisSelectedYearCode=j;
 			 form.YearCode.selectedIndex = j;
			VehicleData.thisModelFamily = p_franchise.children[ 0 ].children[ 0 ];
			form.ModelFamilyCode.selectedIndex = VehicleData.thisModelFamily;
			VehicleData.fillBodyModelList( form, VehicleData.thisModelFamily );
		
		}
		}
		j++;
	}
	if(defaultYear != 'undefined' && defaultYear == true){
		form.YearCode.options.selectedIndex = 1;
		VehicleData.changeYear(form);
	}
	/*if ( VehicleData.thisSelectedYearCode == null && brand == 'SMART' ) {
		VehicleData.thisModelFamily = p_franchise.children[ 0 ];
		VehicleData.fillBodyModelList( form, VehicleData.thisModelFamily );
		}*/
	},

	changeYear:function( form ) {
		VehicleData.thisSelectedYearCode = form.YearCode.options.selectedIndex;
		if ( form.YearCode.options.selectedIndex > 0 ) {
			VehicleData.thisYear = VehicleData.thisFranchise.children[ form.YearCode.options.selectedIndex - 1 ]
			VehicleData.fillModelFamilyList( form, VehicleData.thisYear );
			var brand = form.FranchiseCode.options[ form.FranchiseCode.selectedIndex ].text;
			if ( brand == 'SMART' ) {
				VehicleData.thisModelFamily = VehicleData.thisYear.children[ 0 ];
				VehicleData.fillBodyModelList( form, VehicleData.thisModelFamily );
			} else {
				VehicleData.resetBodyValues( form, false );
			}
		}
		else {
			VehicleData.resetYearValues( form, false );
			if ( brand == 'SMART' ) {
				VehicleData.resetBodyValues( form, false );
			}
		}
	},

	fillModelFamilyList:function( form, p_year ) {
		k = 1;
		form.ModelFamilyCode.options.length = 1;
		form.ModelFamilyCode.options.selectedIndex = 0;
		VehicleData.thisModelFamily = null;
		var defaultPresent = false;
		var mFC = p_year.children;
		form.ModelFamilyCode.options[ 0 ] = new Option( "Select Class", "" );
		form.ModelFamilyCode.options.selectedIndex = 0;
		for ( mIndex in mFC ) {
			theModelFamily = p_year.children[ mIndex ];
			form.ModelFamilyCode.options[ k ] = new Option( theModelFamily.desc, theModelFamily.code );
			if ( VehicleData.thisSelectedFamilyCode != null &&
				VehicleData.thisSelectedFamilyCode == k ) {
				form.ModelFamilyCode.options.selectedIndex = k-1;
				VehicleData.thisModelFamily = mFC[ mIndex ];
				VehicleData.fillBodyModelList( form, VehicleData.thisModelFamily );
			} else if (mFC[mIndex].def == true && VehicleData.thisSelectedFamilyCode==null) {
			form.ModelFamilyCode.selectedIndex = k;
			VehicleData.thisSelectedFamilyCode=form.ModelFamilyCode.selectedIndex;
			VehicleData.thisModelFamily = mFC[mIndex];
			VehicleData.fillBodyModelList(form, VehicleData.thisModelFamily);
			}

			k++;
		}

	},

	changeModelFamily:function( form ) {
		VehicleData.thisSelectedFamilyCode = form.ModelFamilyCode.options.selectedIndex;
		if ( form.ModelFamilyCode.options.selectedIndex > 0 ) {
			VehicleData.thisModelFamily = VehicleData.thisYear.children[ form.ModelFamilyCode.options.selectedIndex - 1 ];
			VehicleData.fillBodyModelList( form, VehicleData.thisModelFamily )
		}
		else {
			VehicleData.resetClassValues( form, false );
		}
	},

	setMSRPValue:function( form ) {
		//VehicleData.thisMsrp = VehicleData.thisYear.children[form.ModelFamilyCode.selectedIndex]
		if ( form.VehicleCode.options.selectedIndex > 0 ) {
			//VehicleData.thisSelectedTrimLevelCode = form.VehicleCode.options.selectedIndex;
			VehicleData.thisSelectedTrimLevelCode=form.VehicleCode[form.VehicleCode.options.selectedIndex].value;
			var selectedBodyModelCode = form.VehicleCode[ form.VehicleCode.selectedIndex ].value;
			//Added
			var selectedBodyModelDesc = form.VehicleCode[ form.VehicleCode.selectedIndex ].text;
			var index =  selectedBodyModelDesc.indexOf(" [Vehicle Price $");
			if(index>0) {
				selectedBodyModelDesc = selectedBodyModelDesc.substring(0, index);
			}
			var p_modelFamily = VehicleData.thisModelFamily;
			for ( bIndex in p_modelFamily.children ) {
				theBodyModel = p_modelFamily.children[ bIndex ]
				//form.VehicleCode.options[l] = new Option(theBodyModel.desc, theBodyModel.code)
				//alert(selectedBodyModelDesc+":"+selectedBodyModelCode);
				if ( theBodyModel.desc == selectedBodyModelDesc && theBodyModel.code == selectedBodyModelCode ) {
					VehicleData.thisMsrp = theBodyModel.msrp;
					VehicleData.thisImageURL = theBodyModel.imageURL;
				}
				l++
			}
		}
	},

	setImageURL:function( franchiseCode, yearCode, modelFamilyCode, modelFamilyDesc, selectedBodyModelDesc, selectedBodyModelCode ) {
		var fC = VehicleData.tree.children;
		var p_modelFamily = null;
		for ( fIndex in fC ) {
			if ( franchiseCode == fC[ fIndex ].code ) {
				var YC = fC[ fIndex ].children;
				for ( yIndex in YC ) {
					if ( yearCode == YC[ yIndex ].code ) {
						var MC = YC[ yIndex ].children;
						if(modelFamilyCode=="")
						{
							p_modelFamily=YC[ yIndex ].children[0];
						}else{
						for ( mIndex in MC ) {
							if ( modelFamilyCode == MC[ mIndex ].code && modelFamilyDesc == MC[ mIndex ].desc ) {
								p_modelFamily = MC[ mIndex ];
								VehicleData.thisSelectedFamilyCode = mIndex;
								break;
							}
						}
						}
					}
				}
			}
		}
		for ( bIndex in p_modelFamily.children ) {
		theBodyModel = p_modelFamily.children[ bIndex ];
		if ( theBodyModel.code == selectedBodyModelCode ) {
		VehicleData.thisImageURL = theBodyModel.imageURL;
		}
		}
	},

	fillBodyModelList:function( form, p_modelFamily ) {
		l = 1;
		form.VehicleCode.options.length = 1;
		form.VehicleCode.options.selectedIndex = 0;
		VehicleData.thisBodyModel = null;
		var bMC = p_modelFamily.children;
		form.VehicleCode.options[ 0 ] = new Option( "Select Body Style", "" );
		form.VehicleCode.options.selectedIndex = 0;
		for ( bIndex in bMC ) {
			theBodyModel = bMC[ bIndex ];
			//Added
			theBodyModeldesc=theBodyModel.desc+" [Vehicle Price $"+formatCurrencyWithoutDollar(theBodyModel.msrp)+"]";
			//---------
			form.VehicleCode.options[ l ] = new Option( theBodyModeldesc, theBodyModel.code );
			//----------
			if ( VehicleData.thisSelectedTrimLevelCode != null && VehicleData.thisSelectedTrimLevelCode == theBodyModel.code ) {
				form.VehicleCode.options.selectedIndex = l-1;
				VehicleData.thisBodyModel = bMC[ bIndex ];
				VehicleData.thisMsrp = VehicleData.thisBodyModel.msrp;
				VehicleData.thisImageURL = VehicleData.thisBodyModel.imageURL;
			} else if (bMC[bIndex].def == true && VehicleData.thisSelectedTrimLevelCode==null) {
				VehicleData.thisBodyModel = bMC[bIndex];
				form.VehicleCode.selectedIndex = l;
				VehicleData.thisMsrp = VehicleData.thisBodyModel.msrp;
				VehicleData.thisImageURL = VehicleData.thisBodyModel.imageURL;
				}

			l++;
			}
		}
	};

function populateTree( xmlDocument, form ) {
	VehicleData.tree.populateRoot( nodeTags, attributeTags );
	VehicleData.getZipCode( nodeTags[ 0 ], xmlDocument );
	VehicleData.buildAttributes( VehicleData.tree.children, nodeTags[ 1 ], VehicleData.tree, xmlDocument );
	VehicleData.fillFranchiseList( form );
	var brand = form.FranchiseCode.options[ form.FranchiseCode.selectedIndex ].text;
	if ( brand == 'SMART' ) {
		parent.nestFRAME.document.getElementById( "rowClass" ).style.display = 'none';
		cond = true;
	}
	else {
		parent.nestFRAME.document.getElementById( "rowClass" ).style.display = '';
	}
}

function populateTreeOnly( xmlDocument ) {
	//alert(" First xmlDocument"+xmlDocument);
	VehicleData.tree.populateRoot( nodeTags, attributeTags );
	VehicleData.buildAttributes( VehicleData.tree.children, nodeTags[ 1 ], VehicleData.tree, xmlDocument );
}

function validateZipOnServer( xmlDocument ) {
	var validZipNode = xmlDocument.getElementsByTagName( "validZip" );
	if ( validZipNode != null && validZipNode != undefined ) {
		serverSideZipValidationStatus = validZipNode[ 0 ].firstChild.data;
	}
	var plusProgramAvailableNode = xmlDocument.getElementsByTagName( "isPlusProgramAvailable" );
	if ( plusProgramAvailableNode != null && plusProgramAvailableNode != undefined ) {
		isPlusProgramAvailable = plusProgramAvailableNode[ 0 ].firstChild.data;
	}
}
