var debug = true;

var allowedBounds;
var bounds;
var bounds_original;
var map;
var max_original = 9;//12
var markerCluster;

function _mydebug(arg)
{
    if (!window.console)
    {
        return;
    }
    else
    {
        console.log(arg);
    }
}

// If the map position is out of range, move it back
// http://econym.org.uk/gmap/example_range.htm
function checkBounds()
{
    // Perform the check and return if OK
    if (allowedBounds.contains(map.getCenter()))
    {
        return;
    }

    // It's not OK, so find the nearest allowed point and move there
    var C = map.getCenter();
    var X = C.lng();
    var Y = C.lat();

    var AmaxX = allowedBounds.getNorthEast().lng();
    var AmaxY = allowedBounds.getNorthEast().lat();
    var AminX = allowedBounds.getSouthWest().lng();
    var AminY = allowedBounds.getSouthWest().lat();

    if (X < AminX) { X = AminX; }
    if (X > AmaxX) { X = AmaxX; }
    if (Y < AminY) { Y = AminY; }
    if (Y > AmaxY) { Y = AmaxY; }

    map.setCenter(new GLatLng(Y, X));
}

function createMarker(point, id, tipo)
{
    var marker = new GMarker(point);

    GEvent.addListener(marker, 'click', function() {
       /*
	    var _caricamento = jQuery('#caricamento').html();
        var _url_ajax    = jQuery('#fumetto').text();

        marker.openExtInfoWindow (
            map,
            'custom_info_window_red',
            _caricamento,
            {
                ajaxUrl:    _url_ajax + '&tipo=' + tipo + '&id=' + id, 
                beakOffset: 3
            }
        );*/
    });

    //GEvent.addListener(marker, 'click', function() {console.log(id)});
	//map.addOverlay(marker);

    return marker;
}

function getCloser(point, set)
{
    var closer_p = new GLatLng(55.949199, -3.197021); // Edinburgh is far enough from "the farest corner of Piedmont" :-)
    var closer_d = point.distanceFrom(closer_p);

    for (var i = 0; i < set.length; i++)
    {
        var distance = point.distanceFrom(set[i].getLatLng());
        if (distance < closer_d)
        {
            closer_p = set[i].getLatLng();
            closer_d = distance;
        }
    }

    return closer_p;
}


function initialize(latitudine, longitudine)
{
    if (GBrowserIsCompatible())
    {
        var lat_max = 46.480000;
        var lat_min = 44.000000;
        var lon_max =  9.230000;
        var lon_min =  6.600000;

        map               = new GMap2(document.getElementById('map_canvas'));
        var center        = new GLatLng(latitudine, longitudine);
        var customUI      = map.getDefaultUI();
        var marker        = new GMarker(center);
        bounds            = map.getBounds();

        map.setCenter(center, max_original);
        map.addOverlay(marker);

        customUI.controls.largemapcontrol3d  = false;
        customUI.controls.smallzoomcontrol3d = true;

        map.setUI(customUI);
//        map.setMapType(G_PHYSICAL_MAP);

        var mt = map.getMapTypes();

        // Overwrite the getMinimumResolution() and getMaximumResolution() methods
        for (var i = 0; i < mt.length; i++)
        {
            mt[i].getMinimumResolution = function() {return  8;}
            //mt[i].getMaximumResolution = function() {return 13;}
        }
  
        // Add a move listener to restrict the bounds range
        GEvent.addListener(map, 'move', function() { checkBounds(); });

        // The allowed region which the whole map must be within
        allowedBounds = new GLatLngBounds(new GLatLng(lat_min, lon_min), new GLatLng(lat_max, lon_max));
    }
}
function processJson(json)
{
	if (markerCluster && markerCluster.clearMarkers)
		markerCluster.clearMarkers();
	
    var is_in = new Boolean(false);
    //jQuery.unblockUI();

    map.clearOverlays();

    bounds_original = map.getBounds();

    var points = new Array();
    for (var i = 0; i < json.length; i++)
    {
        var point = new GLatLng(json[i].lat, json[i].lon);

        bounds.extend(point);
        points.push(createMarker(point, json[i].id, json[i].tipo));

        if (bounds_original.containsLatLng(point) == true)
        {
            is_in = true;
        }

    }

    if (is_in == true)
    {
        map.setCenter(bounds_original.getCenter(), map.getBoundsZoomLevel(bounds_original));
    }
    else
    {
        map.setCenter(getCloser(bounds_original.getCenter(), points), max_original);
    }
	
    markerCluster = new MarkerClusterer(map, points);

}
