﻿var map;
var icon;
var selectedMarker;
var existingMarkers = {};

var centerLatitude = 30.224773;
var centerLongitude = -58.991943;
var startZoom = 2;
var loadCount = 0;
    
$(document).ready(function() {
    window.onload = initializeMap;
    window.onunload = GUnload;
});
    
function initializeMap() {
    if (!GBrowserIsCompatible())
        return;
        
    map = new GMap2(document.getElementById("map_canvas"));
    map.addControl(new GLargeMapControl3D());
    map.addControl(new GMapTypeControl());            
    map.setCenter(new GLatLng(centerLatitude, centerLongitude), startZoom);    
    
    GEvent.addListener(map, 'zoomend', function() {
        map.clearOverlays();    
        existingMarkers = {};        
        
        updateMarkers();
    });
    GEvent.addListener(map, 'dragend', function() {                
        updateMarkers();
    });

    icon = new GIcon();
    icon.image = '/images/markernumber.png';
    icon.iconSize = new GSize(24, 24);
    icon.iconAnchor = new GPoint(12, 12);
    icon.infoWindowAnchor = new GPoint(10, 0);

    updateMarkers();    
}

function updateMarkers() {
    var zoom = map.getZoom();
    if (zoom < 7) return;
    
    showLoadingMsg();
    
    var bounds = map.getBounds();
    var northEast = bounds.getNorthEast();
    var southWest = bounds.getSouthWest();
    var jsonUrlVars = 'ne=' + northEast.toUrlValue() + '&sw=' + southWest.toUrlValue() + '&z=' + zoom;    
    
    processExistingPins(bounds);
    $.getJSON("/search/mapservice.ashx?" + jsonUrlVars, processJsonMarkerData);    
}

function processExistingPins(bounds) {
    map.clearOverlays();
    existingMarkers = {};
    
    for (var i in existingMarkers) {
        if (!bounds.contains(existingMarkers[i].getPoint())) {
            map.removeOverlay(existingMarkers[i]);
            delete existingMarkers[i];
        }
    }
}

function processJsonMarkerData(data) {    
    $.each(data.points, function(i, item) {
        if (!existingMarkers[item.Id]) {
            existingMarkers[item.Id] = createMarker(item);
            map.addOverlay(existingMarkers[item.Id]);
        }
    });

    hideLoadingMsg();
}

function createMarker(hotelInfo) {
    var marker;
    
    if (hotelInfo.NumHotels > 1)
        marker = createClusterMarker(hotelInfo);
    else
        marker = createHotelMarker(hotelInfo);

    return marker;
}

function createClusterMarker(hotelInfo) {
    var latlng = new GLatLng(hotelInfo.lat, hotelInfo.lng);
    
    options = {
        "icon": icon,
        "clickable": true,
        "labelText": hotelInfo.NumHotels,
        "labelOffset": new GSize(-12, -8),
        "labelClass": "markerNumberText"
    };

    var marker = new LabeledMarker(latlng, options);

    GEvent.addListener(marker, 'click', function() {
        var coords = marker.getLatLng();
        zoomHere(coords.lat(), coords.lng());
    });
    
    return marker;
}

function createHotelMarker(hotelInfo) {
    var latlng = new GLatLng(hotelInfo.lat, hotelInfo.lng);
    var marker = new GMarker(latlng);

    GEvent.addListener(marker, 'click', function() {
        selectedMarker = marker;
        $.ajax({
            type: "GET",
            url: "/search/propertydetails.ashx?id=" + hotelInfo.Id + "&num=" + hotelInfo.NumHotels,
            success: loadPropertyHtml
        });
    });

    return marker;
}


function zoomHere(lat, lng) {
    var newZoom;
    var currentZoom = map.getZoom();    
    
    newZoom = currentZoom + 3;
    if (newZoom > 18)
        newZoom = currentZoom + 1;

    map.setCenter(new GLatLng(lat, lng), newZoom);
}

function zoomHotel(lat, lng) {
    var newZoom = 14;
    var currentZoom = map.getZoom();

    if (currentZoom >= newZoom)
        newZoom = currentZoom + 1;
        
    map.setCenter(new GLatLng(lat, lng), newZoom);
}

function loadPropertyHtml(data) {    
    selectedMarker.openInfoWindowHtml(data);
}

function showLoadingMsg() {
    $("#loading").show();
    loadCount++;
}

function hideLoadingMsg() {
    if (loadCount > 0)
        loadCount--;
    
    if (loadCount == 0)
        $("#loading").hide();
}