var map;
var markerClusterer	= null;
var infowindow;
var defaultPushpin = 'http://maps.google.com/mapfiles/marker.png';
var adjustZoomFlag = false;

var initCenter;
var initZoom;

var clusterIcon = [
	{
		url: 'googlemap/icons/_none.png',
		width:	32,
		height:	37,
		opt_textColor: '#ffffff'
	},
	{
		url: 'googlemap/icons/_none.png',
		width:	32,
		height:	37,
		opt_textColor: '#ffffff'
	},
	{
		url: 'googlemap/icons/_none.png',
		width:	32,
		height:	37,
		opt_textColor: '#ffffff'
	},
	{
		url: 'googlemap/icons/_none.png',
		width:	32,
		height:	37,
		opt_textColor: '#ffffff'
	},
	{
		url: 'googlemap/icons/_none.png',
		width:	32,
		height:	37,
		opt_textColor: '#ffffff'
	},
	{
		url: 'googlemap/icons/_none.png',
		width:	32,
		height:	37,
		opt_textColor: '#ffffff'
	}
];

$(function() {
	if (jsONLINE) {
		initMap();

		if (jsGooglemapJsonedPreloadedPushpins) addPushpinsFromJsonString(jsGooglemapJsonedPreloadedPushpins);

		/*
		google.maps.event.addListener(map, 'center_changed', function() {
			var center = map.getCenter();
			console.log('center: ' + center);

			var bounds = map.getBounds();
			console.log('bounds: ' + bounds);
		});
		google.maps.event.addListener(map, 'zoom_changed', function() {
			var zoom = map.getZoom();
			console.log('zoom: ' + zoom);

			var bounds = map.getBounds();
			console.log('bounds: ' + bounds);
		});
		*/

		google.maps.event.addListener(map, 'click', function() {
			if (infowindow) infowindow.close();
		});

		google.maps.event.addListener(map, 'zoom_changed', function() {
			if (adjustZoomFlag == true) {
				var zoom = map.getZoom();
				if (zoom > jsGooglemapZoomMax) map.setZoom(jsGooglemapZoomMax);

				adjustZoomFlag = false;
			}
		});

		//_loadGeoData(null);
	}

	$('.googlemap_legend_checkboxes').click(function(){
		var pagetypesArray = new Array();
		$('.googlemap_legend_checkboxes:checked').each(function(i){
			var glcp = $(this).parent('p').find('span.googlemap_legend_checkboxes_pagetype');
			if (glcp.length > 0) pagetypesArray[i] = glcp.text().toLowerCase();
		});

		var idsArray = new Array();
		$('.googlemap_legend_checkboxes:checked').each(function(i){
			var glci = $(this).parent('p').find('span.googlemap_legend_checkboxes_ids');
			if (glci.length > 0) idsArray[i] = glci.text().toLowerCase();
		});

		if (idsArray.length > 0) {
			var iids2append = '&iids=' + idsArray.join('|');
			var bounds2append = getGetBounds();

			_loadGeoData(iids2append + bounds2append);
		} else if (pagetypesArray.length > 0) {
			var ict2append = '&ict=' + rawurlencode(pagetypesArray.join('|'));
			var bounds2append = getGetBounds();

			_loadGeoData(ict2append + bounds2append);
		} else {
			if (markerClusterer) markerClusterer.clearMarkers();
		}
	});
});

function initMap() {
	var divId				= jsGooglemapMapDivIdDefault;
	initZoom				= jsGooglemapZoomDefault;
	var scaleControl		= true;
	var mapTypeControl		= true;
	if (jsGooglemapSingleMode || jsGooglemapPreloadedMode) {
		divId			= jsGooglemapMapDivIdSingle;
		initZoom		= jsGooglemapZoomSingle;
		scaleControl	= false;
		mapTypeControl	= false;
	}

	initCenter = new google.maps.LatLng(jsGooglemapLatitude, jsGooglemapLongitudine);
	var options = {
		center:				initCenter,
		zoom:				initZoom,
		mapTypeId:			jsGooglemapType,
		navigationControl:	true,
		scaleControl:		scaleControl,
		mapTypeControl:		mapTypeControl,
		scrollwheel:		false
	};

	var mapDiv = document.getElementById(divId); // non vuole $('#' + divId) -> Uncaught TypeError: Cannot set property 'position' of undefined
	map = new google.maps.Map(mapDiv, options);
}

function extendBounds(bounds, longitude, latitude) {
	var latlng = new google.maps.LatLng(latitude, longitude);
	bounds.extend(latlng);
	return bounds;
}

function getGetBounds() {
	var bounds2append = '';

	var ne = null;
	var sw = null;
	if ($('#googlemap_bounds').length > 0) {
		ne = $('#googlemap_bounds_ne').text();
		sw = $('#googlemap_bounds_sw').text();
	}
	if (ne != '' && sw != '') bounds2append = '&bounds=' + ne + '|' + sw;

	return bounds2append;
}

function resetBounds() {
	map.setCenter(initCenter);
	map.setZoom(initZoom);
}

function _loadGeoData(qs2append) {
	blockui('googlemap_container', true);

	$.ajax({
		type:'POST',
		url:'index.php',
		data:'ajax=googlemap_load_geo_data&lang=' + jsLang + qs2append,
		success:function(response){
			if (response) {
				var geoObject = eval('(' + response + ')');
				_populateGooglemap(geoObject);
			}

			blockui('googlemap_container', false);

			return false;
		},
		error: function(){
			console.dir(object);
			console.log(error + ' | ' + errorType);
		}
	});
}

function _populateGooglemap(geoObject) {
	var bounds = new google.maps.LatLngBounds();
	var adjustViewportFlag = false;


	if (markerClusterer) markerClusterer.clearMarkers();

	var markers = [];

	$.each(geoObject['items'], function(i) {
		var currentItem = geoObject['items'][i];

		var idSk				= currentItem['ID_SK'];
		var title				= currentItem['TITOLO_DA_STAMPARE'];
		var content				= currentItem['CONTENT'];
		var longitude			= currentItem['CENTER_X'];
		var latitude			= currentItem['CENTER_Y'];

		var currentItemGeotype	= currentItem['GEOTYPE'];
		var pushpin = geoObject['overlay'][currentItemGeotype]['style'];

		var marker = _googlemapCreateMarker(longitude, latitude, title, content, pushpin);

		markers.push(marker);


		bounds = extendBounds(bounds, longitude, latitude);
		adjustViewportFlag = true;
	});

	markerClusterer = new MarkerClusterer(map, markers, { styles: clusterIcon });


	if (adjustViewportFlag) map.fitBounds(bounds);
}

function _googlemapCreateMarker(longitude, latitude, title, content, pushpin) {
	if (!pushpin) pushpin = defaultPushpin;

	var marker = new google.maps.Marker({
		position: new google.maps.LatLng(latitude, longitude),
		title: strip_tags(rawurldecode(title)),
		icon: pushpin
	});

	google.maps.event.addListener(marker, 'click', function() {
		createInfowindow(map, marker, title, content, false);
	});

	return marker;
}


function addPushpinsFromJsonString(jsGooglemapJsonedPreloadedPushpins) {
	var jsGooglemapPreloadedPushpinsArray = eval('(' + jsGooglemapJsonedPreloadedPushpins + ')');

	var bounds = new google.maps.LatLngBounds();

	for (i in jsGooglemapPreloadedPushpinsArray) {
		var currentPushpin = jsGooglemapPreloadedPushpinsArray[i]['pushpin'];

		for (j in jsGooglemapPreloadedPushpinsArray[i]['markers']) {
			var currentLongitude	= jsGooglemapPreloadedPushpinsArray[i]['markers'][j]['longitude'];
			var currentLatitude		= jsGooglemapPreloadedPushpinsArray[i]['markers'][j]['latitude'];
			var currentTitle		= jsGooglemapPreloadedPushpinsArray[i]['markers'][j]['title'];
			var currentContent		= jsGooglemapPreloadedPushpinsArray[i]['markers'][j]['content'];

			googlemapStandaloneMapAddSingleMarker(map, currentLongitude, currentLatitude, currentTitle, currentContent, currentPushpin, null, false);

			bounds = extendBounds(bounds, currentLongitude, currentLatitude);
		}
	}

	map.fitBounds(bounds);
}

function googlemapStandaloneMapAddSingleMarker(map, longitude, latitude, title, content, pushpin, itemId, clearMapFlag) {
	if (clearMapFlag && markerClusterer) markerClusterer.clearMarkers();

	var markers = [];
	var marker = _googlemapCreateMarker(longitude, latitude, title, content, pushpin);
	markers.push(marker);
	markerClusterer = new MarkerClusterer(map, markers, { styles: clusterIcon });

	var bounds = new google.maps.LatLngBounds();
	bounds = extendBounds(bounds, longitude, latitude);

	adjustZoomFlag = true;
	map.fitBounds(bounds);

	google.maps.event.addListener(marker, 'click', function() {
		createInfowindow(map, marker, title, content, false);
	});
}



function createInfowindow(map, marker, title, content, flag) {
	if (infowindow) infowindow.close();

	if (content) {
		infowindow = new google.maps.InfoWindow();
		infowindow.setContent('<div class="googlemap_infowindow">' + rawurldecode(title + content) + '</div>');
		infowindow.set('flag', flag);
		infowindow.open(map, marker);
	}
}



function blockui(id, io) {
	if (io) {
		$('#' + id).block({
		    message: '<img src="googlemap/loading.gif" />',
		    css: {
		        border:'none',
		        backgroundColor:'transparent'
		    },
		    overlayCSS:  {
		        backgroundColor:'#dfeaf4',
		        opacity:0.5
		    }
		});
	} else $('#' + id).unblock();
}

