//var baseUrl = '';

var DEBUG = false;

var DEFAULT_LAT = 45;
var DEFAULT_LNG = 65;

var ICON_WIDTH = 78;
var ICON_HEIGHT = 78;

var ICON = baseUrl + '/images/icons/navi-icon-initiative-eins.png';
var ICON_PRO = baseUrl + '/images/icons/navi-icon-voting-pro-eins.png';
var ICON_CONTRA = baseUrl + '/images/icons/navi-icon-voting-contra-eins.png';
var ICON_CLUSTER = baseUrl + '/images/icons/navi-icon-initiative-vier.png';
var ICON_CLUSTER_VOTING = baseUrl + '/images/icons/navi-icon-voting-vier.png';
var ICON_CLUSTER_VOTING_PRO = baseUrl + '/images/icons/navi-icon-voting-pro-vier.png';
var ICON_CLUSTER_VOTING_CONTRA = baseUrl + '/images/icons/navi-icon-voting-contra-vier.png';

var INFOWINDOW_WIDTH = '400px';
var INFOWINDOW_HEIGHT = '200px';

var INFOWINDOWLINK_WIDTH = '200px';
var INFOWINDOWLINK_HEIGHT = '50px';

var MIN_ZOOM = 2;
var MAX_ZOOM = 15;

var WORLD_MIN_ZOOM = MIN_ZOOM;
var WORLD_MAX_ZOOM = MIN_ZOOM;

var REGION_MIN_ZOOM = 2;
var REGION_MAX_ZOOM = MAX_ZOOM;

var COUNTRY_MIN_ZOOM = 2;
var COUNTRY_MAX_ZOOM = MAX_ZOOM;

var LOCAL_MIN_ZOOM = 2;
var LOCAL_MAX_ZOOM = MAX_ZOOM;

var map = '';

	function initialize() {
// should be an offset from the browser size	
		
		if ( typeof geozoom === 'undefined' ) {
			geozoom = new Array();
		}		
		
		var lat = DEFAULT_LAT;
		var lng = DEFAULT_LNG;
		
		if ( geozoom['geometry'] ) {
			lat = geozoom.geometry.location.lat;
			lng = geozoom.geometry.location.lng;
		}

		var center = new google.maps.LatLng( lat, lng );

		map = new google.maps.Map(document.getElementById('map'), {
// disable zoom controls			
//			zoomControl : true,
//			scaleControl : true,
			scrollwheel : false,
			streetViewControl : false,
			
// 			disableDoubleClickZoom: true,
			zoom : MIN_ZOOM,
			minZoom : MIN_ZOOM,
			maxZoom : MAX_ZOOM,
			center : center,
			mapTypeId : google.maps.MapTypeId.TERRAIN,
			zoomControl : true,
		    zoomControlOptions : {
		    	style: google.maps.ZoomControlStyle.DEFAULT,
		    	position: google.maps.ControlPosition.LEFT_CENTER
		    },
			mapTypeControl : false
		});
		
		if ( typeof( geodata ) === undefined ) {
			geodata = new Array();
		}
		
		var icon = new google.maps.MarkerImage( ICON,
				new google.maps.Size( ICON_WIDTH, ICON_HEIGHT )
		);
		
		var icon_pro = new google.maps.MarkerImage( ICON_PRO,
				new google.maps.Size( ICON_WIDTH, ICON_HEIGHT )
		);
		
		var icon_contra = new google.maps.MarkerImage( ICON_CONTRA,
				new google.maps.Size( ICON_WIDTH, ICON_HEIGHT )
		);
		
		var markers = [];
		
		//var infoWindow = new google.maps.InfoWindow({pixelOffset: new google.maps.Size(0, ICON_HEIGHT/2)});
		var infoWindow = new InfoBox({
				pixelOffset: new google.maps.Size(0, -(ICON_HEIGHT * 1.75)),
				boxStyle: {
					width: INFOWINDOW_WIDTH,
					height : INFOWINDOW_HEIGHT,
					overflow : 'auto',
					padding: '10px'				
				},
				closeBoxMargin: '5px'
			}),
			infoWindowWithLinks = new InfoBox({
				pixelOffset: new google.maps.Size(0, -(ICON_HEIGHT * 1.10)),
				boxStyle: {
					width : INFOWINDOWLINK_WIDTH,
					height : INFOWINDOWLINK_HEIGHT,
					overflow : 'auto',
					padding : '10px',
					background : 'white'
				},
				closeBoxMargin: '5px'
			});
		
//		clusterIcon = ICON_CLUSTER_VOTING;
		
		totVotePro = 0;
		totVoteContra = 0;
		totInitiative = 0;
		
		currentZoomLevel = map.getZoom();
//		console.log( 'currentZoomLevel=' + currentZoomLevel );
		
		for (i in geodata) {
			switch( geodata[i].type ) {
				case 'VOTE_PRO' :
					currIcon = icon_pro;
					totVotePro += 1;
					break;
				case 'VOTE_CONTRA' :
					currIcon = icon_contra;
					totVoteContra += 1;
					break;
				default :
					currIcon = icon;
					totInitiative += 1;
					break;
			}
		
			switch( geodata[i].zoom_level ) {
				case 'WORLD' :
					minZoom = WORLD_MIN_ZOOM;
					maxZoom = WORLD_MAX_ZOOM;
					break;
				case 'REGION' :
					minZoom = REGION_MIN_ZOOM;
					maxZoom = REGION_MAX_ZOOM;
					break;
				case 'COUNTRY' :
					minZoom = COUNTRY_MIN_ZOOM;
					maxZoom = COUNTRY_MAX_ZOOM;
					break;
				default :
					minZoom = LOCAL_MIN_ZOOM;
					maxZoom = LOCAL_MAX_ZOOM;
					break;
			}	
//			console.log( 'currentZoomLevel: ' + currentZoomLevel + ' minZoom: ' + minZoom + ' maxZoom: ' + maxZoom );
			if ( currentZoomLevel < minZoom || currentZoomLevel > maxZoom ) {
//				visibility = false;
			} else {
//				visibility = true;
			}
			var latLng = new google.maps.LatLng(
				geodata[i].lat,
				geodata[i].lng
			);
			//console.log( 'i=' + i + '\n' + 'lat:' + geodata[i].lat + '\n' + 'lng:' + geodata[i].lng + '\n' + 'latlng:' + latLng );
			var marker = new google.maps.Marker({
				icon : currIcon,
				position : latLng,
//				visible : visibility,
				title : geodata[i].text,
				clickable : true,
				infowindow : geodata[i].html,
				infowindow_link : geodata[i].html_link,
				type : geodata[i].type,
				zoom_level : geodata[i].zoom_level
			});
//			console.log( 'i=' + i + '\n' + 'geodata[' + i + '].html: ' + geodata[i].html );
// this should come from ZF, if present it will be displayed			
//			var contentString = geodata[i].html;

			google.maps.event.addListener( marker, 'click', function() {
//				console.log( 'this.infowindow=' + this.infowindow );
				infoWindow.setContent(this.infowindow);
				infoWindow.open( map, this );
			});			
			
			markers.push(marker);
		}
	
// set initial cluster icon		
//		console.log( 'totVotePro=' + totVotePro + ' ' + 'totVoteContra=' + totVoteContra );
		if ( ( totVotePro + totVoteContra ) ) {
			clusterIcon = ICON_CLUSTER_VOTING;
			if ( totVotePro > 0 && totVoteContra == 0 ) {
				clusterIcon = ICON_CLUSTER_VOTING_PRO;
			}
			if ( totVotePro == 0 && totVoteContra > 0 ) {
				clusterIcon = ICON_CLUSTER_VOTING_CONTRA;
			}			
		} else {
			clusterIcon = ICON_CLUSTER;
		}
		
		var style = [{
			url : clusterIcon,
			width : ICON_WIDTH,			
			height : ICON_HEIGHT,
//			anchor : [16, 0],
			textColor : '#ffffff',
			textSize : 10
		}];

		var markerClusterer = new MarkerClusterer(map, markers, {
			maxZoom : MAX_ZOOM,
			ignoreHidden : true,
			averageCenter : true,
			zoomOnClick : false,
			styles : style
		});
			
/*
		for(i in geozoom) {
			console.log( 'i:' + i);
			for (j in geozoom[i]) {
				console.log( 'i:' + i + ' ' + 'j:' + j );
			}
		}
*/		
		
//		console.log( 'geozoom: ' + geozoom );
		if ( geozoom && geozoom['northeast'] ) {
			var ne = geozoom['northeast'];
			var sw = geozoom['southwest'];
			
//			console.log( ne.lat + ' ' + ne.lng );
//			console.log( 'ne: ' + JSON.stringify(ne) );
//			console.log( sw.lat + ' ' + sw.lng );
//			console.log( 'sw: ' + JSON.stringify(sw) );
			
			var southWest = new google.maps.LatLng(sw['lat'], sw['lng']);
//			console.log( 'southWest: ' + southWest );
			
			var northEast = new google.maps.LatLng(ne['lat'], ne['lng']);
//			console.log( 'northEast: ' + northEast );
			
			var bounds = new google.maps.LatLngBounds(southWest, northEast);
//			console.log( 'bounds: ' + bounds );
			
			map.fitBounds(bounds);
			map.panToBounds(bounds);
//			console.log( bounds );
			
			if ( DEBUG ) {
				var rectangleOptions = {
					strokeColor: 0.8,
					strokeOpacity: 0.8,
					strokeWeight: 2,
					fillColor: "#FF0000",
					fillOpacity: 0.2,
					map: map,
					bounds: bounds
				};
				var rectangle_0 = new google.maps.Rectangle(rectangleOptions);
			}

// this zooms in after fitBounds has ended, then kills itself to stop it triggering again and again...			
//		    google.maps.event.addListenerOnce(map, 'bounds_changed', function(event) {
//		    	console.log('function: bounds_changed');
//		        if ( this.getZoom() ) {
//		            this.setZoom( this.getZoom() + 1 );
//		        }
//			});

		}		
/*
		google.maps.event.addListener(map, 'zoom_changed', function() {
			console.log('function: zoom_changed');
			zoom = map.getZoom();
			if ( zoom < MIN_ZOOM ) {
				return;
			}
			console.log( 'zoom_changed: zoom: ' + zoom );
			for( i in result = markerClusterer.getMarkers() ) {
//				console.log( 'result[' + i + '].zoom_level: ' + result[i].zoom_level );
				switch( result[i].zoom_level ) {
					case 'WORLD' :
						minZoom = WORLD_MIN_ZOOM;
						maxZoom = WORLD_MAX_ZOOM;
						break;
					case 'REGION' :
						minZoom = REGION_MIN_ZOOM;
						maxZoom = REGION_MAX_ZOOM;
						break;
					case 'COUNTRY' :
						minZoom = COUNTRY_MIN_ZOOM;
						maxZoom = COUNTRY_MAX_ZOOM;
						break;
					default :
						minZoom = LOCAL_MIN_ZOOM;
						maxZoom = LOCAL_MAX_ZOOM;
						break;
				}	
//				console.log( 'zoom: ' + zoom + ' minZoom: ' + minZoom + 'maxZoom: ' + maxZoom );
				if ( zoom < minZoom || zoom > maxZoom ) {
//					result[i].visible = false;
				} else {
//					result[i].visible = true;
				}
//				console.log( 'result[' + i + '].visible : ' + result[i].visible );
			}
		});
*/		
		google.maps.event.addListener(markerClusterer, 'click', function(mc) {
//			console.log('function: click');
			getMarkers = mc.getMarkers();
//			console.log( 'mc.getCenter(): ' + mc.getCenter() );
//			console.log( 'mc.getSize(): ' + mc.getSize() );
//			console.log( 'markerClusterer.getTotalMarkers(): ' + markerClusterer.getTotalMarkers() );
//			console.log( 'markerClusterer.getTotalClusters(): ' + markerClusterer.getTotalClusters() );
// determin if this is a region/country and only display one link		
			totGeo = 0;
			totLocal = 0;	
			for( i in getMarkers ) {
				switch( getMarkers[i].zoom_level ) {
					case 'WORLD' :
					case 'REGION' :
					case 'COUNTRY' :
						totGeo += 1;
						break;
					default :
						totLocal += 1;
						break;
				}	
				switch( getMarkers[i].type ) {
					case 'VOTE_PRO' :
						totVotePro += 1;
						break;
					case 'VOTE_CONTRA' :
						totVoteContra += 1;
						break;
					default :
						totInitiative += 1;
						break;
				}					
			}			
//			console.log( 'totGeo: ' + totGeo + ' totLocal: ' + totLocal );
			if ( totGeo > 0 && totLocal == 0 ) {
				infoWindowWithLinks.setPosition( getMarkers[0].position );
				infoWindowWithLinks.setContent( getMarkers[0]['infowindow_link'] );
				infoWindowWithLinks.open( map );
				return;
			}
			zoom = map.getZoom();
//			console.log( 'Before: zoom: ' + zoom + ' minZoom: ' + minZoom + ' maxZoom: ' + maxZoom );
			if ( zoom == maxZoom ) {
//				console.log( 'click: zoom: ' + map.getZoom() );
				var content = '';
//				content += getMarkers[0]['infowindow_link'];

//				console.log( getMarkers[0].position );
				if ( totInitiative > 0  ) {
					infoWindowWithLinks.setPosition( getMarkers[0].position );
					infoWindowWithLinks.setContent( getMarkers[0]['infowindow_link'] );
					infoWindowWithLinks.open( map );
				} else {
					for( i in getMarkers ) {
//						console.log( 'getMarkers[' + i + ']' + result[i]);
						content += getMarkers[i]['infowindow'];
					}					
					infoWindow.setPosition( getMarkers[0].position );
					infoWindow.setContent( content );
					infoWindow.open( map );
				}
	
//				return;
			}
//			markerClusterer.fitMapToMarkers();
			map.setZoom( map.getZoom() + 2 );
			map.setCenter( mc.getCenter() );
			zoom = map.getZoom();
//			console.log( 'After: zoom: ' + zoom + ' minZoom: ' + minZoom + ' maxZoom: ' + maxZoom );			
		});		
	
	}
	google.maps.event.addDomListener(window, 'load', initialize);

