var mapContainerId = '';
var resultsContainerId = 'resultDiv';
var resultsDivId = 'resultOutput';
var resultsSpanId = 'locMessage';
var dealerDropDown = 'dealerFinderList';
var dealerSearchText = 'dealerLocatorSearchText';
var currentDealerIndex = -1;
var dealersFound;
s.products = ""; //Omniture: Clear down s.products to populate with DealerIDs
var separator;

var dealersToDisplay = 9;
var defaultZoomLevel = 12;

var minLat = 49;
var maxLat = 61;
var minLon = -8;
var maxLon = 2;

var searchLocation;

var map = null;

function DashboardOn() {if (map != null) map.ShowDashboard();}
function DashboardOff() {if (map != null) map.HideDashboard();}

function getMap(mapContainer) {

    if (mapContainer != null) 
    {
        mapContainerId = mapContainer;

		// Dispose the map if previously loaded.
		if (map != null)
		{
			map.Dispose();
		}
		
        map = new VEMap(mapContainerId);
		map.SetDashboardSize(VEDashboardSize.Normal);
        map.LoadMap();
        map.ShowDisambiguationDialog(false);
        map.DisambiguationCallback = DisambiguateLocation;
        map.SetScaleBarDistanceUnit(VEDistanceUnit.Miles);
    }
}  

function findLocation(searchValue) {

    if (map != null)
    {
        map.Clear(); 
        map.DisambiguationCallback = DisambiguateLocation;
        searchLocation = null; 
        map.Find(null,							// what
			searchValue + ", United Kingdom",	// where
			null,	// VEFindType (always VEFindType.Business, relates to what search)
			null,	// VEShapeLayer
			null,	// start index for results (0 by default)
			null,	// max number of results (default = 10, range 0 - 20)
			false,	// show results (default is true)
			null,	// create pushpin for what results
			false, // use default disambiguation (default is true)
			null,	// set best map view (default is true)
			onFoundResults
		);
    }
}

function getServicesRequired() {

    var serviceCheckboxes = $("services").getElements('input[name=dealer_services]');
    var serviceSearch = new Array;
    
    for (var i = 0; i < serviceCheckboxes.length; i++)
    {
        if ($(serviceCheckboxes[i]).checked)
        {
            //serviceSearch[serviceSearch.length] = serviceCheckboxes[i].value;
            var srchService = {
                ID : serviceCheckboxes[i].id,
                Name : serviceCheckboxes[i].value
                }

            serviceSearch[serviceSearch.length] = srchService;
        }
    }
    
    return serviceSearch;
}

// (shapeLayer, findResults, places, moreResults, errorMsg)
function onFoundResults(shapeLayer, findResults, e, moreResults, errorMsg) {
	var searchValue = '';
	searchValue = $('dealerLocatorSearchText').value;

	if (e == null || e.length == 0 || e[0].Name.toLowerCase() == 'united kingdom')
	{
		alert("No results. Please try a different search or check the spelling.");
		return;
	}
	//alert("places count:"+e.length);
	var entryFound = false;
	var pos = 0;
	for (var i=0; i < e.length; i++)
	{
		if (e[i].Name.substr(0, searchValue.length+1).toLowerCase().replace(" ", "") == searchValue.toLowerCase().replace(" ", "") + ",")
		{
			entryFound = true;
			pos = i;
			break;
		}
	}

    if (e.length == 1 || entryFound)
    {
        if (e[pos].LatLong.Latitude > minLat && e[pos].LatLong.Latitude < maxLat &&
            e[pos].LatLong.Longitude > minLon && e[pos].LatLong.Longitude < maxLon)
        {
            var serviceSearch = getServicesRequired();
            var serviceId = '', serviceName = '';
            
            for (var i = 0; i < serviceSearch.length; i++)
            {
                serviceId += (serviceId != '' ? "," : "") + serviceSearch[i].ID;
                serviceName += (serviceName != '' ? "," : "") + serviceSearch[i].Name;
            }
            
            var searchFor = '';
            
            if ($(dealerSearchText) != null)
                searchFor = $(dealerSearchText).value;
                
            window.location = 'Location.aspx?id=' + encodeURI(e[pos].ID) + '&lat=' + 
                e[pos].LatLong.Latitude + '&lon=' + 
                e[pos].LatLong.Longitude + 
                (serviceSearch.length > 0 ? "&serviceId=" + serviceId + "&serviceName=" + serviceName : "") + 
                "&type=1&q=" + searchFor;
        }
    }
    else
    {
		DisambiguateLocation(e);
    }
}    

function DisambiguateLocation(e) {

    var results = "";
    var bFound = false;
    
    var serviceSearch = getServicesRequired();

    var serviceSearch = getServicesRequired();
    var serviceId = '', serviceName = '';
    
    for (var i = 0; i < serviceSearch.length; i++)
    {
        serviceId += (serviceId != '' ? "," : "") + serviceSearch[i].ID;
        serviceName += (serviceName != '' ? "," : "") + serviceSearch[i].Name;
    }

    var searchFor = '';
    
    if ($(dealerSearchText) != null)
        searchFor = $(dealerSearchText).value;
        
    for (var i = 0; i < e.length; i++) {
    
		var placeName = e[i].ID;
		if (placeName == 'undefined' || placeName == null || placeName == '')
		{
			placeName = e[i].Name;
		}
    
        if (e[i].LatLong.Latitude > minLat && e[i].LatLong.Latitude < maxLat &&
            e[i].LatLong.Longitude > minLon && e[i].LatLong.Longitude < maxLon)
        {
            bFound = true;
            results += "<li><a href='Location.aspx?id=" + encodeURI(e[i].ID) + "&lat=" + 
                e[i].LatLong.Latitude + "&lon=" + 
                e[i].LatLong.Longitude + 
                (serviceSearch.length > 0 ? "&serviceId=" + serviceId + "&serviceName=" + serviceName : "") + 
                "&type=1&q=" + searchFor + "'>" + placeName + "</a></li>";
        }
    }
    
    if (bFound)
    {
	// TouchClarity Tracking
	tc_log('/dealer_locator/multiple_locations.htm');

        document.getElementById(resultsDivId).innerHTML = "<ul>" + results + "</ul>";
        document.getElementById(mapContainerId).visibility = 'visible';
        document.getElementById(resultsContainerId).style.visibility = 'visible';
        
        var msg = $(resultsSpanId);
        
        if (msg != null)
        {
            msg.innerHTML = msg.innerHTML.replace('{0}', $(dealerSearchText).value);
            msg.style.display = 'inline';
        }
    }
}

function hideDiv(obj) {
    if (obj != null)
        obj.style.visibility = 'hidden';
}

function addPin(pinLatitude, pinLongitude, pinId, pinTitle, pinDescription) {
	if (pinLatitude == 0 && pinLongitude == 0)
	{
		document.getElementById('mapPane').style.height = '0px';
		document.getElementById('noMap').style.height = '400px';
		document.getElementById('mapPane').style.visibility = 'hidden';
		document.getElementById('noMap').style.visibility = 'visible';
	}
	else
	{
		document.getElementById('mapPane').style.visibility = 'visible';
		document.getElementById('noMap').style.visibility = 'hidden';
		document.getElementById('mapPane').style.height = '400px';
		document.getElementById('noMap').style.height = '0px';
		 var pin = new VEPushpin(
			  pinId, 
			  new VELatLong(pinLatitude, pinLongitude), 
			  null, 
			  pinTitle, 
			  pinDescription
			  );
	        
		 try
		 {
			  map.AddPushpin(pin);
		 }
		 catch (errPushpin)
		 {
		 }
    }
}

function getDirections(startLocation) {

    if (startLocation.value !='')
    {
        if (currentDealerIndex > -1)
        {
            // TouchClarity Tracking
            tc_log('/dealer_locator/routeplanner.htm?dealer_id=' + dealersFound[currentDealerIndex].DealerId);

            var locations = new Array();
            locations[0] = startLocation.value;
            locations[1] = new VELatLong(dealersFound[currentDealerIndex].Latitude,  dealersFound[currentDealerIndex].Longitude);
            var routeOptions = new VERouteOptions();
            routeOptions.RouteCallback = foundDirectionsResults_Callback;
            map.GetDirections(locations, routeOptions);
        }
    }
}

function directionsDisambiguate(e) {

    var results = "";
    
    for (var i = 0; i < e.length; i++)
        results += "<li><a href='javascript: hideDiv(document.getElementById(\"resultDiv\")); showRoute(" + 
            e[i].LatLong.Latitude + ", " + 
            e[i].LatLong.Longitude + ", " + 
            dealersFound[currentDealerIndex].Latitude + ", " + 
            dealersFound[currentDealerIndex].Longitude + ");'>" + e[i].ID + "</a></li>";

    document.getElementById(resultsDivId).innerHTML = "<ul>" + results + "</ul>";
    document.getElementById(resultsContainerId).style.visibility = 'visible';
    
    
}

function foundDirectionsResults_Callback(e) {

    if (e.RouteLegs.length > 0)
    {
        showRoute(e.RouteLegs[0].StartLocation.Latitude,
            e.RouteLegs[0].StartLocation.Longitude, 
            dealersFound[currentDealerIndex].Latitude, 
            dealersFound[currentDealerIndex].Longitude);
    }
}    

function showRoute(startLatitude, startLongitude, endLatitude, endLongitude) {

    map.GetRoute(
        new VELatLong(startLatitude, startLongitude), 
        new VELatLong(endLatitude, endLongitude), 
        VEDistanceUnit.Miles, 
        VERouteType.Shortest, 
        getRoute_Callback);
}

function getRoute_Callback(route)
{
    $('itinerarySteps').innerHTML = '';
    
    for (var i = 0; i < route.Itinerary.Segments.length; i++)
    {
        var newLi = document.createElement("li");

        if (i % 2 == 0)
        {
            newLi.className = "alt";
        }
        
        $('itinerarySteps').appendChild(newLi);

        var newDiv = document.createElement("div");
        
        if (i == route.Itinerary.Segments.length - 1)
        {
            newDiv.className = 'routeLastStep';
        }
        else if (i != 0)
        {
            newDiv.className = 'routeStepNumber';
            newDiv.innerHTML = i;
        }
        else
        {
            newDiv.className = 'routeFirstStep';
        }
        
        newLi.appendChild(newDiv);
        
        newDiv = document.createElement("div");
        newDiv.className = 'routeStep';
        newDiv.innerHTML = route.Itinerary.Segments[i].Instruction + 
            " (" + route.Itinerary.Segments[i].Distance + route.Itinerary.DistanceUnit + ")";;
        
        newLi.appendChild(newDiv);
        
        newDiv = document.createElement("div");
        newDiv.className = 'clear';
        
        newLi.appendChild(newDiv);
    }
    
    $('dealerDirections').style.visibility = 'visible';
    $('directionsHeader').style.visibility = 'visible';
}

function showDealerOnMap(dealerIndex, centreAndZoom) {

    map.DeleteAllPushpins();

    var dealerAddress = '';
    dealerAddress = dealersFound[dealerIndex].Address1;
    dealerAddress += (dealerAddress != '' ? ', ' : '') + dealersFound[dealerIndex].Address2;
    dealerAddress += (dealerAddress != '' ? ', ' : '') + dealersFound[dealerIndex].Town;
    dealerAddress += (dealerAddress != '' ? ', ' : '') + dealersFound[dealerIndex].ZipCode;
    
    addPin(dealersFound[dealerIndex].Latitude, 
        dealersFound[dealerIndex].Longitude, 
        dealerIndex, 
        dealersFound[dealerIndex].DealerName.toTitleCase(), 
        "<p>" + dealerAddress + "</p>");

    if ($('mainHeader') != null) $('mainHeader').innerHTML = dealersFound[dealerIndex].DealerName;
    if ($('searchMsg') != null && $('searchDealerCopy') != null && $('searchText') != null && $('searchMsg').innerHTML == '') 
        $('searchMsg').innerHTML = $('searchDealerCopy').innerHTML.replace('{0}', $('searchText').value);

    if (centreAndZoom && $defined(defaultZoomLevel))
    {   

        var zoomLevel = defaultZoomLevel;
		var dealerId;
		if(dealersFound && dealersFound[0]) {
			dealerId = dealersFound[0].DealerId;
		}
		/*Further zoom level in for the flagship branch as requested*/
		if(dealerId && dealerId == '0049007') {
			zoomLevel = 14
		}
		//console.debug(zoomLevel);
        map.SetCenterAndZoom(
            new VELatLong(dealersFound[dealerIndex].Latitude, dealersFound[dealerIndex].Longitude), 
            zoomLevel);
    }
}

function displayDealerDetails(dealerIndex) {

    s.eVar35 = 'postcode'; // tell omniture this is a search by postcode
    if (mapContainerId == '')
        getMap('mapPane');
        
    $('itinerarySteps').innerHTML = '';

    if (dealerIndex != null)
    {
        currentDealerIndex = dealerIndex;
		$('dealerFinderList').options[currentDealerIndex].selected = true;

        var count = 1, currentIndex = 0;
        
        for (var i = 0; i < dealersFound.length; i++)
        {
            if (i == dealerIndex)
            {
                if ($('mainHeader') != null) $('mainHeader').innerHTML = dealersFound[i].DealerName;
                if ($('searchMsg') != null && $('searchLocCopy') != null && $('searchText') != null && $('searchMsg').innerHTML == '') 
                    $('searchMsg').innerHTML = $('searchLocCopy').innerHTML.replace('{0}', $('searchText').value);

                if ($('searchServiceName') != null && $('searchServiceCopy') != null && $('searchServiceName').value != '')
                {
                    var services = $('searchServiceName').value.replace(',', ', ');
                    
                    $('searchMsg').innerHTML += $('searchServiceCopy').innerHTML.replace('{1}', services);
                }

                currentIndex = 1;
            }
            else
            {
                count++;
                currentIndex = count;
            }
            if (currentIndex > 1) {
				$('btnDealerDirections' + currentIndex).href = "javascript: window.scrollTo(0,150); showDealerOnMap(" + i + ", true); displayDealerDetails(" + i + ");";
            }

            var sAddress = dealersFound[i].Address1;
            sAddress += (sAddress != "" && dealersFound[i].Address2 != "" ? ", " : "") +
                dealersFound[i].Address2;
            sAddress += (sAddress != "" && dealersFound[i].Town != "" ? ", " : "") +
                dealersFound[i].Town;
            sAddress += (sAddress != "" && dealersFound[i].ZipCode != "" ? ", " : "") +
                dealersFound[i].ZipCode;
            
            $('dealerName' + currentIndex).innerHTML = dealersFound[i].DealerName;
            if ($defined(dealersFound[i].Distance)) $('dealerDistance' + currentIndex).innerHTML = dealersFound[i].Distance.toFixed(2);//Math.round(dealersFound[i].Distance);
            else $('dealerDistanceContainer' + currentIndex).style.visibility = 'hidden';

            if (dealersFound[i].Rating <= 0){
                $('dealerRating' + currentIndex).addClass('ratingNoStar');
                $('whatisthis' + currentIndex).set('class', 'tooltipWithoutRating');
                $('score' + currentIndex).innerHTML = 'Not yet rated';
            }else{
                $('dealerRating' + currentIndex).addClass('starRating' + dealersFound[i].Rating);
                $('score' + currentIndex).innerHTML = dealersFound[i].Rating +' star(s)';
                $('whatisthis' + currentIndex).set('class', 'tooltipWithRating');
            }
            setToolTips();
                       
            $('dealerAddress' + currentIndex).innerHTML = sAddress;
            $('dealerDetailsLink' + currentIndex).href = "/dealer/Default.aspx?dealerId=" + escape(dealersFound[i].DealerId);
            
            if (dealersFound[i].Telephone != null) $('dealerPhone' + currentIndex).innerHTML = dealersFound[i].Telephone;
            if (dealersFound[i].Fax != null) $('dealerFax' + currentIndex).innerHTML = dealersFound[i].Fax;
            
            // Touch Clarity Tracking
            if (currentIndex < 2) {
                $('dealerPrintButton' + currentIndex).href = "javascript: PrintDealer('"+i+"');";
            }
                        
            $('dealerServicesDetails' + currentIndex).innerHTML = '';
            
            if (dealersFound[i].Services == null || dealersFound[i].Services.length == 0)
            {
                $('dealerServices' + currentIndex).style.display = 'none';
            }
            else if (dealersFound[i].Services.length > 0)
            {
                $('dealerServices' + currentIndex).style.display = 'block';
                
                for (var j = 0; j < dealersFound[i].Services.length; j++)
                {
                    $('dealerServicesDetails' + currentIndex).innerHTML += ($('dealerServicesDetails' + currentIndex).innerHTML != "" ? "<br />" : "") + dealersFound[i].Services[j].Name;
                }
            }

            $('currentDealerId' + currentIndex).value = dealersFound[i].DealerId;
            $('dealerPage' + currentIndex).href = "/dealer/Default.aspx?dealerId=" + dealersFound[i].DealerId;
            
            //Omniture variables
            
            if (i >= dealersFound.length - 2){
                separator = "";
            }else{
                separator = ",";
            }
            s.products = s.products + ';'+ dealersFound[i].DealerId + separator;
           
        }

        if (dealersFound.length < dealersToDisplay) {

            for (var i = dealersFound.length; i < dealersToDisplay; i++) {
                var hideDealerInd = i + 1;
                $('dealerDetails' + hideDealerInd).style.visibility = 'hidden';
                $('dealerServicesHeader' + hideDealerInd).style.display = 'none';
                $('dealerHeader' + hideDealerInd).style.display = 'none';
            }
        }
        
        if ($defined(defaultZoomLevel))
        {    
            map.SetCenterAndZoom(
                new VELatLong(dealersFound[dealerIndex].Latitude, dealersFound[dealerIndex].Longitude), 
                defaultZoomLevel);
        }

        // [TODO] Not sure that this is doing anything any more...
        if ($defined(searchLocation))
        {
            var iZoom = 15;
            var mapResolution = 0;
            
            for (var zoomLevel = 15; zoomLevel > 0; zoomLevel--)
            {
                mapResolution = 156543.04 * Math.cos(searchLocation.Latitude * Math.PI / 180) / (Math.pow(2, zoomLevel));
                
                if (Math.round((mapResolution * parseInt($(mapContainerId).style.width) / 2000)) > dealersFound[dealerIndex].Distance)
                {
                    map.SetCenterAndZoom(searchLocation, zoomLevel - 1);
                    break;
                }
            } 
        }
    }
    
    if ($('routePlannerInput').value != '') {
        getDirections($('routePlannerInput'));
    }
}

function GetDealerId(dealerIndex) {
	return dealersFound[dealerIndex].DealerId;
}

function PrintDealer(dealerIndex) {
    tc_log('/dealer_locator/results_print.link?dealer_id=' + dealersFound[dealerIndex].DealerId +
        '&location=' + dealersFound[dealerIndex].Town +
        '&dealer_name=' + dealersFound[dealerIndex].DealerName);
    window.print();
}

function DegreesToRadians(degrees) {return degrees * Math.PI / 180;}

function CosineLawDistance(point1Latitude, point1Longitude, point2Latitude, point2Longitude)
{
    var R = 6371; // earth's mean radius in km
    var d = Math.acos(Math.sin(DegreesToRadians(point1Latitude))*Math.sin(DegreesToRadians(point2Latitude)) +
            Math.cos(DegreesToRadians(point1Latitude))*Math.cos(DegreesToRadians(point2Latitude))*Math.cos(DegreesToRadians(point2Longitude)-DegreesToRadians(point1Longitude))) * R;
    return d;
}

function dealerOffersServices(testServices, testDealer)
{
    var returnValue = false;

    if (testDealer.Services.length > 0)
    {
        returnValue = true;
        
        for (var j = 0; j < testServices.length; j++)
        {
            var serviceFound = false;

            for (var k = 0; k < testDealer.Services.length; k++)
                if (testDealer.Services[k].ID == testServices[j].ID)
                {
                    serviceFound = true;
                    break;
                }
            
            if (!serviceFound)
            {
                returnValue = false;
                break;
            }
        }
    }
    
    return returnValue;
}

function locateNearestDealers(dealerList, searchLatitude, searchLongitude, searchId, services) {

    var foundDealerCount = 0;
    
    if (searchLocation == null)
    {
        searchLocation = new VELatLong(searchLatitude, searchLongitude);
    }

    var nearestDealers = new Array(dealersToDisplay);

    for (var i = 0; i < dealerList.length; i++) 
    {
        var bServicesOk = true;
        
        if (services.length > 0)
        {
            bServicesOk = dealerOffersServices(services, dealerList[i]);
        }
        
        if (bServicesOk)
        {
            if (foundDealerCount < dealersToDisplay) 
                foundDealerCount++;
            
            var dealerDistance = CosineLawDistance(
                searchLatitude, 
                searchLongitude, 
                dealerList[i].Latitude, 
                dealerList[i].Longitude);
            
            for (var j = 0; j < nearestDealers.length; j++)
            {
                var addDealer = false;
                
                addDealer = nearestDealers[j] == null;

                if (!addDealer && dealerDistance < nearestDealers[j].Distance)
                {
                    addDealer = true;

                    for (var k = nearestDealers.length - 1; k > j; k--)
                    {
                        nearestDealers[k] = nearestDealers[k - 1];
                    }
                }
                
                if (addDealer)
                {
                    dealerList[i]['Distance'] = dealerDistance;
                    nearestDealers[j] = dealerList[i];
                    
                    break;
                }
            }
        }
    }
   
    dealersFound = nearestDealers;
    
    var dropDown = $(dealerDropDown);

    if (dropDown != null)
        if (dropDown.options != null)
        {
            dropDown.options.length = 0;
        }

    if (foundDealerCount > 0)
    {
        for (var i = 0; i < foundDealerCount; i++)
        {
            dealersFound[i].DealerName = dealersFound[i].DealerName.toTitleCase();
            dealersFound[i].Address1 = dealersFound[i].Address1.toTitleCase();
            dealersFound[i].Address2 = dealersFound[i].Address2.toTitleCase();
            dealersFound[i].Town = dealersFound[i].Town.toTitleCase();

            var sAddress = dealersFound[i].Address1;
            sAddress += (sAddress != "" && dealersFound[i].Address2 != "" ? ", " : "") +
                dealersFound[i].Address2;
            sAddress += (sAddress != "" && dealersFound[i].Town != "" ? ", " : "") +
                dealersFound[i].Town;
            sAddress += (sAddress != "" && dealersFound[i].ZipCode != "" ? ", " : "") +
                dealersFound[i].ZipCode;

            if (dropDown != null)
                dropDown.options[i] = new Option(
                    dealersFound[i].DealerName + ", " + 
                    sAddress + " - " + 
                    Math.round(dealersFound[i].Distance) + " miles", i);
                
        }

        // Truncate array (if necessary).
        dealersFound.length = foundDealerCount;
            
        displayDealerDetails(0);
        showDealerOnMap(0, true);
        omnitureTrackingOnFullPageLoad();
    
	    // Touch Clarity tracking
        tc_log('/dealer_locator/results.htm?dealer_id=' + dealersFound[0].DealerId + '&town=' + dealersFound[0].Town + '&dealer_name=' + dealersFound[0].DealerName);
    }
    else
    {
        window.alert("No dealers found matching specified criteria");
    }
}

//only gets called if a single record is returned
//when searching by dealer name
function setDealerDetailsLink(dealerId) {
	var anchor;
	for(var i = 0; i < 10; i++) {
		if($('dealerDetailsLink'+i) != null){
			anchor = $('dealerDetailsLink'+i);
			anchor.href = '/dealer/Default.aspx?dealerId=' + dealerId;
		}
	}
}
function displayDealerRating(){
var rating = dealersFound[0].Rating;

if (rating <= 0){
        $('dealerRating1').addClass('ratingNoStar');
        $('whatisthis1').set('class', 'tooltipWithoutRating');
        $('score1').innerHTML = 'Not yet rated';
    }else{
        $('dealerRating1').addClass('starRating' + rating);
        $('score1').innerHTML = rating +' star(s)';
        $('whatisthis1').set('class', 'tooltipWithRating');
    }       
}

String.prototype.toTitleCase = function() {
    var returnValue = this.toLowerCase();
    var splitString = returnValue.split(' ');
    for (var i = 0; i < splitString.length; i++)
        splitString[i] = splitString[i].substring(0, 1).toUpperCase() + splitString[i].substring(1).toLowerCase();
    
    returnValue = splitString.join(' ');
    
    return returnValue;
}

function omnitureTrackingOnFullPageLoad(){
        s.channel = "Dealer locator";
        s.prop11 = "Search results";
        s.prop12 = "";
        s.prop19 = "Dealer search";
        s.pageName = "dealer_locator > search_results > entry";
        s.hier = "dealer_locator > search_results";
        s.events="event9"; 
        s.eVar50='Dealer Impression';
        var s_code = s.t(); if (s_code) document.write(s_code)
        }



