// Search method
var localSearch = new GlocalSearch();

var map = null;
var defaultZoom = 9;
var defaultPoint = new GLatLng(51.477222, 0);
var baseMarker;

var icons = Array();
var myPoints = Array(); // Array of GLatLng objects
var myPointsUnsorted = Array(); // Array of GLatLng objects
var myPointsTemp = Array(); // Array of GLatLng objects
var myName = Array();
var myTel = Array();
var myAddr = Array();
var icon = new GIcon();
icon.image = "http://www.google.com/mapfiles/marker.png";
icon.shadow = "http://www.google.com/mapfiles/shadow50.png";
icon.iconSize = new GSize(20, 34);
icon.shadowSize = new GSize(37, 34);
icon.iconAnchor = new GPoint(10, 34);

// Add google analytics etc here

jQuery(document).ready(function() {
    setupMap('map');
});

jQuery(window).unload(GUnload);

function setupMap(mapDataHolder) {
    if (GBrowserIsCompatible()) {

        // Create the map
        map = new GMap2(document.getElementById("map"));
        map.setCenter(defaultPoint, defaultZoom);
        //map.addControl(new MStatusControl());
        map.setUIToDefault();
        map.disableScrollWheelZoom();

        //var pos = new GControlPosition(G_ANCHOR_BOTTOM_LEFT, new GSize(0, -80));
        //map.addControl(new MStatusControl({position:pos}));

        // Define the base
        baseMarker = new GMarker(defaultPoint, { draggable: true });
        map.panTo(defaultPoint);

        GEvent.addListener(baseMarker, 'dragend', function() {
            var pt = baseMarker.getPoint();
            map.panTo(pt);
            sort();
        });

        // Add the stockists                        
        addMarkers();

        sort();
        checkZoomLevel();
        map.setZoom(defaultZoom);
       

        displayNearestInfo();

    } else {
        alert("Your browser may not be compatible with the Google Maps system.\nPlease visit http://maps.google.com for more information.");
    }
}

function displayNeaestInfo() {
    return;
    var closestMarker = new GMarker(myPointsTemp[0])
    var html = 'Distance from current address: ' + (closestMarker.getLatLng().distanceFrom(baseMarker.getLatLng()) / 1609).toFixed(2) + ' miles<br \/><br \/>';
    closestMarker.openInfoWindowHtml(html);
    map.openInfoWindow(map.getCenter(),
			document.createTextNode("Hello, world"));
}
function addMarkers() {
    myPoints = Array(); // Array of GLatLng objects
    map.clearOverlays();
    map.addOverlay(baseMarker)
    loadMarkersFromUrl();
}

function loadMarkersFromUrl() {
    GDownloadUrl("http://www.oursportinglife.co.uk/geo.xml", function(data) {
        var xml = GXml.parse(data);
        var markers = xml.documentElement.getElementsByTagName("marker");
        for (var i = 0; i < markers.length; i++) {
            var lat = parseFloat(markers[i].getAttribute("lat"));
            var lon = parseFloat(markers[i].getAttribute("lng"));
            var name = markers[i].getAttribute("name");
            var tel = markers[i].getAttribute("tel");
            var addr = markers[i].getAttribute("addr");
            // Add each point to the array
            var m = new GLatLng(lat, lon)
            myPoints.push(m);
            myPointsUnsorted.push(m);
            myName.push(name);
            myTel.push(tel);
            myAddr.push(addr);
        }
        // Print unsorted
        createIcons();

        myPointsTemp = Array();
        for (var n = 0; n < myPoints.length; n++) {
            myPointsTemp.push(myPoints[n]);
        }
        plotMarkers();
    });
}



// Magic function ;-)
function compareDistance(LatLonA, LatLonB) {
    return baseMarker.getLatLng().distanceFrom(LatLonA) - baseMarker.getLatLng().distanceFrom(LatLonB);
}

function sort() {

    myPoints.sort(compareDistance);
    map.clearOverlays();
    map.addOverlay(baseMarker)

    createIcons();
    myPointsTemp = Array();
    for (var n = 0; n < myPoints.length; n++) {
        myPointsTemp.push(myPoints[n]);
    }
    plotMarkers();
}

function checkZoomLevel() {

    var closestMarker = new GMarker(myPointsTemp[0])
    var distance = (closestMarker.getLatLng().distanceFrom(baseMarker.getLatLng()) / 1609);

    if (distance < 30) {
        defaultZoom = 9;
    } else if (distance > 30 && distance <= 100) {
        defaultZoom = 8;
    } else if (distance > 100 && distance <= 300) {
        defaultZoom = 7;
    } else {
        defaultZoom = 6;
    }
}

createIcons = function() {
    var baseIcon = new GIcon();
    baseIcon.iconSize = new GSize(20, 34);
    baseIcon.iconAnchor = new GPoint(10, 34);
    baseIcon.infoWindowAnchor = new GPoint(10, 0);
    icons = Array();

    for (var n = 65; n < (65 + myPoints.length); n++) {
        if (n < 75) {
            var icon = (new GIcon(baseIcon, 'http://www.oursportinglife.co.uk/images/osl-marker.png', null, ""));
            //var icon = (new GIcon(baseIcon, 'http://www.google.com/intl/en_ALL/mapfiles/marker_green' + String.fromCharCode(n) + '.png', null, ""));
            icons.push(icon);
        } else {
            var icon = (new GIcon(baseIcon, 'http://www.oursportinglife.co.uk/images/osl-marker.png', null, ""));
            icons.push(icon);
        }
    }

}
function plotMarkers() {
    var p = myPointsTemp.shift();
    var marker = new GMarker(p, { icon: icons.shift() })
    GEvent.addListener(marker, 'click', function() {

        var name = '';
        var tel = '';
        var addr = '';

        // find matching marker
        for (var n = 0; n < myPointsUnsorted.length; n++) {
            var a = new GMarker(myPointsUnsorted[n]);
            if (marker.getLatLng() == a.getLatLng()) {
                name = myName[n];
                tel = myTel[n];
                addr = myAddr[n];
                addr = addr.replace(/#/g, "<br \/>");
            }
        }
        var html = '<h2>' + name + '<br \/>' + addr + '<\/h2><p id="bubble">Distance from current address: ' + (marker.getLatLng().distanceFrom(baseMarker.getLatLng()) / 1609).toFixed(2) + ' Miles<\/p>';
        marker.openInfoWindowHtml(html);

    });
    
    map.addOverlay(marker)
    if (myPointsTemp.length) {
        window.setTimeout("plotMarkers()", 10);
    }

}

function placeMarkerAtPoint(point) {
    // Set up our GMarkerOptions object
    var markerOptions = { icon: icon, draggable: true };
    var marker = new GMarker(point, markerOptions);
    map.addOverlay(marker);
    //marker.openInfoWindowHtml(place.address);
}

function setCenterToPoint(point) {
    map.setCenter(point, defaultZoom);
}

function searchFromPostcode(postcode) {
    localSearch.setSearchCompleteCallback(null,
		                    function() {
		                        if (localSearch.results[0]) {
		                            var resultLat = localSearch.results[0].lat;
		                            var resultLng = localSearch.results[0].lng;
		                            var point = new GLatLng(resultLat, resultLng);
		                            baseMarker.setPoint(point);
		                            map.panTo(point);
		                            sort();
		                            checkZoomLevel();
		                            map.setZoom(defaultZoom);
		                            displayNeaestInfo();
		                        } else {
		                            alert('Address not found!');
		                        }
		                    });

    localSearch.execute(postcode);
}
