﻿var map, geocoder, markers = new Array();

google.setOnLoadCallback(function() {
    map = new GMap2(document.getElementById("map"));
    map.enableScrollWheelZoom();
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    GEvent.addListener(map, "dragend", UpdateMap);
    GEvent.addListener(map, "dblclick", UpdateMap);
    geocoder = new GClientGeocoder();
    if (!geocoder) alert("Geocoder not available!");

    $("#address").change(UpdateAddress);
    $("select").change(UpdateMap);
    $("#news").load("news.htm");

    // ?lat=44.977482&lng=-93.264351&z=13&vl=0&mr=0&mp=1&xp=3&age=99999
    if ($.query.get('vl')) $("#vegLevel").val($.query.get('vl'));
    if ($.query.get('mr')) $("#rating").val($.query.get('mr'));
    if ($.query.get('mp') && $.query.get('xp')) $("#priceRange").val($.query.get('mp') + "," + $.query.get('xp'));
    if ($.query.get('age')) $("#age").val($.query.get('age'));

    if ($.query.get('lat') && $.query.get('lng')) {
        map.setCenter(new GLatLng($.query.get('lat'), $.query.get('lng')));
        if ($.query.get('z')) map.setZoom($.query.get('z'));
        UpdateMap();
    } else {
        if (google.loader.ClientLocation)
            $("#address").val(google.loader.ClientLocation.address.city + ", " + google.loader.ClientLocation.address.region);
        UpdateAddress();
    }
});

function UpdateAddress() {
    geocoder.getLatLng($("#address").val(), function(point) {
        if (!point) {
            if ($("#address").val() == "") alert("We can't auto-locate you. Please enter your address or zip code in the box to the left.");
            else alert($("#address").val() + " not found! Try entering just a zip code.");
            return;
        }
        map.setCenter(point);
        UpdateMap();
    });
}

function UpdateMap() {
    $("div#updating").fadeIn();
    var filter = new Object();
    filter.returnCount = 42;  // $("#returnCount").val();
    filter.baseLat = map.getCenter().lat();
    filter.baseLon = map.getCenter().lng();
    filter.minVegLevel = $("#vegLevel").val();
    filter.minRating = $("#rating").val();
    filter.minPrice = $("#priceRange").val().substring(0, 1);
    filter.maxPrice = $("#priceRange").val().substring(2, 3);
    filter.age = $("#age").val();

    $("#directlink").attr("href", "default.aspx?lat=" + filter.baseLat + "&lng=" + filter.baseLon + "&z="+ map.getZoom() +"&vl=" + filter.minVegLevel + "&mr=" + filter.minRating + "&mp=" + filter.minPrice + "&xp=" + filter.maxPrice + "&age=" + filter.age);

    $.getJSON("getVeg.ashx", filter, function(data) {
        if (map.getZoom() < 1) map.setZoom(12);

        // first, remove all current markers that are not part of the new set
        var markersTemp = new Array();
        while (markers.length > 0) {
            var marker = markers.pop();
            // if marker exists in the new data set
            var exists = false;
            for (var i = 0; i < data.length; i++) if (data[i].Id == marker.entry.Id) { exists = true; break; }
            if (exists) markersTemp.push(marker);
            else map.removeOverlay(marker);
        }
        markers = markersTemp;
        markersTemp = null;

        for (var i = 0; i < data.length; i++) {
            var entry = data[i];
            // if marker already exists, don't both creating a new one
            var exists = false;
            for (var k = 0; k < markers.length; k++) if (markers[k].entry.Id == entry.Id) { exists = true; break; }
            if (!exists) {
                var point = new GLatLng(entry.Lat, entry.Lng);
                var marker = new GMarker(point);
                marker.entry = entry;
                GEvent.addListener(marker, "mouseover", function() {
                    var displayText = "<b>" + this.entry.Title + "</b><br>";
                    displayText += "Average Rating: " + this.entry.Rating + "<br>";
                    displayText += "Price Range: " + this.entry.Price + "<br>"; // Distance: " + this.entry.Dist + " miles";
                    this.openInfoWindowHtml(displayText);
                });
                GEvent.addListener(marker, "mouseout", function() { this.closeInfoWindow(); });
                GEvent.addListener(marker, "click", function() { window.open("http://www.vegguide.org/entry/" + this.entry.Id, "_blank") });
                map.addOverlay(marker);
                markers.push(marker);
            }
        }
        $("div#updating").fadeOut();
    });
}

// if the database is more than 1 day out of date this method is called; ajaxily update the db
$(document).ready(function() {
    if ($("head").attr("updateData") == "True") {
        $("#updatingData").show().pulse({ speed: 500, opacityRange: [0.2, 0.9] });
        $("#lastUpdate").load("updateData.ashx", null, function() {
            $("#updatingData").hide().recover();
        });
    }
});
    
// given a set of data, find the optimum zoom level
//function AutoZoom(data) {
//    var latMin = map.getCenter().lat(), latMax = map.getCenter().lat(), lngMin = map.getCenter().lng(), lngMax = map.getCenter().lng();
//    for (var i = 0; i < data.length; i++) {
//        if (data[i].Lat < latMin) latMin = data[i].Lat;
//        if (data[i].Lat > latMax) latMax = data[i].Lat;
//        if (data[i].Lng < lngMin) lngMin = data[i].Lng;
//        if (data[i].Lng > lngMax) lngMax = data[i].Lng;
//    }
//    var zoom = map.getBoundsZoomLevel(new GLatLngBounds(new GLatLng(latMin, lngMax), new GLatLng(latMax, lngMin)));
//    map.setZoom(zoom);
//}
