
/*
 * 
 * Richiede:
 * 
 * - Google Maps V2
 * - jQuery 
 *  
 */


function APMMap() {

	this.start = start;

	function attachInfoWindow(gmap, marker, identificativo, id_pm, nomeppag, urlShowInfo) {		
		google.maps.Event.addListener(marker, 'click', function() {
			$.ajax({
				url: urlShowInfo,
				data: ({id: identificativo, idpm: id_pm, nppag: nomeppag}),
				type: "POST",
				success: function(data, textStatus, XMLHttpRequest) {
					marker.openInfoWindowHtml(data);
				}
				/*,
			 	error: function (XMLHttpRequest, textStatus, errorThrown) {					
					alert("error: " + textStatus);
					alert("error: " + errorThrown);
					alert("error: " + XMLHttpRequest.status);
				},
				complete: function (XMLHttpRequest, textStatus) {
					alert("complete: " + textStatus);
				}
				*/
			}); // ajax
	  	}); // click
	}
	
	function mapFromAddress(gmap, address, incZoom) {
		var geocoder = new google.maps.ClientGeocoder();
		geocoder.setBaseCountryCode("it");
			
		//var tabAccuracy = new Array(2,4,6,10,12,13,16,16,17);
		var tabAccuracy = new Array(3,5,7,11,12,13,16,16,17,17);
		
		geocoder.getLocations(address, function(response) {
			if (response.Status.code == 200) {
				var place = response.Placemark[0];
		        var accuracy = place.AddressDetails.Accuracy;
		        var zoom = (accuracy > 8 ? 17 : tabAccuracy[accuracy]) + (incZoom);
		        if (zoom > 19) {
		        	zoom = 19;
		        }
		        else if (zoom < 0) {
		        	zoom = 0;
		        }
		        gmap.setCenter(new google.maps.LatLng(place.Point.coordinates[1], place.Point.coordinates[0]), zoom);
			}
		});
	}
	
	function mapFromPoints(gmap, geoItems) {
		var n = geoItems.length;
		var geoItem = geoItems[0];
		var latitudine = geoItem[2];
		var longitudine = geoItem[3];
		var north = latitudine;
		var south = latitudine;
		var east  = longitudine;
		var west  = longitudine;
		for (var i = 1; i < n; i++) {
			geoItem = geoItems[i];
			latitudine = geoItem[2];
			longitudine = geoItem[3];
			if (latitudine > north) {
				north = latitudine;
			}
			else if (latitudine < south) {
				south = latitudine;
			}
			if (longitudine > east) {
				east = longitudine;
			}
			else if (longitudine < west) {
				west = longitudine;
			}
		}
		var sw = new google.maps.LatLng(south, west);
		var ne = new google.maps.LatLng(north, east);
		var bounds = new google.maps.LatLngBounds(sw, ne);

		var center = new google.maps.LatLng((south + north) / 2, (west + east) / 2);
		var zoom = gmap.getBoundsZoomLevel(bounds) - (n == 1 ? 5 : 1);

		if (zoom < 0) {
			zoom = 0;
		}
		
        gmap.setCenter(center, zoom);

		return bounds;
	}
	
	function getLatLngFirstItem(geoItems) {
		var geoItem = geoItems[0];
		var latitudine = geoItem[2];
		var longitudine = geoItem[3];
		
		var ll = new google.maps.LatLng(latitudine, longitudine);

		return ll;
	}
	
	function showMarkers(gmap, geoItems, urlShowInfo, id_pm, nomeppag, home_color, show_shadow, iconMarkerWidth, iconMarkerHeight) {
		var _clickable = urlShowInfo != undefined && urlShowInfo != null && urlShowInfo != ''
			          && id_pm != 0 && nomeppag != undefined && nomeppag != '' ;
		var n = geoItems.length;
		for (var i = 0; i < n; i++) {
			var geoItem = geoItems[i];
			var riga = geoItem[0];
			var identificativo = geoItem[1];
			var latitudine = geoItem[2];
			var longitudine = geoItem[3];
			var pos = new google.maps.LatLng(latitudine, longitudine);
			
			var iconMarker = new google.maps.Icon();
			iconMarker.image = '/maps/marker/home/' + home_color + '_' + riga + '.png';
			if (show_shadow) {
				iconMarker.shadow = '/img/marker/home_shadow.png';
			}
			
			iconMarker.iconSize = new google.maps.Size(iconMarkerWidth, iconMarkerHeight);
			iconMarker.shadowSize = new google.maps.Size(59, iconMarkerHeight);
			iconMarker.iconAnchor = new google.maps.Point(0, iconMarkerHeight);
			
			iconMarker.infoWindowAnchor = new google.maps.Point(27, 5);

			var markerOptions = { icon: iconMarker, clickable: _clickable };

			var marker = new google.maps.Marker(pos, markerOptions);
			gmap.addOverlay(marker);
			
			if (_clickable) {
				attachInfoWindow(gmap, marker, identificativo, id_pm, nomeppag, urlShowInfo);
			}
		}

	}
	
	/*
	 * idMapCanvas: String
	 * idStreetViewCanvas: String
	 * idLinkCanvas: String
	 * idMapLink: String
	 * idStreetViewLink: String
	 * 
	 * GeoList:
	 * --------
	 * address: String
	 * incZoom: int
	 * abilitaStreetView: boolean (true/false)
	 * geoItems: Array di address, incZoom, Array di [riga, identificativo, latitudine, longitudine] 
	 * urlShowInfo: String (url per infoWindow)
	 *
	 * id_pm: idPaginaModulo
	 * nomeppag: nome parametro pagina della Pagina Modulo
	 * home_color: red, blue, magenta
	 * show_shadow: true | false
	 * iconMarkerWidth: larghezza icona marker
	 * iconMarkerHeight: altezza icona marker
	 */
	
	var idDivLinkCanvas = null;
	
	function start(idMapCanvas, idStreetViewCanvas, idLinkCanvas, idMapLink, idStreetViewLink, geoList, id_pm, nomeppag, home_color, show_shadow, iconMarkerWidth, iconMarkerHeight) {
		idDivLinkCanvas = idLinkCanvas;
		
		if (google.maps.BrowserIsCompatible()) {

			var gmap = new google.maps.Map2(document.getElementById(idMapCanvas));
			gmap.setMapType(G_NORMAL_MAP);
		    gmap.setUIToDefault();
	
			var address = geoList[0];
			var incZoom = geoList[1];
			var abilitaStreetView = geoList[2];
		    var geoItems = geoList[3];
			var urlShowInfo = geoList[4];
			var n = 0;
			if (geoItems != undefined && geoItems != null) {
				n = geoItems.length;						
			}
	
			if (n == 0) {
				mapFromAddress(gmap, address, incZoom);
			}
			else {
				mapFromPoints(gmap, geoItems);
				showMarkers(gmap, geoItems, urlShowInfo, id_pm, nomeppag, home_color, show_shadow, iconMarkerWidth, iconMarkerHeight);
			}
			
			if (abilitaStreetView && n == 1) {
				var linkCanvas = document.getElementById(idLinkCanvas);
				linkCanvas.style.display = 'block';
				
				var ll = getLatLngFirstItem(geoItems);
				var panoramaOptions = { latlng: ll, features: { userPhotos: false }};
				var myStreetView = new GStreetviewPanorama(document.getElementById(idStreetViewCanvas), panoramaOptions);
				GEvent.addListener(myStreetView, "error", handleError);
			}
		}
	} // start
	
	function handleError(errorCode) {
		var canvasDivLink = document.getElementById(idDivLinkCanvas);
		canvasDivLink.style.display = 'none';
	}


} // APMMap

function hasClassName(el, name){
	var re = new RegExp('(^\s*|\s*)' + name + '(\s*|\s*$)');
	return re.test(el.className);
}

function toggleAPMMap(idLinkOn, idLinkOff, idCanvasOn, idCanvasOff) {
	var linkOn = document.getElementById(idLinkOn);	
	if (hasClassName(linkOn, 'nopointer')) {
		return;
	}	
	var jLinkOn = $('#' + idLinkOn);
	jLinkOn.attr('class', 'grigio11b nopointer');
	jLinkOn.parent().attr('class', 'grigio11b');	
	
	var jLinkOff = $('#' + idLinkOff);
	jLinkOff.attr('class', 'rosso11b');
	jLinkOff.parent().attr('class', 'rosso11b');
	
	var canvasOn = document.getElementById(idCanvasOn);
	canvasOn.style.display = 'none';
	
	var canvasOff = document.getElementById(idCanvasOff);	
	canvasOff.style.display = 'block';

}

