var map, geocoder, store_data;
    
var iconRed = new GIcon();
iconRed.image = '/img/layout/gmap_marker.png';
iconRed.shadow = '/img/layout/gmap_marker_shadow.png';
iconRed.iconSize = new GSize(19,34);
iconRed.shadowSize = new GSize(35,34);
iconRed.iconAnchor = new GPoint(7,30);
iconRed.infoWindowAnchor = new GPoint(7,0);


$(function(){
    geocoder = new GClientGeocoder();
    map = new GMap2(document.getElementById("GoogleMap"), {mapTypes:[G_PHYSICAL_MAP]});
    map.addControl(new GSmallMapControl());
    map.enableScrollWheelZoom();
    map.setCenter(new GLatLng(0, 0), 1);
    
    //setupTitleOverlay();
    setupLocations();
});

function setupTitleOverlay() {
    var titleOverlay = new GScreenOverlay('http://pbigold.ppi-testing.com/img/layout/gmap_title_overlay.jpg', 
        new GScreenPoint(10,0.9, 'pixels', 'fraction'), 
        new GScreenPoint(0,0),
        new GScreenSize(164,36)
    );
    var titleOverlay = new GScreenOverlay('http://pbigold.ppi-testing.com/img/layout/gmap_title_overlay.jpg');
    
    map.addOverlay(titleOverlay);
}

function setupLocations() {
    GDownloadUrl("/googlemaps/getXML", function(data) {
        var xml = GXml.parse(data);
        
        var markers = xml.documentElement.getElementsByTagName('marker');
        map.clearOverlays();    
        
        var bounds = new GLatLngBounds();
        for (var i = 0; i < markers.length; i++) {
            var name = markers[i].getAttribute('name');
            var address = markers[i].getAttribute('address');
            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, name, address);
            map.addOverlay(marker);
        }
    });
}

function createMarker(point, name, address) {
    var marker = new GMarker(point, iconRed);
    var html = '<div>'+address+'</div>';
    GEvent.addListener(marker, 'click', function() {
        marker.openInfoWindowHtml(html);
    });
    return marker;
}

function searchLocations() {
    var address = document.getElementById('addressInput').value;
    geocoder.getLatLng(address, function(latlng) {
        if (!latlng) {
            alert(address + ' not found');
        } else {
            searchLocationsNear(latlng);
        }
    });
}

function searchLocationsNear(center) {
    var radius = $('#StoreMaxDistance').val();
    var searchUrl = '/' + set_language + '/shop/locate?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
    GDownloadUrl(searchUrl, function(data) {
        var xml = GXml.parse(data);
        store_data = xml;
        var sidebar = $('#mapSidebar .content')[0];
        sidebar.innerHTML = '';
        
        if (xml.documentElement == null) {
            sidebar.innerHTML = 'No results found.';
            map.setCenter(new GLatLng(60, -95), 3);
            return;
        }
        var markers = xml.documentElement.getElementsByTagName('marker');
        map.clearOverlays();

        if (markers.length == 0) {
            sidebar.innerHTML = 'No results found.';
            map.setCenter(new GLatLng(60, -95), 3);
            return;
        }
        var bounds = new GLatLngBounds();

        for (var i = 0; i < markers.length; i++) {
            var name = markers[i].getAttribute('name');
            var image = markers[i].getAttribute('image');
            var address = markers[i].getAttribute('address');
            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, name, address, image);
            map.addOverlay(marker);
            var sidebarEntry = createSidebarEntry(i, marker, name, address, distance, image);
            sidebar.appendChild(sidebarEntry);
            bounds.extend(point);
        }
        $.setEvents();
        map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
    });
}

function createSidebarEntry(i, marker, name, address, distance, image) {
    var div = $('<div class="sideBarEntry"></div>');    
    div.append('<div class="storeName"><img class="storeImage" src="/img/store_logos/' + image + '"/> ' + name + '<span class="storeDistance">' + distance.toFixed(1) + ' miles</span></div>');
    div.append('<div class="storeAddress">' + address + '</div>');
    div.click(function(){
        GEvent.trigger(marker, 'click');
    }); 
    return div[0];
}

$.setEvents = function() {
    $('.sideBarEntry').click(function(){
        var count = $(this).prevAll().length;
        //store_data is a global variable carrying the last xml response for usage
        //defined in searchLocationsNear()
        var markers = store_data.documentElement.getElementsByTagName('marker');
        $('#CustomerStoreNo').val(markers[count].getAttribute('store_no'));
        $('#CustomerStreetAddr1').val(markers[count].getAttribute('addr1'));
        $('#CustomerTxtShipAddr3').val(markers[count].getAttribute('addr2'));
        $('#CustomerTxtShipCity').val(markers[count].getAttribute('city'));
        $('#CustomerCboShipState').val(markers[count].getAttribute('province'));
        $('#CustomerTxtShipZip').val(markers[count].getAttribute('postal'));
    });
}