﻿var vs_visibilityOptions = new Object();
var vs_wsUrl = new Dictionary();
var vs_ovs;
function initiateVehicleSelector(mkddl, yddl, bsddl, mddl, condition, preselect)
{
	vsSelectorVehicle.condition = ((condition && condition.length) ? condition : '3');
	var qs = new QueryString().current;
	vs_ovs = new Object();
	vs_ovs.bodyStyle = (qs.containsKey('bodystyle') ? qs.item('bodystyle') : null);
	vs_ovs.year = (qs.containsKey('year') ? qs.item('year') : null);
	vs_ovs.make = (qs.containsKey('makeid') ? qs.item('makeid') : null);
	vs_ovs.model = (qs.containsKey('model') ? qs.item('model') : (qs.containsKey('smodel') ? qs.item('smodel') : null));
	vs_ovs.noPrice = (qs.containsKey('noprice') ? qs.item('noprice') : null);
	vs_ovs.radius = (qs.containsKey('radius') ? qs.item('radius') : null);
	vs_ovs.vsID = getControlIDFromElement(mkddl);
	if(!restoreState(getControlIDFromElement(mkddl)) && preselect)
	{
		setState(vs_ovs);
	}
}

function restoreState(vsCID)
{
	var result = false;
	var c = readCookie('vsState');
	if(c)
	{
		var vsID = c.split('^')[0];
		var vsPVID;
		if(vsID.indexOf('~') > -1)
		{
			vsPVID = vsID.split('~')[0];
			vsID = vsID.split('~')[1];
		}
		if(tracker_pvid == vsPVID && vsID == vsCID && gO(vsID + '_vsContainer'))
		{
			result = true;
			var oVS;
			eval('oVS = ' + c.split('^')[1]);
			oVS.vsID = vsID;
			oVS.pvID = vsPVID;
			setState(oVS);
		}
	}	
	return result;
}

function setState(oVS)
{
	if(oVS)
	{
		if(oVS.bodyStyle)
		{
			if(typeof showBodyStyleSelector == 'function') showBodyStyleSelector();				
			var bs = gO(oVS.vsID + '_vsBodystyle');
			if(bs)
			{
				ListUtil.setSelectedItem(bs, oVS.bodyStyle, true);
				var yr = gO(oVS.vsID + '_vsYearPosition1');
				if(yr)
				{
					var bsi_id = setInterval(function(){
						if(yr.options && yr.options.length > 1)
						{
							clearInterval(bsi_id);
							setStateFromYear(oVS);
						}
					}, 500);
				}
				else
				{
					var mk = gO(oVS.vsID + '_vsMake');
					if(mk)
					{
						var bsi_id = setInterval(function(){
							if(mk.options && mk.options.length > 1)
							{
								clearInterval(bsi_id);
								setStateFromMake(oVS);
							}
						}, 500);
					}
				}
			}
		}
		else if(oVS.year)
		{
			setStateFromYear(oVS);
		}
		else if(oVS.make)
		{
			setStateFromMake(oVS);
		}
		
		if(oVS.vsID && gO(oVS.vsID + '_vsNoPriceCheck') && typeof oVS.noPrice != 'undefined')
			gO(oVS.vsID + '_vsNoPriceCheck').checked = (oVS.noPrice == 'true');
	}
}

function setStateFromYear(oVS)
{
	var yr = gO(oVS.vsID + '_vsYearPosition1');
	if(yr)
	{
		yr.disabled = false;
		ListUtil.setSelectedItem(yr, oVS.year, true);
	}
	var mk = gO(oVS.vsID + '_vsMake');
	if(mk)
	{
		var yri_id = setInterval(function(){
			if(mk.options && mk.options.length > 1)
			{
				clearInterval(yri_id);
				setStateFromMake(oVS);
			}
		}, 500);
	}
}

function setStateFromMake(oVS)
{
	var mk = gO(oVS.vsID + '_vsMake');
	if(mk)
	{
		ListUtil.setSelectedItem(mk, oVS.make, true);
		var lItem = ListUtil.itemWithValue(mk, oVS.make);
		if(lItem && lItem.text)
			vs_ovs.makeName = lItem.text;
		var md = gO(oVS.vsID + '_vsModel')
		if(md)
		{
			var mki_id = setInterval(function(){
				if(md.options && md.options.length > 1)
				{
					clearInterval(mki_id);
					ListUtil.setSelectedItem(md, oVS.model, true);
				}
			}, 500);
		}
		
		if(oVS.radius)
			ListUtil.setSelectedItem(oVS.vsID + '_vsRadius', oVS.radius, false);
	}
}

function setStateCookie(controlSetID)
{
	var buf = [];
	if(tracker_pvid)
	{
		buf.push(tracker_pvid);
		buf.push('~');
	}
	buf.push(controlSetID);
	buf.push('^{');
	for(var p in vsSelectorVehicle)
	{
		buf.push('\'' + p + '\':');
		buf.push('\'' + vsSelectorVehicle[p] + '\'');
		buf.push(',');
	}
	if(buf[buf.length - 1] == ',')
		buf.splice(buf.length - 1, 1);
	buf.push('}');
	document.cookie = 'vsState=' + encodeURIComponent(buf.join(''));
}

function getControlIDFromElement(element)
{
	var result = '';
	if(element)
	{
		var id;
		if(typeof element == 'object')
		{
			id = element.id;
		}
		else if(typeof element == 'string')
		{
			id = element;
		}
		
		if(id)
		{
			result = id.substring(0, id.lastIndexOf('_'));		
		}
	}
	return result;
}

function getVisOptionsForElement(element)
{
	var result;
	if(vs_visibilityOptions)
		result = vs_visibilityOptions[getControlIDFromElement(element)];
	return result;
}

function getSelectedCondition(vsID)
{
	var result = 0;
	if(vsID)
	{
		if (gO(vsID + '_vsConditionNew') && gO(vsID + '_vsConditionNew').checked) result = 1;
		if (gO(vsID + '_vsConditionUsed') && gO(vsID + '_vsConditionUsed').checked) result = 2;
		if (gO(vsID + '_vsConditionAdvanced') && gO(vsID + '_vsConditionAdvanced').checked) result = 3;
	}
	if(result == 0) result = vsSelectorVehicle.condition;
	return result;
}

function doChangeCondition(condition, mkddl, mddl, yddl)
{
	vsSelectorVehicle.condition = condition;
	
	var req;
	if(mkddl)
	{
		var vsID = getControlIDFromElement(mkddl);
		var vis = getVisOptionsForElement(mkddl);
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetMakesForVisibilityOptions');
			req.parameters.add('visOptions', vis);
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetMakesForCondition');
			req.parameters.add('condition', condition);
		}
	}
	if(req)
	{
		req.addRequestHandler(ListUtil.listLoading, mkddl);
		req.addResponseHandler(writeMakesDDL, mkddl, ListUtil.selectedItemValue(mkddl));
		req.send();
	}
}

function populateYears(yddlID, makeID, modelName, condition)
{
	if(!(condition))
		condition = vsSelectorVehicle.condition;
		
	if(makeID && makeID.length && modelName && modelName.length)
	{
		var vsID = getControlIDFromElement(yddlID);
		var vis = getVisOptionsForElement(yddlID);
		var req;
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelYears');
			req.parameters.add('makeid', makeID);
			req.parameters.add('modelName', modelName);
			req.parameters.add('options', vis);
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelYearsForCondition');
			req.parameters.add('makeid', makeID);
			req.parameters.add('modelName', modelName);
			req.parameters.add('condition', condition);
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, yddlID);
			req.addResponseHandler(writeYearsDDL, yddlID);
			req.send();
		}
	}
	else
	{
		ListUtil.clearList(yddlID);
		ListUtil.insertItem(yddlID, ListUtil.createItem('Select Year', ''), 0);
		if(gO(yddlID)) gO(yddlID).disabled = true;
	}
}

function populateYearsByBodyStyle(bsddlID, yddlID, condition)
{
	if(!(condition))
		condition = vsSelectorVehicle.condition;
	if(bsddlID && bsddlID.length && ListUtil.selectedItemValue(bsddlID))
	{
		var vis = getVisOptionsForElement(yddlID);
		var vsID = getControlIDFromElement(yddlID);
		var bodyStyle = ListUtil.selectedItemValue(bsddlID);
		var req;
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetYearsForBodystyle');
			req.parameters.add('bodyStyle', bodyStyle);
			req.parameters.add('options', vis);
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetYearsForBodystyleAndCondition');
			req.parameters.add('bodyStyle', bodyStyle);
			req.parameters.add('condition', condition);
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, yddlID);
			req.addResponseHandler(writeYearsDDL, yddlID);
			req.send();
		}
	}
	else
	{
		ListUtil.clearList(yddlID);
		ListUtil.insertItem(yddlID, ListUtil.createItem('Select Year', ''), 0);
		if(gO(yddlID)) gO(yddlID).disabled = true;
		clearMakeAndModels(getControlIDFromElement(yddlID) + '_vsMake');
	}
}

function writeYearsDDL(response, oid)
{
	if(response && response.object)
	{
		var year = ListUtil.selectedItemValue(oid);
		if(response.object[0].Year < response.object[response.object.length - 1].Year)
			response.object.reverse();
		ListUtil.populateListFromObjectArray(oid, response.object, 'Year', 'Year');
		ListUtil.insertItem(oid, ListUtil.createItem('Select Year', ''), 0);
		gO(oid).className = 'dd_year';
		if(year && ListUtil.itemWithValue(oid, year))
			ListUtil.setSelectedItem(oid, year, true);
		else
			ListUtil.setSelectedIndex(oid, 0, true);
	}
	else alert('Error! Please try later.');
}

function populateMakesByBodyStyle(bodystyle, mkddlID)
{
	if(bodystyle && bodystyle.length > 0)
	{
		var vis = getVisOptionsForElement(mkddlID);
		var vsID = getControlIDFromElement(mkddlID);
		var req;
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetMakesForBodyStyle');
			req.parameters.add('bodystyle', bodystyle);
			req.parameters.add('options', vis);
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetMakesForBodyStyle');
			req.parameters.add('bodystyle', bodystyle);
			req.parameters.add('condition', vsSelectorVehicle.condition);
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, mkddlID);
			req.addResponseHandler(writeMakesDDL, mkddlID, ListUtil.selectedItemValue(mkddlID));
			req.send();
		}
	}
	else
		clearMakeAndModels(mkddlID);
}

function populateMakesByYear(year, mkddlID)
{
	if(year && year.length == 4)
	{
		var vis = getVisOptionsForElement(mkddlID);
		var vsID = getControlIDFromElement(mkddlID);
		var req;
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetMakesForYearAndVisibility');
			req.parameters.add('year', year);
			req.parameters.add('options', vis);
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetMakesForYear');
			req.parameters.add('year', year);
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, mkddlID);
			req.addResponseHandler(writeMakesDDL, mkddlID, ListUtil.selectedItemValue(mkddlID));
			req.send();
		}
	}
	else
		clearMakeAndModels(mkddlID);
}

function populateMakesByYearAndBodyStyle(year, bodystyle, mkddlID)
{
	if((year && year.length) && (bodystyle && bodystyle.length))
	{
		var vis = getVisOptionsForElement(mkddlID);
		var vsID = getControlIDFromElement(mkddlID);
		var req;
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetMakesForYearBodystyleAndVisibility');
			req.parameters.add('year', year);
			req.parameters.add('bodystyle', unescape(bodystyle));
			req.parameters.add('options', vis);
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetMakesForYearAndBodystyle');
			req.parameters.add('year', year);
			req.parameters.add('bodystyle', unescape(bodystyle));
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, mkddlID);
			req.addResponseHandler(writeMakesDDL, mkddlID, ListUtil.selectedItemValue(mkddlID));
			req.send();
		}
	}
	else
		clearMakeAndModels(mkddlID);
}

function writeMakesDDL(response, mkddlID, make)
{
	if(response && response.object)
	{
		ListUtil.populateListFromObjectArray(mkddlID, response.object, 'Name', 'ID');
		ListUtil.insertItem(mkddlID, ListUtil.createItem('Select Make', ''), 0);
		gO(mkddlID).className = 'dd_make';
		if(make && make.length > 0 && ListUtil.itemWithValue(mkddlID, make))
			ListUtil.setSelectedItem(mkddlID, make, true);
		else
		{
			if(ListUtil.itemWithText(mkddlID,'All Makes') == null)
				ListUtil.setSelectedIndex(mkddlID, 0, true);
			else
				ListUtil.setSelectedIndex(mkddlID, 1, true);
		}
	}
	else
	{
		clearMakeAndModels(mkddlID);
		alert('Error! Please try later.');
	}
}

function clearMakeAndModels(mkddlID)
{
	if(mkddlID)
	{
		ListUtil.clearList(mkddlID);
		ListUtil.insertItem(mkddlID, ListUtil.createItem('Select Make', ''), 0);
		if(gO(mkddlID)) gO(mkddlID).disabled = true;
		ListUtil.clearList(getControlIDFromElement(mkddlID) + '_vsModel');
		ListUtil.insertItem(getControlIDFromElement(mkddlID) + '_vsModel', ListUtil.createItem('Select Model', ''), 0);
		if(gO(getControlIDFromElement(mkddlID) + '_vsModel')) gO(getControlIDFromElement(mkddlID) + '_vsModel').disabled = true;
	}
}

function populateModels(yddlID, changeYear, mddlID, makeID, condition, longnames)
{
	if(condition == null)
		condition = vsSelectorVehicle.condition;
	if(makeID == "")
	{
		ListUtil.clearList(mddlID);
		ListUtil.insertItem(mddlID, ListUtil.createItem('Select Model', ''), 0);
		if(gO(mddlID)) gO(mddlID).disabled = true;
		if(changeYear)
		{
			ListUtil.clearList(yddlID);
			ListUtil.insertItem(yddlID, ListUtil.createItem('Select Year', ''), 0);
			if(gO(yddlID)) gO(yddlID).disabled = true;
		}
	}
	else
	{
		var vis = getVisOptionsForElement(mddlID);
		var vsID = getControlIDFromElement(mddlID);
		var req;
		if(changeYear)
		{
			ListUtil.clearList(yddlID);
			ListUtil.insertItem(yddlID, ListUtil.createItem('Select Year', ''), 0);
			
			if(!isNaN(vis))
			{
				req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForMakeAndVisibility');
				req.parameters.add('makeid', makeID);
				req.parameters.add('options', vis);
				req.parameters.add('longnames', longnames);
			}
			else
			{
				req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForCondition');
				req.parameters.add('makeid', makeID);
				req.parameters.add('condition', condition);
				req.parameters.add('longnames', longnames);
			}
		}
		else
		{
			if(!isNaN(vis))
			{
				req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForMakeYearAndVisibility');
				req.parameters.add('makeid', makeID);
				req.parameters.add('year', ListUtil.selectedItemValue(yddlID));
				req.parameters.add('options', vis);
				req.parameters.add('longnames', longnames);
			}
			else
			{
				req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForMakeAndYear');
				req.parameters.add('makeid', makeID);
				req.parameters.add('year', ListUtil.selectedItemValue(yddlID));
				req.parameters.add('longnames', longnames);
			}
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, mddlID);
			req.addResponseHandler(writeModelsDDL, mddlID, ListUtil.selectedItemValue(mddlID));
			req.send();
		}
	}
}

function populateModelsByMakeAndCondition(mddlID, makeID, condition, longnames)
{
	if(!(condition))
		condition = vsSelectorVehicle.condition;
		
	var vis = getVisOptionsForElement(mddlID);
	var vsID = getControlIDFromElement(mddlID);
	var req;
	if(makeID == "")
	{
		ListUtil.clearList(mddlID);
		ListUtil.insertItem(mddlID, ListUtil.createItem('Select Model', ''), 0);
		if(gO(mddlID)) gO(mddlID).disabled = true;
	}
	else
	{
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForMakeAndVisibility');
			req.parameters.add('makeid', makeID);
			req.parameters.add('options', vis);
			req.parameters.add('longnames', longnames);
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForCondition');
			req.parameters.add('makeid', makeID);
			req.parameters.add('condition', condition);
			req.parameters.add('longnames', longnames);
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, mddlID);
			req.addResponseHandler(writeModelsDDL, mddlID, ListUtil.selectedItemValue(mddlID));
			req.send();
		}
	}
}

function populateModelsByMakeYearAndExtendedBodyStyleName(makeID, yddlID, bsddlID, mddlID, longnames)
{
	if(makeID == "")
	{
		ListUtil.clearList(mddlID);
		ListUtil.insertItem(mddlID, ListUtil.createItem('Select Model', ''), 0);
		if(gO(mddlID)) gO(mddlID).disabled = true;
	}
	else
	{
		var vis = getVisOptionsForElement(mddlID);
		var vsID = getControlIDFromElement(mddlID);
		var req;
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForMakeYearExtendedBodystyleAndVisibility');
			req.parameters.add('makeid', makeID);
			req.parameters.add('year', ListUtil.selectedItemValue(yddlID));
			req.parameters.add('options', vis);
			req.parameters.add('bodystyle', ListUtil.selectedItemValue(bsddlID));
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForMakeYearAndExtendedBodystyle');
			req.parameters.add('makeid', makeID);
			req.parameters.add('year', ListUtil.selectedItemValue(yddlID));
			req.parameters.add('bodystyle', ListUtil.selectedItemValue(bsddlID));
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, mddlID);
			req.addResponseHandler(writeModelsDDL, mddlID, ListUtil.selectedItemValue(mddlID));
			req.send();
		}
	}
}

function populateModelsByMakeAndExtendedBodyStyleName(mddlID, makeID, bsddlID, longnames)
{
	if(makeID == "")
	{
		ListUtil.clearList(mddlID);
		ListUtil.insertItem(mddlID, ListUtil.createItem('Select Model', ''), 0);
		if(gO(mddlID)) gO(mddlID).disabled = true;
	}
	else
	{
		var vis = getVisOptionsForElement(mddlID);
		var vsID = getControlIDFromElement(mddlID);
		var req;
		if(!isNaN(vis))
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForMakeExtendedBodystyleAndVisibility');
			req.parameters.add('makeid', makeID);
			req.parameters.add('options', vis);
			req.parameters.add('bodystyle', ListUtil.selectedItemValue(bsddlID));
			req.parameters.add('showLongModelNames', longnames);
		}
		else
		{
			req = new vx_AjaxRequest(vs_wsUrl.item(vsID), 'GetModelsForMakeAndExtendedBodystyle');
			req.parameters.add('makeid', makeID);
			req.parameters.add('bodystyle', ListUtil.selectedItemValue(bsddlID));
		}
		if(req)
		{
			req.addRequestHandler(ListUtil.listLoading, mddlID);
			req.addResponseHandler(writeModelsDDL, mddlID, ListUtil.selectedItemValue(mddlID));
			req.send();
		}
	}
}


function writeModelsDDL(response, oid, model)
{
	if(response && response.object)
	{
		ListUtil.populateListFromObjectArray(oid, response.object, 'Name', 'Name');
		ListUtil.insertItem(oid, ListUtil.createItem('Select Model', ''), 0);
		gO(oid).className = 'dd_model';
		if(model && model.length > 0 && ListUtil.itemWithValue(oid, model))
			ListUtil.setSelectedItem(oid, model, true);
		else
			ListUtil.setSelectedIndex(oid, 0, true);
	}
	else
	{
		ListUtil.clearList(oid);
		ListUtil.insertItem(ListUtil.createItem('Select Model', ''));
		alert('Error! Please try later.');
	}
}
function Dictionary()
{
	this.keys = [];
	this.values = [];
	this.count = 0;
	
	if(typeof Dictionary.__initialized == 'undefined')
	{
		Dictionary.prototype.isSynchronous = function()
		{
			return (this.keys.length == this.values.length);
		}
	
		Dictionary.prototype.__validate = function()
		{
			if(!this.isSynchronous())
				throw new Error('This Dictionary\'s keys and values are no longer synchronized. The Dictionary is invalid.');
		}
	
		Dictionary.prototype.containsKey = function(key)
		{
			this.__validate();
			return this.keys.contains(key);
		}
		
		Dictionary.prototype.containsValue = function(value)
		{
			this.__validate();
			return this.values.contains(value);
		}
		
		Dictionary.prototype.add = function(key, value)
		{
			this.__validate();
			if(typeof key == 'undefined' || key == null) throw new Error('The key can not be null.');
			if(!this.containsKey(key))
			{
				this.keys.push(key);
				this.values.push(value);
				this.count++;
			}
			else
				throw new Error('Dictionary already contains this key: ' + key);
		}
		
		Dictionary.prototype.update = function(key, value)
		{
			this.__validate();
			if(typeof key == 'undefined' || key == null) throw new Error('The key can not be null.');
			if(this.containsKey(key))
			{
				var index = this.keys.indexOf(key);
				this.values[index] = value;
			}
			else
				this.add(key, value);
		}
		
		Dictionary.prototype.clear = function()
		{
			delete this.keys;
			delete this.values;
			
			this.count = 0;
			this.keys = [];
			this.values = [];
		}
		
		Dictionary.prototype.remove = function(key)
		{
			this.__validate();
			if(typeof key == 'undefined' || key == null) throw new Error('The key can not be null.');
			if(this.containsKey(key))
			{
				var index = this.keys.indexOf(key);
				this.keys.splice(index, 1);
				this.values.splice(index, 1);
				this.count = this.keys.length;
			}
			else
				throw new Error('This Dictionary does not contain the key: ' + key + '.  The key cannot be removed.');
		}
		
		Dictionary.prototype.item = function(key)
		{
			if(this.containsKey(key))
			{
				return this.values[this.keys.indexOf(key)];
			}
			else throw new Error('This Dictionary does not contain the key: ' + key);
		}
		
		Dictionary.prototype.itemAt = function(index)
		{
			if(index < 0 || (this.keys.length - 1) < index) throw new Error('index is outside of the Dictionary bounds');
			return this.values[index];
		}
	
		Dictionary.__initialized = true;
	}
}
