// this is the Javascript that makes the map.  It should be defined in the head of the document

// global variables
var map;
var request;
var icons;
var bounds;
var points = new Array();
var geocoder;
var markers;
var countBerlin = 0;
var countWorld = 0;
var overlays = new Array();
var lines = new Array();
function infoWindowWatcher(){
	var aWindowIsVisible = false;
	$("div[class='gmnoprint']").each(function(index,infoWindow){
		if(infoWindow.style.display == 'block'){
			aWindowIsVisible = true;
			return;
		}
	});
	if(aWindowIsVisible == false){
		//alert('all windows closed');
	}	else	{
		window.setTimeout('infoWindowWatcher();',1000);
	}
}

function backToBounds(){

	//map.closeInfoWindow();
	//map.setZoom(map.getBoundsZoomLevel(bounds)); 
	map.setCenter(bounds.getCenter());
	
	if(countBerlin > 0 && countWorld > 0){
		//alert(overlays.length);
		/*
		for(index in overlays){
			if(overlays[index] == 'line'){
				alert('removing');
				map.removeOverlay(index);
				
			}
		}
		*/
		//drawLinesToBerlin();
	}	
	
}

function drawLinesToBerlin(){
    /*
	var address = 'Berlin, Deutschland';
	var mylat;
	var myLon;
	if (geocoder) {
		geocoder.getLatLng(
			address,
			function(point) {
				if (!point) {
					//alert(address + " not found");
				} else {
					myLat = point.lat().toFixed(5);
					myLon = point.lng().toFixed(5);
					//document.getElementById('coords').appendChild(document.createTextNode(address+' lat="'+myLat+'" lon="'+myLon+'">'));
					//extend map for Berlin
					bounds.extend(point);
					//draw lines
					for(index in points){
				        var line = new Array(
							new GLatLng(parseFloat(point.lat())			,parseFloat(point.lng())		)
						  , new GLatLng(parseFloat(points[index].lat())	,parseFloat(points[index].lng()))
						);
						//map.addOverlay(new GPolyline(line,'#FF0000','1',{geodesic:true}));
						map.addOverlay(new GPolyline(line,'#FF0000','2'));
						overlays[overlays.length] = 'line';
					}
					mapZoomAndCenter();
				}
			}
		);	
	}
	*/
	//var berlinLat = 52.52341;
	//var berlinLon = 13.41140;
	var berlinLat = 52.52341;
	var berlinLon = 13.41140;
	bounds.extend(new GLatLng(berlinLat,berlinLon));
	if(points.length == 1){
		bounds.extend(new GLatLng(berlinLat+0.5,berlinLon+0.5));
	}
	for(index in points){
        var line = new Array(
			new GLatLng(parseFloat(berlinLat)			,parseFloat(berlinLon)		)
		  , new GLatLng(parseFloat(points[index].lat())	,parseFloat(points[index].lng()))
		);
		//map.addOverlay(new GPolyline(line,'#FF0000','1',{geodesic:true}));
		map.addOverlay(new GPolyline(line,'#FF0000','2'));
		overlays[overlays.length] = 'line';
	}
	mapZoomAndCenter();

}


function createMarkerFromAddress(marker){//,name,html,iconStr) {

   var address = marker['address'];
   var html = marker['html'];
  
   if(markers.length > 1){
	   //html += '<ul><li>-</li><li>Zoom</li><li><a href="javascript:backToBounds();">zurück</a></li></ul>';
	}
    
	var mylat;
	var myLon;
	if (geocoder) {
		geocoder.getLatLng(
			address,
			function(point) {
				if (!point) {
					alert(address + " not found");
				} else {
					//document.getElementById("lat").innerHTML = point.lat().toFixed(5);
					//document.getElementById("lng").innerHTML = point.lng().toFixed(5);
					
					myLat = point.lat().toFixed(5);
					myLon = point.lng().toFixed(5);
					//document.getElementById('coords').appendChild(document.createTextNode(address+' lat="'+myLat+'" lon="'+myLon+'">'));
					//adjust close markers
					if(countWorld == 0 && countBerlin > 0){
						//alert(myLat);
						for(index in points){
							var previous = points[index];
							var distance = previous.lng() > point.lng()? previous.lng() - point.lng() : point.lng() - previous.lng();
							if(distance < 0.001){
								//alert('too close');
								point = new GLatLng(point.lat(),point.lng()+0.0015);
							}
						}
					}
					
					//if Berlin and World addresses are mixed, don't pin Berlin
					
					var marker = new GMarker(point);  
					GEvent.addListener(marker, "click", function() {
					
			          marker.openInfoWindowHtml(html,{maxHeight:'400',maxWidth:'600'});
					  infoWindowWatcher();
			        });
					
				    
				    //GEvent.addListener(marker,OVERLAY_REMOVED,function(){
					//	alert('closed');
				    //});
			        
					map.addOverlay(marker);
					overlays[overlays.length] = 'marker';
					points[points.length] = point;
					bounds.extend(point);
					
					if(	points.length == markers.length || (
							countWorld > 0 && countBerlin > 0 && points.length == countWorld
						)
					){
						if(countWorld > 0 && countBerlin > 0){
							drawLinesToBerlin();
						}	else	{
							mapZoomAndCenter();
						}
						
					}
				}
			}
		);	
	}
}

function mapZoomAndCenter(){
	if(markers.length > 1){
		map.setZoom(map.getBoundsZoomLevel(bounds));
		//zoom out for close maps to include not only the bottom part of the markers close to the top
		if(map.getZoom() > 14){
			map.setCenter(bounds.getCenter(),map.getZoom() - 1);
		}	else	{
			map.setCenter(bounds.getCenter());
		}
	}	else	{
		map.setCenter(points[0], markers[0]['zoom']);
		
	}
}



function makeMap() {
	
	document.getElementById('message').style.display = 'none';
	
	markers = new Array();
	$("div[class='marker']").each(function(index,marker){
		var length = markers.length;
		markers[length] = new Array();
		markers[length]['html'] = $(this).html();
		//
		//markers[length]['html'] = $(this).innerHTML;
		markers[length]['address'] = marker.getElementsByTagName('span')[0].innerHTML;
		//fetch zoomlevel
		var zoom;
		//var info = new Array();
		var infoString='';
		if(marker.getElementsByTagName('span')[0].getAttribute('class')){
			zoom = marker.getElementsByTagName('span')[0].getAttribute('class');
			//infoString = marker.getElementsByTagName('span')[0].getAttribute('class');
		} else if (marker.getElementsByTagName('span')[0].className){
			zoom = marker.getElementsByTagName('span')[0].className;
			// infoString = marker.getElementsByTagName('span')[0].className;
		}	else	{
			zoom = 'zoom-13';
		}
		markers[length]['zoom'] = parseInt(zoom.substr(5,zoom.length - 5));
	});
	
	if(markers.length == 0){
		return;
	}
	
	for(index in markers){
		if(markers[index]['address'].indexOf('Berlin') == -1){
			countWorld++;								
		}	else	{
			countBerlin++;
		}
	}
	
	if (GBrowserIsCompatible()) {
		// resize the map
		var m = document.getElementById("map");
		m.style.width = "853px";
		m.style.height = "480px";
		//map = new GMap2(document.getElementById("map"));
		map = new GMap2(document.getElementById("map"));
		map.disableDragging();
		GEvent.addListener(map,"click", function() {
          backToBounds();
        });
		//map.setCenter(new GLatLng(51.151786,10.415039), 3);
		if(markers.length > 1){
			map.setCenter(new GLatLng(70,0),8);
		}
		
		geocoder = new GClientGeocoder();
		
		map.clearOverlays();
		// ===== Start with an empty GLatLngBounds object =====     
		bounds = new GLatLngBounds();
		//alert(markers.length);
		for(index in markers){
			//always print addresses outside Berlin
			if(markers[index]['address'].indexOf('Berlin') == -1){
				createMarkerFromAddress(markers[index]);
			//print Berlin addresses only if there are not addresses outside Berlin
			}	else if(countWorld == 0) {
				createMarkerFromAddress(markers[index]);
			//draw lines to Berlin after all other markers have been set
			}	
			
		}
					//
	} else {
			//alert("your browser does not support Google Maps!");
	}

}


