var infowindow;
var geocoder;
var editingMarker= null;
var latDefault=41.8954656;
var lngDefault=12.4823243;

function openInfoWindow(map, marker, contentString) {
	infowindow = new google.maps.InfoWindow({content: contentString});
	infowindow.open(map, marker);
}
function closeInfoWindow() {
	if (typeof infowindow != 'undefined') {
		infowindow.close();
	}
}

function createMarker(contentString, latlng, map, markerimage, markershadowimage) {
	if (typeof markerimage == 'undefined' ) markerimage = '/images/marker.png';
	if (typeof markershadowimage == 'undefined' ) markershadowimage = '/images/marker_shadow.png';
	var image = new google.maps.MarkerImage(markerimage,
        new google.maps.Size(29, 46),
        new google.maps.Point(0,0),
	    new google.maps.Point(15, 46));
    /*var shadow = new google.maps.MarkerImage(markershadowimage,
	    new google.maps.Size(24, 25),
	    new google.maps.Point(0,0),
	    new google.maps.Point(8, 25));*/
	var marker = new google.maps.Marker({position: latlng, map: map, icon: image/*, shadow: shadow */});
	if (contentString != "") {
		google.maps.event.addListener(marker, "click", function() {
			if (infowindow) infowindow.close();
				openInfoWindow(map, marker, contentString);
		});
	}
	return marker;
}


/*
 * lat : array di latitudini
 * lng : array di longitudini
 * description : matrice di descrizioni aggiuntive description[0]["title"]
 * autoZoom: indicates if want to autozoom
 */
function initializeMainMap(lat, lng, description, autoZoom, howManyInRed)
{
	if (typeof autoZoom == 'undefined' ) autoZoom = false;
	if (typeof howManyInRed == 'undefined' ) howManyInRed = 25;

	var latlng = new google.maps.LatLng(latDefault, lngDefault);
	
	var myOptions = {
		zoom: 5,
		center: latlng,
		navigationControl: true,
		scaleControl: false,
		mapTypeControl: true,
		scrollwheel: false,
		//mapTypeId: google.maps.MapTypeId.HYBRID
		mapTypeId: google.maps.MapTypeId.TERRAIN
	}
	var map = new google.maps.Map(document.getElementById("map_main_canvas"), myOptions);
	
	n = lat.length;
	var minLng = 0;
	var maxLng = 0;
	var minLat = 0;
	var maxLat = 0;
	for (var i = 0; i < n; i++) {
		if (i== 0) {
			minLat = lat[i];
			maxLat = lat[i];
			minLng = lng[i];
			maxLng = lng[i];
		}
		if (lat[i] < minLat) { minLat= lat[i]; }
		if (lat[i] > maxLat) { maxLat= lat[i]; }
		if (lng[i] < minLng) { minLng= lng[i]; }
		if (lng[i] > maxLng) { maxLng= lng[i]; }
	}
	latCenter = minLat + (( (maxLat - minLat) / 2) );
	lngCenter = minLng + (( (maxLng - minLng) / 2) );
	var markers = new Array();
	var infowindows = new Array();
	for (var i = 0; i < n; i++) {
		var latlng = new google.maps.LatLng(lat[i], lng[i]);
		var contentString =description[i];
		/*if (i<howManyInRed) {
			marker = createMarker(contentString, latlng, map, '/images/markernew.png', '/images/markernew_shadow.png');
		} else {
			marker = createMarker(contentString, latlng, map);
		}*/
		marker = createMarker(contentString, latlng, map);
		markers[i]= marker;
	}
	if (n == 0) {
		latlng = new google.maps.LatLng(latDefault, lngDefault);
		map.setCenter(latlng);
	} else {
		var bounds = new google.maps.LatLngBounds();
		bounds.extend(new google.maps.LatLng(minLat, minLng));
		bounds.extend(new google.maps.LatLng(maxLat, maxLng));
		map.setCenter(bounds.getCenter());
		if (autoZoom) {
			map.fitBounds(bounds);
		}
	}
}

function initializeMapRoute(lat, lng, description, wannaPolylines)
{
	if (typeof wannaPolylines == 'undefined' ) wannaPolylines = true;
	var myOptions = {
		zoom: 8,
		navigationControl: true,
		scaleControl: false,
		mapTypeControl: true,
		scrollwheel: false,
		mapTypeId: google.maps.MapTypeId.TERRAIN
	}
	var map = new google.maps.Map(document.getElementById("map_route_canvas"), myOptions);

	var minLng = 0;
	var maxLng = 0;
	var minLat = 0;
	var maxLat = 0;
	n = lat.length;
	for (var i = 0; i < n; i++) {
		if (i== 0) {
			minLat = lat[i];
			maxLat = lat[i];
			minLng = lng[i];
			maxLng = lng[i];
		}
		if (lat[i] < minLat) { minLat= lat[i]; }
		if (lat[i] > maxLat) { maxLat= lat[i]; }
		if (lng[i] < minLng) { minLng= lng[i]; }
		if (lng[i] > maxLng) { maxLng= lng[i]; }
	}
	latCenter = minLat + (( (maxLat - minLat) / 2) );
	lngCenter = minLng + (( (maxLng - minLng) / 2) );
	var flightPlanCoordinates = new google.maps.MVCArray();
	var markers = new Array();
	for (var i = 0; i < n; i++) {
		var latlng = new google.maps.LatLng(lat[i], lng[i]);
		//d = description[i];
		var contentString =description[i];
		//var currTitle = d["title"];
		var marker = createMarker(contentString, latlng, map);
		flightPlanCoordinates.insertAt(i, latlng);
		markers[i] = marker;
	}
	
	if (minLat==0 && minLng==0 && maxLat==0 && maxLng==0) {
		lat = latDefault;
		lng = lngDefault;
		var latlng = new google.maps.LatLng(lat, lng);
		map.setCenter(latlng);
		map.setZoom(5);
	} else {
		var bounds = new google.maps.LatLngBounds();
		bounds.extend(new google.maps.LatLng(minLat, minLng));
		bounds.extend(new google.maps.LatLng(maxLat, maxLng));
		//map.setCenter(bounds.getCenter(), map.getBoundsZoomLevel(bounds));
		map.setCenter(bounds.getCenter());
		map.fitBounds(bounds);
		if (wannaPolylines) {
			var flightPath = new google.maps.Polyline({
				path: flightPlanCoordinates,
				strokeColor: "#364377",
				strokeOpacity: 1,
				strokeWeight: 3
			});
			flightPath.setMap(map);
		}

		
	}
}


function updateLatLng(marker,latWidgetName, lngWidgetName) {
	if (typeof latWidgetName == 'undefined' ) latWidgetName = 'lat';
	if (typeof lngWidgetName == 'undefined' ) lngWidgetName = 'lng';
	latitud=String(marker.getPosition().lat());
	longitud=String(marker.getPosition().lng()); 
	if (latWidgetName != "") {
		if (document.getElementById(latWidgetName) != null) {
			document.getElementById(latWidgetName).value= latitud;
		}
	}
	if (lngWidgetName != "") {
		if (document.getElementById(lngWidgetName) != null) {
			document.getElementById(lngWidgetName).value= longitud;
		}
	}
}

function setThePoint(point, map, latWidgetName, lngWidgetName, wannaOpenWindowInfo) {
	if (typeof wannaOpenWindowInfo == 'undefined' ) wannaOpenWindowInfo = true;
	closeInfoWindow();
	if (editingMarker != null) {
		editingMarker.setMap(null);
	}
	map.setCenter(point);
	editingMarker = new google.maps.Marker( {
			position :point,
			draggable: true
	}
	);
	google.maps.event.addListener(editingMarker, "dragstart", function() {
		closeInfoWindow();
	});
	google.maps.event.addListener(editingMarker, "dragend", function() {
		updateLatLng(editingMarker , latWidgetName, lngWidgetName);
		titolo = makeContentInfoWindow();
		if (wannaOpenWindowInfo) {
			openInfoWindow(map, editingMarker, titolo);
		}
	});
	editingMarker.setMap(map);
	updateLatLng(editingMarker, latWidgetName, lngWidgetName);
	titolo = makeContentInfoWindow();
	if (wannaOpenWindowInfo) {
		openInfoWindow(map, editingMarker, titolo);
		//marker.openInfoWindowHtml(titolo);
	}
}
function initializeMapEdit(lat, lng, widgetNameLat, widgetNameLng, openWindowInfo) {
	centerNotSet=false;
	if (typeof lat == 'undefined' ) { lat = latDefault; centerNotSet=true;}
	if (typeof lng == 'undefined' ) { lng = lngDefault; centerNotSet=true;}
	if (lat == 0 ) { lat = latDefault; centerNotSet=true;}
	if (lng == 0 ) { lng = lngDefault; centerNotSet=true;}
	if (typeof openWindowInfo == 'undefined' ) openWindowInfo =true;
	if (typeof widgetNameLat == 'undefined' ) widgetNameLat = 'lat';
	if (typeof widgetNameLng == 'undefined' ) widgetNameLng = 'lng';
	var latlng = new google.maps.LatLng(lat, lng);
	var zoomVar = 15;
	if (centerNotSet) {
		zoomVar = 5;
	}
	var myOptions = {
		zoom: zoomVar,
		center: latlng,
		navigationControl: true,
		scaleControl: false,
		mapTypeControl: true,
		scrollwheel: false,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	}
	var map = new google.maps.Map(document.getElementById("map_edit_canvas"), myOptions);
	if ( ! centerNotSet) {
		point = new google.maps.LatLng(lat, lng)
		setThePoint(point, map, widgetNameLat, widgetNameLng, openWindowInfo);
	}
	geocoder = new google.maps.Geocoder();
	return map;
}

function initializeMapShow(lat, lng) {
	centerNotSet=false;
	if (typeof lat == 'undefined' ) { lat = latDefault; centerNotSet=true;}
	if (typeof lng == 'undefined' ) { lng = lngDefault; centerNotSet=true;}
	if (lat == 0 ) { lat = latDefault; centerNotSet=true;}
	if (lng == 0 ) { lng = lngDefault; centerNotSet=true;}
	if (typeof openWindowInfo == 'undefined' ) openWindowInfo =true;
	if (typeof widgetNameLat == 'undefined' ) widgetNameLat = 'lat';
	if (typeof widgetNameLng == 'undefined' ) widgetNameLng = 'lng';
	var latlng = new google.maps.LatLng(lat, lng);
	var zoomVar = 15;
	if (centerNotSet) {
		zoomVar = 5;
	}
	var myOptions = {
		zoom: zoomVar,
		center: latlng,
		navigationControl: true,
		scaleControl: true,
		mapTypeControl: true,
		scrollwheel: false,
		mapTypeId: google.maps.MapTypeId.ROADMAP
	}
	var map = new google.maps.Map(document.getElementById("map_show_canvas"), myOptions);
	if ( ! centerNotSet) {
		point = new google.maps.LatLng(lat, lng)
		setThePoint(point, map, widgetNameLat, widgetNameLng, openWindowInfo);
	}
	geocoder = new google.maps.Geocoder();
	return map;
}

function extractRegion(r){
	var c = r.address_components;
	for (var i = 0; i< c.length; i++) {
		var curr = c[i];
		var region;
		var country;
		if (curr["types"]) {
			var types = curr["types"]; 
			for (var k = 0; k < types.length; k++) {
				if (types[k] == "administrative_area_level_1") {
					region = curr['long_name'];
				}
				if (types[k] == "country") {
					country = curr['short_name'];
				}
			}
		}
	}
	if(country == "IT")
	{
	   return region;	
	}
	else
	{
		region = "EE";
		return region;
	}
		
	return false;
}

function extractProvince(r){
	var c = r.address_components;
	var province;
	var country;
	for (var i = 0; i< c.length; i++) {
		var curr = c[i];
		if (curr["types"]) {
			var types = curr["types"]; 
			for (var k = 0; k < types.length; k++) {
				if (types[k] == "administrative_area_level_2") {
					province = curr['short_name'];
				}
				if (types[k] == "country") {
					country = curr['short_name'];
				}
			}
		}
	}
	if(country == "IT")
	{
	   return province;	
	}
	else
	{
		province = "EE";
		return province;
	}
	
	return false;
}
/*
function extractRegion(r){
	var c = r.address_components;
	for (var i = 0; i< c.length; i++) {
		var curr = c[i];
		if (curr["types"]) {
			var types = curr["types"]; 
			for (var k = 0; k < types.length; k++) {
				if (types[k] == "administrative_area_level_1") {
					return curr['long_name'];
				}
			}
		}
	}
	return false;
}
*/
/*
function extractProvince(r){
	var c = r.address_components;
	for (var i = 0; i< c.length; i++) {
		var curr = c[i];
		if (curr["types"]) {
			var types = curr["types"]; 
			for (var k = 0; k < types.length; k++) {
				if (types[k] == "administrative_area_level_2") {
					return curr['short_name'];
				}
			}
		}
	}
	return false;
}
*/
function showAddress(address, city, map, geocoder, widgetNameLat, widgetNameLng, openWindowInfo, callbackFunctionForGeocodex) {
	separator="";
	addressToFind="";
	var result;
	if (typeof widgetNameLat == 'undefined' ) widgetNameLat = 'lat';
	if (typeof widgetNameLng == 'undefined' ) widgetNameLng = 'lng';
	if (typeof openWindowInfo == 'undefined' ) openWindowInfo = true;
	
	
	if (address  != null && address != 'undefined' && address != '') {
		addressToFind = address;
		separator=", ";
	}
	
	if (city != null && city != 'undefined' && city != '') {
		addressToFind = addressToFind+separator+city;
	}
	if (geocoder) {
		ll= geocoder.geocode(
			{ "address": addressToFind} ,
			function(results, status)  {
				if (status == google.maps.GeocoderStatus.OK) {
					if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
						
						point = results[0].geometry.location;
						//var regione = extractRegion(results[0]);
						//console.log(regione);
						//map.clearOverlays();
						setThePoint(point, map, widgetNameLat, widgetNameLng, openWindowInfo);
						if (map.getZoom() == 5) {
							map.setZoom(15);
						}
						result = results[0];
						if (callbackFunctionForGeocodex) {
							callbackFunctionForGeocodex(result);
						}
						
						
						//return results[0];
					} else {
						alert(address + " NON TROVATO!");
					}
				} else {
					alert("Geocode was not successful for the following reason: " + status);
				}
			}
		);
	}
	return result;
}

function showAddressStage(address, city, map, geocoder, widgetNameLat, widgetNameLng, openWindowInfo, callbackFunctionForGeocodex) {
	separator="";
	addressToFind="";
	var result;
	if (typeof widgetNameLat == 'undefined' ) widgetNameLat = 'lat';
	if (typeof widgetNameLng == 'undefined' ) widgetNameLng = 'lng';
	if (typeof openWindowInfo == 'undefined' ) openWindowInfo = true;
	
	
	if (address  != null && address != 'undefined' && address != '') {
		addressToFind = address;
		separator=", ";
	}
	
	if (city != null && city != 'undefined' && city != '') {
		addressToFind = addressToFind+separator+city;
	}
	if (geocoder) {
		ll= geocoder.geocode(
			{ "address": addressToFind} ,
			function(results, status)  {
				if (status == google.maps.GeocoderStatus.OK) {
					if (status != google.maps.GeocoderStatus.ZERO_RESULTS) {
						
						point = results[0].geometry.location;
						//map.clearOverlays();
						setThePoint(point, map, widgetNameLat, widgetNameLng, openWindowInfo);
						if (map.getZoom() == 5) {
							map.setZoom(15);
						}
						
						$$('.feedback.no')[0].hide();
						$$('.feedback.ok')[0].show();
						
						callbackFunctionForGeocode(results[0]);
						/*
						result = results[0];
						if (callbackFunctionForGeocodex) {
							callbackFunctionForGeocodex(result);
						}
						*/
						//return results[0];
					} else {
						alert(address + " NON TROVATO!");
						/*$$('.feedback.no')[0].show();
						$$('.feedback.ok')[0].hide();*/
					}
				} else {
					alert("Geocode was not successful for the following reason: " + status);
					/*$$('.feedback.no')[0].show();
					$$('.feedback.ok')[0].hide();*/
				}
			}
		);
	}
	return result;
}




function makeContentInfoWindow() {
	s="";
	if (document.getElementById("title") != null) {
		s = document.getElementById("title").value
	}
	return s;
}
