var showMenuTimer, hideMenuTimer, jObject, currentURL, debugConsole, stockType, makeSelector, modelSelector, yearSelector, trimSelector, agedDaysSelector, rooftopSelector, make, model, year, bodyStyle, sort, sortOrder, pageNum, pageSize, vehicleCount, view, special, fuelTypeCode, carfaxOneOwner, searchCriteriaUI, hasVideo, hasImage, exteriorBaseColor, certified, agedDays, rooftop, cityMilage, highwayMilage, trim, lockNewUsed, dealerId, dealerId2, sortMakeDD, sortModelDD, sortYearDD, sortTrimDD, sortBodyStyleDD, layout, advancedsearch, lowPrice, highPrice, odometerHigh, increments, milli, lowestChosen, highestChosen, currentInventory, tempInventory, __usedArray, __newArray, __allArray, currentCars, priceArray, comboBoxes, makesArray, modelsArray, yearsArray, trimsArray, bodyStylesArray, dim, initCompareArray, checkboxArray, checkedArray, offPageArray, bodyStylesArray, stockNumber, path, highMilageSelector, onlyCombo;
var columns = ["img", "vin", "price", "msrp", "invoice", "payment", "y", "mk", "md", "ty", "b", "c", "ic", "tr", "sn", "mc", "cmpg", "hmpg", "ct", "mid", "eng", "trm", "od", "dId", "ebc", "st", "sp", "vurl"];
var bodyStyleIDs = new Array("Coupe","Convertible","Targa","Hatchback","Sedan","Truck","Minivan","SUV","Wagon","Van","Cargo_Van","Passenger_Van");
var jsReady = false;
var swfReady = false; 
var debug = false; 
var prices = false; 
var lowSelected = false; 
var advancedsearchEnabled = false; 
var highSelected = false;
var inventoryClick = false;
var internalPageFlag = null;
var includeSlider = null;
var overlayTracker = null;
var showMenuTimer = null;
var hideMenuTimer = null;
var eventType = null;
var menuTracker = null; 
var itemClicked = null;
var popupWindow = null;
var swfCount = 0; 
var selectedOrder = 0; 
var galMaxH = 0; 
var galElems = null;
var milli = 0;
var quickSearchClients = "|2110|2|44|2720|2928|2265|46|23|2235|3499|2607|3125|2081|2684|2222|2813|2323|";
if (!window.console || !console.firebug) {
	var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
	window.console = {};
	for (var i = 0; i < names.length; ++i) window.console[names[i]] = function() {}
}
/*
function debugThis(text){if(debug)debugConsole.innerHTML+=text+'<br /><br />';}

function debugArray(theArray,whichArray){if(debug){var debugText = whichArray+': ';for(a=0;a<theArray.length;a++)debugText += theArray[a] + ', ';debugThis(debugText);}}
*/

function InvEvent(){
	inventoryClick = true;
	var firstDealerId = dealerId2.value.split(",")[0].replace(/[\[\]]/g, "");
	setCookie( 'inventoryClick', firstDealerId, 1);
}

function pageInit(){
	
	QueryString_parse();
//	if(!debug)debug = QueryString('debug');
	sort = gE('sort');
	sortOrder = gE('sortOrder');
	
	make = gE('make'), model = gE('model'),	year = gE('year'), lowPrice = gE('lowPrice'),	highPrice = gE('highPrice'), odometerHigh = gE('odometerHigh'), bodyStyle = gE('bodyStyle'), pageNum = gE('pageNum'),	pageSize = gE('pageSize'), vehicleCount = gE('vehicleCount'),	view = gE('view'), layout = view.value,	special = gE('special'), fuelTypeCode = gE('fuelTypeCode'), carfaxOneOwner = gE('carfaxOneOwner'), searchCriteriaUI = gE('searchCriteriaUI'), hasVideo = gE('hasVideo'),	hasImage = gE('hasImage'), exteriorBaseColor = gE('exteriorBaseColor'),	certified = gE('certified'), agedDays = gE('agedDays'), rooftop = gE('dealerId'), cityMilage = gE('cityMilage'), highwayMilage = gE('highwayMilage'), trim = gE('trim'), lockNewUsed = gE('lockNewUsed'), dealerId = gE('dealerId'), dealerId2 = gE('dealerId2'), sortMakeDD = gE('sortMakeDD'),	sortModelDD = gE('sortModelDD'),	sortYearDD = gE('sortYearDD'),	sortTrimDD = gE('sortTrimDD'), sortBodyStyleDD = gE('sortBodyStyleDD'), advancedsearch = gE('advancedsearch-header'), stockNumber = gE('stockNumber'), highMilageSelector = gE('highMilageSelector'), stockType = gE('stockType');
	if(QueryString('locknewused')){
		lockNewUsed.value=QueryString('locknewused');
		stockType.value=QueryString('locknewused');
	}
	if(stockType.value!='')gE(stockType.value).checked=true;
	else gE("Both").checked=true;
	makeSelector = (gE('makeSelector'))?gE('makeSelector'):false;
	modelSelector = (gE('modelSelector'))?gE('modelSelector'):false;
	yearSelector = (gE('yearSelector'))?gE('yearSelector'):false;
	trimSelector = (gE('trimSelector'))?gE('trimSelector'):false;
	agedDaysSelector = (gE('agedDaysSelector'))?gE('agedDaysSelector'):false;
	rooftopSelector = (gE('rooftopSelector'))?gE('rooftopSelector'):false;
	increments = 10000;
	lowestChosen = -1;
	onlyCombo = -1;
	highestChosen = 10000000;
	currentInventory = [];
	tempInventory = []; 
	__usedArray = []; 
	__newArray = [];
	__allArray = [];
	currentCars = [];
	priceArray = [];
	menuArray = [];
	makesArray = [];
	modelsArray = [];
	yearsArray = [];
	trimsArray = [];
	initCompareArray = [];
	checkboxArray = [];
	checkedArray = [];
	offPageArray = [];
	bodyStylesArray = [];
	hiddenFields = [stockType,lowPrice,highPrice,odometerHigh,view,sort,sortOrder,pageNum,pageSize,vehicleCount,special,fuelTypeCode,carfaxOneOwner,searchCriteriaUI,hasVideo,hasImage,exteriorBaseColor,certified,agedDays,rooftop,cityMilage,highwayMilage,lockNewUsed,dealerId,stockNumber];
	paymentRangeIDs = [gE('pr0'),gE('pr1'),gE('pr2'),gE('pr3'),gE('pr4'),gE('pr5'),gE('pr6'),gE('pr7')];
	comboBoxes = ["year", "make", "model", "bodyStyle", "trim" ]; //changing order affects sentence structure
	if(sortMakeDD)menuArray.push('sortMakeDD');
	if(sortModelDD)menuArray.push('sortModelDD');
	if(sortYearDD)menuArray.push('sortYearDD');
	if(sortTrimDD)menuArray.push('sortTrimDD');
	if(sortBodyStyleDD)menuArray.push('sortBodyStyleDD');
	seperateNewUsed();
	setMilage();
	setRooftop();
	advancedSearchInit();
	if(gE('compare-view'))initComparison();
	if(gE("view").value == "gallery") resizeGalleryView();
	var filters = getFilters2(["make", "model", "year", "bodyStyle"]);
	var myList = getFilteredList(filters, currentCars);
	
	updatePrice(myList);
	
	//First update body styles according to current config
	//then based on querystring
	hideImpossibleBodyStyles(getUniqueList(myList, "bodyStyle"));

	//keys are converted to lowercase during capture (?)
	if(QueryString('bodystyle') && QueryString('bodystyle') != "") 
		showSelectedBodyStyle(QueryString('bodystyle'), false)
	//enableSearchButton(true);
	//pulled these from the enableSearchButton method which now submits the form
	var search_btn = gE('searchButton');
	search_btn.disabled = false;
	search_btn.setAttribute('disabled', false);
	search_btn.className = "searchButtonEnabled";
	
	/*
	window.onunload = function() {
		var WindowParams = (BrowserDetect['browser']=="Explorer")?'width=740,height=525,scrollbars=yes,resizable=yes,status=no':'width=740,height=470,scrollbars=yes,resizable=yes,status=no';
  		if(!getCookie('dmiDetailsCookie') && popupWindow==null && internalPageFlag == null && inventoryClick == false){
			var firstDealerId = dealerId2.value.split(",")[0].replace(/[\[\]]/g, "");
			var Buzz_Reminder = window.open('/pages/forms/inv/forms-car-finder.jsp?dealerId='+firstDealerId+'&URL='+document.location,'Buzz_Reminder',WindowParams);
			(Buzz_Reminder)?window.focus():Buzz_Reminder=null;
		}
	}*/
	if(gE('headerswf'))(window.addEventListener)?gE('headerswf').setAttribute('onclick', 'InvEvent()'):gE('headerswf').attachEvent('onmousedown', InvEvent);
	if(gE('footerswf'))(window.addEventListener)?gE('footerswf').setAttribute('onclick', 'InvEvent()'):gE('footerswf').attachEvent('onmousedown', InvEvent);
	// if(includeSlider)attachSliderEvents();

	if(quickSearchClients.indexOf("|"+invClientId+"|") > -1 ) {
		document.getElementById('all_prices').style.display='inline';
		document.getElementById('all_bodyStyles').style.display='inline';	
	}
	else {
		document.getElementById('all_prices').style.display='none';
		document.getElementById('all_bodyStyles').style.display='none';
	}
}

function setMilage(){
  if(QueryString('odometerhigh')){
		odometerHigh.value = QueryString('odometerhigh');
		for(var i = 0; i < highMilageSelector.options.length; i++)if (highMilageSelector.options[i].value == odometerHigh.value)highMilageSelector.selectedIndex = i;
	}
}

function setRooftop(){
	if(rooftopSelector){
		if(QueryString('dealerid')){
			rooftop.value = QueryString('dealerid');
			if (rooftop.value.indexOf(',') == -1) {
				for(var i = 0; i < rooftopSelector.options.length; i++) {
					if (rooftopSelector.options[i].value == rooftop.value)
						rooftopSelector.selectedIndex = i;
				}
			}
			else
				rooftop.value = "";
		}
		else rooftop.value = "";
	}
}

function resizeGalleryView() {
	if(galElems != null) {
	var i = 0;
	var gl = galElems.length;
	for (i = 0; i < gl; i++) galMaxH = Math.max(galMaxH, galElems[i].offsetHeight);
	for (i = 0; i < gl; i++) galElems[i].style.height = galMaxH + "px";
	}
}

function advancedSearchInit(){
	if(QueryString('advancedsearch') || hasVideo.value != '' || hasImage.value != '' || certified.value != '' || carfaxOneOwner.value != '' ||agedDays.value != '' || (rooftopSelector && rooftopSelector.selectedIndex > 0) || odometerHigh.value != '' || trim.value != ''){
		gE('advanced-search').onclick();
		advancedsearchEnabled = true;
	}else{
		advancedsearchEnabled = false;
	}
}

function clearAdvancedSearchFields() {
	var vid = gE('hasVideoCheckbox');
	var img = gE('hasImageCheckbox');
	var crt = gE('isCertified');
	var cfx = gE('isCarfaxOneOwnerCheckbox');
	if(vid.checked == true || img.checked == true || crt.checked == true || cfx.checked == true || agedDaysSelector.options.selectedIndex > 1 || (rooftopSelector && rooftopSelector.options.selectedIndex > 1) || trimSelector.options.selectedIndex > 1) enableSearchButton(true);
	hasVideo.value = hasImage.value = certified.value = agedDays.value = trim.value = carfaxOneOwner.value = '';
	trimSelector.options.selectedIndex = 0;
	agedDaysSelector.options.selectedIndex = 1;
	if(rooftopSelector)rooftopSelector.options.selectedIndex = 0;
	vid.checked = img.checked = crt.checked = false;
	return false;
}

function toggleAdvanced(target) {
	if(jsReady){
		var basic = target.getAttribute('basic');
		var advanced = target.getAttribute('advanced');
		var tar = gE('tar');
		var mr = gE('mileagerange');
		var ex = gE('extras');
		if(advancedsearchEnabled != true){
			advancedsearchEnabled = true;
			mr.style.display = ex.style.display = tar.style.display ='block';
			target.innerHTML = basic;
			target.setAttribute('title', basic);
		}else{
			advancedsearchEnabled = false;
			mr.style.display = ex.style.display = tar.style.display = 'none';
			target.innerHTML = advanced;
			target.setAttribute('title', advanced);
			clearAdvancedSearchFields();
		}
		buildSentence();
		return false;
	}
}

function buildMenu(targetArray,hiddenField){
	targetArray.sort();
	if(hiddenField=='year')targetArray.reverse();
	var columns = 1;
	if(targetArray.length > 5)columns = 2;
	if(targetArray.length > 10)columns = 3;
	if(targetArray.length > 15)columns = 4;
	var columnItems=Math.ceil(targetArray.length/columns);
	var ULHTML = '<ul>';
	for(m=0;m<targetArray.length;m++){
		if(m==columnItems*1 || m==columnItems*2 || m==columnItems*3)ULHTML += '</ul><ul>';
		ULHTML += '<li><a href="Javascript:gE(\''+hiddenField+'\').value=\'' + targetArray[m] + '\';appendURL(\''+hiddenField+'\',\'' + targetArray[m] + '\')">' + targetArray[m] + '</a></li>';
	}
	ULHTML += '</ul>';
	return ULHTML;
}

function enableCB() {
	for(var i = 0; i<comboBoxes.length;i++){
		priceArray = [];
		var cb = gE(comboBoxes[i]+'Selector');
		cb.setAttribute('order', -1);
		cb.disabled=false;
		populateComboBox(i,currentCars, true, null, -1);
	}
}

function updateSearch(input){
	var passModelValue = null;
	switch(input.id){
		case "New":
			currentCars = __newArray;
			stockType.value='New';
			enableCB();
			break;
		case "Used":
			currentCars = __usedArray;
			stockType.value='Used';
			enableCB();
			break;
		case "Both":
			currentCars = __allArray;
			stockType.value='';
			enableCB();
		break;
		case "agedDaysSelector":
			agedDays.value=input.options[input.selectedIndex].value;
		break;
		case "hasVideoCheckbox":
			hasVideo.value=(input.checked)?'1':'';
		break;
		case "hasImageCheckbox":
			hasImage.value=(input.checked)?'1':'';
		break;
		case "isCertified":
			certified.value=(input.checked)?'1':'';
		break;
		case "rooftopSelector":
			dealerId.value=input.options[input.selectedIndex].value;
		break;
		case "isCarfaxOneOwnerCheckbox":
			carfaxOneOwner.value=(input.checked)?'1':'';
		break
	}
	
	buildSentence();
	enableSearchButton(true);
}

/****************************************
BODY STYLE
****************************************/

function createNewBodyStyle(bodyStyleID,bodyStyleText) {
	gE('bodyStylesDiv').innerHTML += '<a style="display:block;" class="generic" id="' + bodyStyleID + '" href="#" title="' + bodyStyleText + '" onclick="setBodyStyle(this, \'[' + bodyStyleID + ']\'); return false;"><span>' + bodyStyleText + '</span></a>';
	if(!aHas(bodyStyleIDs, bodyStyleID))bodyStyleIDs.push(bodyStyleID);
}

function hideImpossibleBodyStyles(styleArray){
	if(styleArray.length > 0) {
		for(var j=0; j<bodyStyleIDs.length; j++){
			var className = (aHas(styleArray, bodyStyleIDs[j].split("_").join(" ")))?'enabled':'disabled';
			if(bodyStyle.value && bodyStyle.value.replace(/[\[\]]/g, "") == bodyStyleIDs[j].split("_").join(" ")) className = 'selected';
			gE(bodyStyleIDs[j]).className = className;
		}
	}
}

function setBodyStyle(e, style)
{
	if(e.className == "disabled") return false;
	for(var j=0;j<bodyStyleIDs.length;j++) {
		if(gE(bodyStyleIDs[j])) {
			if(gE(bodyStyleIDs[j]).className == "selected") gE(bodyStyleIDs[j]).className = "enabled";
		}
	}
	e.className = "selected";
	updateCombo(gE('bodyStyleSelector'), style);
	return false;
}

function showSelectedBodyStyle(style) {
	if(style) {
		style = unescape(style).replace(/[\[\]]/g, "").replace(/_/g, " ").toLowerCase();
		var className = "";
		for(var j=0;j<bodyStyleIDs.length;j++) {
			if(style == bodyStyleIDs[j].replace(/_/g, " ").toLowerCase())
			gE(bodyStyleIDs[j]).className = "selected";
		}
	}
}

/****************************************
TRIM
****************************************/
function updateTrimLevels() {
	var trims = getTrimLevels();
	if(trims.length == 1)
	{
		for(var i = 0; i < gE("trimSelector").options.length; i++)
		{
			if(gE("trimSelector").options[i].value == trims[0])
			{
				gE("trimSelector").selectedIndex = i;
				break;
			}
		}
	}
}

function getTrimLevels () {
	var filters = getFilters2(["make", "model", "year", "bodyStyle"], true);
	var result = getFilteredList(filters, currentCars);
	return getUniqueList(result, "trim");
}

/****************************************
PRICE
****************************************/
function updatePrice(vehicles)
{
	var low = 10000000;
	var high = 0;
	for (var j=0; j<vehicles.length; j++) {
		low = Math.min(vehicles[j].low, low);
		high = Math.max(vehicles[j].high, high);
	}
	updatePriceRange(low, high);
}

function setPriceRange(e)
{
	if(e.className == "disabled") return false;
	for(var j=0;j<paymentRangeIDs.length;j++) {
		if(paymentRangeIDs[j]) {
			if(paymentRangeIDs[j].className == "selected") paymentRangeIDs[j].className = "enabled";
		}
	}
	e.className = "selected";
	setTimeout(buildSentence,0);
}
	
	
function updatePriceRange(theLowPrice, theHighPrice) {
	if(theLowPrice != 10000000 && theHighPrice != 0)
	{
		for(var j=0;j<paymentRangeIDs.length;j++) {
			if(paymentRangeIDs[j]) {
				var thisLow = paymentRangeIDs[j].getAttribute('lowPrice');
				var thisHigh = paymentRangeIDs[j].getAttribute('highPrice');
				var className = 'disabled';
				if(theLowPrice < thisHigh && theHighPrice >= thisLow) className = 'enabled';

				if(className == "disabled" && thisLow == lowPrice.value && thisHigh == highPrice.value)
				{
					gE('lowPrice').value="";
					gE('highPrice').value="";
				} else if(thisLow == lowPrice.value && thisHigh == highPrice.value)
				{
					className = 'selected';
				}
				paymentRangeIDs[j].className = className;
			}
		}
	}
	setTimeout(buildSentence,0);
}

function rowOver (element, event, _class, overlayFlag){
	if(jsReady){
		if((overlayType == 'defaultOver' || overlayType == 'thumbOver') && !overlayFlag) startOverlay(element, event);
		element.className = _class;
	}
}

/****************************************
FILTERING
****************************************/

/**
 * Creates a filter object that is used when running queries
 * @param {String} expression a filter expression in the format
 *                 of [$key == value || $key != value]
 */
function Filter(expression)
{
	this.expression = expression;
}

/**
 * Executes the filter against the supplied object
 * @param {Object} obj an object to test with key/value pairs
 */
Filter.prototype.test = function(obj)
{
	var keyPattern = /\$\w+/g;
	var finalExpression = this.expression;
	var keys = this.expression.match(keyPattern);
	for(var i = 0; i < keys.length; i++)
	{
		var rk = keys[i].replace("$","");
		finalExpression = finalExpression.replace(keys[i], "'" + obj[rk] + "'");
	}
	return eval(finalExpression);
}

function getFilters2(ids, useSelectors)
{
	var filters = [];
	var val;
	var field;
	for(var i = 0; i < ids.length; i++)
	{
		if(useSelectors)
		{
			field = ids[i] + "Selector"
		}
		else
		{
			field = ids[i]
		}
		if (ids[i] != "price")
		{
			val = getFieldVal(field)
			
			// if bodyStyle and the hidden field, there might be multiple
			// styles so we need to evaluate the value and loop through
			// and build the filter
			if(ids[i] == "bodyStyle")
			{
				if (val) {
					val = val.replace(/[\[\]]/g, "").split(",");
				}
				var tempFilter = [];
				for(var ii = 0; ii < val.length; ii++)
				{
					// add the filter, after stripping out leading and trailing spaces.
					tempFilter.push("$" + ids[i] + " == '" + val[ii].replace(/^ +/g, "").replace(/ +$/g, "") + "'");
				}
				var filterStr = tempFilter.join(" || ");
				if(filterStr != "")filters.push(new Filter(filterStr));
			}
			else if(ids[i] == "make")
			{
				if (val) {
					val = val.split("^");
				}
				var tempFilter = [];
				for(var ii = 0; ii < val.length; ii++)
				{
					// add the filter, after stripping out leading and trailing spaces.
					tempFilter.push("$" + ids[i] + " == '" + val[ii].replace(/^ +/g, "").replace(/ +$/g, "") + "'");
				}
				var filterStr = tempFilter.join(" || ");
				if(filterStr != "")filters.push(new Filter(filterStr));
			}
			else
			{
				if(val && val != "" && val != "*")
				{
					var filterStr = "$" + ids[i] + " == '" + val + "'";
					filters.push(new Filter(filterStr));
				}
			}
		}
		else
		{
			var priceLow = gE("priceLow").value;
			var priceHigh = gE("priceHigh").value;

			if(priceLow && priceHigh && priceLow != "" && priceHigh != "")
			{
				var priceFilter = new Filter("($priceLow >= " + priceLow + " && $priceLow <= " + priceHigh + ") || ($priceHigh >= " + priceLow + " && $priceHigh <= " + priceHigh + ")");
				filters.push(priceFilter);
			}
		}
	}
	return filters;
}

function getFilteredList(filters, list)
{
	var results = [];
	for(var i = 0; i < list.length; i++)
	{
		var match = true;
		
		for (var ii = 0; ii < filters.length; ii++)
		{
			match = filters[ii].test(list[i]);
			if(!match) break;
		}
		if(match)
		{
			results.push(list[i]);
		}
	}
	return results;
}

function getUniqueList(vehicles, key)
{
	var result = [];
	for(var i = 0; i < vehicles.length; i++)
	{
		if(!checkExistence(result, vehicles[i][key]) && vehicles[i][key] != "undefined" && vehicles[i][key] != "")
		{
			result.push(vehicles[i][key]);
		}
	}
	return result;
}

function rowOut (element, event, _class){if(jsReady && !overlayTracker || overlayTracker != element.id)element.className = _class;}

// helper function for getting field value regardless if it's
// a hidden, text, password, or dropdown. radios and checks not supported...
function getFieldVal(fieldName) {
	var field = gE(fieldName);
	if(field != null) {
		if(field.type == "select-one") {
			return field[field.selectedIndex].value;
		} else {
			return field.value;
		}	
	}
	return null;
}

/****************************************
URLS AND NAVIGATION
****************************************/

// generates an array of key value pairs in the form "key=value"
function generateParamArray(fields, fieldTypes) {
	var params = [];
	var field;
	for(var i = 0; i < fields.length; i++) {
		//querystring
		if(fieldTypes == "querystring") {
			params.push(fields[i] + "=" + escape(QueryString(fields[i])));
		}
		//form
		if(fieldTypes == "form") {
			if(fields[i].indexOf("Selector") != -1)
			{
				var val = getFieldVal(fields[i]) || getFieldVal(fields[i].replace("Selector", ""));
			}
			else
			{
				var val = getFieldVal(fields[i]);
			}
			//if(val != null && val != "") {
			if(val != null && val != "" && val != "All") { 
				params.push(fields[i].replace("Selector", "") + "=" + escape(val));
			}
		}
		//query || form
		if(fieldTypes == "queryOrForm") {
			if(QueryString(fields[i]) != null && QueryString(fields[i]) != "") {
				params.push(fields[i] + "=" + escape(QueryString(fields[i])));
			} else {
				var val = getFieldValue(fields[i]);
				if(val != null && val != "") {
					params.push(fields[i] + "=" + escape(val));
				}
			}
		}
	}
	return params;
}

function appendURL(singleParam,paramValue) {
	if(jsReady) {
		internalPageFlag = true;
		var vehicleSelectors = ["yearSelector", "makeSelector", "modelSelector", "bodyStyleSelector", "trimSelector"];
		var gridView         = ["pageNum", "view", "sort", "sortOrder", "searchCriteriaUI"];
		var vehicleAtributes = [
			"agedDays", "certified", "cityMilage", "exteriorBaseColor",
			"hasImage", "hasVideo", "highPrice", "highwayMilage",
			"lockNewUsed", "lowPrice", "odometerHigh", "special",
			"stockNumber", "stockType","fuelTypeCode","carfaxOneOwner"
		];
		var dealerFields = ["dealerId"];
		var queryFields = ["debug", "clearcache"];
		var dual = 	["pageSize"];

		var output = [];

		if(singleParam != "year" && singleParam != "make" && singleParam != "model" && singleParam != "trim") {
			output = output.concat(generateParamArray(vehicleSelectors, "form"));
			output = output.concat(generateParamArray(vehicleAtributes, "form"));
			output = output.concat(generateParamArray(gridView, "form"));
		} else {
			output.push(singleParam + "=" + escape(paramValue));
		}

		output = output.concat(generateParamArray(dual, "queryOrForm"));
		output = output.concat(generateParamArray(dealerFields, "form"));
		output = output.concat(generateParamArray(queryFields, "query"));

		var currentUrl = window.location.href.replace("#", "").split("?")[0] + "?page=" + QueryString("page");
		var urlAdd = "&" + output.join("&");
		window.location.href = currentUrl + urlAdd;
	}
}

function resetURL() {
	if(jsReady){
		internalPageFlag = true;
		currentURL = window.location.href;
		currentURL = (currentURL.indexOf('#')!=-1)? currentURL.replace('#','') : currentURL;
		currentURL = (currentURL.indexOf('&')!=-1)? currentURL.substring(0,currentURL.indexOf('&')) : currentURL;
		window.location = currentURL;
	}
}

function showMenu(theMenu){
	if(jsReady)showMenuTimer = setTimeout(function(){if(overlayTracker)deleteOverlay();for(var i=0;i<menuArray.length;i++)if(gE(menuArray[i]))gE(menuArray[i]).style.display=(theMenu==menuArray[i])?'block':'none';menuTracker=theMenu;showMenuTimer = null;},250);
}

function hideMenu(theMenu){
	if(jsReady){
		if(showMenuTimer)clearTimeout(showMenuTimer);
	  hideMenuTimer = setTimeout(function(){gE(theMenu).style.display='none';hideMenuTimer = null;menuTracker = null;},250);
	}
}

function dontHideMenu(theMenu){if(theMenu==menuTracker)clearTimeout(hideMenuTimer);}

function enableSearchButton(enabled){
	var search_btn = gE('searchButton');
	search_btn.disabled = !enabled;
	search_btn.setAttribute('disabled', !enabled);
	search_btn.className = (enabled)? "searchButtonEnabled" : "searchButtonDisabled";
	if(enabled) {
		if(quickSearchClients.indexOf("|"+invClientId+"|") > -1 ) {
			pageNum.value="";
			appendURL();
		}
		else {
			(window.addEventListener)? search_btn.addEventListener('click', function(){pageNum.value="";appendURL()},false) : search_btn.attachEvent('onclick', function(){pageNum.value="";appendURL()});
		}
		
	}
	else (window.addEventListener)? search_btn.setAttribute('onclick', 'null') : search_btn.attachEvent('onclick', null);
}

function setPath(_p) {path = _p;}
function getPath(a) {gE('vtdswf').swfControl(path);}

function jsControl() {
	var args_str = "";
	for (var i = 0; i < arguments.length; i++) {
		args_str += arguments[i];
		if (i < arguments.length - 1) args_str += ",";
	}
	gE('vtdswf').swfControl(args_str);
}

function TSA(sortThis, so){
	if(jsReady){
	gE('sortOrder').value = (so != undefined)? so : (gE('sort').value==sortThis && gE('sortOrder').value=='0')?'1':'0';
	if(sortThis)gE('sort').value=sortThis;
	appendURL();
	}
}

function initComparison(URLParameter){
	initCompareArray = QueryString('stocknumber');
	if(QueryString('stocknumber'))stockNumber.value = QueryString('stocknumber');
	if(initCompareArray)initCompareArray = initCompareArray.split('%2C');
	var inputElements=document.getElementsByTagName("input");
	for (var i = 0; i < inputElements.length; i++)if(inputElements[i].name=="compareVehicleCheckbox"){
		checkboxArray.push(inputElements[i]);
		inputElements[i].disabled = '';
		inputElements[i].checked = false;
	}
	if(initCompareArray && initCompareArray.length > 0){
		for(var j=0; j < initCompareArray.length; j++){
			initCompareArray[j] = initCompareArray[j].substring(0,initCompareArray[j].indexOf('^'));
			for(var k=0; k < checkboxArray.length; k++){
				if(initCompareArray[j] == checkboxArray[k].value){
					checkboxArray[k].checked=true;
					checkedArray.push(checkboxArray[k]);
					break;
				}
				if(k == checkboxArray.length - 1 && !aHas(offPageArray, initCompareArray[j]))offPageArray.push(initCompareArray[j]);
			}
		}
	}
	gE('compare-view').className = (initCompareArray && initCompareArray.length > 1)?'compare-view':'compare-viewDisabled';
	if(offPageArray.length + checkedArray.length >=4){
		for(var k=0; k < checkboxArray.length; k++){
			checkboxArray[k].disabled = (checkboxArray[k].checked)?false:true;
		}
	}
}

function compareVehicles(){
	clearTimeout(overlayTimer);
	deleteOverlay();
	checkedArray = [];
	stockNumber.value = '';
	if(checkboxArray && checkboxArray.length > 0){
		for (var i = 0; i < checkboxArray.length; i++)if(checkboxArray[i].checked)checkedArray.push(checkboxArray[i]);
		for (var i = 0; i < checkboxArray.length; i++){	
			checkboxArray[i].disabled = (!checkboxArray[i].checked && checkedArray.length == 4 - offPageArray.length)?true:false;
			if(checkboxArray[i].checked)stockNumber.value += checkboxArray[i].value + "^" + checkboxArray[i].getAttribute('dealerId') + "%2C";
		}
		if(offPageArray && offPageArray.length > 0)for(var m=0; m < offPageArray.length; m++)stockNumber.value += offPageArray[m] + "%2C";
		stockNumber.value = stockNumber.value.substring(0, stockNumber.value.length - 3);
		if((offPageArray.length + checkedArray.length) > 1){
			 gE('compare-view').className = 'compare-view';
		}else{
			gE('compare-view').className = 'compare-viewDisabled';
			stockNumber.value = '';
		}
	}
	setTimeout(function(){itemClicked = null;},1000);
}

if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0)
         ? Math.ceil(from)
         : Math.floor(from);
    if (from < 0)
      from += len;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}

function getFilterList(combos, combo)
{
	var temp = combos.slice();
	temp.splice(combos.indexOf(combo), 1)
	return temp;
}

function seperateNewUsed() {
	var low = 10000000;
	var high = 0;
	var jObject = '';
  if (jsonText) 
    jObject = eval('(' + jsonText + ')');
  
	__newArray=[],__usedArray = [];
	var highestPrice = 0;
	var tempArray = [];
	for (var i in jObject) { // make
		for (var j in jObject[i]) { // model
			for (var k in jObject[i][j]){ // year
				for(var l = 0; l < jObject[i][j][k].length; l+=2) // stockType/bodyStyle/price & trims
				{
					var str = String(jObject[i][j][k][l]);
					var tempArr = str.split(";");
					var tempStr = tempArr[0];
					tempArr[2]=(tempArr[2]=="") ? -1: tempArr[2];
					tempArr[3]=(tempArr[3]=="") ? -1: tempArr[3];
					if(tempArr[3]>highestPrice)highestPrice=tempArr[3];
					var trims = jObject[i][j][k][l+1]||[];
					//If there are no trims defined, add an empty one...
					if(!trims.length) {
						trims.push("");
					}
					for(var m = 0; m < trims.length; m++) // trims
					{
						var obj =  {make:i, model:j, year:k, bodyStyle:tempArr[1], low:tempArr[2], high:Number(tempArr[3]), trim:trims[m]};
						if(obj.make != "" && !aHas(makesArray, obj.make)) makesArray.push(obj.make);
						if(obj.model != "" && !aHas(modelsArray, obj.model)) modelsArray.push(obj.model);
						if(obj.year != "" && !aHas(yearsArray, obj.year)) yearsArray.push(obj.year);
						if(obj.trim != "" && obj.trim != "undefined" && !aHas(trimsArray, obj.trim)) trimsArray.push(obj.trim);
						if(obj.bodyStyle != "" && !aHas(bodyStylesArray, obj.bodyStyle)) bodyStylesArray.push(obj.bodyStyle);
						if (tempStr.toLowerCase() == "used" || tempStr.indexOf("Usag") != -1)__usedArray.push(obj);
						else if (tempStr.toLowerCase() == "new" || tempStr.toLowerCase() == "neuf")__newArray.push(obj);
						low = (obj.low<low) ? obj.low: low;
						high = (obj.high>high) ? obj.high: high;
						__allArray.push(obj);
						if (!checkExistence(tempArray,  obj.bodyStyle) && obj.bodyStyle != "") {
							tempArray.push(obj.bodyStyle);
							var styleName = obj.bodyStyle.split(' ').join('_');
							if(aHas(bodyStyleIDs, styleName))gE(styleName).style.display='block';
							else createNewBodyStyle(styleName, obj.bodyStyle);
						}
					}
				}
			}
		}
	}
	currentCars = (stockType.value=='New')? __newArray : (stockType.value=='Used')? __usedArray :__allArray;

	//Since comboboxes doesn't jive with the flow of the UI, we need
	//a prefered order for preseting order values in the UI when
	//a querystring is present.
	preferedOrder = ["make", "model", "year", "bodyStyle", "trim"];
	for(var i = 0; i < preferedOrder.length; i++)
	{
		if(!QueryString(preferedOrder[i].toLowerCase()) || unescape(QueryString(preferedOrder[i].toLowerCase())).indexOf("^") != -1 || unescape(QueryString(preferedOrder[i].toLowerCase())).indexOf(",") != -1)
		{
			preferedOrder.splice(i, 1);
			i--;
		}
	}

	for(var i = 0; i<comboBoxes.length;i++) {
		priceArray = [];
		var combobox = gE(comboBoxes[i]+'Selector');
		if(combobox != null) {
			
			var tempList = [];
			var filters = getFilters2(getFilterList(comboBoxes, comboBoxes[i]));
			var tempList = getFilteredList(filters, currentCars);
			if(QueryString(comboBoxes[i].toLowerCase()))
			{
				combobox.setAttribute('order', preferedOrder.indexOf(comboBoxes[i]));
			}
			else
			{
				combobox.setAttribute('order', -1);
			}
			combobox.disabled=false;
			populateComboBox(i, tempList, true, null, combobox.getAttribute('order'));
		}
	}

	selectedOrder = preferedOrder.length;

	if(sortMakeDD)sortMakeDD.innerHTML += "" + buildMenu(makesArray,'make') + "";
	if(sortModelDD)sortModelDD.innerHTML += "" + buildMenu(modelsArray,'model') + "";
	if(sortYearDD)sortYearDD.innerHTML += "" + buildMenu(yearsArray,'year') + "";
	if(sortTrimDD)sortTrimDD.innerHTML += "" + buildMenu(trimsArray,'trim') + "";
	if(sortBodyStyleDD) sortBodyStyleDD.innerHTML += "" + buildMenu(bodyStylesArray,'bodyStyle') + "";
	//updatePriceRange(low, high);
	jsReady = true;
}

function getListOfCars(int){
	int = Number(int);
	var carList = currentCars;
	for(i = 0; i<comboBoxes.length;i++){
		var tempCars = [];
		var combobox = gE(comboBoxes[i]+'Selector');
		if((Number(combobox.getAttribute('order'))<int && combobox.getAttribute('order')!=-1) || Number(combobox.getAttribute('order'))==int){
			if (combobox.options[combobox.selectedIndex].value != "All") {
				for (var j = 0; j<carList.length; j++) {
					if (combobox.options[combobox.selectedIndex].text == carList[j][comboBoxes[i]]) {
						tempCars.push(carList[j]);
					}
				}
				carList = tempCars;
			}
		}
	}
	return carList;
}

function updateCombo(obj, selectedValue){
	
	//if(obj.id == "bodyStyleSelector")showSelectedBodyStyle(selectedValue);

	if(obj.getAttribute('order') == -1){
		obj.setAttribute('order',selectedOrder);
		selectedOrder++;
	}

	if(obj.id == "bodyStyleSelector"){
		var newObj = gE(obj.id);
		if (selectedValue == 'All' || selectedValue == '') {
			bodyStyle.value = 'All';
			newObj.selectedIndex = 0;
		}
		for(var i = 0; i<newObj.options.length; i++)
		{
			if (newObj.options[i].value.toLowerCase() == selectedValue.toLowerCase().replace(/[\[\]]/g, "").replace(/_/g, " ")) newObj.selectedIndex = i;
		}
	}

	var currentArray = currentCars;
	var tempCars = [];
	var bool = false;

	tempCars = getListOfCars(obj.getAttribute('order'));
	currentArray = tempCars;
	
	for(i = 0; i<comboBoxes.length;i++) {
		populateComboBox(i,currentArray, false, obj, obj.getAttribute('order'));
	}
		
	//if selected index is 0, reset all sub-combo boxes
	if (obj.selectedIndex == 0) {
		if(obj.id == 'makeSelector' && obj.options[obj.selectedIndex].value == "All")
			model.value = year.value = trim.value = bodyStyle.value = '';
		else if (obj.id == 'modelSelector' && obj.options[obj.selectedIndex].value == "All")
			year.value = trim.value = bodyStyle.value = '';
		else if (obj.id == 'yearSelector' && obj.options[obj.selectedIndex].value == "All")
			trim.value = bodyStyle.value = '';
	}
	
	updatePrice(currentArray);
	enableSearchButton('true');
}

function populateComboBox(cb, carsArray, skipSelected, obj, int) {
	var combobox = gE(comboBoxes[cb]+'Selector');
	if(((combobox != obj && Number(combobox.getAttribute('order')) > Number(int)) || Number(combobox.getAttribute('order'))==-1) || skipSelected){
		var tempArray = [];
		combobox.options.length=1;
		tempArray = [];
		var selectedMake = "";
		var selectedMakeNameArray = [];
		for (i in carsArray) {
			if(selectedMakeNameArray.length == 0) {
				selectedMakeNameArray.push(carsArray[i].make);
			}
			else if (selectedMakeNameArray.indexOf(carsArray[i].make) == -1)
				selectedMakeNameArray.push(carsArray[i].make);
		}
		if (cb == 1 && selectedMakeNameArray.length == 1) {  //cb 1 = makes
			selectedMake = carsArray[carsArray.length - 1];
			carsArray = currentCars;  //always show all makes
		}
		for (var j=0; j<carsArray.length; j++) {
			tempStr = carsArray[j][comboBoxes[cb]];
			if (tempStr != 'undefined' && !checkExistence(tempArray, tempStr) && tempStr!= "") {
				tempArray.push(tempStr);
			}
		}

		tempArray.sort();
		if(cb==0)tempArray.reverse(); //yearSelector
		for(j=0; j<tempArray.length; j++){
			newOpt = combobox.appendChild(document.createElement('option'));
			newOpt.text = tempArray[j];
			newOpt.value = tempArray[j];
			if(cb==1 && selectedMake != null) {
				if (newOpt.text == selectedMake.make) {
					newOpt.setAttribute("selected", "selected");
				} 
			}
			if(comboBoxes[cb] == "bodyStyle"){
				tempArray[j] = tempArray[j];
			}
		}

		if(comboBoxes[cb] == "bodyStyle") {	
			hideImpossibleBodyStyles(tempArray)
		}

		if(combobox.options.length>2) {
			if(QueryString(comboBoxes[cb].toLowerCase())==null){
				//ensure that the correct make is shown if you select a model first
				if (cb != 1) {
					combobox.selectedIndex = 0;
				}
			}else {
				for (var i = 0; i<combobox.options.length; i++){
					if(unescape(QueryString(comboBoxes[cb].toLowerCase()))==combobox.options[i].text && skipSelected){
						combobox.selectedIndex = i;
						combobox.options[i].setAttribute("selected", "selected");
						if((QueryString.keys.length == 2 && QueryString('dealerid') == null) || (QueryString.keys.length==3 && QueryString('dealerid') != null)){
							onlyCombo = cb;
							combobox.setAttribute('order',selectedOrder);
							selectedOrder++;
						}
					}
				}
			}
			combobox.disabled=false;
		} else if(combobox.options.length==2) {
			if(comboBoxes[cb] != "trim") {
				//setting the selectedIndex property in IE6 can fail
				//in certain situtaions. forever hacking around ie6... 
				combobox.options[1].setAttribute("selected", "selected");
			}
			combobox.disabled=false;
		}else{
		  combobox.disabled=true;
		}
	}
}

function checkExistence(ary, prop) {
	var len = ary.length;
	for (var i = 0; i<len; i++) {
		if (ary[i]==prop) return true;
	}
	return false;
}

function resetCombo(){
	selectedOrder=0;
	highSelected = lowSelected = false;
	for(i = 0; i<comboBoxes.length;i++){
		gE(comboBoxes[i]+'Div').innerHTML = "";
		var combobox = gE(comboBoxes[i]+'Selector');
		combobox.innerHTML = "";
		cE(combobox, "Select " + comboBoxes[i], "");
	}
	seperateNewUsed();
}

function buildSentence(){
	var vehicleStr = '';
	var yearStr = null;
	var makeStr = null;
	var modelStr = null;
	var bodyStr = null;
	var priceRangeStr = null;
	var trimStr = null;
	var locationStr = null;
	for(i = 0; i<comboBoxes.length;i++){
		var combobox = gE(comboBoxes[i]+'Selector');
		if(combobox){
			if((combobox.selectedIndex != 0 && combobox.selectedIndex != -1) || combobox.options.length==2){
				if(comboBoxes[i]=="year")yearStr = combobox.options[combobox.selectedIndex].value;
				if(comboBoxes[i]=="make")makeStr = combobox.options[combobox.selectedIndex].value;
				if(comboBoxes[i]=="model")modelStr = combobox.options[combobox.selectedIndex].value;
				if(comboBoxes[i]=="bodyStyle")bodyStr = combobox.options[combobox.selectedIndex].value;
				if(comboBoxes[i]=="trim" && advancedsearchEnabled)trimStr = combobox.options[combobox.selectedIndex].value;
			}
		}
	}
	if(rooftopSelector && rooftopSelector.selectedIndex != 0 && rooftopSelector.selectedIndex != -1)locationStr = rooftopSelector.options[rooftopSelector.selectedIndex].text;
	//gE('searchDesc_all_new_used').innerHTML = (stockType.value=="New")?'New':(stockType.value=="Used")?'Pre-Owned':'all';
	gE('searchDesc_all_new_used').innerHTML = (stockType.value=="New")?labels['stockType']['new']:(stockType.value=="Used")?labels['stockType']['used']:labels['stockType']['both'];
	gE('searchDesc_certified').style.display = (advancedsearchEnabled && certified.value != '')?'inline':'none';
	gE('searchDesc_carfaxOneOwner').style.display = (advancedsearchEnabled && carfaxOneOwner.value != '')?'inline':'none';
	if(yearStr)vehicleStr += "&nbsp;" + yearStr;
	// if(makeStr)vehicleStr += "&nbsp;" + makeStr;
	
	if(makeStr && modelStr!="All" && !modelStr && !trimStr && !bodyStr) {
		if(makeStr.lastIndexOf("s") != makeStr.length - 1) {
			makeStr += "s";
		}
		
		console.log(makeStr.lastIndexOf("ys") + " : " + makeStr.length);
		
		if(makeStr.lastIndexOf("ys") === makeStr.length - 2) {
			makeStr = makeStr.substring(0, makeStr.length - 2);
			makeStr += "ies";
		}
	}
	
	if(makeStr && modelStr!="All" && !modelStr && !trimStr && !bodyStr) {
	//if(makeStr && modelStr!="All") {
		vehicleStr += "&nbsp;" + makeStr;
	}
	// if(modelStr)vehicleStr += "&nbsp;" + modelStr;

	if(modelStr && modelStr!="All" && !trimStr && !bodyStr) {
		if(modelStr.lastIndexOf("s") != modelStr.length - 1) {
			modelStr += "s";
		}
		
		if(modelStr.lastIndexOf("ys") === modelStr.length - 2) {
			modelStr = modelStr.substring(0, modelStr.length - 2);
			modelStr += "ies";
		}
	}
	
	if(modelStr && modelStr!="All") vehicleStr += "&nbsp;" + modelStr;
	
	if(trimStr && trimStr!="All")vehicleStr += "&nbsp;" + trimStr;
	if(trimStr && trimStr!="All" && !bodyStr) vehicleStr += "s";
	if(bodyStr && bodyStr!="All")vehicleStr += "&nbsp;" + bodyStr + "s";
	gE('carListDiv').innerHTML = (vehicleStr != null)?'<b>' + vehicleStr + '</b>':'';
	gE('carListDiv').style.display = (vehicleStr != null)?'inline':'none';
	gE('searchDesc_vehicles').style.display = ((yearStr && makeStr==null) || vehicleStr=='')?'inline':'none';
	gE('searchDesc_location').innerHTML = (advancedsearchEnabled && locationStr)?'&nbsp;at&nbsp;'+locationStr:'';
	gE('searchDesc_between').style.display = (lowPrice.value != '' && lowPrice.value != 0 && highPrice.value != 1000000)?'inline':'none';
	gE('searchDesc_under').style.display = (lowPrice.value != '' && lowPrice.value == 0)?'inline':'none';
	gE('searchDesc_over').style.display = (highPrice.value == 1000000)?'inline':'none';
	gE('searchDesc_range').style.display = (lowPrice.value != '')?'inline':'none';
	gE('searchDesc_range').innerHTML = (lowPrice.value==0)?highPrice.value.replace('000','K'):(highPrice.value==1000000)?lowPrice.value.replace('000','K'):lowPrice.value.replace('000','K') + " & " + highPrice.value.replace('000','K');
	gE('searchDesc_video').style.display = (advancedsearchEnabled && hasVideo.value != '')?'inline':'none';
	gE('searchDesc_and_images').style.display = (advancedsearchEnabled && hasVideo.value != '' && hasImage.value!='')?'inline':'none';
	gE('searchDesc_images').style.display = (advancedsearchEnabled && hasVideo.value == '' && hasImage.value != '')?'inline':'none';
	gE('searchDesc_highmiles').style.display = (advancedsearchEnabled && odometerHigh.value != '')?'inline':'none';
	gE('searchDesc_highmiles_value').innerHTML = (advancedsearchEnabled && odometerHigh.value != '')?odometerHigh.value.replace("00000","00K").replace("0000","0K"):'';
}

function imgErrorHandler(img) {
	if (locale != "fr_CA"){
		img.src = "/plugins/images/noImageAvailable.gif";
	}else{
		img.src = "/plugins/images/noImageAvailable_fr.gif";
	}
}

function compareSimilar(overlayVehicleSN, dealerId){
	
	var inputElements=document.getElementsByTagName("input");
	var checkedItemCount = 0;
	var urlString = '';
	for (var i = 0; i < inputElements.length; i++)if(inputElements[i].name=="similarVehicleCheckbox"){
		if(inputElements[i].checked==true){
			urlString += inputElements[i].value + "^" + inputElements[i].getAttribute('dealerId') + "%2C";
			checkedItemCount++;
		}
	}
	for (var i = 0; i < inputElements.length; i++)if(inputElements[i].name=="similarVehicleCheckbox"){
		inputElements[i].disabled = (!inputElements[i].checked && checkedItemCount == 3)?true:false;
	}
	if(urlString != ''){
		gE('similar-view').className = 'compare-view';
			if(overlayVehicleSN){
				urlString = 'compareInv.do?stockNumber=' + overlayVehicleSN + "^" + dealerId + "%2C" + urlString.substring(0, urlString.length - 3);
				window.location = urlString;
			}
	}else{
		gE('similar-view').className = 'compare-viewDisabled';
	}
}

function clickVehicle(sn, did, y, mk, md){
	if(!itemClicked){
		internalPageFlag=true;
		window.location=did + '/inv/' + y + mk + md + '/' + sn;
	}
}