// globals
var searchReq = null;
var map = null;
var geocoder = null;
var bounds = null;
var dealers;

// threshold beyond which the Dealer Search facilities will be provided; if threshold isn't passed, then ALL dealers will be shown
var dealerCountThreshold = 30;

// this value acts as a cap on the maximum number of dealer results to be shown for a search; it is used in case the country specifies too high a value
var maxPermissibleResults = 50;

// arrays to hold markers created when results have been returned, and html to be displayed in info windows
var markers = [];
var tab1html = [];
var tab2html = [];

var pinImages = [];
pinImages[0] = "/Images/GoogleMap_Pin_1_tcm168-339.gif";
pinImages[1] = "/Images/GoogleMap_Pin_2_tcm168-350.gif";
pinImages[2] = "/Images/GoogleMap_Pin_3_tcm168-361.gif";
pinImages[3] = "/Images/GoogleMap_Pin_4_tcm168-363.gif";
pinImages[4] = "/Images/GoogleMap_Pin_5_tcm168-364.gif";
pinImages[5] = "/Images/GoogleMap_Pin_6_tcm168-365.gif";
pinImages[6] = "/Images/GoogleMap_Pin_7_tcm168-366.gif";
pinImages[7] = "/Images/GoogleMap_Pin_8_tcm168-367.gif";
pinImages[8] = "/Images/GoogleMap_Pin_9_tcm168-368.gif";
pinImages[9] = "/Images/GoogleMap_Pin_10_tcm168-340.gif";
pinImages[10] = "/Images/GoogleMap_Pin_11_tcm168-341.gif";
pinImages[11] = "/Images/GoogleMap_Pin_12_tcm168-342.gif";
pinImages[12] = "/Images/GoogleMap_Pin_13_tcm168-343.gif";
pinImages[13] = "/Images/GoogleMap_Pin_14_tcm168-344.gif";
pinImages[14] = "/Images/GoogleMap_Pin_15_tcm168-345.gif";
pinImages[15] = "/Images/GoogleMap_Pin_16_tcm168-346.gif";
pinImages[16] = "/Images/GoogleMap_Pin_17_tcm168-347.gif";
pinImages[17] = "/Images/GoogleMap_Pin_18_tcm168-348.gif";
pinImages[18] = "/Images/GoogleMap_Pin_19_tcm168-349.gif";
pinImages[19] = "/Images/GoogleMap_Pin_20_tcm168-351.gif";
pinImages[20] = "/Images/GoogleMap_Pin_21_tcm168-352.gif";
pinImages[21] = "/Images/GoogleMap_Pin_22_tcm168-353.gif";
pinImages[22] = "/Images/GoogleMap_Pin_23_tcm168-354.gif";
pinImages[23] = "/Images/GoogleMap_Pin_24_tcm168-355.gif";
pinImages[24] = "/Images/GoogleMap_Pin_25_tcm168-356.gif";
pinImages[25] = "/Images/GoogleMap_Pin_26_tcm168-357.gif";
pinImages[26] = "/Images/GoogleMap_Pin_27_tcm168-358.gif";
pinImages[27] = "/Images/GoogleMap_Pin_28_tcm168-359.gif";
pinImages[28] = "/Images/GoogleMap_Pin_29_tcm168-360.gif";
pinImages[29] = "/Images/GoogleMap_Pin_30_tcm168-362.gif";
pinImages[30] = "/Images/GoogleMap_Pin_31_tcm168-99171.gif";
pinImages[31] = "/Images/GoogleMap_Pin_32_tcm168-99172.gif";
pinImages[32] = "/Images/GoogleMap_Pin_33_tcm168-99173.gif";
pinImages[33] = "/Images/GoogleMap_Pin_34_tcm168-99174.gif";
pinImages[34] = "/Images/GoogleMap_Pin_35_tcm168-99175.gif";
pinImages[35] = "/Images/GoogleMap_Pin_36_tcm168-99176.gif";
pinImages[36] = "/Images/GoogleMap_Pin_37_tcm168-99177.gif";
pinImages[37] = "/Images/GoogleMap_Pin_38_tcm168-99178.gif";
pinImages[38] = "/Images/GoogleMap_Pin_39_tcm168-99179.gif";
pinImages[39] = "/Images/GoogleMap_Pin_40_tcm168-99180.gif";
pinImages[40] = "/Images/GoogleMap_Pin_41_tcm168-99181.gif";
pinImages[41] = "/Images/GoogleMap_Pin_42_tcm168-99182.gif";
pinImages[42] = "/Images/GoogleMap_Pin_43_tcm168-99183.gif";
pinImages[43] = "/Images/GoogleMap_Pin_44_tcm168-99184.gif";
pinImages[44] = "/Images/GoogleMap_Pin_45_tcm168-99185.gif";
pinImages[45] = "/Images/GoogleMap_Pin_46_tcm168-99186.gif";
pinImages[46] = "/Images/GoogleMap_Pin_47_tcm168-99187.gif";
pinImages[47] = "/Images/GoogleMap_Pin_48_tcm168-99188.gif";
pinImages[48] = "/Images/GoogleMap_Pin_49_tcm168-99189.gif";
pinImages[49] = "/Images/GoogleMap_Pin_50_tcm168-99190.gif";

var pinImageBlank = "/Images/GoogleMap_Pin_Blank_tcm168-369.gif";
var pinImagePreferred = "/Images/GoogleMap_Pin_Preferred_tcm168-371.gif";
var ImageNoMap = "/Images/WTB_nomap_tcm168-375.jpg";
var pinImageRegion = "/Images/GoogleMap_Pin_Region_tcm168-372.gif";
var pinImageRegionShadow = "/Images/GoogleMap_Pin_Region_Shadow_tcm168-373.png";
var pinImageDealerShadow = "/Images/GoogleMap_Pin_Dealer_Shadow_tcm168-370.png";

//Gets the browser specific XmlHttpRequest Object
function getXmlHttpRequestObject() {
	if (window.XMLHttpRequest) {
		return new XMLHttpRequest();
	} else if(window.ActiveXObject) {
		return new ActiveXObject("Microsoft.XMLHTTP");
	} else {
		alert("Your browser does not support AJAX");
	}
}

function unload()
{
	if (map) {
		GUnload();
	}
}

function load()
{
    //First check if the user has set a maximum, if not leave our default
    if (document.getElementById('maxNumberDealerResults').value != "")	
	{
		dealerCountThreshold = document.getElementById('maxNumberDealerResults').value;
	}

	//XmlHttpRequest object to do Ajaxificationising
	searchReq= getXmlHttpRequestObject();
	// need to make the next part conditional - some countries wont want map shown

	if (GoogleMapsFlag==1) {
        if (GBrowserIsCompatible()) {
            geocoder = new GClientGeocoder();
            // strictly speaking, we may only need Geocoder if postCode searches are enabled
            if (geocoder) {
            	document.getElementById('map').style.display = 'block';
                map = new GMap2(document.getElementById("map"));
                map.addControl(new GLargeMapControl());
                map.addControl(new GMapTypeControl());
                map.setCenter(new GLatLng(0, 0), 1);
                map.setMapType(G_NORMAL_MAP);
                bounds = new GLatLngBounds();
                if (document.getElementById('RegionEnabled')) {
                    if (dealerRegions.length !=0) {
                        for (var i = 0; i < dealerRegions.length; i++) {
                            var regionData=dealerRegions[i].split(",");
                            regionName=regionData[0];
                            regionLat=regionData[1];
                            regionLng=regionData[2];
                            showRegion(regionName,regionLat,regionLng);
                        }
                    } else {
                        if (dealerCount>dealerCountThreshold) {
                            addressToLatLng(countryName,showCountry);
                        } else {
                            showDealers();
                        }
                    }
                } else {
                    if (dealerCount>dealerCountThreshold){
                        addressToLatLng(countryName,showCountry);
                    } else {
                        showDealers();
                    }
                    // if the city and postCode radio buttons aren't there either then don't show Search area
                    if (!document.getElementById('CityEnabled') && !document.getElementById('PostcodeEnabled')) 
                    {
                        document.getElementById('searchAreaDiv').innerHtml="";
                        document.getElementById('searchAreaDiv').style.display="none";
                        document.getElementById('dealerListing').innerHtml="";
                        document.getElementById('dealerListing').style.display="none";
                        document.getElementById('dealerListContainer').className="fullHeight";
                    }
                }
            } else {
                alert("GoogleMaps geocoder not available!");
            }

        } else {
            alert ('Your browser is incompatible with GoogleMaps!');
        }
        
	} else {
	    document.getElementById('dealerListing2').style.display = 'block';
	    if (dealerCount>dealerCountThreshold) {
            document.getElementById('dealerListing2').style.backgroundImage = 'url(' + ImageNoMap + ')';
        } else {
            showDealers();
        }
	}
	document.getElementById('btnFindResellerGo').disabled=true;
    setInitialSearchCriterion();
}

// prevent form being submitted by user pressing ENTER key when focus is on input field
function testForEnter(e)
{
	var intKey = (window.Event) ? e.which : e.keyCode;
	return intKey !=13;
}


function showRegion(regionName, regionLat, regionLng) {
	var regionMarker, markerOptions, regionIcon;
	var point = new GLatLng(regionLat, regionLng);
	
	regionName = XMLClean(regionName);
	if (point) {
        regionIcon = new GIcon(G_DEFAULT_ICON);
		// select icon image
		regionIcon.image = pinImageRegion;
		regionIcon.iconSize = new GSize(21,14);
		regionIcon.iconAnchor = new GPoint(11,13);
		regionIcon.shadowSize = new GSize(25,14);
		regionIcon.shadow = pinImageRegionShadow;
		// GMarkerOptions object
		markerOptions = { icon:regionIcon, title:regionName };
		// define a marker
		regionMarker = new GMarker(point, markerOptions);
		// redefine map bounds
		bounds.extend(point);
		// and put pin on map
		map.addOverlay(regionMarker);
		// add an onClick handler for the pin
		GEvent.addListener(regionMarker, "click",	function() {
		    //setSuggestion(regionName);
		    document.getElementById('fldLocation').value = regionName;
            setSearchCriterion("Region");
	        wtbSearch(regionName,"Region");
		});
		// zoom to centre of new bounds
		reZoom();		
	} else {
		alert("null point for region"+regionName+"!!!");
	}
}	


//Called from keyup on the search textbox.
//Start the AJAX request.
function searchSuggest(txtSearch,searchCriterion) {
    var now = new Date();

	if (searchCriterion=="Postcode") {
		// don't do auto-completion for postcode searches - just enable the Go button and return !
		document.getElementById('btnFindResellerGo').disabled=false;
		return;
	}

    document.getElementById('btnFindResellerGo').disabled=true;
	if (txtSearch.length<2) {
		document.getElementById('searchSuggestions').style.display="none";
		return;
	}
	
	if (searchReq.readyState == 4 || searchReq.readyState == 0) {
		var str = encodeURIComponent(txtSearch);
		var URL = '/includes/Pages/wtbSearchSuggestion.aspx?searchCriterion='+searchCriterion+'&searchString='+str;
		searchReq.open("GET", URL, true);
		searchReq.onreadystatechange = handleSearchSuggest; 
		searchReq.send(null);
	}		
}

	
//Called when the AJAX response is returned.
function handleSearchSuggest() {
	if (searchReq.readyState == 4) {
		var ss = document.getElementById('searchSuggestions')
		ss.innerHTML = '';
		// response is in XML
		var response = searchReq.responseXML;
		var suggestions = response.getElementsByTagName('suggestion');
		for (var i=0; i < suggestions.length; i++) {
			var suggestion = XMLClean(suggestions.item(i).firstChild.nodeValue);
			//Build our element string.  This is cleaner using the DOM, but
			//IE doesn't support dynamically added attributes.
			var suggest = '<div onmouseover="javascript:suggestOver(this);" ';
			suggest += 'onmouseout="javascript:suggestOut(this);" ';
			suggest += 'onclick="setSuggestion(\'' + toUnicode(suggestion) + '\')"';
			suggest += 'class="suggest_link">' + JavascriptClean(suggestion) + '</div>';
			ss.innerHTML += suggest;
		}
		if (ss.innerHTML.length == 0) {
			var noResult = '<div class="suggest_link">' + noDealersMsg + '</div>';
			ss.innerHTML = noResult;
		}
		ss.style.display="block";
	}
}


//Mouse over function
function suggestOver(div_value) {
	div_value.className = 'suggest_link_over';
}


//Mouse out function
function suggestOut(div_value) {
	div_value.className = 'suggest_link';
}


//Remove default text and change styles for search input field
function test(default_val){
	if(document.getElementById('fldLocation').value == default_val){
		document.getElementById('fldLocation').value = '';
		//document.getElementById('txtSearch').style.color = 'black';
	}
}


//Click function
function setSuggestion(value) {
	document.getElementById('fldLocation').value = value;
	document.getElementById('searchSuggestions').innerHTML = '';
	document.getElementById('searchSuggestions').style.display="none";
	document.getElementById('btnFindResellerGo').disabled=false;
    wtbSearch(value,getSearchCriterion());
}


//Mouse over function
function dealerOver(div_value) {
	if (div_value.className != 'dealer_link_selected') {
		div_value.className = 'dealer_link_over';
	}
}
//Mouse out function - may need to check whether the item is already selected here and not change its class if that is the case ...
function dealerOut(div_value) {
	if (div_value.className != 'dealer_link_selected') {
		div_value.className = 'dealer_link';
	}
}


function dealerSelected(index) {
	for(var i=0; i < dealers.length; i++) {
		if (i==index) {
			document.getElementById('dealerResult'+i).className = 'dealer_link_selected';
		} else {
			document.getElementById('dealerResult'+i).className = 'dealer_link';
		}
	}
	
	//alert("Browser name: "+ navigator.appName + ", Browser version: "+ parseFloat(navigator.appVersion));
	if (navigator.appName=="Microsoft Internet Explorer" && parseFloat(navigator.appVersion)<=5)
	{
		// IE prior to 8
		document.getElementById('dealerListing').scrollTop = document.getElementById('dealerResult'+index).offsetTop;
	}
	else
	{
		// Working browsers
		document.getElementById('dealerResult'+index).scrollIntoView(true);
	}
	document.getElementById('WTBBoxTop').scrollIntoView(true);
}


function showBubble(i) {
	if (tab2html[i] != '') {
		markers[i].openInfoWindowTabsHtml([new GInfoWindowTab(tab1Label,tab1html[i]), new GInfoWindowTab(tab2Label,tab2html[i])], {maxWidth: 400});
	} else {
		markers[i].openInfoWindowTabsHtml([new GInfoWindowTab(tab1Label,tab1html[i])], {maxWidth: 400});
	}
	dealerSelected(i);
}


// show all dealers for this country 
// this will only ever be called if the number of dealers is below the value of dealerCountThreshold
function showDealers() {
    //var maxResults = document.getElementById('maxNumberDealerResults').value;
    
	// Hide the search, make the listing big
	document.getElementById('searchAreaDiv').innerHtml="";
	document.getElementById('searchAreaDiv').style.display="none";
	document.getElementById('dealerListContainer').className="fullHeight";
    
	if (searchReq.readyState == 4 || searchReq.readyState == 0) {
        var now = new Date();
		var URL = '/includes/Pages/wtbShowDealers.aspx';
		searchReq.open("GET", URL, true);
		searchReq.onreadystatechange = handleShowDealers; 
		searchReq.send(null);
	}
}


function handleShowDealers() {
    var dealerLat, dealerLng, dealerName, dealerAddress, dealerPreferred, dealerLat, dealerLng;
	var response, address, categories, category, info, dealerInfo, ss, results, dealerResult, services;

	results = "";
	
	if (searchReq.readyState == 4) {

		if (GoogleMapsFlag==1) {
			bounds = new GLatLngBounds();
			map.clearOverlays();
			ss = document.getElementById('dealerListing');
		} else {
			ss = document.getElementById('dealerListing2');
		}
		ss.innerHTML = '';

		// response is in XML
		response = searchReq.responseXML;
		dealers= response.getElementsByTagName('dealer');

		for(var i=0; i < dealers.length; i++) {
			//Build our element string.  This is cleaner using the DOM, but
			//IE doesn't support dynamically added attributes.
			// first grab the XML for this particular dealer and assign it to a var as shorthand
			var dealer = dealers.item(i);

			// we should be safe to assume that the dealer name (at least!) has been specified ...
			dealerName = XMLClean(dealer.getElementsByTagName('dealerName')[0].firstChild.nodeValue);
			dealerPreferred = parseInt(dealer.getElementsByTagName('preferred')[0].firstChild.nodeValue);

			var Latitudes=dealer.getElementsByTagName('latitude');
			 
			if (Latitudes.length!=0) {
				dealerLat = parseFloat(Latitudes[0].firstChild.nodeValue);
			} else {
				dealerLat = 0;
			}
			
			var Longitudes=dealer.getElementsByTagName('longitude');
			
			if (Longitudes.length!=0) {
				dealerLng = parseFloat(Longitudes[0].firstChild.nodeValue);
			} else {
				dealerLng= 0;
			}

			dealerResult  ='<li id="dealerResult'+i+'" ';

			// add real event handlers if GoogleMapsFlag is enabled and this dealer has lat/lng values
			if (GoogleMapsFlag==1 && dealerLat!=0 && dealerLng!=0) {				
				dealerResult += 'onmouseover="javascript:dealerOver(this);" ';
				dealerResult += 'onmouseout="javascript:dealerOut(this);" ';
				dealerResult += 'onclick="showBubble('+i+');return false;" ';
			} else {
				dealerResult += 'onmouseover="this.style.cursor='+"'default'" + '"; '; 
				dealerResult += 'onmouseout=null ';
				dealerResult += 'onclick=null ';				
			}
			
			dealerResult  +='>';
			
			dealerPreferred = parseInt(dealer.getElementsByTagName('preferred')[0].firstChild.nodeValue);
			var iconImage='<img src="'+pinImageBlank+'" alt="" class="left" />';
			// show non-blank icon if GoogleMapsFlag is disabled or if it is enabled and this dealer has lat/lng values
			if (GoogleMapsFlag==0 || (GoogleMapsFlag==1 && dealerLat!=0 && dealerLng!=0)) {
				if (dealerPreferred==1) {
					iconImage='<img src="'+pinImagePreferred+'" alt="" class="left" />';
				} else {
				    //If we have  a numbered pin use that instead of the blank pin
				    if (i<pinImages.length) {
					    iconImage='<img src="' + pinImages[i] + '" alt="" class="left" />';
				    }
				}
			}
			dealerResult += iconImage;
			
			dealerAddress = '<strong>'+dealerName+'</strong><br />';
			
			// now we deal with some elements that may or may not be present...
			if (dealer.getElementsByTagName('ContactName').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('ContactName')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address1').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address1')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address2').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address2')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address3').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address3')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('City').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('City')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Region').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Region')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('PostCode').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('PostCode')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}			
			if (dealer.getElementsByTagName('Telephone').length !=0) {
				dealerAddress += phoneLabel + ': ' +XMLClean(dealer.getElementsByTagName('Telephone')[0].firstChild.nodeValue) +'<br />';
			}
			if (dealer.getElementsByTagName('Fax').length !=0) {
				dealerAddress += faxLabel + ': ' +XMLClean(dealer.getElementsByTagName('Fax')[0].firstChild.nodeValue) +'<br />';
			}
			var dealerEmail = "";
			if (dealer.getElementsByTagName('Email').length !=0) {
				var email = XMLClean(dealer.getElementsByTagName('Email')[0].firstChild.nodeValue);
				dealerEmail = '<a href="mailto:'+email+'" title="E-mail reseller">'+emailLabel+'</a><br />';
				// Add this to the address if this dealer does NOT have a map pin, or if we are NOT googlemapping				
				if(dealerLat==0 && dealerLng==0 || GoogleMapsFlag!=1){
					dealerAddress += dealerEmail;
				}
			}
			var dealerURL = "";						
			if (dealer.getElementsByTagName('URL').length !=0){
				var URL = XMLClean(dealer.getElementsByTagName('URL')[0].firstChild.nodeValue);
				// Clean out any existing protocol reference
				URL = URL.replace("http://", "", "gi");
				// Make this a link, using the urlLabel
				dealerURL = '<a href="http://'+URL+'" title="'+dealerName+'" target="_blank">'+urlLabel+'</a><br />';
				// Add this to the address if this dealer does NOT have a map pin, or if we are NOT googlemapping
				if(dealerLat==0 && dealerLng==0 || GoogleMapsFlag!=1){
					dealerAddress += dealerURL;
				}
			}
			
			// We now also want the services to appear on the search results lists
			var dealerServices = "";
			services = dealer.getElementsByTagName('service');
			for(var k=0; k < services.length; k++) {				
				category = services.item(k);
				dealerServices += '<br />' + XMLClean(category.firstChild.nodeValue);
			}

			if (GoogleMapsFlag==1) {
				// process any product Categories associated with this dealer and use them to construct the 2nd tab HTML
				dealerInfo = '';
				if (dealer.getElementsByTagName('categories').length !=0 || dealer.getElementsByTagName('service').length !=0){
					categories= dealer.getElementsByTagName('category');
					for(var j=0; j < categories.length; j++) {
						category = categories.item(j);
						info = XMLClean(category.firstChild.nodeValue);
						dealerInfo += '<h4>'+info+'</h4>';
					}
					if(dealer.getElementsByTagName('categories').length !=0 && dealer.getElementsByTagName('service').length !=0){
						dealerInfo += '<br />';
					}
					services= dealer.getElementsByTagName('service');
					for(var k=0; k < services.length; k++) {
						category = services.item(k);
						dealerInfo += '<h4>'+XMLClean(category.firstChild.nodeValue)+'</h4>';
					}
				}
				// close this dealerResult
				dealerResult += "<p>" + dealerAddress + dealerServices + "</p>";
			} else {
				// display list of Dealer Services as 2nd column in DealerResults
				dealerInfo = '';
				if (dealer.getElementsByTagName('service').length !=0) {
					categories= dealer.getElementsByTagName('service');
					for(var j=0; j < categories.length; j++) {
						category = categories.item(j);
						dealerInfo += XMLClean(category.firstChild.nodeValue) +'<br />';
					}
				}
								
				// close this dealerResult
				dealerResult += "<p>" + dealerAddress + dealerServices + dealerInfo + "</p>";
				//dealerResult = '<table width="100%"><tr><td width="60%">' + dealerResult + dealerAddress+ '</td><td>'  + dealerInfo + '</td></tr></table>';
			}
			
			// add to list of results
			results += dealerResult +'</li>';

			// pin dealer on map if GoogleMapsFlag is enabled and this dealer has lat/lng values
			// page data values for the tab labels will have been written into variables defined within whereToBuy.tmpl
			if (GoogleMapsFlag==1 && dealerLat!=0 && dealerLng!=0) {
                createMarker(dealerLat,dealerLng,dealerPreferred,dealerAddress,dealerEmail,dealerURL,dealerInfo,i);
			}
		}
		// display list of results
		if (GoogleMapsFlag==1)
		{
			ss.innerHTML = "<ol>"+results+"</ol>";
		} else {
			// Remove existing dealerListContainer
			var tmpnode1 = document.getElementById('dealerListContainer');
			if (tmpnode1)
			{
				var tmpnode2 = tmpnode1.parentNode;
				if (tmpnode2)
				{
					tmpnode2.removeChild(tmpnode1);
				}
			}
			// wrap results in dealerListContainer and dealerListing for styles
			ss.innerHTML = '<div id="dealerListContainer"><div id="dealerListing"><ol>'+results+'</ol></div></div>';
		}
	}
}

// actually submit Search and obtain results 
function wtbSearch(txtSearch,searchCriterion) {

    //alert("calling wtbSearch");

    var str = encodeURIComponent(txtSearch);
    
    // WebTrends tracking:
    //dcsMultiTrack('WT.ti','WTBSearch','DCSext.page','WTBSearch','DCSext.countrypage','WTBSearch','DCSext.searchstring',str,'DCSext.searchcriterion',searchCriterion);
    
    // Hide the advanced search panel if its visible. Make sure the listing is visible
	//if (GoogleMapsFlag==1 && advancedSearchEnabled==1) {
    if (document.getElementById('advancedSearchPanel').style.display=="block") {
        document.getElementById('advancedSearchPanel').style.display = "none";
	}
	if (document.getElementById('dealerListing').style.display=="none") {
        document.getElementById('dealerListing').style.display = "block";
	}
	
	// if it's a postcode search, branch from here to the appropriate function
	if (searchCriterion=="Postcode") {
		showNearestAddresses(txtSearch);
	} else {
		if (searchReq.readyState == 4 || searchReq.readyState == 0) {
			var now = new Date();
			
			// make sure the country hasn't specified too large a value for the maximum number of results to be shown
			//THIS DOESNT SEEM TO BE USED?????????????
//			var maxResults = document.getElementById('maxNumberDealerResults').value;
//			if (maxResults > maxPermissibleResults) {
//				maxResults = maxPermissibleResults;
//			}
			
			var categories="";
			var services="";
			
			if (advancedSearchEnabled==1) {
				// deduce what filters to apply and create appropriate list to append to URL
				//document.getElementById('filterCount').value=0;
				
				var checkboxes = document.getElementsByName('dealerCategory');
				for (var i = 0; i < checkboxes.length; i++) {
					if (checkboxes[i].checked == true) {
						categories+=checkboxes[i].value+"|";
					}
				}

				checkboxes = document.getElementsByName('dealerService');
				for (var i = 0; i < checkboxes.length; i++) {
					if (checkboxes[i].checked == true) {
						services+=checkboxes[i].value+"|";
					}
				}
			}
            URL = '/includes/Pages/wtbSearch.aspx?searchCriterion='+searchCriterion+'&searchString='+str+'&cats='+categories+'&svcs='+services;
            searchReq.open("GET", URL, true);
			searchReq.onreadystatechange = handleWTBSearch; 
			searchReq.send(null);
		}
	}
}

//Called when the AJAX response is returned.
function handleWTBSearch() {
	var dealerLat, dealerLng, dealerName, dealerAddress, dealerPreferred, dealerLat, dealerLng;
	var response, address, categories, category, info, dealerInfo, ss, results, dealerResult;

	results = "";
	if (searchReq.readyState == 4) {		
		
		if (GoogleMapsFlag==1) {
			bounds = new GLatLngBounds();
			map.clearOverlays();
			ss = document.getElementById('dealerListing');
		} else {
			ss = document.getElementById('dealerListing2');
		}

		// response is in XML
		response = searchReq.responseXML;
		dealers= response.getElementsByTagName('dealer');

		for (var i=0; i < dealers.length; i++) {
			//Build our element string.  This is cleaner using the DOM, but
			//IE doesn't support dynamically added attributes.
			// first grab the XML for this particular dealer and assign it to a var as shorthand
			var dealer = dealers.item(i);

			// we should be safe to assume that the dealer name (at least!) has been specified ...
			dealerName = XMLClean(dealer.getElementsByTagName('dealerName')[0].firstChild.nodeValue);
			dealerPreferred = parseInt(dealer.getElementsByTagName('preferred')[0].firstChild.nodeValue);

			var Latitudes=dealer.getElementsByTagName('latitude');
			 
			if (Latitudes.length!=0) {
				dealerLat = parseFloat(Latitudes[0].firstChild.nodeValue);
			} else {
				dealerLat = 0;
			}
			
			var Longitudes=dealer.getElementsByTagName('longitude');
			
			if (Longitudes.length!=0) {
				dealerLng = parseFloat(Longitudes[0].firstChild.nodeValue);
			} else {
				dealerLng= 0;
			}

			dealerResult  ='<li id="dealerResult'+i+'" ';

			// add real event handlers if GoogleMapsFlag is enabled and this dealer has lat/lng values			
			// and we're still dealing with one of the first maxPermissibleResults dealer results
			if (GoogleMapsFlag==1 && dealerLat!=0 && dealerLng!=0 && i<maxPermissibleResults) {
				dealerResult += 'onmouseover="javascript:dealerOver(this);" ';
				dealerResult += 'onmouseout="javascript:dealerOut(this);" ';
				dealerResult += 'onclick="showBubble('+i+');return false;" ';
			} else {
				dealerResult += 'onmouseover="this.style.cursor='+"'default'" + '"; '; 
				dealerResult += 'onmouseout=null ';
				dealerResult += 'onclick=null ';
			}
			
			dealerResult  +='>';
			
			dealerPreferred = parseInt(dealer.getElementsByTagName('preferred')[0].firstChild.nodeValue);
			var iconImage='<img src="'+pinImageBlank+'" alt="" class="left" />';
			// show non-blank icon if GoogleMapsFlag is disabled or if it is enabled and this dealer has lat/lng values
			if (GoogleMapsFlag==0 || (GoogleMapsFlag==1 && dealerLat!=0 && dealerLng!=0)) {
				if (dealerPreferred==1) {
					iconImage='<img src="'+pinImagePreferred+'" alt="" class="left" />';
				} else {
					//If we have not exceeded the max results and we have a numbered pin use
				    //that instead of the blank pin
				    if (i<maxPermissibleResults & i<pinImages.length) {
					    iconImage='<img src="' + pinImages[i] + '" alt="" class="left" />';
				    }
				}
			}
			dealerResult += iconImage;
			
			dealerAddress = '<strong>'+dealerName+'</strong><br />';
			
			// now we deal with some elements that may or may not be present...
			if (dealer.getElementsByTagName('ContactName').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('ContactName')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address1').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address1')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address2').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address2')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address3').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address3')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('City').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('City')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Region').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Region')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('PostCode').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('PostCode')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Telephone').length !=0) {
				dealerAddress += phoneLabel + ': ' +XMLClean(dealer.getElementsByTagName('Telephone')[0].firstChild.nodeValue) +'<br />'
			}
			if (dealer.getElementsByTagName('Fax').length !=0) {
				dealerAddress += faxLabel + ': ' +XMLClean(dealer.getElementsByTagName('Fax')[0].firstChild.nodeValue) +'<br />';
			}
			var dealerEmail = "";
			if (dealer.getElementsByTagName('Email').length !=0) {
				var email = XMLClean(dealer.getElementsByTagName('Email')[0].firstChild.nodeValue);
				// Build display html
				dealerEmail = '<a href="mailto:'+email+'" title="E-mail reseller">'+emailLabel+'</a><br />';
				// Add this to the address if this dealer does NOT have a map pin, or if we are NOT googlemapping				
				if(dealerLat==0 && dealerLng==0 || GoogleMapsFlag!=1){
					dealerAddress += dealerEmail;
				}
			}
			
			var dealerURL = "";						
			if (dealer.getElementsByTagName('URL').length !=0){
				var URL = XMLClean(dealer.getElementsByTagName('URL')[0].firstChild.nodeValue);
				// Clean out any existing protocol reference
				URL = URL.replace("http://", "", "gi");
				// Make this a link, using the urlLabel
				dealerURL = '<a href="http://'+URL+'" title="'+dealerName+'" target="_blank">'+urlLabel+'</a><br />';
				// Add this to the address if this dealer does NOT have a map pin, or if we are NOT googlemapping
				if(dealerLat==0 && dealerLng==0 || GoogleMapsFlag!=1) {
					dealerAddress += dealerURL;
				}
			}
			
			// We now also want the services to appear on the search results lists
			var dealerServices = "";			
			services= dealer.getElementsByTagName('service');
			for(var k=0; k < services.length; k++) {				
				category = services.item(k);
				info = XMLClean(category.firstChild.nodeValue);
				dealerServices += '<br />' + info;						
			}

			if (GoogleMapsFlag==1) {
				// process any product Categories/Services associated with this dealer and use them to construct the 2nd tab HTML
				dealerInfo = '';
				if (i<maxPermissibleResults) {
					// no point in calculating this stuff for others as they'll never be shown
							
				    if (dealer.getElementsByTagName('categories').length !=0 || dealer.getElementsByTagName('service').length !=0) {
					    categories= dealer.getElementsByTagName('category');
					    for(var j=0; j < categories.length; j++) {
						    category = categories.item(j);
						    info = XMLClean(category.firstChild.nodeValue);
						    dealerInfo += '<h4>'+info+'</h4>';
					    }
					    if(dealer.getElementsByTagName('categories').length !=0 && dealer.getElementsByTagName('service').length !=0){
						    dealerInfo += '<br />';
					    }
					    services= dealer.getElementsByTagName('service');
					    for(var k=0; k < services.length; k++) {
						    category = services.item(k);
						    info = XMLClean(category.firstChild.nodeValue);
						    dealerInfo += '<h4>'+info+'</h4>';						
					    }
				    }
				}
				// Include the address and services
				dealerResult += "<p>" + dealerAddress + dealerServices + "</p>";
			} else {
				document.getElementById('dealerListing2').style.backgroundImage="";
				// display list of Dealer Services as 2nd column in DealerResults
				dealerInfo = '';
				if (dealer.getElementsByTagName('service').length !=0) {
					categories= dealer.getElementsByTagName('service');
					for(var j=0; j < categories.length; j++) {
						category = categories.item(j);
						info = XMLClean(category.firstChild.nodeValue);
						dealerInfo += info+'<br />';
					}
				}
				// Include the address and services
				dealerResult += "<p>" + dealerAddress + dealerServices + "</p>";
				//dealerResult = '<table width="100%"><tr><td width="70%">' + dealerResult + dealerAddress + '</td><td>'  + dealerInfo + '</td></tr></table>';
			}
			
			// Close this dealerResult
			dealerResult += '</li>';
			
			// add to list of results
			results += dealerResult;

			// for first maxPermissibleResults dealers only, pin dealer on map if GoogleMapsFlag is enabled and this dealer has lat/lng values
			// page data values for the tab labels will have been written into variables defined within whereToBuy.tmpl
			if (GoogleMapsFlag==1 && dealerLat!=0 && dealerLng!=0 && i<maxPermissibleResults) {
				createMarker(dealerLat,dealerLng,dealerPreferred,dealerAddress,dealerEmail,dealerURL,dealerInfo,i)
			}
		}
		
		if (dealers.length!=0) {
			// display list of results
			ss.innerHTML = "<ol>"+results+"</ol>";
		} else {
			ss.innerHTML = noDealersMsg;
		}
		if (GoogleMapsFlag!=1)
		{
			// Remove existing dealerListContainer
			var tmpnode1 = document.getElementById('dealerListContainer');
			if (tmpnode1)
			{
				var tmpnode2 = tmpnode1.parentNode;
				if (tmpnode2)
				{
					tmpnode2.removeChild(tmpnode1);
				}
			}
			// wrap results in dealerListContainer and dealerListing for styles
			ss.innerHTML = '<div id="dealerListContainer"><div id="dealerListing">' + ss.innerHTML + '</div></div>';
		}
	}
}


function addressToLatLng(address,callbackFunction) {
// callbackFunction is the one that will be called once the LatLng value has been returned	
	if (geocoder) {
		geocoder.getLatLng(address, callbackFunction);
	}else{
		alert("no geocoder, so no getLatLng results");	
	}
}


function showLatLng(point) {
	if (!point) {
		alert('Address not found!');
	} else {
		// could do anything with the results here, but for now we'll just output them via an alert
		alert('Latitude:' + point.lat() + ', Longitude:' + point.lng());
	}
}	


function showCountry(point) {
	if (!point) {
		alert('Country not found!');
	} else {
		map.setCenter(point,5);
	}
}	


function showNearestAddresses(postCode) {
	// this will actually accept anything - it doesn't HAVE to be a postcode !!!
	// append countryName to it - some postcodes may be too generic
	// better accuracy is achieved, e.g. with Belgium 2000 => Antwerpen
	if (geocoder) {
		// if we're potentially dealing with a UK postocde, first validate it and return it in a standard form
		if (countryName=="UK") {
			if (checkPostCode(postCode)) {
				// if it is a valid postcode, get it again in standard form with space inserted
				postCode = checkPostCode(postCode);
			}  // otherwise asssume it isn't a proper postcode and just use it "as is" as it'll probably be a town
		}

		// MC 468 - erase countryName if Belgium or Switzerland_France, to prevent it being
		// appended inappropriately to, e.g. Luxembourg addresses, which would prevent geocoding
		if ((countryName=="Belgium") || (countryName=="Switzerland_France")) {
			countryName = "";	
		}			

        var translatedCountry = countryName;

        //Localised country name not null and not empty
        if (typeof(localisedCountry) != "undefined" &&             
            localisedCountry != null && 
            localisedCountry != "" )
        {
            //alert(typeof localisedCountryName);
            translatedCountry = localisedCountry;
        }
        
        //Country base code not null and not empty
        if (typeof(countryBaseCode) != "undefined" &&             
            countryBaseCode != null && 
            countryBaseCode != "" )
        {
            try
            {
                geocoder.setBaseCountryCode(countryBaseCode); //Bias to local Google Maps
            }
            catch(err)
            {
                //Unable to set the country code, default to standard search
            }            
        }
        
		geocoder.getLatLng(postCode + " " + translatedCountry,
			function(point) {
				if (!point) {
					alert('Address: '+ postCode + " not found!");
				} else {
					// call server-side code via Ajax to calc nearest dealers to this point
					// then show list of those dealers and put them on map too ... etc etc 
					wtbGetClosestDealers(point);
				}
			}
		);
	}
}


//  query db and return list of the closest maxNumberDealerResults dealers to the supplied location
// the value of distanceUnits will be either 'M' or 'K' and will have been written into whereToBuy.tmpl
function wtbGetClosestDealers(point) {
    //alert("calling wtbGetClosestDealers");

	var Latitude = point.lat();
	var Longitude = point.lng();
	
	if (searchReq.readyState == 4 || searchReq.readyState == 0) {
		var now = new Date();		
		// apply threshold in case opco has specified too large a value
		//DOESNT SEEM TO BE USED
//		var maxResults = document.getElementById('maxNumberDealerResults').value;
//		if (maxResults > dealerCountThreshold) {
//			maxResults = dealerCountThreshold;
//		}
		
		var categories="";
		var services="";
		
		if (advancedSearchEnabled==1) {
			// deduce what filters to apply and create appropriate list to append to URL
			//document.getElementById('filterCount').value=0;
			
			var checkboxes = document.getElementsByName('dealerCategory');
			for (var i = 0; i < checkboxes.length; i++) {
				if (checkboxes[i].checked == true) {
					categories+=checkboxes[i].value+"|";
				}
			}

			checkboxes = document.getElementsByName('dealerService');
			for (var i = 0; i < checkboxes.length; i++) {
				if (checkboxes[i].checked == true) {
					services+=checkboxes[i].value+"|";
				}
			}
		}
        var URL = '/includes/Pages/wtbGetClosestDealers.aspx?lat='+Latitude+'&lng='+Longitude;
		searchReq.open("GET", URL, true);
		searchReq.onreadystatechange = handleWTBGetClosestDealers; 
		searchReq.send(null);
	}		
}


//Called when the AJAX response is returned.
function handleWTBGetClosestDealers() {
	var address = null;
	var distance = null;
	var dealerLat, dealerLng, dealerName, dealerAddress, dealerPreferred, dealerLat, dealerLng;
	var response, dealerInfo, categories, category, info, ss, results, dealerResult;

// no need to check GoogleMapsFlag within this function as it MUST be enabled if we're doing this kind of search

	results = "";
	if (searchReq.readyState == 4) {
		bounds = new GLatLngBounds();
		map.clearOverlays();
		ss = document.getElementById('dealerListing');

 		ss.innerHTML = '';

		// response is in XML
		response = searchReq.responseXML;
		dealers= response.getElementsByTagName('dealer');
		
		for(var i=0; i < dealers.length; i++) {
			//Build our element string.  This is cleaner using the DOM, but
			//IE doesn't support dynamically added attributes.
			// first grab the XML for this particular dealer and assign it to a var as shorthand
			var dealer = dealers.item(i);

			// we should be safe to assume that the dealer name (at least!) has been specified ...
			dealerName = XMLClean(dealer.getElementsByTagName('dealerName')[0].firstChild.nodeValue);
			dealerPreferred = parseInt(dealer.getElementsByTagName('preferred')[0].firstChild.nodeValue);
			
			dealerResult  ='<li id="dealerResult'+i+'" ';
			if (i<maxPermissibleResults) {
				dealerResult += 'onmouseover="javascript:dealerOver(this);" ';
				dealerResult += 'onmouseout="javascript:dealerOut(this);" ';
				dealerResult += 'onclick="showBubble('+i+');return false;" ';
			} else {
				dealerResult += 'onmouseover="this.style.cursor='+"'default'" + '"; ';
				dealerResult += 'onmouseout=null ';
				dealerResult += 'onclick=null ';
			}
			dealerResult  +='>';

			dealerPreferred = parseInt(dealer.getElementsByTagName('preferred')[0].firstChild.nodeValue);
			
			var iconImage='<img src="'+pinImageBlank+'" alt="" class="left" />';
			// show non-blank icon if GoogleMapsFlag is disabled or if it is enabled and this dealer has lat/lng values
			if (dealerPreferred==1) {
                iconImage='<img src="'+pinImagePreferred+'" alt="" class="left" />';
			} else {
				if (i<maxPermissibleResults & i<pinImages.length) {
					iconImage='<img src="' + pinImages[i] + '" alt="" class="left" />';
				}
			}
			dealerResult += iconImage;
			dealerAddress = '<strong>'+dealerName+'</strong><br />';
			
			// now we deal with some elements that may or may not be present...
			if (dealer.getElementsByTagName('ContactName').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('ContactName')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address1').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address1')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address2').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address2')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Address3').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Address3')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('City').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('City')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Region').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('Region')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('PostCode').length !=0) {
				address = XMLClean(dealer.getElementsByTagName('PostCode')[0].firstChild.nodeValue);
				dealerAddress += address + '<br />'
			}
			if (dealer.getElementsByTagName('Telephone').length !=0) {
				dealerAddress += phoneLabel + ': ' +XMLClean(dealer.getElementsByTagName('Telephone')[0].firstChild.nodeValue) +'<br />';
			}
			if (dealer.getElementsByTagName('Fax').length !=0) {
				dealerAddress += faxLabel + ': ' + XMLClean(dealer.getElementsByTagName('Fax')[0].firstChild.nodeValue) +'<br />';
			}
			var dealerEmail = "";
			if (dealer.getElementsByTagName('Email').length !=0) {
				var email = XMLClean(dealer.getElementsByTagName('Email')[0].firstChild.nodeValue);
				dealerEmail = '<a href="mailto:'+email+'" title="E-mail reseller">'+emailLabel+'</a><br />';
				// Add this to the address if this dealer does NOT have a map pin				
				if(dealerLat==0 && dealerLng==0){
					dealerAddress += dealerEmail;
				}
			}
			var dealerURL = "";
			if (dealer.getElementsByTagName('URL').length !=0) {
				var URL = XMLClean(dealer.getElementsByTagName('URL')[0].firstChild.nodeValue);
				// Clean out any existing protocol reference, so we do not duplicate this
				URL = URL.replace("http://", "", "gi");
				// Make this a link, using the urlLabel
				dealerURL = '<a href="http://'+URL+'" title="'+dealerName+'" target="_blank">'+urlLabel+'</a><br />';
				// Add this to the address if this dealer does NOT have a map pin
				if (dealerLat==0 && dealerLng==0) {
					dealerAddress += dealerURL;
				}
			}
			
			distance = parseFloat(dealer.getElementsByTagName('distance')[0].firstChild.nodeValue).toFixed(2);
			distance += (distanceUnits=='M' ? ' miles' : ' km');
						
			var dealerServices = "";			
			var services= dealer.getElementsByTagName('service');
			for(var k=0; k < services.length; k++) {				
				category = services.item(k);
				info = XMLClean(category.firstChild.nodeValue);
				dealerServices += '<br />' + info;						
			}
			
			// close this dealerResult
			dealerResult += "<p>" + dealerAddress + dealerServices + "</p>";
			dealerResult += "</li>";
			
			// and add to list
			results += dealerResult;
 
			dealerLat = parseFloat(dealer.getElementsByTagName('latitude')[0].firstChild.nodeValue);
			dealerLng = parseFloat(dealer.getElementsByTagName('longitude')[0].firstChild.nodeValue);

			// process any product Categories/Services associated with this dealer and use them to construct the 2nd tab HTML
			dealerInfo = '';
			// no point in calculating this stuff for others as they'll never be shown
			if (i<maxPermissibleResults) {
				if (dealer.getElementsByTagName('categories').length !=0 || dealer.getElementsByTagName('service').length !=0) {
					categories= dealer.getElementsByTagName('category');
					for(var j=0; j < categories.length; j++) {
						category = categories.item(j);
						dealerInfo += '<h4>'+XMLClean(category.firstChild.nodeValue)+'</h4>';
					}
					if(dealer.getElementsByTagName('categories').length !=0 && dealer.getElementsByTagName('service').length !=0){
						dealerInfo += '<br />';
					}
					services= dealer.getElementsByTagName('service');
				    for(var k=0; k < services.length; k++) {
					    category = services.item(k);
					    dealerInfo += '<h4>'+XMLClean(category.firstChild.nodeValue)+'</h4>';						
				    }
				}
			}
			
			// pin the dealer on the map if it's one of the first maxPermissibleresults dealers
			// page data values for the tab labels will have been written into variables defined within whereToBuy.tmpl
			if (i<maxPermissibleResults){
				createMarker(dealerLat, dealerLng, dealerPreferred, dealerAddress, dealerEmail, dealerURL, dealerInfo, i, distance);
			}
		}
			
        if (dealers.length!=0) {
	        // display list of results
	        ss.innerHTML = "<ol>"+results+"</ol>";
        } else {
	        ss.innerHTML = noDealersMsg;
        }
		if (GoogleMapsFlag!=1) ss.innerHTML = '<div id="dealerListContainer"><div id="dealerListing">' + ss.innerHTML + '</div></div>';
	}
}

function getSearchCriterion() {
    //alert("calling getSearchCriterion");
	
	// If there is only one radio button we cannot treat this as an array
	if (document.aspnetForm.searchCriterion.length == undefined){
		var rad_val = document.aspnetForm.searchCriterion.value;
		return rad_val;
	}else{
		// NB this assumes that one of the radio buttons is checked
		for (var i=0; i < document.aspnetForm.searchCriterion.length; i++)  {
			if (document.aspnetForm.searchCriterion[i].checked) {
			      var rad_val = document.aspnetForm.searchCriterion[i].value;
			      return rad_val;
			}
		}
	}
}


function setSearchCriterion(criterion) {
	
	// If there is only one radio button we cannot treat this as an array
	if (document.aspnetForm.searchCriterion.length == undefined) {
		if (document.aspnetForm.searchCriterion.value==criterion) {
			document.aspnetForm.searchCriterion.checked = true;
		} else {
		    document.aspnetForm.searchCriterion.checked = false;
		}
	} else {
		for (var i=0; i < document.aspnetForm.searchCriterion.length; i++) {
			document.aspnetForm.searchCriterion[i].checked = false;
			if (document.aspnetForm.searchCriterion[i].value==criterion) {
				document.aspnetForm.searchCriterion[i].checked = true;
			}
		}
	}
}

function setInitialSearchCriterion(criterion) {
	
	// If there is only one radio button we cannot treat this as an array
	if (document.getElementById('PostcodeEnabled')) {
		setSearchCriterion('Postcode');
	} else if (document.getElementById('CityEnabled')) {
	    setSearchCriterion('City');
	} else if (document.getElementById('RegionEnabled')) {
        setSearchCriterion('Region');
    }
}
				
				
function reZoom() {
	map.setZoom(map.getBoundsZoomLevel(bounds));
	map.setCenter(bounds.getCenter());
}


function createMarker(lat,lng,preferredFlag,address,email,url,info,index,distance) {
// creates the marker, stores details in arrays, and sets up the event window
	var dealerMarker, dealerIcon, markerOptions;
	var point = new GLatLng(lat,lng);
	
	dealerIcon = new GIcon(G_DEFAULT_ICON);
	dealerIcon.iconSize = new GSize(19,32);
	// select icon image
	if (preferredFlag==1) {
		dealerIcon.image = pinImagePreferred;
	} else {
		dealerIcon.image = pinImages[index];
	}
	
	dealerIcon.shadowSize = new GSize(42,35);
	dealerIcon.shadow = pinImageDealerShadow;
	markerOptions = { icon:dealerIcon };
	dealerMarker = new GMarker(point, markerOptions);
	
	if(distance){
		distance += ': ';
	}else{
		distance = "";
	}
        
	// add to arrays
	markers[index] = dealerMarker;
	tab1html[index] = address;
	tab1html[index] += email;
	tab1html[index] += url;
	// add a Directions link, leading to a map centred on this point as a start address
	tab1html[index] += '<br />' + distance + '<a style="text-decoration:underline" href="http://maps.google.com/maps?saddr=&daddr=' + point.toUrlValue() + '" target ="_blank">' + directionsLabel + '</a>';	
	
    // add some padding to prevent any of the content being overlapped by the close bubble X
    tab1html[index] = '<div class="infoWindowContents">'+tab1html[index]+'</div>';
    
    tab2html[index] = info;
    
    // add some padding to prevent any of the content being overlapped by the close bubble X
    if (info !="") {
	    tab2html[index] = '<div class="infoWindowContents">'+tab2html[index]+'</div>';
	}
        
        GEvent.addListener(dealerMarker, "click", function() {
		showBubble(index);
        });

	map.addOverlay(dealerMarker);
	bounds.extend(point);
	reZoom();

}

function toggleAdvancedSearchPanel() {
	if (document.getElementById('advancedSearchPanel').style.display=="none"	) {
		document.getElementById('advancedSearchPanel').style.display = "block";
		// also hide search results area if necessary
		if (GoogleMapsFlag==1) {
			document.getElementById('dealerListing').style.display = "none";
		}
	} else {
		document.getElementById('advancedSearchPanel').style.display = "none";
		// also hide search results area if necessary
		if (GoogleMapsFlag==1) {
			document.getElementById('dealerListing').style.display = "block";
		}
	}
}


function XMLClean(XMLString) {
	XMLString.replace("&amp;", "&", "gi");
	XMLString.replace("&lt;", "<", "gi");
	XMLString.replace("&gt;", ">", "gi");
	return XMLString;
}


function JavascriptClean(JString) {
	JString.replace("'","\\\\\\'","gi");
	JString.replace('"','\\\\\\"','gi');
	return JString;
}

function toUnicode(JString) {
// NB this doesn't Unicode the whole string, just quote and double-quote characters	
	var cleanedString='';
	for (var i=0; i<JString.length; i++) {
		if (JString[i] == "\'") {
			cleanedString += "\\u0027";
		} else if (JString[i] == '\"') {
			cleanedString += "\\u0022";
		} else {
			cleanedString += JString.substr(i,1);
		};
	}
	return cleanedString.replace("'", "\\'", "gi");
}	
