var map, geocoder, store_data;

$(function(){
    geocoder = new GClientGeocoder();
    map = new GMap2(document.getElementById("googleMap"));
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());    
    map.enableScrollWheelZoom();
    map.setCenter(new GLatLng(34, -95), 3);
    
    $('#btnLookupStores').click(function(){
        var lookup, street, city, province, postal;
        lookup = '';
        
        if (street = $('#DealerStreetAddress').val()) {
            lookup += street + ", ";            
        }
        if (city = $('#DealerCity').val()) {
            lookup += city + ", ";
        }
        if (state = $('#DealerState').val()) {
            lookup += state + " ";
        }
        if (zip = $('#DealerZip').val()) {
            lookup += zip;
        }
//        console.log(lookup);
        geocoder.getLatLng(lookup, function(latlng){
            if (!latlng) {
                alert('Location not found. Please try being less specific.');
            }
            else {
                searchLocationsNear(latlng);
            }
        });
    });
});

function setupLocations() {
    var xml = GXml.parse($('#XMLContainer').html());
    
    var markers = xml.documentElement.getElementsByTagName('marker');
    map.clearOverlays();    
    
    var sidebar = document.getElementById('mapSidebar');
    sidebar.innerHTML = '';
    if (markers.length == 0) {
        sidebar.innerHTML = 'No results found.';
        map.setCenter(new GLatLng(34, -95), 3);
        return;
    }
    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);
        var sidebarEntry = createSidebarEntry(marker, name, address, distance);
        sidebar.appendChild(sidebarEntry);
        bounds.extend(point);
    }
    map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));  
}

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 = $('#DealerMaxDistance').val();
    var searchUrl = '/dealers/locate?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
    GDownloadUrl(searchUrl, function(data) {
//    console.log(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(34, -95), 3);
            return;
        }
        var markers = xml.documentElement.getElementsByTagName('marker');
        map.clearOverlays();

        if (markers.length == 0) {
            sidebar.innerHTML = 'No results found.';
            map.setCenter(new GLatLng(34, -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 createMarker(point, name, address, image) {
    var marker = new GMarker(point), html;
        
    html = '<div class="storeName"><img class="storeImage" src="/img/store_logos/' + image + '"/> ' + name + '</div>';
    html += '<div class="storeAddress">' + address + '</div>';    
    GEvent.addListener(marker, 'click', function() {
        marker.openInfoWindowHtml(html);
    });
    return marker;
}

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'));
    });
}
