Event.observe(window, 'load', function() {
	initialize();
});

var map;
var mapC;
var panorama;
var infoWindow;
var svClient;
var geocoder;
var iconaRealigro = new Array();
var points = null;
var svAttiva = false;

function initialize() {
	$("mappa").addClassName("attiva");

	// container della mappa:
	mapC = $("mapcontainer");

	// Container dello street view:
	mapSv = $("mapcontainerStreetView");

	var mapOptions = {
		center: new google.maps.LatLng(41.9, 12.49),
		zoom: 16,
		mapTypeId: google.maps.MapTypeId.ROADMAP,
		navigationControlOptions: { style: google.maps.NavigationControlStyle.SMALL },
		streetViewControl: true,
		mapTypeControl: false
    };

	// Inizializza la mappa:
	map = new google.maps.Map(mapC, mapOptions);

	// Street view client:
	svClient = new google.maps.StreetViewService();

	// Istanza della Street View Panorama:
	panorama = map.getStreetView();

	// Info:
	infoWindow = new google.maps.InfoWindow();

	// Customizza le icone:
	iconaRealigro[0] = createIcon(0);
	iconaRealigro[1] = createIcon(1);

	// Inizializza i punti selezionati:
	initializePoint();

	// Inizializza i pulsanti:
	google.maps.event.addDomListener($("mapinfoMappa"), "click", function() {
		map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
		panorama.setVisible(false);
	});

	google.maps.event.addDomListener($("mapinfoSatellite"), "click", function() {
		map.setMapTypeId(google.maps.MapTypeId.SATELLITE);
		panorama.setVisible(false);
	});

	google.maps.event.addDomListener($("mapinfoIbrida"), "click", function() {
		map.setMapTypeId(google.maps.MapTypeId.HYBRID);
		panorama.setVisible(false);
	});

	google.maps.event.addListener(map, "click", function(){
		infoWindow.close();
	});
}

function initializePoint() {
	var bounds = new google.maps.LatLngBounds();
	var defPoints = false;

	for (i in points) {
		defPoints = true;
		var point = points[i];
		var latlng = new google.maps.LatLng(parseFloat(point.lat), parseFloat(point.lng));
		bounds.extend(latlng);

		var tipo = 0;
		if (parseInt(point.tipo) == 1) {
			tipo = 1;
		}

		createMarker(map, latlng, point.msg, iconaRealigro[tipo]);

		// Richiama questa funzione per tutti i marker per
		// assicurarsi che la view sia attivata sul primo disponibile:
		if (!svAttiva) {
			svClient.getPanoramaByLocation(latlng, 50, initializeStreetView);
		}
	}

	if (defPoints) {
		// Setta la mappa per mostrare solo l'area
		// che include i marker:
		map.setCenter(bounds.getCenter());
		map.panToBounds(bounds);
	} else {
		$("mappa").removeClassName("attiva");
	}
}

function initializeStreetView(data, status) {
	if (status != google.maps.StreetViewStatus.OK) {
		return;
	}

	svAttiva = true;

	panorama.setPano(data.location.pano);
	panorama.setPov({
		heading: 34,
		pitch: 10,
		zoom: 1
	});

	panorama.setVisible(true);
}

// Setta lo z-index del marker dello Street View
// per fare in modo che sia sempre in primo piano rispetto agli altri marker.
function svMarkerZIndex() {
	return 100;
}

function createMarker(map, latlng, html, icona) {
	var marker = new google.maps.Marker({
		position: latlng,
		map: map,
		icon: icona,
		visible: true
	});

	google.maps.event.addListener(marker, "click", function() {
		infoWindow.setPosition(latlng);
		infoWindow.setContent(html, marker);
		infoWindow.open(map);
	});
}

function createIcon(tipo) {
	var icon = null;

	switch (parseInt(tipo)) {
		case 1:
			icon = new google.maps.MarkerImage("/img/marker2.png");
			break;
		default:
			icon = new google.maps.MarkerImage("/img/marker.png");
			break;
	}

	icon.size = new google.maps.Size(22,26);
	icon.origin = new google.maps.Point(11,26);
	icon.anchor = new google.maps.Point(11,13);

	return icon;
}
