﻿var map;
var localSearch = new GlocalSearch();

function usePointFromPostcode(postcode, callbackFunction) {
    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);
		        callbackFunction(point);
		    } else {
		        alert("Location not found!");
		    }
		});
    localSearch.execute(postcode + ", UK");
}

function placeMarkerAtPointWithDrag(point) {
    var marker = new GMarker(point, { draggable: true, title: 'Drag me' });
    // Adding a click event to the marker
    GEvent.addListener(marker, "click", function() { marker.openInfoWindow(document.getElementById("postcode").value); });
    // Close InfoWindow at dragstart
    GEvent.addListener(marker, "dragstart", function() { map.closeInfoWindow(); });
    // Capture point at dragend
    GEvent.addListener(marker, "dragend", function() {
            var point = marker.getPoint();
            document.getElementById("txtLat").value = point.lat();
            document.getElementById("txtLng").value = point.lng();
            marker.openInfoWindow(document.getElementById("postcode").value);
        });
}

function placeMarkerAtPoint2(point) {
    var marker = new GMarker(point);
    // Adding a click event to the marker
    GEvent.addListener(marker, "click", function() { marker.openInfoWindow(document.getElementById("baseLocate").value + '<br />Your location'); });
    map.addOverlay(marker);
}

function setCenterToPoint(point) {
    map.setCenter(point, 17);
}

function showPointLatLng(point) {
    alert("Latitude: " + point.lat() + "\nLongitude: " + point.lng());
}

function createMarker(point, icon, title, name, address, URLpub, URLfacebook) {
    // Create marker icon for Pub with quiz.
    var myIconPubQuiz = new GIcon(G_DEFAULT_ICON);
    myIconPubQuiz.image = "/assets/img/GoogleMap_J2Obottle_orange.png";
    myIconPubQuiz.iconSize = new GSize(29, 71);
    //    myIconPub.shadow = "/assets/img/my_custom_icon_shadow.png";
    myIconPubQuiz.shadowSize = new GSize(1, 1);
    myIconPubQuiz.iconAnchor = new GPoint(14, 1);
    myIconPubQuiz.infoWindowAnchor = new GPoint(10, 14);
    //    myIconPubQuiz.printImage = "/assets/img/my_custom_icon_print.gif";
    //    myIconPubQuiz.mozPrintImage = "/assets/img/my_custom_icon_mozPrint.gif";
    //    myIconPubQuiz.printShadow = "/assets/img/my_custom_icon_printShadow.gif";
    //    myIconPubQuiz.transparent = "/assets/img/my_custom_icon_transparent.png";
    //    myIconPubQuiz.imageMap = [10, 29, 1, 16, 0, 5, 5, 0, 12, 4, 18, 2, 21, 12, 21, 16];
//    myIconPubQuiz.imageMap = [9, 6, 20, 6, 20, 30, 22, 30, 22, 64, 7, 64, 7, 30, 9, 30];

    // Create marker icon for Pub with no quiz.
    var myIconPub = new GIcon(G_DEFAULT_ICON);
    myIconPub.image = "/assets/img/GoogleMap_J2Obottle_red.png";
    myIconPub.iconSize = new GSize(29, 71);
    myIconPub.shadow = "/assets/img/GoogleMap_J2Obottle_red_shadow.png";
    myIconPub.shadowSize = new GSize(1, 1);
    myIconPub.iconAnchor = new GPoint(14, 1);
    myIconPub.infoWindowAnchor = new GPoint(10, 14);
    //    myIconPub.printImage = "/assets/img/my_custom_icon_print.gif";
    //    myIconPub.mozPrintImage = "/assets/img/my_custom_icon_mozPrint.gif";
    //    myIconPub.printShadow = "/assets/img/my_custom_icon_printShadow.gif";
    //    myIconPub.transparent = "/assets/img/my_custom_icon_transparent.png";
    //    myIconPub.imageMap = [10, 29, 1, 16, 0, 5, 5, 0, 12, 4, 18, 2, 21, 12, 21, 16];
//    myIconPub.imageMap = [9, 6, 20, 6, 20, 30, 22, 30, 22, 64, 7, 64, 7, 30, 9, 30];
//    myIconPub.imageMap = [1,1, 10,1, 10,10, 1,10];

    // Create myLocation marker icon
    var myLocation = new GIcon(G_DEFAULT_ICON);
    myLocation.image = "/assets/img/GoogleMap_MyLocation.png";
    myLocation.iconSize = new GSize(10, 10);
    //    myLocation.shadow = "/assets/img/my_custom_icon_shadow.png";
    myLocation.shadowSize = new GSize(1, 1);
    myLocation.iconAnchor = new GPoint(5, 5);
    myLocation.infoWindowAnchor = new GPoint(1, 5);
    //    myLocation.printImage = "/assets/img/my_custom_icon_print.gif";
    //    myLocation.mozPrintImage = "/assets/img/my_custom_icon_mozPrint.gif";
    //    myLocation.printShadow = "/assets/img/my_custom_icon_printShadow.gif";
    //    myLocation.transparent = "/assets/img/my_custom_icon_transparent.png";
    //    myLocation.imageMap = [10, 29, 1, 16, 0, 5, 5, 0, 12, 4, 18, 2, 21, 12, 21, 16];

    // Create Preloaded Pub marker icon
    var myIconPreloadPub = new GIcon(G_DEFAULT_ICON);
    myIconPreloadPub.image = "/assets/img/GoogleMap_J2Obottle_orange.png";
    myIconPreloadPub.iconSize = new GSize(29, 71);
    //    myIconPreloadPub.shadow = "/assets/img/my_custom_icon_shadow.png";
    myIconPreloadPub.shadowSize = new GSize(1, 1);
    myIconPreloadPub.iconAnchor = new GPoint(14, 1);
    myIconPreloadPub.infoWindowAnchor = new GPoint(10, 14);
    //    myIconPreloadPub.printImage = "/assets/img/my_custom_icon_print.gif";
    //    myIconPreloadPub.mozPrintImage = "/assets/img/my_custom_icon_mozPrint.gif";
    //    myIconPreloadPub.printShadow = "/assets/img/my_custom_icon_printShadow.gif";
    //    myIconPreloadPub.transparent = "/assets/img/my_custom_icon_transparent.png";
    //    myIconPreloadPub.imageMap = [10, 29, 1, 16, 0, 5, 5, 0, 12, 4, 18, 2, 21, 12, 21, 16];
//    myIconPreloadPub.imageMap = [9, 6, 20, 6, 20, 30, 22, 30, 22, 64, 7, 64, 7, 30, 9, 30];

    var marker;

    switch (icon) {
        case 1:
            //Pub with quiz.
            switch (title) {
                case '':
                    marker = new GMarker(point, { icon: myIconPubQuiz, zIndex: 2 });
                    break;
                default:
                    marker = new GMarker(point, { icon: myIconPubQuiz, title: title, zIndex: 2 });
                    break;
            }
            break;
        case 2:
            //myLocation.
            switch (title) {
                case '':
                    marker = new GMarker(point, { icon: myLocation, zIndex: 4 });
                    break;
                default:
                    marker = new GMarker(point, { icon: myLocation, title: title, zIndex: 4 });
                    break;
            }
            break;
        case 99:
            //pre-loaded pubs.
            switch (title) {
                case '':
                    marker = new GMarker(point, { icon: myIconPreloadPub, zIndex: 4 });
                    break;
                default:
                    marker = new GMarker(point, { icon: myIconPreloadPub, title: title, zIndex: 4 });
                    break;
            }
            break;
        default:
            //Pub without quiz.
            switch (title) {
                case '':
                    marker = new GMarker(point, { icon: myIconPub, zIndex: 1 });
                    break;
                default:
                    marker = new GMarker(point, { icon: myIconPub, title: title, zIndex: 1 });
                    break;
            }
            break;
    }

    var html = "<div id='j2o_pop_border'><div id='j2oName'>" + name + "</div><div>" + address + "</div>";
    if (URLpub != '' && URLpub != null) { html = html + "<div>" + URLpub + "</div>"; }
    if (URLfacebook != '' && URLfacebook != null) { html = html + "<div>" + URLfacebook + "</div>"; }
    html = html + "</div>";
    //    GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml(html); });
    GEvent.addListener(marker, 'click', function() { marker.openExtInfoWindow(map, "j2o_pop", html, { beakOffset: 0 }); });
    return marker;
}

function mapLoad() {
    if (GBrowserIsCompatible()) {
        map = new GMap2(document.getElementById("map"));
        //focus on UK.
        map.setCenter(new GLatLng(54.521081, -3.735352), 5);

        var customUI = map.getDefaultUI();
        customUI.maptypes.hybrid = false;
        customUI.maptypes.physical = false;
        customUI.controls.largemapcontrol3d = true;
        customUI.controls.scalecontrol = false;
        map.setUI(customUI);

        var minMapScale = 1;
        var maxMapScale = 20;
        // get array of map types 
        var mapTypes = map.getMapTypes();
        // overwrite the getMinimumResolution() and getMaximumResolution() methods for each map type 
        for (var i = 0; i < mapTypes.length; i++) {
            mapTypes[i].getMinimumResolution = function() { return minMapScale; }
            mapTypes[i].getMaximumResolution = function() { return maxMapScale; }
        }
    } else {
        alert('Sorry, the Google Maps API is not compatible with this browser');
    }
}

function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function() {
            oldonload();
            func();
        }
    }
}

function addUnLoadEvent(func) {
    var oldonunload = window.onunload;
    if (typeof window.onunload != 'function') {
        window.onunload = func;
    } else {
        window.onunload = function() {
            oldonunload();
            func();
        }
    }
}

function searchLocations() {
    if (document.getElementById('baseLocate').value == "") {
        alert('Please enter your post code OR place name');
    } else {
        usePointFromPostcode(document.getElementById('baseLocate').value, searchLocationsNear2);
    }
}

function searchLocationsNear2(center) {
    map.clearOverlays();
    var bounds = new GLatLngBounds();

    var radius = document.getElementById('selRadius').value;
    var searchUrl = 'assets/utility/GetPubXML.aspx?lat=' + center.lat() + '&lng=' + center.lng() + '&rad=' + radius;
    //alert('assets/utility/GetPubXML.aspx?lat=' + center.lat() + '&lng=' + center.lng() + '&rad=' + radius);

    GDownloadUrl(searchUrl, function(data, responseCode) {
        if (data == '') {
            alert('No pubs located ...');
        } else {
            if (responseCode == 200) {
                var xml = GXml.parse(data);
                var markers = xml.documentElement.getElementsByTagName('marker');

                for (var i = 0; i < markers.length; i++) {
                    var name = markers[i].getAttribute('name');
                    var address = markers[i].getAttribute('address');
                    var urlpub = markers[i].getAttribute('URLpub');
                    var urlfacebook = markers[i].getAttribute('URLfacebook');
                    var distance = parseFloat(markers[i].getAttribute('distance'));
                    var icon = parseFloat(markers[i].getAttribute('pub_type'));
                    var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')), parseFloat(markers[i].getAttribute('lng')));
                    var marker = createMarker(point, icon, name, name, address, urlpub, urlfacebook);
                    map.addOverlay(marker);
                    bounds.extend(point);
                }
                map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
            } else {
                //alert('Request resulted in error. Check XML file is retrievable.');
                alert('Information is not available - please retry.');
            }
        }
    });

    var marker = createMarker(center, 2, '', 'Search point', '', '', '');
    map.addOverlay(marker);
    bounds.extend(center);
}

function searchPubName() {
    var searchName = document.getElementById("txtPubName").value;
    if (searchName == "") {
        alert('Please provide pub name for search.');
        return false;
    }
    map.clearOverlays();
    var bounds = new GLatLngBounds();

    var radius = document.getElementById('selRadius').value;
    var searchUrl = 'assets/utility/GetPubNameXML.aspx?searchName=' + searchName;

    GDownloadUrl(searchUrl, function(data, responseCode) {
        if (data == '') {
            alert('No pubs located ...');
        } else {
            if (responseCode == 200) {
                var xml = GXml.parse(data);
                var markers = xml.documentElement.getElementsByTagName('marker');

                for (var i = 0; i < markers.length; i++) {
                    var name = markers[i].getAttribute('name');
                    var address = markers[i].getAttribute('address');
                    var urlpub = markers[i].getAttribute('URLpub');
                    var urlfacebook = markers[i].getAttribute('URLfacebook');
                    var distance = parseFloat(markers[i].getAttribute('distance'));
                    var point = new GLatLng(parseFloat(markers[i].getAttribute('lat')), parseFloat(markers[i].getAttribute('lng')));
                    var marker = createMarker(point, 0, name, name, address, urlpub, urlfacebook);
                    map.addOverlay(marker);
                    bounds.extend(point);
                }
                map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
            } else {
                //alert('Request resulted in error. Check XML file is retrievable.');
                alert('Information is not available - please retry.');
            }
        }
    });
}

addLoadEvent(mapLoad);
addUnLoadEvent(GUnload);