var map;
var active_points = new Array();
var last_post_id = 0;
var latest_post_request;
var first_fire = true;
var empty_icon;

// Called in body -> onLoad
function load_map() {
    map = new GMap2($('map_view'));
    map.addControl(new GLargeMapControl());
    map.enableScrollWheelZoom();
    map.setCenter(new GLatLng(40.753889, -73.974123), 4);
    
    // Set up empty icon (for map updates)
    empty_icon            = new GIcon(G_DEFAULT_ICON);
    empty_icon.iconSize   = new GSize(1, 1);
    empty_icon.iconAnchor = new GPoint(1, 1);
    empty_icon.shadow     = false;
    
    // Set up default icon
    var marker_icon        = new GIcon(
        G_DEFAULT_ICON,
        '/images/map_marker.png'
    );
    marker_icon.iconSize   = new GSize(26, 26);
    marker_icon.iconAnchor = new GPoint(13, 13);
    marker_icon.shadow     = false;

    var marker_icon_multi = new GIcon(
        marker_icon,
        '/images/map_marker_multi.png'
    );

    function add_marker(lat, lon, multi, tumblelogs) {
        if (! active_points[lat + ',' + lon] || active_points[lat + ',' + lon][0] < tumblelogs.length) {
            if (active_points[lat + ',' + lon]) {
                map.removeOverlay(active_points[lat + ',' + lon][1]);
            }
            
            active_points[lat + ',' + lon] = [tumblelogs.length];
            
            var marker = new GMarker(
                new GLatLng(lat, lon),
                (multi ? marker_icon_multi : marker_icon)
            );

            var content = '';

            for (var i=0; i<tumblelogs.length; i++) {
                content += '<li><a href="' + tumblelogs[i]['url'] 
                         + '" target="_blank"><img src="' 
                         + tumblelogs[i]['avatar_url'].replace('^', 'http://data.tumblr.com/')
                         + '" alt=""/>' + tumblelogs[i]['title'] + '</a></li>';
            }

            GEvent.addListener(marker, "click", function() {
                this.openExtInfoWindow(
                    map,
                    'map_bubble',
                    '<div class="map_bubble"><ul class="map_list">' + content + '</ul></div>'
                );
            });   

            map.addOverlay(marker);
            
            active_points[lat + ',' + lon][1] = marker;
        }
    }
    
    GEvent.addListener(map, "zoomend", function(oldLevel, newLevel) {
        if (oldLevel >= 8 && newLevel < 8) {
            Element.hide('map_loading');
            
            if (marker_request) {
                marker_request.transport.abort();
                marker_request = false;
            }
            
            map.clearOverlays();
        }
    });
    
    var marker_request;
    
    GEvent.addListener(map, "moveend", function() {        
        if (map.getZoom() >= 8) {                        
            if (marker_request) {
                marker_request.transport.abort();
                marker_request = false;
            }
            
            Element.show('map_loading');
        
            marker_request = new Ajax.Request(
                '/get_map_tumblelogs/' + 
                map.getBounds().getSouthWest().lat() + ',' +
                map.getBounds().getSouthWest().lng() + '/' + 
                map.getBounds().getNorthEast().lat() + ',' + 
                map.getBounds().getNorthEast().lng() + '/' +
                map.getCenter().lat() + ',' + 
                map.getCenter().lng() + '/', 
                {
                    method: 'get',
                    onSuccess: function(transport) {
                        Element.hide('map_loading');
                        
                        for (var point in transport.responseJSON) {                            
                            add_marker(
                                point.split(',')[0],
                                point.split(',')[1],
                                (transport.responseJSON[point].length > 1 ? true : false),
                                transport.responseJSON[point]
                            );
                        }
                    }
                }
            );
        }
    });
    
    if (first_fire) {
        setInterval('update_map_with_latest_post()', 1000 * 2);
        first_fire = false;
    } else {
        setInterval('update_map_with_latest_post()', 1000 * 10);
    }
}

function update_map_with_latest_post() {
    if (! latest_post_request && map.getZoom() < 8) {
        latest_post_request = new Ajax.Request(
            '/get_latest_post_for_map', 
            {
                method: 'get',
                onSuccess: function(transport) {
                    latest_post_request = false;
                    
                    if (map.getZoom() < 8) {
                        if (last_post_id != transport.responseJSON['post_id']) {
                            map.clearOverlays();
                            last_post_id = transport.responseJSON['post_id'];
                            
                            var marker = new GMarker(
                                new GLatLng(
                                    transport.responseJSON['latitude'],
                                    transport.responseJSON['longitude']
                                ),
                                empty_icon
                            );
                             
                            marker.openExtInfoWindow(
                                map,
                                'map_bubble',
                                '<a href="' + transport.responseJSON['url'] + '" ' +
                                'target="_blank" ' +
                                'class="post_bubble"><div class="info">' +  
                                '<img src="' + transport.responseJSON['avatar_url'] +
                                '" alt=""/>' + transport.responseJSON['title'] +
                                '</div>' + transport.responseJSON['post_content'] + '</a>'                            );
                        }
                    }
                }
            }
        );
    }
}

function resize_map_for_window()
{
	$('map_view').style.height = (document.viewport.getHeight() - 80 - 81 - 65) + 'px';
}