﻿google.load("maps", "2", { "other_params": "sensor=false" });
google.setOnLoadCallback(initializeMap);

var map;
var baseIcon;
var marker;


var dealerIds = new Array();
var dealerIndex = 0;
var nearestDealerLat;
var nearestDealerLng;
var mapWidth = 500;
var mapHeight = 450;
var markerWidth = 34;
var markerHeight = 34;
var markerWidthAsFractionOfMapWidth;
var markerHeightAsFractionOfMapHeight;
var minimumZoomLevel = 7;
var doingPostcodeSearch = false;
var zoomLoopCount = 0;
var showMarkers = false;

var enableUpdate = true;


function goPostcode() {
    document.getElementById(getGoButtonId()).disabled = true;
    document.getElementById(getGoButtonId()).value = "Searching...";
    document.getElementById("PostcodeError").className = "hide";
    doingPostcodeSearch = true;
    zoomLoopCount = 0;
    //				alert("reset zoomLoopCount");

    var request = GXmlHttp.create();
    var url = "GeoData.asmx/GetGeoData?postcode=" + document.getElementById(getPostcodeInputId()).value;
    request.open("GET", url, true);
    request.onreadystatechange = function() {
        if (request.readyState == 4) {
            var xmlDoc = request.responseXML;
            var points = xmlDoc.documentElement.getElementsByTagName("point");

            if (points.length > 0) {
                showMarkers = true;
                var point = new GPoint(parseFloat(points[0].getAttribute("lng")),
													parseFloat(points[0].getAttribute("lat")));
                map.centerAndZoom(point, minimumZoomLevel);
            } else {
                document.getElementById("PostcodeError").className = "";
            }

            document.getElementById(getGoButtonId()).disabled = false;
            document.getElementById(getGoButtonId()).value = "Go";

        }
    }
    //				alert("sending postcode request");
    request.send(null);
}

function createMarker(point, index, html) {
    // Create a lettered icon for this point using our icon class
    var letter = String.fromCharCode("A".charCodeAt(0) + index);
    var letteredIcon = new google.maps.Icon(baseIcon);
    letteredIcon.image = "http://www.google.com/mapfiles/marker" + letter + ".png";
    // Set up our GMarkerOptions object
    markerOptions = { icon: letteredIcon };
    var marker = new GMarker(point, markerOptions);

    // Show this marker's index in the info window when it is clicked
    GEvent.addListener(marker, "click", function() {
        enableUpdate = false; //prevent map from reloading markers, which would destroy the popup
        marker.openInfoWindowHtml(html);
    });

    return marker;
}

function initializeMap() {

    if (google.maps.BrowserIsCompatible()) {


        // Create a base icon for all of our markers that specifies the
        // shadow, icon dimensions, etc.
        baseIcon = new google.maps.Icon(G_DEFAULT_ICON);
        baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
        baseIcon.iconSize = new google.maps.Size(20, 34);
        baseIcon.shadowSize = new google.maps.Size(37, 34);
        baseIcon.iconAnchor = new google.maps.Point(9, 34);
        baseIcon.infoWindowAnchor = new google.maps.Point(9, 2);

        map = new GMap(document.getElementById("DealerMap"));

        markerWidthAsFractionOfMapWidth = markerWidth / mapWidth;
        markerHeightAsFractionOfMapHeight = markerHeight / mapHeight;

        map.addControl(new GLargeMapControl());

        map.centerAndZoom(new GPoint(-4.4, 54.6), 12);


        GEvent.addListener(map, "moveend", updateTheMap);

        document.getElementById(getPostcodeInputId()).focus();

        if (document.getElementById(getPostcodeInputId()).value != '') {
            goPostcode();
        }

    }
} 


function showDirections(postcode) {
    if (document.getElementById(getPostcodeInputId()).value > '') {
        var url = "http://maps.google.co.uk/maps?q=" + document.getElementById(getPostcodeInputId()).value + " to " + postcode;
        window.open(url, 'directions', '', false);
        return true;
    } else {
        alert("Please enter the first half of your postcode above then click on this link again.");
        document.getElementById(getPostcodeInputId()).focus();
        return false;
    }
}

function scrollTo(lng, lat) {
    map.recenterOrPanToLatLng(new GPoint(lng, lat));
}

function updateTheMap() {

    if (zoomLoopCount == 0 && showMarkers == true && enableUpdate == true) {

        var center = map.getCenterLatLng();
        var request = GXmlHttp.create();
        var url = "DealerData.asmx/NearestDealers?latitude=" + center.y + "&longitude=" + center.x;
        request.open("GET", url, true);
        request.onreadystatechange = function() {
            if (request.readyState == 4) {

                var xmlDoc = request.responseXML;
                var markers = xmlDoc.documentElement.getElementsByTagName("marker");
                var listHTML = '';

                //AJS 5/8/09
                dealerIds = new Array();
                dealerIndex = 0;
                map.clearOverlays();

                for (var i = 0; i < markers.length; i++) {

                    var dealerId = markers[i].getAttribute("ID");

                    var popupOpeningTag = "<div class='dealerPopup smallText'>";
                    var dealerOpeningTag = "<div class='dealerDetails float'>";
                    var markerHTML = "<a href=\'#\' onclick=\"scrollTo(" + markers[i].getAttribute("lng") + "," + markers[i].getAttribute("lat") + ");\"><img src=\"http://www.google.com/mapfiles/marker" + String.fromCharCode("A".charCodeAt(0) + i) + ".png\" alt=\"\" class=\"marker\" /></a>";
                    var nameHTML = "<h4>" + markers[i].getAttribute("cn") + "</h4>";
                    var addressHTML = "<p>" + markers[i].getAttribute("ad") + markers[i].getAttribute("pc") + "</p>";
                    var numbersHTML = "<p>" + markers[i].getAttribute("num") + "</p>";
                    var websiteHTML = (markers[i].getAttribute("we") != '') ? "<p><a href=\'" + markers[i].getAttribute("we") + "\' target=\'_blank\'>" + removeProtocol(markers[i].getAttribute("we")) + "</a></p>" : '';
                    var scrollHTML = "<p><a href=\'#\' onclick=\"scrollTo(" + markers[i].getAttribute("lng") + "," + markers[i].getAttribute("lat") + ");\">Centre map</a></p>";
                    var directionsHTML = "<p><a href=\'#\' onclick=\"showDirections(\'" + markers[i].getAttribute("pc") + "\');\">Get directions</a></p>";
                    var closingTag = "</div>";

                    var dealerHTML = dealerOpeningTag + markerHTML + "<div class='dealerDetailsText'>" + nameHTML + addressHTML + numbersHTML + websiteHTML + scrollHTML + directionsHTML + "</div>" + closingTag;
                    var popupHTML = popupOpeningTag + nameHTML + addressHTML + numbersHTML + websiteHTML + directionsHTML + closingTag;


                    var addDealer = true;

                    if (i == 0) {
                        nearestDealerLat = parseFloat(markers[i].getAttribute("lat"));
                        nearestDealerLng = parseFloat(markers[i].getAttribute("lng"));
                    }

                    if (dealerIndex > 0) {
                        for (var j = 0; j < dealerIndex; j++) {
                            if (dealerIds[j] == dealerId) {
                                addDealer = false;
                            }
                        }
                    }

                    if (addDealer == true) {
                        dealerIds[dealerIndex] = dealerId;

                        var point = new GPoint(parseFloat(markers[i].getAttribute("lng")),
																parseFloat(markers[i].getAttribute("lat")));
                        var marker = createMarker(point, dealerIndex, popupHTML);

                        map.addOverlay(marker);

                        dealerIndex += 1;
                    }
                    listHTML += dealerHTML;

                }
                document.getElementById("LocalDealers").innerHTML = listHTML;

                var bounds;
                var n;
                var e;
                var s;
                var w;

                while (doingPostcodeSearch == true && map.getZoomLevel() <= 12) {

                    bounds = map.getBoundsLatLng();
                    n = bounds.maxY - (bounds.maxY - bounds.minY) * markerHeightAsFractionOfMapHeight;
                    e = bounds.maxX - (bounds.maxX - bounds.minX) * markerWidthAsFractionOfMapWidth;
                    s = bounds.minY;
                    w = bounds.minX;

                    if (nearestDealerLat < s || nearestDealerLat > n || nearestDealerLng < w || nearestDealerLng > e) {
                        //zoom out
                        zoomLoopCount++;
                        //										alert("need to zoom " + zoomLoopCount.toString() + ": " + nearestDealerLng.toString() + ";" + nearestDealerLat.toString() + "." + n.toString() + "," + s.toString() + "," + e.toString() + "," + w.toString()); 
                        map.zoomTo(map.getZoomLevel() + 1);
                    } else {
                        //										alert("no need to zoom " + zoomLoopCount.toString() + ": " + nearestDealerLng.toString() + ";" + nearestDealerLat.toString() + "." + n.toString() + "," + s.toString() + "," + e.toString() + "," + w.toString()); 
                        doingPostcodeSearch = false;
                        //										alert("final zoom level = " + map.getZoomLevel().toString());
                    }

                }
            }
        }
        request.send(null);
    }

    if (map.getZoomLevel() < minimumZoomLevel && map.getZoomLevel() > 0) {
        alert("You've reached the maximum magnification level for this map. To see the exact location of a dealer, make sure you've entered the first half of your postcode then click the dealer's 'Get directions' link.");
        map.zoomTo(minimumZoomLevel);
    }

    zoomLoopCount = 0;
    if (map.getZoomLevel() < 10) {
        showMarkers = true;
    }

    enableUpdate = true; //updates might have been temporarily suppressed to prevent popup from being destroyed.
}

if (typeof (Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

