// -- instance of DealerSvc for use in page
var DealerSvc = new DealerSvcClass();

window.addEvent('domready', function()
{	
	// -- continent select
	var continent;

	// -- country select
	var country;

	// -- region select
	var region;
	
	if (continent = $('continent')) 
	{
		continent.addEvent('change', function()
		{
			var value = continent.get('value');
			if (value != 0 && value != '')
			{
				addSelectOptions('Loading...', $('country'), null);
				addSelectOptions('Select a region', $('region'), null);
				
				var params = {continent : value};
				/* when continent is selected, load countries as result */
				DealerSvc.search(DealerSvc.CONTINENTS, params, onCountries);
			}
		});
	}
	
	if (country = $('country'))
	{
		country.addEvent('change', function()
		{
			var value = country.get('value');
			if (value != 0 && value != '')
			{
				// alert(value);
				addSelectOptions('Loading...', $('region'), null);
				
				var params = {country : value};
				/* when country is selected, load regions as result */
				DealerSvc.search(DealerSvc.COUNTRIES, params, onRegions);
			}
		});
	}
	
	if (region = $('region'))
	{
		region.addEvent('change', function()
		{
			var continentValue = continent.get('value');
			var countryValue = country.get('value');
			// var regionValue = (continentValue == 1) ? region.get('value') : region.get('text');
			var regionValue = region.get('value');
			
			if (countryValue != 0 && countryValue != '' && regionValue != 0 && regionValue != '')
			{
				// alert(countryValue + " " + regionValue);
				$('dealer_search_result').innerHTML = '<em>Searching for dealers...</em>';
				var params = {country: countryValue, region: regionValue};
				/* when region is selected, load dealers as result */
				DealerSvc.search(DealerSvc.REGIONS, params, onDealers);
			}
		});
	}
	
	var rangeSearch;
	if (rangeSearch = $('rangeSearch'))
	{
		rangeSearch.addEvent('click', function()
		{
			tryRangeSearch();
		});
	}
	
	var zipField;
	if (zipField = $('zip'))
	{
		zipField.addEvent('keypress', function(event) 
		{
			var event = new Event(event);
			if (event.key == 'enter')
				tryRangeSearch();
		});
	}
	
});

function addSelectOptions(defaultStr, select, results)
{
	var option = new Option(defaultStr, '', true, false);
	select.options.length = 0;
	
	// -- sorry, WC3 I have to make IE happy
	//select.add(option, null);
	select.options[select.options.length] = option;
	
	if (results)
	{
		for (var i = 0; i < results.length; i++) 
		{
			var pair = results[i];
			option = new Option(pair[1], pair[0], false, false);
			// -- and again with the IE
			//select.add(new Option(pair[1], pair[0], false, false), null);
			select.options[select.options.length] = option;
		}
	}
}

function onCountries(text, xml)
{
	if (text.length) 
	{		
		var results = parseXmlListToArray(xml);
		var select = $('country');
		addSelectOptions('Select a country', $('country'), results);
	}
}

function onDealers(text, xml)
{
	$('dealer_search_result').innerHTML = text;
}

function onRegions(text, xml)
{
	if (text.length) 
	{
		var results = parseXmlListToArray(xml, null, true);
		var select = $('country');
		addSelectOptions('Select a region', $('region'), results);	
	}
}

function parseDealerList(data)
{
	document.write(data);
}

function parseXmlListToArray(xml, tag, reversed) 
{
	tag = tag || 'KeyValuePairOfstringstring';
	reversed = reversed || false;
	var xmlList = xml.getElementsByTagName(tag);
	var results = [];
	for (var i = 0; i < xmlList.length; i++)
	{
		var key;
		var keyNode;
		var value;
		var valueNode;
		if (!reversed)
		{
			if (keyNode = xmlList[i].getElementsByTagName("key")[0].firstChild) 
			{
				key = keyNode.nodeValue;
			}
			else
			{
				key = "";
			}
			if (valueNode = xmlList[i].getElementsByTagName("value")[0].firstChild) 
			{
				value = valueNode.nodeValue;
			}
			else 
			{
				value = key;
			}
		}
		else 
		{
			if (valueNode = xmlList[i].getElementsByTagName("key")[0].firstChild) 
			{
				value = valueNode.nodeValue;
			}
			else 
			{
				value = '';
			}
			if (keyNode = xmlList[i].getElementsByTagName("value")[0].firstChild) 
			{
				key = keyNode.nodeValue;
			}
			else
			{
				key = value;
			}
		}
		results[i] = [key, value];
	}
	return results;
}

function tryRangeSearch()
{
	var withinValue = parseInt($('range').get('value'));
	var zipValue    = $('zip').get('value');
	
	if (!withinValue) withinValue = 10;
	
	if (zipValue.length)
	{
		$('dealer_search_result').innerHTML = "<em>Searching in " + zipValue + ' within ' + withinValue + " miles...</em>"
		var params = {zip: zipValue, radius: withinValue};
		DealerSvc.search(DealerSvc.ZIPCODE, params, onDealers);
	}
}
