/*********************************************************************
 * 
 * This JavaScript file contains functions that support the Dealer 
 * Locator web application.  
 * 
 ********************************************************************/

/**********************************************************
 * Global variables
 **********************************************************/
var makesFormSelectId = 'mkid_0';	 //makes select tag id on form page
var makesResultsSelectId = 'mkid_1';	 //makes select tag id on results page
var dealerMakesIdCookie = "dlmkid";
var sessionInfoCookie = "SessionInfo";
var marketList = "<option value=''>Choose a City</option><option value='60606|100000'>National Search</option><option value='35203|30'>Alabama, Birmingham</option><option value='36117|75'>Alabama, Montgomery</option><option value='36006|50'>Alabama, Prattville</option><option value='99501|500'>Alaska, Anchorage</option><option value='85004|50'>Arizona, Phoenix</option><option value='85711|50'>Arizona, Tucson</option><option value='72209|30'>Arkansas, Little Rock</option><option value='72654|20'>Arkansas, Mountain Home</option><option value='93302|45'>California, Bakersfield</option><option value='94598|50'>California, Contra Costa Co.</option><option value='94533|30'>California, Fairfield</option><option value='93786|50'>California, Fresno</option><option value='90053|50'>California, Los Angeles</option><option value='94948|30'>California, Marin</option><option value='95352|30'>California, Modesto</option><option value='92260|30'>California, Palm Springs</option><option value='92501|30'>California, Riverside</option><option value='95814|50'>California, Sacramento</option><option value='93901|30'>California, Salinas</option><option value='92108|30'>California, San Diego</option><option value='94102|30'>California, San Francisco</option><option value='95113|50'>California, San Jose</option><option value='93401|50'>California, San Luis Obispo</option><option value='95401|30'>California, Santa Rosa</option><option value='94595|30'>California, Walnut Creek</option><option value='80202|30'>Colorado, Denver</option><option value='80526|50'>Colorado, Ft. Collins</option><option value='06115|50'>Connecticut, Hartford</option><option value='06360|50'>Connecticut, Norwich</option><option value='20006|30'>D.C., Washington</option><option value='19720|40'>Delaware, Wilmington</option><option value='33304|20'>Fla., Ft. Lauderdale/Palm Beach</option><option value='34205|40'>Florida, Brandenton</option><option value='33901|30'>Florida, Ft. Myers</option><option value='32202|30'>Florida, Jacksonville</option><option value='32940|30'>Florida, Melbourne</option><option value='33132|50'>Florida, Miami</option><option value='32801|50'>Florida, Orlando</option><option value='32504|50'>Florida, Pensacola</option><option value='34236|40'>Florida, Sarasota</option><option value='33067|50'>Florida, South Florida</option><option value='32302|50'>Florida, Tallahassee</option><option value='33602|30'>Florida, Tampa</option><option value='30303|30'>Georgia, Atlanta</option><option value='30901|30'>Georgia, Augusta</option><option value='31906|20'>Georgia, Columbus</option><option value='30501|50'>Georgia, Gainesville</option><option value='31210|50'>Georgia, Macon</option><option value='31401|30'>Georgia, Savannah</option><option value='96816|250'>Hawaii, Honolulu</option><option value='83706|100'>Idaho, Boise</option><option value='62220|40'>Illinois, Belleville</option><option value='61820|30'>Illinois, Champaign</option><option value='60606|40'>Illinois, Chicago</option><option value='61104|30'>Illinois, Rockford</option><option value='47708|30'>Indiana, Evansville</option><option value='46802|40'>Indiana, Ft. Wayne</option><option value='46202|30'>Indiana, Indianapolis</option><option value='47905|40'>Indiana, Lafayette</option><option value='46952|50'>Indiana, Marion</option><option value='47305|30'>Indiana, Muncie</option><option value='47374|50'>Indiana, Richmond</option><option value='46601|50'>Indiana, South Bend</option><option value='47801|30'>Indiana, Terre Haute</option><option value='50310|100'>Iowa, Des Moines</option><option value='52245|50'>Iowa, Iowa City</option><option value='67201|50'>Kansas, Wichita</option><option value='40508|50'>Kentucky, Lexington</option><option value='40202|50'>Kentucky, Louisville</option><option value='42001|30'>Kentucky, Paducah</option><option value='70801|30'>Louisiana, Baton Rogue</option><option value='38392|50'>Louisiana, Jackson</option><option value='70502|30'>Louisiana, Lafayette</option><option value='71201|50'>Louisiana, Monroe</option><option value='70116|30'>Louisiana, New Orleans</option><option value='71106|75'>Louisiana, Shreveport</option><option value='02601|30'>MA, Hyannis (Cape Cod)</option><option value='21204|40'>Maryland, Baltimore</option><option value='21801|30'>Maryland, Salisbury</option><option value='02118|30'>Massachusetts, Boston</option><option value='01615|50'>Massachusetts, Worcester</option><option value='49017|20'>Michigan, Battle Creek</option><option value='48009|50'>Michigan, Detroit</option><option value='48502|30'>Michigan, Flint</option><option value='49503|30'>Michigan, Grand Rapids</option><option value='49007|30'>Michigan, Kalamazoo</option><option value='48910|30'>Michigan, Lansing</option><option value='49440|30'>Michigan, Muskegon</option><option value='48060|50'>Michigan, Port Huron</option><option value='55802|20'>Minnesota, Duluth</option><option value='55488|50'>Minnesota, Minneapolis</option><option value='56301|30'>Minnesota, St. Cloud</option><option value='55101|50'>Minnesota, St. Paul</option><option value='39507|50'>Mississippi, Biloxi</option><option value='39401|30'>Mississippi, Hattiesburg</option><option value='39201|50'>Mississippi, Jackson</option><option value='64108|75'>Missouri, Kansas City</option><option value='65806|50'>Missouri, Springfield</option><option value='63102|30'>Missouri, St. Louis</option><option value='59401|50'>Montana, Great Falls</option><option value='27609|50'>N.C., Raleigh/Durham/Chapel Hill</option><option value='68102|30'>Nebraska, Omaha</option><option value='89109|30'>Nevada, Las Vegas</option><option value='89509|50'>Nevada, Reno</option><option value='08009|30'>New Jersey, Southern New Jersey</option><option value='07728|40'>New Jersey, Toms River</option><option value='88310|150'>New Mexico, Alamogordo</option><option value='87101|30'>New Mexico, Albuquerque</option><option value='88221|150'>New Mexico, Carlsbad</option><option value='88030|150'>New Mexico, Deming</option><option value='87499|150'>New Mexico, Farmington</option><option value='88004|150'>New Mexico, Las Cruces</option><option value='88061|150'>New Mexico, Silver City</option><option value='12202|30'>New York, Albany</option><option value='13850|50'>New York, Binghamton</option><option value='14202|30'>New York, Buffalo</option><option value='14902|50'>New York, Elmira</option><option value='14850|30'>New York, Ithaca</option><option value='10118|20'>New York, New York City</option><option value='12602|50'>New York, Poughkeepsie</option><option value='14614|50'>New York, Rochester</option><option value='13202|30'>New York, Syracuse</option><option value='13501|30'>New York, Utica</option><option value='28801|50'>North Carolina, Asheville</option><option value='28212|50'>North Carolina, Charlotte</option><option value='27407|50'>North Carolina, Greensboro</option><option value='58201|50'>North Dakota, Grand Forks</option><option value='44308|50'>Ohio, Akron</option><option value='44820|50'>Ohio, Bucyrus</option><option value='44702|30'>Ohio, Canton</option><option value='45601|50'>Ohio, Chillicothe</option><option value='45202|20'>Ohio, Cincinnati</option><option value='44114|30'>Ohio, Cleveland</option><option value='43215|30'>Ohio, Columbus</option><option value='43812|50'>Ohio, Coshocton</option><option value='45402|30'>Ohio, Dayton</option><option value='43420|50'>Ohio, Fremont</option><option value='43130|50'>Ohio, Lancaster</option><option value='44901|50'>Ohio, Mansfield</option><option value='45750|30'>Ohio, Marieta</option><option value='43302|50'>Ohio, Marion</option><option value='43055|50'>Ohio, Newark</option><option value='43601|30'>Ohio, Toledo</option><option value='43701|50'>Ohio, Zanesville</option><option value='73102|30'>Oklahoma, Oklahoma City</option><option value='74103|30'>Oklahoma, Tulsa</option><option value='97201|30'>Oregon, Portland</option><option value='97301|30'>Oregon, Salem</option><option value='18102|50'>Pennsylvania, Allentown</option><option value='17201|30'>Pennsylvania, Chambersburg</option><option value='17102|30'>Pennsylvania, Harrisburg</option><option value='19130|40'>Pennsylvania, Philadelphia</option><option value='15219|30'>Pennsylvania, Pittsburgh</option><option value='18711|50'>Pennsylvania, Wilkes Barre</option><option value='02902|30'>Rhode Island, Providence</option><option value='29901|100'>South Carolina, Beaufort</option><option value='29401|30'>South Carolina, Charleston</option><option value='29201|50'>South Carolina, Columbia</option><option value='29607|50'>South Carolina, Greenville</option><option value='29928|20'>South Carolina, Hilton Head</option><option value='29577|75'>South Carolina, Myrtle Beach</option><option value='29730|50'>South Carolina, Rock Hill</option><option value='57401|50'>South Dakota, Aberdeen</option><option value='57106|75'>South Dakota, Sioux Falls</option><option value='37402|30'>Tennessee, Chattanooga</option><option value='37040|30'>Tennessee, Clarksville</option><option value='37902|30'>Tennessee, Knoxville</option><option value='38103|30'>Tennessee, Memphis</option><option value='37201|50'>Tennessee, Nashville</option><option value='78757|30'>Texas, Austin</option><option value='78401|30'>Texas, Corpus Christi</option><option value='75202|30'>Texas, Dallas</option><option value='79901|75'>Texas, El Paso</option><option value='76011|50'>Texas, Ft. Worth</option><option value='77036|30'>Texas, Houston</option><option value='78205|30'>Texas, San Antonio</option><option value='76701|30'>Texas, Waco</option><option value='84111|30'>Utah, Salt Lake City</option><option value='84770|50'>Utah, St. George</option><option value='05403|100'>Vermont, Burlington</option><option value='23501|50'>Virginia, Hampton Roads</option><option value='23806|30'>Virginia, Petersburg</option><option value='23173|30'>Virginia, Richmond</option><option value='24011|30'>Virginia, Roanoke</option><option value='24401|50'>Virginia, Staunton</option><option value='98225|30'>Washington, Bellingham</option><option value='98506|30'>Washington, Olympia</option><option value='98109|30'>Washington, Seattle</option><option value='98405|50'>Washington, Seattle-Tacoma</option><option value='99203|30'>Washington, Spokane</option><option value='25701|30'>West Virginia, Huntington</option><option value='54911|50'>Wisconsin, Appleton</option><option value='54936|50'>Wisconsin, Fond du Lac</option><option value='54301|50'>Wisconsin, Green Bay</option><option value='53703|30'>Wisconsin, Madison</option><option value='54220|50'>Wisconsin, Manitowoc</option><option value='54449|50'>Wisconsin, Marshfield</option><option value='53201|30'>Wisconsin, Milwaukee</option><option value='54901|50'>Wisconsin, Oshkosh</option><option value='53082|50'>Wisconsin, Sheboygan</option><option value='54481|50'>Wisconsin, Stevens Point</option><option value='54401|75'>Wisconsin, Wausau</option><option value='54495|50'>Wisconsin, Wisconsin Rapids</option>";
var urlMakesJSON = "/for-sale/GetMakeData.action?varname=newMakeDefaults&cpo=&usd=&nw=Y&loc=en";  //URL that returns invalid JSON text that contains makes list
var localJSON = "{'options':[{'name':'All Makes', 'value':'', 'time':1266272237596},{'name':'Acura', 'value':'20001'},{'name':'Aston Martin', 'value':'20003'},{'name':'Audi', 'value':'20049'},{'name':'Bentley', 'value':'20051'},{'name':'BMW', 'value':'20005'},{'name':'Bugatti', 'value':'33583'},{'name':'Buick', 'value':'20006'},{'name':'Cadillac', 'value':'20052'},{'name':'Chevrolet', 'value':'20053'},{'name':'Chrysler', 'value':'20008'},{'name':'Dodge', 'value':'20012'},{'name':'Ferrari', 'value':'20014'},{'name':'Ford', 'value':'20015'},{'name':'GMC', 'value':'20061'},{'name':'Honda', 'value':'20017'},{'name':'Hummer', 'value':'20018'},{'name':'Hyundai', 'value':'20064'},{'name':'Infiniti', 'value':'20019'},{'name':'Jaguar', 'value':'20066'},{'name':'Jeep', 'value':'20021'},{'name':'Kia', 'value':'20068'},{'name':'Koenigsegg', 'value':'33663'},{'name':'Lamborghini', 'value':'20069'},{'name':'Land Rover', 'value':'20024'},{'name':'Lexus', 'value':'20070'},{'name':'Lincoln', 'value':'20025'},{'name':'Lotus', 'value':'20071'},{'name':'Maserati', 'value':'20072'},{'name':'Maybach', 'value':'20027'},{'name':'Mazda', 'value':'20073'},{'name':'Mercedes-Benz', 'value':'20028'},{'name':'Mercury', 'value':'20074'},{'name':'Mini', 'value':'20075'},{'name':'Mitsubishi', 'value':'20030'},{'name':'Nissan', 'value':'20077'},{'name':'Pontiac', 'value':'20035'},{'name':'Porsche', 'value':'20081'},{'name':'Rolls-Royce', 'value':'20037'},{'name':'Saab', 'value':'20038'},{'name':'Saturn', 'value':'20039'},{'name':'Scion', 'value':'20085'},{'name':'Smart', 'value':'20228'},{'name':'Spyker', 'value':'33584'},{'name':'Subaru', 'value':'20041'},{'name':'Suzuki', 'value':'20042'},{'name':'Tesla', 'value':'28263'},{'name':'Toyota', 'value':'20088'},{'name':'Volkswagen', 'value':'20089'},{'name':'Volvo', 'value':'20044'}]}";

/**********************************************************
 * 
 * Accepts a JSON object as input.  Iterates over the 
 * JSON object to append options to a select tag.
 * 
 * @param JSON object that contains a list of makes
 * 
 **********************************************************/
function addMakesOptions(data, makesObj)
{
	var used = 'Used';
	var usedId = '84206';
	var makesOptions = "";

	$.each(data.options, function(i, d)
	{
		makesOptions += '<option value="' + d.value + '">' + d.name + '<\/option>';
	});
	makesOptions += '<option value="' + usedId + '">' + used + '<\/option>';
	var makesSelectElement = $('#' + makesObj); 
	makesSelectElement.append(makesOptions);
	
	if (document.getElementById(makesFormSelectId))
		setSelectedMake(document.getElementById(makesFormSelectId));
	else if (document.getElementById(makesResultsSelectId))
		setMultipleSelectedMakes(document.getElementById(makesResultsSelectId));
}

function setSelectedMake(makesList)
{
	var sessionInfo = getCookie(sessionInfoCookie);
	if (sessionInfo != null)
	{		
		var sMakeName = '';
		var sCookieArray = sessionInfo.split('|');
		for (var i=0; i<sCookieArray.length; i++)
		{
			ssArr = sCookieArray[i].split('=');
			if(ssArr[0] == 'mknm')
			{
				sMakeName = ssArr[1].replace(new RegExp( "\\+", "g" ), " ");
				break;
			}			
        }
		
		if (sMakeName.length > 0)
		{
			for(var j=0; j < makesList.length; j++)
			{			
				if(makesList.options[j].text == sMakeName)
				{	
					/** Wrapping this in try catch fixes the multiple make assignment bug in IE6 */
					try
					{
						makesList.options[j].selected = 'selected';
						break;
					}
					catch(ex) {} 
				}
			}
		}
	}
}

function setMultipleSelectedMakes(makesList)
{
	var multipleMakesID = getCookie(dealerMakesIdCookie);
	if (multipleMakesID !== null)
	{
		var sessionMakes = multipleMakesID.replace(/\[/g,"").replace(/\]/g,"").replace(/\s+/g,"").split(",");

		var len = makesList.length;
		var smLen = sessionMakes.length;
		
		for(var i = 0; i < len; i++)
		{
			for(var j = 0; j < smLen; j++)
			{
				if(sessionMakes[j] == makesList.options[i].value)
				{	
					/** Wrapping this in try catch fixes the multiple make assignment bug in IE6 */
					try
					{
						makesList.options[i].selected = 'selected';
					}
					catch(ex) {} 
				}
			}	
		}
	}
}

/**********************************************************
 * 
 * Uses JQuery/AJAX to perform an XMLHttpRequest against
 * a URL.  The URL returns a list of makes in an invalid 
 * JSON text format.  The invalid format is converted to 
 * valid JSON text. Next, The JSON.parse() function 
 * converts the text to a JSON object. 
 * The addMakesSelectOptions(data) function is then
 * executed to create and update the form with the new 
 * makes select tag.
 *  
 **********************************************************/
function getMakesJSONList(makesObj) 
{
	$.ajax({type: "GET",
		url: urlMakesJSON,
		dataType: "text",
		success: function(jsonText) 
		{
			if (jsonText !== null) 
			{
				var jsonObj;
				if ($.browser.msie) 
				{
					jsonObj = eval(jsonText);
				}
				else 
				{
					//jsonText = jsonText.replace(/'/gi, '"');  //convert to valid JSON
					jsonObj = eval(jsonText);
				}
				addMakesOptions(jsonObj, makesObj);
			}
		},
		error: function (xhr) 
		{
		    //Do nothing 
		}
	});
}

/**********************************************************
 * This functions was brought over from the legacy
 * dealer locator application.  Its purpose is to 
 * retrieve a cookie.
 * 
 * @param cookieName the name of the cookie
 * @return the cookie value
 ***********************************************************/
function getCookie(cookieName) 
{
	var cookieValue = "";
	var allCookies = document.cookie;
	var cookiePosition = allCookies.indexOf(cookieName + '=');   
	
	if(cookiePosition !== -1)
	{
		var valueStart = cookiePosition + cookieName.length + 1;
		var valueEnd = allCookies.indexOf(';', valueStart);
		if(valueEnd === -1) 
		{
			valueEnd = allCookies.length;
		}
		cookieValue = allCookies.substring(valueStart, valueEnd);
		cookieValue = unescape(cookieValue);
	}
	return cookieValue;
}

/**********************************************************
 * This functions was brought over from the legacy
 * dealer locator application.  Its purpose is to 
 * set a cookie.
 * 
 * @param cookieName the name of the cookie
 * @param cookieValue the value of the cookie
 ***********************************************************/
function setCookie(cookieName, cookieValue) 
{
	document.cookie = cookieName + "=" + escape(cookieValue);
}

/**********************************************************
 * 
 * Function that is executed as soon as the DOM is loaded
 * and before the page contents are loaded. 
 *
 **********************************************************/
$(document).ready( function() {

	 	if(document.getElementById(makesFormSelectId))
	 	{
		 	getMakesJSONList(makesFormSelectId);
	 	}	 	
	 	else if(document.getElementById(makesResultsSelectId))
	 	{
		 	getMakesJSONList(makesResultsSelectId);
	 	}	 
	}
);

/***************************************************************
 * 
 * Hides the choose a city link and shows the choose a city
 * drop down.
 * 
 ***************************************************************/
function showCities() 
{
	$('#dfCitySpan').hide();
	$('#dfCitySelector').show();
}

/**************************************************************
 * 
 * This method leverages logic found in the legacy dealerLocator 
 * web application.  Its purpose is to update the radius and 
 * ZIP code fields according to the selected market defaults.
 * 
 * @param name of the form to update
 * ************************************************************/
function updateMarketDefaults(form) 
{
	with (form) 
   {
	  var params = form.dfCitySelector.value;
      var zipCode = params.substring(0,5);
      var radius = params.substring(6,params.length); 
      
      form.zc.value = zipCode;
      
      for(var i=0; i<form.rd.length; i++) 
      {
     	 if(radius === 'All')
    	 {
    		radius = '100000';
    	 }
     	 if(radius === '45')
     	 {
     		 radius = '30';
     	 }
    	 if(form.rd[i].value === radius) 
         {
        	 form.rd[i].selected = 'selected';
         }
      }
   }
}


/**
 * Updates the results page expand results section.
 */
function updateDisplay()
{
	var expandGo = "expandGo";  
	var expandZc = "expandZc"; 	
	var expandZcLink = "expandZcLink";  	
	var expandZcText = "expandZcText"; 		
	
	document.getElementById(expandZcText).style.display = "none";
	document.getElementById(expandZcLink).style.display = "none";
	document.getElementById(expandZc).style.display = "inline";
	document.getElementById(expandGo).style.display = "inline";
}

function dropDownSort(url, sortValue)
{
	if (sortValue !== '')
	{
		window.location = "./"+url+sortValue;
	}
}

function expandSearch(url, radius, zip)
{
	expandUrl = url + "&sc.radius="+radius+"&sc.zipCode="+zip;
	window.location = "./"+expandUrl;
}

function changeResultSetSize(url, size)
{
	window.location = "./"+url + size;
}


function groomBuyIndexDealerForm(form) {
	   var errorFound = 'false';
	   
	   var errorFound = checkBuyIndexMakes(form);
	   
	   if(errorFound == 'true'){
	      alert(error["make,ANY_PLUS_MAKE"]);
	      return;
	   }
	   if(isWhitespace(form.zc.value)) {
	      alert(error["zc,NO_DL_ZIP"]);
	      return;
	   }
	   if(!isZIPCode(form.zc.value)){
	      alert(error["zc,ERR_INV_ZC"]);
	      return;
	   }
	   else {
	       form.submit();
	   } 
	}

function checkBuyIndexMakes(form){
	   var errorFound = 'false';
	   var selectedMakes = new Array();
	   var x = 0;
	   for(var i=0; i < form.mkid_0.length; i++) {
	      if(form.mkid_0.options[i].selected == true) {
	         selectedMakes[x]=form.mkid_0.options[i].value;
	         x += 1;
	      }
	   }
	   if(selectedMakes.length > 1) {
	      for(var i=0; i < selectedMakes.length; i++) {
	         if(selectedMakes[i]==""){            
	            errorFound = 'true';
	         }
	      }
	   }
	   return errorFound;
	}

