/*
** 2010 IE Ingo Eberhardt ingo@tunnelen.de
** JavaScript for MikroKopter Map  WorldWide
** Januar 2009 		initial release
** February 2009	outsourced Javascript in this file. to huge for index file
**
*/

//<![CDATA[
// our uuuuuh globals
var map;
var geocoder;
var mainBounds;
var tilelayers;
var mgr;
var batch = [];
var geoXMLarr = [];
var ieversion = 0;
var mousemovepoint;
var editopen = -1;
var toolboxopen = -1;
var markerCluster;

// for Toolbox
var curShape; 
var polyShape = new Array(); 
var polyPoints = new Array();
var points = new Array(); 


var lineColor = "#FF0000"; // red line
var opacity = .5;
var lineWeight = 2; 

//Custom function for fetchng tiles from OSM server 

CustomGetTileUrl = function(a,b){ 
	return "http://a.tile.openstreetmap.org/" + b + "/" + a.x + "/" + a.y + ".png";
}

// initialize some things
function initialize() {
	//GLog.write( "Begin Init..." );
	// this is our global map device. set to div name "map_canvas"
	map 			= new GMap2(document.getElementById("map_canvas"));
	//map				= new GMap2(document.getElementById("map_canvas"),{size: new GSize(500,600)});
	
	// our friendly, loved geocoder object
	geocoder 		= new GClientGeocoder();
		
	mainBounds 		= new GLatLngBounds();

	// general options for map div	
	map.setCenter(new GLatLng(51.34159362674578, 9.47021484375), 2);	
	
	map.addMapType(G_PHYSICAL_MAP);
	
	
	map.enableScrollWheelZoom();
	map.addControl(new GScaleControl());
	map.addControl(new GLargeMapControl());
	map.addControl(new GMapTypeControl());
	
	//window.setTimeout(LoadMgrMarkers, 0);
	
	var copyright = new GCopyright(1, new GLatLngBounds(new GLatLng(53.8136257,-3.0981445), new GLatLng(53.8654855,-2.9663944) ),10, "C Text");
	var copyrightCollection = new GCopyrightCollection();
	copyrightCollection.addCopyright(copyright);
	
	var min = 0;
    var max = 11;
    var osmmax = 15; 
	var osmlicense = "<a href='http://www.openstreetmap.com' target='_blank'>License</a>";	
    var osmcopyright = new GCopyright(1, new GLatLngBounds(new GLatLng(-90, -180), new GLatLng(90, 180)), 0, osmlicense);    
    var osmcopyrightCollection = new GCopyrightCollection("OpenStreetsMap: ");    
    osmcopyrightCollection.addCopyright(osmcopyright);
    var osm = [new GTileLayer(osmcopyrightCollection, min, osmmax)];
    
    osm[0].getTileUrl = CustomGetTileUrl;         
    osmLayer = new GMapType(osm, G_SATELLITE_MAP.getProjection(), "O.S.M", {minResolution:min, maxResolution:osmmax});
	map.addMapType(osmLayer);	
	
	GEvent.addListener(map,'click',mapClick);	
	GEvent.addListener(map,'mousemove',function(point){
            mousemovepoint = point;
            });
	// Microsoft Internet Explorer 8 needs special treatment
    if(navigator.appVersion.indexOf("MSIE 8") != -1) {
		ieversion = 8;
	}	
	
	LoadMgrMarkers();
	//GLog.write( "End Init");
	
	//oldMarkers();

}

/*
** creates a marker and returns marker object. the only way i found to create markers with infowindows.
*/
function createMarker(point, icon, mid, infoWindowHTML, category) {
	var themarker = new GMarker(point, icon);
	
	themarker.mycategory 		= category;
	themarker.infoWindowHTML 	= infoWindowHTML;
	themarker.marker_id			= mid;

	GEvent.addListener(themarker, "click", function() {		
		themarker.openInfoWindowHtml(infoWindowHTML);
	});		
	return themarker;
}

function deleteMarker( id ) {
 	GLog.write( "I will delete Marker with " + id );
 	GDownloadUrl("http://der.oschni.de/multikoptermap/delete/marker/" + id, function(data) {
		var xml = GXml.parse(data);
		map.clearOverlays();		
		markerCluster.clearMarkers();				
		LoadMgrMarkers();
		
		loadMarkerData(1); // User
		loadMarkerData(2); // Events
		loadMarkerData(3); // FlyingAreas
	});
}

function editMarker( mid ) {
	$("#EditMarkerDialog").dialog('open');
	getMarker(mid);
}

function deleteMarkerQuestion() {	
	document.getElementById("blob_delete_question").style.visibility="visible";
	document.getElementById("blob_delete_question_no").style.visibility="visible";
}

function no() {
	document.getElementById("blob_delete_question").style.visibility="hidden";
	document.getElementById("blob_delete_question_no").style.visibility="hidden";
}
/*
** Saves a marker with given values from module_position
*/

function saveMarker() {
	lat2 	= $('#lat').val();
	lon2 	= $('#lon').val();
	name2	= $('#name').val();
	//GLog.write( "name2: " + name2);
	cid2		= $('#category').val();
	
	//GLog.write( 'lat' + lat + ' lon' + lon + ' name' + $.base64Encode(escape(name)) + ' cid' + cid );
	//GLog.write( "base_url:" + base_url + 'map/savemarker/'+lat+'/'+lon+'/'+base64Encode(escape(name))+'/'+cid );
	
	/*GDownloadUrl( base_url + 'map/savemarker/'+lat+'/'+lon+'/'+base64Encode(escape(name))+'/'+cid, function(data) {
	
		
	});*/
	
	$.post(base_url + 'map/savemarker', $("#marker_form").serialize(), function(data){
	
		//alert( data );
  		var xml 		= GXml.parse(data);  
		var status 		= xml.getElementsByTagName("status");
		var state 		= status[0].getAttribute("status");
		var mid			= status[0].getAttribute("id");
		//GLog.write( 'status ' + state );
		if( state == 1 ) {
			//$("#marker_form")[0].reset()
			$('#lat').val('');
			$('#lon').val('');
			$('#name').val('');

			InsertMarker( mid );
			loadMarkerData(1); // User
			loadMarkerData(2); // Events
			loadMarkerData(3); // FlyingAreas
			
			var myHtml = 'Marker was succesfully saved.<br />';
			myHtml += 'You can share your marker by the following Link.<br />';
			myHtml += '<a href="'+base_url+'map/marker/'+mid+'">'+base_url+'map/marker/'+mid+'</a><br />';
			$("#SaveMessage").html( myHtml );			
			$("#SaveMessage").dialog( 'open' );
			
		} else {
			alert( 'failed' );
		}
		//GLog.write( "done?");
	});	

}
/*
** Updates a marker with given values from the marker_edit_form
*/
function updateMarker() {
	//$.post(base_url + 'map/updatemarker', $("#marker_edit_form").serialize(), function(data){
	//GLog.write( base_url + 'map/updatemarker/'+$('#mid_edit').val()+'/'+$('#lat_edit').val()+'/'+$('#lon_edit').val()+'/'+$('#name_edit').val()+'/'+$('#category_edit').val() );		
	$.post(base_url + 'map/updatemarker/'+$('#mid_edit').val()+'/'+$('#lat_edit').val()+'/'+$('#lon_edit').val()+'/'+$('#name_edit').val()+'/'+$('#category_edit').val(), function(data){
	
		//alert( data );
		var point 		= new GLatLng( $('#lat_edit').val(), $('#lon_edit').val() );
  		var xml 		= GXml.parse(data);  
		var status 		= xml.getElementsByTagName("status");
		var state 		= status[0].getAttribute("status");
		var mid			= $('#mid_edit').val()
		var cid			= $('#category_edit').val();
		
		var iconOptionsRED = {};
		iconOptionsRED.width = 32;
		iconOptionsRED.height = 32;
		iconOptionsRED.primaryColor = "#E20029FF";
		iconOptionsRED.cornerColor = "#F1F1FFFF";
		iconOptionsRED.strokeColor = "#000000FF";
		
		var iconOptionsGREEN = {};
		iconOptionsGREEN.width = 32;
		iconOptionsGREEN.height = 32;
		iconOptionsGREEN.primaryColor = "#4DE200FF";
		iconOptionsGREEN.cornerColor = "#F1F1FFFF";
		iconOptionsGREEN.strokeColor = "#000000FF";
		
		
		var iconOptionsBLUE = {};
		iconOptionsBLUE.width = 32;
		iconOptionsBLUE.height = 32;
		iconOptionsBLUE.primaryColor = "#0086E2FF";
		iconOptionsBLUE.cornerColor = "#F1F1FFFF";
		iconOptionsBLUE.strokeColor = "#000000FF";
		
		var myIcon;
		if( cid == 1 ) {
			myIcon = MapIconMaker.createMarkerIcon( iconOptionsRED );
		}
					
		if( cid == 2 ) {
			myIcon = MapIconMaker.createMarkerIcon( iconOptionsGREEN );
		}
		
		if( cid == 3 ) {
			myIcon = MapIconMaker.createMarkerIcon( iconOptionsBLUE );
		}
		
		if( state == 1 ) {
			//$("#marker_form")[0].reset()
			/*$('#lat').val('');
			$('#lon').val('');
			$('#name').val('');*/
			//GLog.write( "point: "+point+" mid "+mid+" cid "+cid );
			//markerToremove = createMarker(point, myIcon, mid, '', cid);
			//GLog.write( "next" );
			//markerCluster.removeMarker( markerToremove );
			
			//map.clearOverlays();
			
			markerCluster.clearMarkers();						
			LoadMgrMarkers();
			InsertMarker( mid );
			loadMarkerData(1); // User
			loadMarkerData(2); // Events
			loadMarkerData(3); // FlyingAreas				
			//$("#UpdateMessage").dialog( 'open' );
			
		} else {
			//alert( 'failed' );
		}
		//GLog.write( "done?");
});	
}

// START LOADING OLD MK MAP DATA
function LoadMgrMarkers() {	
	//GLog.write( "Loading Mgr Map..." );
	GDownloadUrl(base_url + '/receiveall', function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		//GLog.write( markers.length + " Markers loaded" );
		for (var i = 0; i < markers.length; i++) {								
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
									parseFloat(markers[i].getAttribute("lng")));
			var uid = markers[i].getAttribute("user_id");
			var mid = markers[i].getAttribute("marker_id");
			var cid = markers[i].getAttribute("category_id");
			
			//var myIcon = new GIcon(G_DEFAULT_ICON);
			var iconOptionsRED = {};
			iconOptionsRED.width = 32;
			iconOptionsRED.height = 32;
			iconOptionsRED.primaryColor = "#E20029FF";
			iconOptionsRED.cornerColor = "#F1F1FFFF";
			iconOptionsRED.strokeColor = "#000000FF";
			
			var iconOptionsGREEN = {};
			iconOptionsGREEN.width = 32;
			iconOptionsGREEN.height = 32;
			iconOptionsGREEN.primaryColor = "#4DE200FF";
			iconOptionsGREEN.cornerColor = "#F1F1FFFF";
			iconOptionsGREEN.strokeColor = "#000000FF";
			
			
			var iconOptionsBLUE = {};
			iconOptionsBLUE.width = 32;
			iconOptionsBLUE.height = 32;
			iconOptionsBLUE.primaryColor = "#0086E2FF";
			iconOptionsBLUE.cornerColor = "#F1F1FFFF";
			iconOptionsBLUE.strokeColor = "#000000FF";
			
			var myIcon;
			if( cid == 1 ) {
				myIcon = MapIconMaker.createMarkerIcon( iconOptionsRED );
			}
						
			if( cid == 2 ) {
				myIcon = MapIconMaker.createMarkerIcon( iconOptionsGREEN );
			}
			
			if( cid == 3 ) {
				myIcon = MapIconMaker.createMarkerIcon( iconOptionsBLUE );
			}
			
			//GLog.write( uid + " and " + mid );
			//str_info += markers[i].getAttribute("marker_name");
			// only show that link if you are his owner
			var myHtml = markers[i].getAttribute("str_info");
			myHtml += '<a href="'+base_url+'map/marker/'+mid+'">Link to this Marker</a><br />';
			if( user_id != -1 ) {
				if( uid == user_id ) {					
					myHtml += '<a class="ui-link-delete" onClick="deleteMarkerQuestion(); return false;">Delete this marker!</a> <a class="ui-link-delete-really" id="blob_delete_question" onClick="deleteMarker('+ mid +'); return false;">YES!</a> <a class="ui-link-delete-really-no" id="blob_delete_question_no" onClick="no(); return false;">NO!</a><br />';
					myHtml += '<a id="edit_link" class="ui-link" onClick="editMarker('+mid+'); return false;">Edit</a><br />';
				}
			}
			
			myHtml += '</div>';
			
			
				//GLog.write("point: "+point);
			 	batch.push(createMarker(point, myIcon, mid, myHtml, cid));
			 
		}
		//GLog.write( "done" );
		
		zoom = 8;
		size = 60;
		markerCluster = new MarkerClusterer(map, batch, {maxZoom: zoom, gridSize: size });
		
		//mgr = new MarkerManager( map );
		//mgr.addMarkers(batch, 6);		      
    	//mgr.refresh();
	});
}
// END  LOADING DATA FROM DB
function LoadOldMarkers() {	
	//GLog.write( "Loading Old Mgr Map..." );
	GDownloadUrl(base_url + '/receiveall/old', function(data) {
		var xml = GXml.parse(data);
		var markers = xml.documentElement.getElementsByTagName("marker");
		//GLog.write( markers.length + " Old Markers loaded" );
		$("#oldmarkerprogressbar").html("");		
		
		for (var i = 0; i < markers.length; i++) {
										
			var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
									parseFloat(markers[i].getAttribute("lng")));
			var uid = markers[i].getAttribute("user_id");
			var mid = markers[i].getAttribute("marker_id");
			var cid = markers[i].getAttribute("category_id");
			
			//var myIcon = new GIcon(G_DEFAULT_ICON);
			var iconOptionsRED = {};
			iconOptionsRED.width = 32;
			iconOptionsRED.height = 32;
			iconOptionsRED.primaryColor = "#E20029FF";
			iconOptionsRED.cornerColor = "#F1F1FFFF";
			iconOptionsRED.strokeColor = "#000000FF";
			
			var myIcon;
			myIcon = MapIconMaker.createMarkerIcon( iconOptionsRED );

			//GLog.write( uid + " and " + mid );
			//str_info += markers[i].getAttribute("marker_name");
			// only show that link if you are his owner
			var myHtml = markers[i].getAttribute("str_info");
			myHtml += '<a href="'+base_url+'map/marker/'+mid+'">Link to this Marker</a><br />';
			if( user_id != -1 ) {
				if( uid == user_id ) {					
					myHtml += '<a class="ui-link-delete" onClick="deleteMarkerQuestion(); return false;">Delete this marker!</a> <a class="ui-link-delete-really" id="blob_delete_question" onClick="deleteMarker('+ mid +'); return false;">YES!</a> <a class="ui-link-delete-really-no" id="blob_delete_question_no" onClick="no(); return false;">NO!</a><br />';
					myHtml += '<a id="edit_link" class="ui-link" onClick="editMarker('+mid+'); return false;">Edit</a><br />';
				}
			}
			
			myHtml += '</div>';				
				
			batch.push(createMarker(point, myIcon, mid, myHtml, cid));			 	
			 
		}
		//GLog.write( "done" );
		
		zoom = 8;
		size = 60;
		markerCluster = new MarkerClusterer(map, batch, {maxZoom: zoom, gridSize: size });
		
		//mgr = new MarkerManager( map );
		//mgr.addMarkers(batch, 6);		      
    	//mgr.refresh();
	});
}

/*
** Toggles Marker and set Position on Map
*/
function ToggleMarker( mid ) {  
	//GLog.write( "mid: "+mid );  
    GDownloadUrl( base_url + 'map/togglemarker/'+mid, function(data) {
						var xml2 = GXml.parse(data);
						var markers = xml2.documentElement.getElementsByTagName("marker");
						//GLog.write( "Length: "+markers.length+" mid: "+mid );
						
						for (var i = 0; i < markers.length; i++) {
							var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
													parseFloat(markers[i].getAttribute("lng")));
							var uid = markers[i].getAttribute("user_id");
							//var mid = markers[i].getAttribute("marker_id");
							var cid = markers[i].getAttribute("category_id");
															
    						// move to point    
    						map.panTo(point);
    						// set view to point
    						map.setCenter(point, 10);		
							var myHtml = markers[i].getAttribute("str_info");							
						
							// only show that link if you are his owner
							myHtml += '<a href="'+base_url+'map/marker/'+mid+'">Link to this Marker</a><br />';
							
							if( user_id != -1 ) {
								if( uid == user_id ) {
									myHtml += '<a class="ui-link-delete" onClick="deleteMarkerQuestion(); return false;">Delete this marker!</a> <a class="ui-link-delete-really" id="blob_delete_question" onClick="deleteMarker('+ mid +'); return false;">YES!</a> <a class="ui-link-delete-really-no" id="blob_delete_question_no" onClick="no(); return false;">NO!</a><br />';
									myHtml += '<a id="edit_link" class="ui-link" onClick="editMarker('+mid+'); return false;">Edit</a><br />';
								}
							}
    						map.openInfoWindow(point, myHtml);
    					}
    			});    
}
/*
** Get Marker from DB for output in Edit Markerform
*/
function getMarker( mid ) {  
	//GLog.write( "mid: "+mid );  
    GDownloadUrl( base_url + 'map/togglemarker/'+mid, function(data) {
						var xml2 = GXml.parse(data);
						var markers = xml2.documentElement.getElementsByTagName("marker");
						//GLog.write( "Length: "+markers.length+" mid: "+mid );
						
						for (var i = 0; i < markers.length; i++) {
							var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
													parseFloat(markers[i].getAttribute("lng")));
							var uid 			= markers[i].getAttribute("user_id");
							
							//var mid 			= markers[i].getAttribute("marker_id");
							var cid 			= markers[i].getAttribute("category_id");
							
							var marker_name 	= markers[i].getAttribute("marker_name");
							
							var lat			 	= markers[i].getAttribute("lat");
							
							var lon			 	= markers[i].getAttribute("lng");
							
							//GLog.write( "lat,lon,name,category: " +lat+lon+marker_name+cid );
							$('#lat_edit').val(lat);
							$('#lon_edit').val(lon);
							$('#name_edit').val(marker_name);
							$('#category_edit').val(cid);
							$('#mid_edit').val(mid);
						}	
    			});    
}

function InsertMarker( mid ) {  
	//GLog.write( "mid: "+mid );  
    GDownloadUrl( base_url + 'map/togglemarker/'+mid, function(data) {
						var xml2 = GXml.parse(data);
						var markers = xml2.documentElement.getElementsByTagName("marker");
						//GLog.write( "Length: "+markers.length+" mid: "+mid );
						
						for (var i = 0; i < markers.length; i++) {
							var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")),
													parseFloat(markers[i].getAttribute("lng")));
							var uid = markers[i].getAttribute("user_id");
							//var mid = markers[i].getAttribute("marker_id");
							var cid = markers[i].getAttribute("category_id");
							
							//var myIcon = new GIcon(G_DEFAULT_ICON);
							var iconOptionsRED = {};
							iconOptionsRED.width = 32;
							iconOptionsRED.height = 32;
							iconOptionsRED.primaryColor = "#E20029FF";
							iconOptionsRED.cornerColor = "#F1F1FFFF";
							iconOptionsRED.strokeColor = "#000000FF";
							
							var iconOptionsGREEN = {};
							iconOptionsGREEN.width = 32;
							iconOptionsGREEN.height = 32;
							iconOptionsGREEN.primaryColor = "#4DE200FF";
							iconOptionsGREEN.cornerColor = "#F1F1FFFF";
							iconOptionsGREEN.strokeColor = "#000000FF";
							
							
							var iconOptionsBLUE = {};
							iconOptionsBLUE.width = 32;
							iconOptionsBLUE.height = 32;
							iconOptionsBLUE.primaryColor = "#0086E2FF";
							iconOptionsBLUE.cornerColor = "#F1F1FFFF";
							iconOptionsBLUE.strokeColor = "#000000FF";
							
							var myIcon;
							if( cid == 1 ) {
								myIcon = MapIconMaker.createMarkerIcon( iconOptionsRED );
							}
										
							if( cid == 2 ) {
								myIcon = MapIconMaker.createMarkerIcon( iconOptionsGREEN );
							}
							
							if( cid == 3 ) {
								myIcon = MapIconMaker.createMarkerIcon( iconOptionsBLUE );
							}
															
    						// move to point    
    						map.panTo(point);
    						// set view to point
    						map.setCenter(point);		
							var myHTML = markers[i].getAttribute("str_info");				
							
						
							// only show that link if you are his owner
		
							if( user_id != -1 ) {
								if( uid == user_id ) {
									myHTML += '<a class="ui-link-delete" onClick="deleteMarkerQuestion(); return false;">Delete this marker!</a> <a class="ui-link-delete-really" id="blob_delete_question" onClick="deleteMarker('+ mid +'); return false;">YES!</a> <a class="ui-link-delete-really-no" id="blob_delete_question_no" onClick="no(); return false;">NO!</a>';
								}
							}						
	    					map.openInfoWindow(point, myHTML);
	    					//GLog.write(" window opened" );
	    					var newmarker = createMarker(point, myIcon, mid, myHTML, cid);
	    					//GLog.write(" markercreated" );
	    					//markerCluster.reAddMarkers_(newmarker);
	    					//GLog.write(" marker readded" );
	    					map.addOverlay(newmarker);
	    					//GLog.write(" added to view" );
	    				}
    			});    
}

/*
** Toggles InfoWindow and set Position
*/
function mapClick(marker, point) {
	if( !marker ) {
		if( !(user_id == -1) ) {
			var createpoint; 
			if(ieversion == 8){
		        // The click event returns wrong coords in IE8, use mouse position
	    	    createpoint = mousemovepoint;
    		}else{        
    			createpoint = point;
        	}
    
			/*lat = document.getElementById("lat");
			lon = document.getElementById("lon");*/		
			
			/*lat.value = point.y;		
			lon.value = point.x;*/
			//GLog.write( "editopen: "+editopen);
			if( editopen == 1 ) {
				
				$('#lat_edit').val( point.y );
				$('#lon_edit').val( point.x );
			} 
			
			if( toolboxopen == 1 ) {
				$('#tb_lat').val( point.y );
				$('#tb_lon').val( point.x );
				
				addToKMLArray(point);
			} else {
				$('#lat').val( point.y );
				$('#lon').val( point.x );
			}
						
			if( toolboxopen == -1 ) {
				var myIcon = new GIcon(G_DEFAULT_ICON);
				//map.clearOverlays();
				//map.addOverlay(createMarker(point, myIcon, '', 99));
				var myHTML  = '<div class="ui-widget-black ui-widget-content-black ui-helper-clearfix">';
		    	myHTML      += '<h2>You are here - wanna zoom in?</h2><p>* You can change the location by clicking again anywhere on the map<br>* You can zoom in with a double click or the scroll wheel of your mouse.</p>';
		    	myHTML 		+= '</div>';
		   	 	map.openInfoWindow( createpoint, myHTML );
		   	 }
	   	 }
	}
}

function addToKMLArray(point) {
	//$('#tb_kmltext').append( point.y+', '+point.x+'\n' );
	// collect clicked points
	for (var i = 0; i<1; i++) {
		
		//polyShape[i] = new GPolyline(points,lineColor,lineWeight,opacity);
		//map.removeOverlay(polyShape[i]);
		map.clearOverlays();
		points.push(point);
		polyShape[i] = new GPolyline(points,lineColor,lineWeight,opacity);
		map.addOverlay(polyShape[i]);
		polyShape[i].id = i;
		// whenever the mouse pointer touches a line, its coordinates will be written in the textarea
		GEvent.addListener(polyShape[i], "mouseover", function() {
			presentshapecoords(this.id);
		});
	} 
	
	editlines();
}

function reset(){		
	points 		= [];
	polyPoints 	= [];
	curShape 	= null;
	$('#tb_kmltext').val('');
} 

// whenever the mousepointer touches a line, this function is run. see listener in mapClick()
function presentshapecoords(a){
	
	curShape = a;
	polyPoints = [];
	var j = polyShape[a].getVertexCount(); // get the amount of points
	//GLog.write("j: "+j);
	for (i = 0; i<j; i++) {
		polyPoints[i] 	= polyShape[a].getVertex(i); // update polyPoints array
		points[i] 		= polyShape[a].getVertex(i);
	}
	GEvent.addListener(polyShape[a], "click", function(latlng, index) {
		if (typeof index == "number") {
			polyShape[a].deleteVertex(index);
		}
	});
	
	// do not redraw the map
	//$('#tb_kmltext').val('');
	logCoordinates();
}

function editlines(){
	for (var a = 0; a<polyShape.length; a++) {
		map.removeOverlay(polyShape[a]);
		polyShape[a].enableEditing({onEvent: "mouseover"});
		//polyShape[a].disableEditing({onEvent: "mouseout"});
		editmode = GEvent.addListener(polyShape[a], 'lineupdated', updateCoordinates);
		map.addOverlay(polyShape[a]);
	}	
} 

// logCoordinates - prints out coordinates of one global polyPoints array
function logCoordinates(){
	var j = polyPoints.length; // get the amount of points
	//GLog.write("j length: "+j );
	// coordinates are printed with a maximum of 6 decimal places, function roundVal takes care of this
	var coords = '';	
	for (var i = 0; i<j; i++) {
		var lat 	= polyPoints[i].lat();
		var lon 	= polyPoints[i].lng();
		//GLog.write( "lat: "+lat+" lon: "+lon);
		//document.getElementById("coords").value += roundVal(longi) + "," + roundVal(lat) + ",0\n";
		coords +=lat+', '+lon+'\n';
	}
	$('#tb_kmltext').val(coords);
} 

// when editing lines, the points array is updated with this function
function updateCoordinates(){
	//$('#tb_kmltext').val('');
	polyPoints = [];
	points = [];
	var j = polyShape[curShape].getVertexCount(); // get the amount of points
	for (var i = 0; i<j; i++) {
		polyPoints[i] = polyShape[curShape].getVertex(i); // update polyPoints array
		points[i] = polyShape[curShape].getVertex(i); // same for click array
		
	}
	logCoordinates();
} 

function closePolyline() {
	addToKMLArray(points[0]);
}
 
function profile(uid) {			
	//GLog.write( "loading profile " + uid );
	
	GDownloadUrl( base_url + 'map/profile/'+uid, function(data) {
	
		//GLog.write( base_url + 'map/profile/'+uid );
		var xml 			= GXml.parse(data);	
		
		var profile 			= xml.getElementsByTagName("user");
		//GLog.write( profile.length );
					
			var username 		= profile[0].getAttribute("username");
			//GLog.write( username );
			
			var homepage 		= profile[0].getAttribute("homepage");
			//GLog.write( homepage );
			
			var video_plattform = profile[0].getAttribute("video_plattform");
			//GLog.write( video_plattform );
			
			var bio				= profile[0].getAttribute("bio");
			//GLog.write( bio );
			
			var myHTML = '';
			myHTML += '<p><b>Homepage:</b> <a href="'+homepage+'">' +homepage+ '</a></p>';
			myHTML += '<p><b>Video Plattform:</b> <a href="'+video_plattform+'">' +video_plattform+ '</a></p>';
			myHTML += '<p><b>Bio:</b> '+bio+ '</p>';
			myHTML += '<p><b>User Markers</b></p><div id="user_markers" class="ui-widget-content ui-dialog-content" style="margin-top:10px; text-align:left; width:95%; height:200px; white-space:nowrap; overflow-x: hidden; overflow-y: scroll;"></div>';			
			myHTML += '<p><b>User Overlays</b></p><div id="user_overlays" class="ui-widget-content ui-dialog-content" style="margin-top:10px; text-align:left; width:95%; height:200px; white-space:nowrap; overflow-x: hidden; overflow-y: scroll;"></div>';
			//GLog.write( myHTML );
			$("#ProfileDialog").dialog('option', 'title', 'Profile ' + username);
			$("#ProfileDialog").html(myHTML);
									
			//GLog.write( "opening dialog" );					
			$("#ProfileDialog").dialog( 'open' );
			
			/* LOAD MARKERS */
			GDownloadUrl( base_url + 'map/usermarker/'+uid, function(data) {
						var xml2 = GXml.parse(data);
						var markers = xml2.documentElement.getElementsByTagName("marker");
						//GLog.write( "Length: "+markers.length+" uid: "+uid );
						var myHTML2 = '<ul>';
						for (var i = 0; i < markers.length; i++) {		
							myHTML2 += '<li><a href="#" onclick="ToggleMarker(  '+markers[i].getAttribute("marker_id")+' );">' + markers[i].getAttribute("marker_name")+'</a></li>';				
						}
						myHTML2 += '</ul>';
						//GLog.write( "loaded Markers" );
												
						$('#user_markers').html( myHTML2 );
						//GLog.write( myHTML2 );
			});
			
			/* LOAD OVELRAYS */
			GDownloadUrl( base_url + 'map/useroverlay/'+uid, function(data) {
						var xml2 = GXml.parse(data);
						var overlays = xml2.documentElement.getElementsByTagName("kmlfile");
						//GLog.write( "Length: "+overlays.length+" uid: "+uid );
						var myHTML2 = '<ul>';
						for (var i = 0; i < overlays.length; i++) {
							if( overlays[i].getAttribute("is_private") == 1 ) {
								myHTML2 += '<li><span class="ui-icon ui-icon-locked"></span><a href="#"  onclick="loadKMLOverlay('+overlays[i].getAttribute("overlay_id")+');">' + overlays[i].getAttribute("name")+'</a></li>';
							} else {
								myHTML2 += '<li><a href="#"  onclick="loadKMLOverlay('+overlays[i].getAttribute("overlay_id")+');">' + overlays[i].getAttribute("name")+'</a></li>';
							}				
						}
						myHTML2 += '</ul>';
						//GLog.write( "Loaded overlays" );
						
						$('#user_overlays').html( myHTML2 );
						//GLog.write( myHTML2 );
			});
	});
}

	/*
	** Changes QMK Login State
	*/
	function AllowQmkLogin() {
		//GLog.write( "start changing");
		GDownloadUrl( base_url + 'map/allow_qmk_login/'+user_id, function(data) {
				//GLog.write( "response");
				if( $('#qmk_login').val() == 'Click to Enable') {			
					$('#qmk_login').val('Click to Disable');
				} else {				
					$('#qmk_login').val('Click to Enable');
				}
		});
	}
	
	/*
	** returns PHP created md5 from overlay model!
	*/
	function getMD5(mystring) {			
		GDownloadUrl( base_url + 'map/getMD5/'+mystring, function(data) {			
			var xmlMD5sum = GXml.parse(data);
			var md5sum = xmlMD5sum.getElementsByTagName("md5sum");						
			for (var i = 0; i < md5sum.length; i++) {
				GLog.write( md5sum[i].getAttribute("string") );
				return md5sum[i].getAttribute("string");				
			}
		});
	}
	
	/*
** LOADS Overlays from Database and controlls Click Behaviour
*/

function loadKMLOverlay( IdOfKmlOverlay, privatepassword ) {
	//GLog.write( "Loading Overlay from DB..." );
	var pp;
	if(privatepassword) {
		pp = privatepassword;
	} else {
		pp = '';
	}
	//GLog.write( 'oid: '+IdOfKmlOverlay+' pp: '+pp);
	GDownloadUrl(base_url+"map/overlay_receive/"+IdOfKmlOverlay+"/"+pp, function(data) {
		//GLog.write( "Response from overlay_receive..." );
		//GLog.write( "URL: "+base_url+"map/overlay_receive/"+IdOfKmlOverlay+"/"+pp);
		var xml = GXml.parse(data);
		var kmlfiles = xml.documentElement.getElementsByTagName("kmlfile");
		//GLog.write( kmlfiles.length + " KML Data loaded" );
		
		var path = base_url+"overlaydata/";
		
		for (var i = 0; i < kmlfiles.length; i++) {
		
			// its not a private file
			//GLog.write( "is_private: "+kmlfiles[i].getAttribute("is_private"));
			//GLog.write( "password_ok: "+kmlfiles[i].getAttribute("privatepasswordok"));
			if( kmlfiles[i].getAttribute("is_private") == 0) {
				var str_kmlfile 	= kmlfiles[i].getAttribute("kmlfilename");				
				
				//GLog.write( "GGeoXML Object Path: " + path + str_kmlfile );
				var theGeoXML = new GGeoXml( path + str_kmlfile, function() {
					//theGeoXML.myKmlId = int_ID;
					
					//GLog.write( "array pushed" );
					geoXMLarr.push( theGeoXML );
					
					//GLog.write( "overlay added" );
					map.addOverlay( theGeoXML );
					
					// get default Boundings from GGeoXML Object, get resulting Zoom Level
					var boundsZoomLevel = map.getBoundsZoomLevel(theGeoXML.getDefaultBounds());
					//GLog.write( "boundsZoomLevel: " + boundsZoomLevel );
					// and set zoomLevel minus 2 for viewing them
					map.setZoom( boundsZoomLevel );
					
					// now set centered view of all loaded GeoXML Objects
					var boundsCenter = theGeoXML.getDefaultBounds().getCenter();
					//GLog.write("boundsCenter: " + boundsCenter );				
					map.setCenter( boundsCenter );
					map.setMapType(G_SATELLITE_MAP);				
				 });
			} else { // is_private is TRUE
				if( kmlfiles[i].getAttribute("privatepasswordok") == 1 ) {
					//--------------------------------------------
					// is_private and passwork OK then load file.
					//--------------------------------------------
					var str_kmlfile 	= kmlfiles[i].getAttribute("kmlfilename");				
					//GLog.write( "Password is OK" );
					//GLog.write( "GGeoXML Object Path: " + path + str_kmlfile );
					var theGeoXML = new GGeoXml( path + str_kmlfile, function() {
						//theGeoXML.myKmlId = int_ID;
						
						//GLog.write( "array pushed" );
						geoXMLarr.push( theGeoXML );
						
						//GLog.write( "overlay added" );
						map.addOverlay( theGeoXML );
						
						// get default Boundings from GGeoXML Object, get resulting Zoom Level
						var boundsZoomLevel = map.getBoundsZoomLevel(theGeoXML.getDefaultBounds());
						//GLog.write( "boundsZoomLevel: " + boundsZoomLevel );
						// and set zoomLevel minus 2 for viewing them
						map.setZoom( boundsZoomLevel );
						
						// now set centered view of all loaded GeoXML Objects
						var boundsCenter = theGeoXML.getDefaultBounds().getCenter();
						//GLog.write("boundsCenter: " + boundsCenter );				
						map.setCenter( boundsCenter );
						map.setMapType(G_SATELLITE_MAP);
					});
				} else {
					//--------------------------------------------
					// otherwise open password dialog
					//--------------------------------------------
					$('#PrivatePasswordDialog').dialog( 'open' );
					$('#pp_oid').val(IdOfKmlOverlay);
				}
			}
			
		}
		//GLog.write( "done" );
	});	
}
/*
** END OF  LOADS Overlays from Database and controlls Click Behaviour
*/

	/*
	** LOADS Data into the selections on the left side
	**/
	function loadMarkerData(cid) {		
		$.ajax({
		  url: base_url+'/map/getmarkerlist/'+cid,
		  success: function(data) {
		    $('#category'+cid).html(data);
		    $('#q'+cid).liveUpdate('#catlist'+cid).focus();
		    if( cid == 4 ) {		    	
		   		$("#loadold").click(function(event){			
					// load old markers now!
					$("#oldmarkerprogressbar").html("<b>Loading...</b>");					
					LoadOldMarkers();
				});
			} 
		  }
		});
	}
	
	function loadOverlayData() {		
		$.ajax({
		  url: base_url+'/map/getoverlaylist/',
		  success: function(data) {
		    $('#overlay').html(data);		    
		  }
		});
	}

//]]>
