﻿var geocoder;
var dealermap;
var infowindow;

(function() {

    google.maps.Map.prototype.markers = new Array();

    google.maps.Map.prototype.addMarker = function(marker) {
        this.markers[this.markers.length] = marker;
    };

    google.maps.Map.prototype.getMarkers = function() {
        return this.markers
    };

    google.maps.Map.prototype.clearMarkers = function() {
        if (infowindow) {
            infowindow.close();
        }

        for (var i = 0; i < this.markers.length; i++) {
            this.markers[i].setMap(null);
        }
    };
})();


$(document).ready(function() {
    geocoder = new google.maps.Geocoder();
    
    var myOptions = {
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    dealermap = new google.maps.Map($("#theMap")[0], myOptions);
    
    setupinitialview();

    $("#dealersearch").click(function(evt) {
        var where = jQuery.trim($("#Location").val());
        if (where.length < 1)
            return;

        loaddealers(where);
    });
});

function showAllMarkers( map ){
    var bounds = new google.maps.LatLngBounds();
    var markers = map.getMarkers();
    
    for (var i = 0; i < markers.length; i++) {
        bounds.extend(markers[i].getPosition());
    }
    map.setCenter(bounds.getCenter());
    map.fitBounds(bounds);
};

function setupinitialview() {

    var massarelli_latlong = new google.maps.LatLng(39.668812, -74.862964);

    var massarelli_info =
        "<p><strong>Massarelli's" +
        "<br /></strong>500 South Egg Harbor Road" +
        "<br />Hammonton, NJ 08037" +
        "<br />609-567-9700 Telephone" +
        "<br />609-567-8844 Facsimile</p>";

    dealermap.setCenter(massarelli_latlong);
       
    createMarker(
        dealermap,
        "Massarelli's Home Office",
        massarelli_info,
        massarelli_latlong
    );
}

function createMarker(map, title, content, latlng) {
    var marker = new google.maps.Marker({ position: latlng, map: map, title: title });
    google.maps.event.addListener(marker, "click", function() {
        if (infowindow) infowindow.close();
        infowindow = new google.maps.InfoWindow({ content: content });
        infowindow.open(map, marker);
    });

    map.addMarker(marker, latlng);
    
    return marker;
}


function loaddealers(where) {
    $("#dealerList").empty();
    dealermap.clearMarkers();
    loaddealers_partII(where);
    //clearMap();
};

function loaddealers_partIII(){
    center = dealermap.getCenter();
    var radius = jQuery.trim($("#Radius").val())

    $.post("/Dealers/SearchByLocation",
            {
                latitude: center.lat(),
                longitude: center.lng(),
                radius: radius
            },
            function(dealers) {
                HandleDealers(dealers);
                showAllMarkers(dealermap);
            },
            "json"
        );
}

function HandleDealers(dealers) {
    var dealersflag = false;

    //var latlngbounds = new google.maps.GLatLngBounds();        

    var startaddress = jQuery.trim($("#Location").val());

    $.each(dealers, function(i, dealer) {
        dealersflag = true;

        var LL = new google.maps.LatLng(dealer.Latitude, dealer.Longitude);

        //latlngbounds.extend(LL);

        var dUrl = "";

        if (dealer.Url == "" || dealer.Url == null) {
            dName = "<b>" + dealer.Name + "</b>";
        } else {
            if (dealer.Url.indexOf("http://") >= 0) {
                dName = '<a href="' + dealer.Url + '" target="_blank">' + dealer.Name + '</a>';
            } else {
                dName = '<a href="http://' + dealer.Url + '" target="_blank">' + dealer.Name + '</a>';
            }
        }

        var dlink = "http://maps.google.com/maps?f=d&source=s_d&" +
                    "saddr=" + escape(startaddress) +
                    "&daddr=" + escape(dealer.AddressMerged);

        var details = dName +
                        '<br /> ' + dealer.AddressFormatted +
                        '<br /> ' + dealer.Phone +
                        '<br /> ' + '<a href="' + dlink + '" target="dealer">' + "Directions" + "</a>";

        var marker = createMarker(dealermap, dealer.Name, details, LL);

        //Add a dealer to the <ul> dealerList on the right
        $('#dealerList').append(
                                $('<li/>')
                                .attr("class", "dealerItem")
                                .append(
                                    $('<a/>')
                                    .attr("href", "#")
                                    .html(dealer.Name)
                                    .data("marker", marker)
                                    .data("details", details)
                                    .data("map", dealermap)
                                    .click(function() {
                                        if (infowindow) infowindow.close();
                                        infowindow = new google.maps.InfoWindow({ content: $(this).data("details") });
                                        infowindow.open(
                                            $(this).data("map"),
                                            $(this).data("marker")
                                        );
                                        return false;
                                    })
                                )
                           );

        //map.setCenter(latlngbounds.getCenter(), map.getBoundsZoomLevel(latlngbounds));

    });
}


function loaddealers_partII(where) {

    if (geocoder) {
        geocoder.geocode({ 'address': where }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
                    dealermap.setCenter(results[0].geometry.location);

                    createMarker(dealermap, "Your starting point!", 
                        "<p>Where you started at...</p>", 
                        results[0].geometry.location);

                    loaddealers_partIII();
                } else {
                    alert("No results found");
                }
            } else {
                alert("Geocode was not successful for the following reason: " + status);
            }
        });
    }
}


function callbackUpdateMapDealers(layer, resultsArray, places, hasMore, VEErrorMessage) {

    $("#dealerList").empty();
    clearMap();
    var center = map.GetCenter();
    var radius = jQuery.trim($("#Radius").val());

    $.post("/Dealers/SearchByLocation",
        {
            latitude: center.Latitude,
            longitude: center.Longitude,
            radius: radius
        },
        function(dealers) {
            HandleDealers(dealers);
        },
        "json"
    );
}

