/**
* clears all Map events
*/
function Pointer(map) {
	google.maps.event.clearListeners(map,'click');
}
/**
* draw A Polygon 
* Polygon can be edited by click on it 
* click the map again to stop editing...
*/
function drawPolygon(map,mapObjekts) {
	google.maps.event.clearListeners(map,'click');
	google.maps.event.addListenerOnce(map,'click',function(event) {
			// set Marker at Startpoint (
			tempMarker(event.latLng);
			
			var objekt = recreatePolygon(null,event.latLng,map);
			
			google.maps.event.addListener(map,'click',function(event) {
					objekt.addPoint(event.latLng);
			});
			
	});
}
function recreatePolygon(oldObjekt,latLng,map) {
	document.getElementById("inputField").innerHTML = "";
	
	if (oldObjekt != null) {
		if (oldObjekt.window) {
			oldObjekt.window.close();
		}
		coords = oldObjekt.getPaths();
		var polyOptions = {
			map: map, 
			paths: coords,
			strokeColor: ColorSelect.getStrokeColor(),
			strokeOpacity: 1.0,
			fillColor: ColorSelect.getFillColor(),
			fillOpacity: ColorSelect.getOpacity(),
			strokeWeight: ColorSelect.getStroke()
		} 
	} else {
		var coords =  new google.maps.MVCArray();
		coords.push(latLng);
		var polyOptions = {
			map: map, 
			path: coords,
			strokeColor: ColorSelect.getStrokeColor(),
			strokeOpacity: 1.0,
			fillColor: ColorSelect.getFillColor(),
			fillOpacity: ColorSelect.getOpacity(),
			strokeWeight: ColorSelect.getStroke()
		} 
	}

	for (var i = mapObjekts.length-1; i >= 0;i--){ // maybe needs rework...
		if (mapObjekts[i] == oldObjekt) {	
			mapObjekts[i].del();
			mapObjekts.splice(i,1);
		}
	}
	var objekt = new google.maps.Polygon(polyOptions);
	objekt.title = "DRAWaMAP Polygone";
	mapObjekts.push(objekt);
	
	if (oldObjekt) {
		if (oldObjekt.title ) objekt.title = oldObjekt.title;
		if (oldObjekt.Info ) objekt.Info = oldObjekt.Info;
	}
	
	google.maps.event.addListener(objekt,'click',function(event) {
			google.maps.event.trigger(map, 'click', event, this);
			var objNr =-1;
			for (var i = mapObjekts.length-1; i >= 0;i--){ // maybe needs rework...
				if (mapObjekts[i] == this) {
					objNr = i;
					break;
				}
			}
			this.ClickAction(objNr);
	});
	
	return objekt;
}


/**
* delete a Map Item
*/
function deletObjekt(Overlay) {
	google.maps.event.clearListeners(map,'click');
	document.getElementById("inputField").innerHTML = "";
	Overlay.del();
	for (var i = mapObjekts.length-1; i >= 0;i--){ // maybe needs rework...
		if (mapObjekts[i] == Overlay) mapObjekts.splice(i,1);
	}
}
/**
* draw Line on the Map...
*/
function drawline(map,mapObjekts) {
	google.maps.event.clearListeners(map,'click');
	var marker;
	google.maps.event.addListenerOnce(map,'click',function(event) {		
			marker = tempMarker(event.latLng);
			
			var objekt = recreatePolyline(null,event.latLng,map) 
			
			google.maps.event.addListener(map,'click',function(event, Overlay) {
					var coords = objekt.getPath();
					coords.push(event.latLng);
					marker.setMap(null);
					marker = tempMarker(event.latLng);
			});	
	});	
}

function recreatePolyline(oldObjekt,latLng,map) {
	document.getElementById("inputField").innerHTML = "";
	var coords =  new google.maps.MVCArray();
	coords.push(latLng);
	if (oldObjekt != null) {
		if (oldObjekt.window) {
			oldObjekt.window.close();
		}
		coords = oldObjekt.getPath();
	} 
	var polyOptions = {
		map: map, 
		path: coords,
		strokeColor: ColorSelect.getStrokeColor(),
		strokeOpacity: 1.0,
		strokeWeight: ColorSelect.getStroke()
	} 
	
	for (var i = mapObjekts.length-1; i >= 0;i--){ // maybe needs rework...
		if (mapObjekts[i] == oldObjekt) {
			mapObjekts[i].del();
			mapObjekts.splice(i,1);	
		}
	}
	
	var objekt = new google.maps.Polyline(polyOptions);
	objekt.title = "DRAWaMAP Polyline";
	mapObjekts.push(objekt);
	
	if (oldObjekt) {
		if (oldObjekt.title ) objekt.title = oldObjekt.title;
		if (oldObjekt.Info ) objekt.Info = oldObjekt.Info;
	}
	
	google.maps.event.addListener(objekt,'click',function(event) {
			google.maps.event.trigger(map, 'click', event, this);
			var objNr;
			for (var i = mapObjekts.length-1; i >= 0;i--){ // maybe needs rework...
				if (mapObjekts[i] == this) {
					objNr = i;
				}
			}
			this.ClickAction(objNr);
	});
	
	return objekt;
}

function editPoly(objekt,objNr,num) {
	google.maps.event.clearListeners(map,'click');
	if(objekt.markers && objekt.addmarkers) {
		var erasemarker;
		for (var i=0; i < objekt.markers.getLength();i++) {
			erasemarker = objekt.markers.getAt(i);
			erasemarker.setMap(null);
		}
		for (var i=0; i < objekt.addmarkers.getLength();i++) {
			erasemarker = objekt.addmarkers.getAt(i);
			erasemarker.setMap(null);
		}	
	}
	
	var coords =  new google.maps.MVCArray();
	objekt.markers = new google.maps.MVCArray();
	objekt.addmarkers = new google.maps.MVCArray();
	
	coords = objekt.getPath();
	var marker;
	for (var i=0; i < coords.getLength();i++) {
		marker = tempMarker(coords.getAt(i));
		google.maps.event.clearListeners(marker,'click');
		google.maps.event.addListener(marker,'dragend',function(event){
				var coords =  new google.maps.MVCArray();
				var marker;
				for (var i=0; i < objekt.markers.getLength();i++) {
					marker = objekt.markers.getAt(i);
					coords.push(marker.getPosition());
				}
				objekt.setPath(coords);
				editPoly(objekt,0,num);
		});
		google.maps.event.addListenerOnce(marker,'click',function() {
				var erasemarker;
				for (var i=0; i < objekt.markers.getLength();i++) {
					erasemarker = objekt.markers.getAt(i);
					erasemarker.setMap(null);
				}
				for (var i=0; i < objekt.addmarkers.getLength();i++) {
					erasemarker = objekt.addmarkers.getAt(i);
					erasemarker.setMap(null);
				}
		});
		marker.draggable = true;
		objekt.markers.push(marker);
		
		if ( i < coords.getLength() + num) {
			var c1 = coords.getAt(i);
			var c2 = coords.getAt((i+1)%coords.getLength());
			marker = tempMarker(new google.maps.LatLng(c2.lat() + (c1.lat()-c2.lat())/2,c2.lng() + (c1.lng()-c2.lng())/2));
			marker.id = i;
			objekt.addmarkers.push(marker);
			
			google.maps.event.clearListeners(marker,'click');
			google.maps.event.addListener(marker,'dragend',function(event){
					coords.insertAt( (this.id+1)%coords.getLength() ,this.getPosition() );
					objekt.setPath(coords);
					editPoly(objekt,0,num);
			});
			google.maps.event.addListenerOnce(marker,'click',function() {
					var erasemarker;
					for (var i=0; i < objekt.markers.getLength();i++) {
						erasemarker = objekt.markers.getAt(i);
						erasemarker.setMap(null);
					}
					for (var i=0; i < objekt.addmarkers.getLength();i++) {
						erasemarker = objekt.addmarkers.getAt(i);
						erasemarker.setMap(null);
					}
			});
		}
	}
	document.getElementById("inputField").innerHTML = "";
}

/**
* set a Marker and it's options....
*/
function createMarker(map,mapObjekts) {
	// was vielleicht kommen sollte
	google.maps.event.clearListeners(map,'click');
	google.maps.event.addListenerOnce(map,"click",function(event) {
			recreateMarker(null,event.latLng,map);
	});
}

function recreateMarker(oldObjekt,latlng,map) {
	document.getElementById("inputField").innerHTML = "";
	if (latlng != null) {
		var lat = latlng.lat();
		var lng = latlng.lng();	
		var coords =  new google.maps.MVCArray();
		coords.push(new google.maps.LatLng(lat,lng));
		coords.push(new google.maps.LatLng(lat + .0001,lng + .0001));
		coords.push(new google.maps.LatLng(lat + .0003,lng + .0001));
		coords.push(new google.maps.LatLng(lat + .0003,lng - .0001));
		coords.push(new google.maps.LatLng(lat + .0001,lng - .0001));		
	} else {
		var coords =  new google.maps.MVCArray();
		coords = oldObjekt.getPath();
		latlng = coords.getAt(0);
	}
	
	var polyOptions = {
		map: map, 
		path: coords,
		strokeColor: ColorSelect.getStrokeColor(),
		strokeOpacity: 1.0,
		fillColor: ColorSelect.getFillColor(),
		fillOpacity: ColorSelect.getOpacity(),
		strokeWeight: ColorSelect.getStroke()
	} 
	for (var i = mapObjekts.length-1; i >= 0;i--){ 
		if (mapObjekts[i] == oldObjekt) {
			mapObjekts[i].del();
			mapObjekts.splice(i,1);
		}
	}
	
	var objekt = new google.maps.Polygon(polyOptions);
	objekt.title = "DRAWaMAP Marker";
	if (oldObjekt) {
		if (oldObjekt.title ) objekt.title = oldObjekt.title;
		if (oldObjekt.Info ) objekt.Info = oldObjekt.Info;
	}
	var geocoder = new google.maps.Geocoder();
	
	if (geocoder) {
      geocoder.geocode({latLng: latlng}, function(results, status) {
      		if (status == google.maps.GeocoderStatus.OK) {
      			if (results[0]) {
      				objekt.address = results[0].formatted_address;// htmlentities(results[0].formatted_address);
      			}
      		} else {
      			objekt.address = latlng.toUrlValue(3);
      		}
      });
   }
	
	mapObjekts.push(objekt);
	
	google.maps.event.addListener(objekt,'click',function(event) {
			google.maps.event.trigger(map, 'click', event, this);
			var objNr;
			for (var i = mapObjekts.length-1; i >= 0;i--){ // maybe needs rework...
				if (mapObjekts[i] == this) {
					objNr = i;
				}
			}
			this.ClickActionMarker(objNr) 
	});
	// so that a click on a overlay also clicks the map...
	
	return objekt;
	
}

function editMarker(objekt,objNr,map) {
	document.getElementById("inputField").innerHTML = "";
	google.maps.event.clearListeners(map,'click');
	var coords = objekt.getPath();
	var marker = tempMarker(coords.getAt(0));
	google.maps.event.addListenerOnce(marker,'dragend',function(event){
			var latlng = event.latLng;
			objekt.setPath( move(coords,latlng,coords.getAt(0)) );
			this.setMap(null);
			var geocoder = new google.maps.Geocoder();
			
			if (geocoder) {
				geocoder.geocode({latLng: latlng}, function(results, status) {
						if (status == google.maps.GeocoderStatus.OK) {
							if (results[0]) {
								objekt.address = results[0].formatted_address;//htmlentities(results[0].formatted_address);
							}
						} else {
							objekt.address = latlng.toUrlValue(3);
						}
				});
			}
	});
}

function move(Path,to,from) {
	var dLat = to.lat() - from.lat() ;
	var dLng = to.lng() - from.lng();
	for(var i =0; i < Path.getLength();i++) {
		Path.setAt(i, new google.maps.LatLng(Path.getAt(i).lat() + dLat,Path.getAt(i).lng() + dLng));
	}
	return Path;
}



/**
* tempMarker
*/
function tempMarker(latlng) {
	var img = new google.maps.MarkerImage('ICONS/ZoomMarker.png',
		new google.maps.Size(22,22),
		new google.maps.Point(0,0),
		new google.maps.Point(10,10));
	var marker = new google.maps.Marker({
			position: latlng,
			draggable: true,
			map: map,
			title:"Temporary Marker",
			icon: img
	});
	google.maps.event.addListener(marker,"click",function() {
			google.maps.event.clearListeners(map,'click');
			this.setMap(null);	
	});
	return marker
}
/**
*	QUADTREE
*/

function drawQuad(map,mapObjekts,element) {
	google.maps.event.clearListeners(map,'click');
	
	element = document.getElementById(element);
	var firstCorner = "";
	var marker;
	
	google.maps.event.addListener(map,"click",function(event) {
			if (firstCorner =="") {
				firstCorner = event.latLng;
				marker = tempMarker(event.latLng);
			} else {
				var latlng = event.latLng;
				var sw = new google.maps.LatLng( Math.min( latlng.lat(),firstCorner.lat()) , Math.min( latlng.lng(),firstCorner.lng()) );
				var ne = new google.maps.LatLng( Math.max( latlng.lat(),firstCorner.lat()) , Math.max( latlng.lng(),firstCorner.lng()) );
				var Bounds = new Array();
				var Bound = new google.maps.LatLngBounds(sw,ne);		
				var Area = ( sw.lat() - ne.lat() ) * ( sw.lng() - ne.lng() );
				
				Bound.area = ( sw.lat() - ne.lat() ) * ( sw.lng() - ne.lng() );
				Bounds.push(Bound);
				marker.setMap(null);
				firstCorner = "";
				
				var positions = new Array();
				
				for (var item in mapObjekts) {
					try {
						if ( mapObjekts[item].title.search(/marker/i) != -1 ) {
							pos = mapObjekts[item].getPath();
							pos = pos.getAt(0);
							if (Bound.contains(pos)) {
								positions.push(pos);
							}
						}
					} catch (err) {}
				}
				positions = removeDouble(positions,2);
				
				var fixed_Bounds = new Array();
				
				for (var b = 0; b < Bounds.length;b++) {
					var count = 0;
					for (var p = 0;p < positions.length;p++) {
						if (Bounds[b].contains(positions[p])) {
							count++;	
							if ( count > 1) {
								Bounds = splitBound(Bounds[b],Bounds);
								p = positions.length;
								b = 0;
							} 
						}
					}
					if (count <= 1) {
						fixed_Bounds.push(Bounds[b]);
						Bounds.splice(b,1);
						b = -1;
					} 
				}
				
				var coords = new Array();
				
				for ( var b = 0; b < fixed_Bounds.length;b ++) {
					var rect = new google.maps.MVCArray();
					var sw = fixed_Bounds[b].getSouthWest();
					var ne = fixed_Bounds[b].getNorthEast();
					var se = new google.maps.LatLng(sw.lat(),ne.lng());
					var nw = new google.maps.LatLng(ne.lat(),sw.lng());
					rect.push(sw);
					rect.push(se);
					rect.push(ne);
					rect.push(nw);
					
					var index = potentz( Area/fixed_Bounds[b].area ,4 )-1;
					index = Math.max(0,index);
					
					if (coords[index]) {
						coords[index].push(rect);
					} else {
						coords[index] = new google.maps.MVCArray();
						coords[index].push(rect);
					}
				}
				
				var col = createHMC(coords.length);
				
				for (p in coords) {
					if (coords[p]) {
						// create heat map colors 
						var polyOptions = {
							map: map, 
							paths: coords[p],
							strokeColor: col[p],
							strokeOpacity: 0.01,
							fillColor: col[p],
							fillOpacity: 0.8,
							strokeWeight: 0
						} 
						var objekt = new google.maps.Polygon(polyOptions);
						objekt.title = "DRAWaMAP QUADTREE";
						mapObjekts.push(objekt);
						
						google.maps.event.addListener(objekt,'click',function(event) {
								google.maps.event.trigger(map, 'click', event, this);
								var objNr =-1;
								for (var i = mapObjekts.length-1; i >= 0;i--){ // maybe needs rework...
									if (mapObjekts[i] == this) {
										objNr = i;
										break;
									}
								}
								this.ClickAction(objNr);
						});
						

					}
				}
				
				google.maps.event.clearListeners(map,'click');
			}
	});
}

function createHMC(numbers) {
	var winkel = (Math.PI) / numbers;
	var colorString = new Array();
	
	for (var i = 0; i < numbers;i++){
		var b =  Math.max( Math.cos((winkel*i)) , 0 );
		var g =  Math.max( Math.sin((winkel*i)) , 0 );
		var r =  Math.max( (Math.cos((winkel*i))*-1),0 );
		colorString.push( RGB2Color(Math.round(r*255), Math.round(g*255), Math.round(b*255)) );
		// alert( RGB2Color(Math.round(r*255), Math.round(g*255), Math.round(b*255)) );
		// alert(Math.round(r*255) + "," + Math.round(g*255) + "," + Math.round(b*255) );
	}
	return colorString;
}

function RGB2Color(r,g,b){
	return '#' + byte2Hex(r) + byte2Hex(g) + byte2Hex(b);
}

function byte2Hex(n) {
	var nybHexString = "0123456789ABCDEF";
	return String(nybHexString.substr((n >> 4) & 0x0F,1)) + nybHexString.substr(n & 0x0F,1);
}


function potentz(number,base){
	number = Math.round(number);
	var count = 0;
	while (number != 1) {
		number /= base;
		count++;
	}
	return count;
}

function splitBound(Bound,Bounds) {
 
	var sw = Bound.getSouthWest();
	var ne = Bound.getNorthEast();
	var Center = Bound.getCenter();
	var sc = new google.maps.LatLng( sw.lat(), Center.lng() );	
	var cw = new google.maps.LatLng( Center.lat(), sw.lng() );
	var nc = new google.maps.LatLng( ne.lat(), Center.lng() );
	var ce = new google.maps.LatLng( Center.lat(), ne.lng() );
	
	var tempBound = new google.maps.LatLngBounds(sw,Center);
	tempBound.area = ( sw.lat() - Center.lat() ) * ( sw.lng() - Center.lng() );
	Bounds.push( tempBound );
	
	tempBound = new google.maps.LatLngBounds(Center,ne);
	tempBound.area = ( Center.lat() - ne.lat() ) * ( Center.lng() - ne.lng() );
	Bounds.push( tempBound );
	
	tempBound = new google.maps.LatLngBounds(cw,nc);
	tempBound.area = ( cw.lat() - nc.lat() ) * ( cw.lng() - nc.lng() );
	Bounds.push( tempBound );
	
	
	tempBound =  new google.maps.LatLngBounds(sc,ce);
	tempBound.area = ( sc.lat() - ce.lat() ) * ( sc.lng() - ce.lng() );
	Bounds.push( tempBound );
	
	for(var item in Bounds) {
		if (Bounds[item] == Bound) {
			Bounds.splice(item,1);	
		}
	}
	
	return Bounds;	
}

/**
* 	WALKING DISTANCE
*/
function walking(map,mapObjekts,element) {
	element = document.getElementById(element);
	var str = "";
	str = "<div id='inputFieldBOX' class='inputFieldBOX'>";
	str += '<div id="open" onclick="minimize(&#34;inputFieldBOX&#34;,this)" class="minimize"></div>';
	str += "<h2>Time polygone :</h2><p/>";
	str += "<input id='timeDist' value='5' size='6'> minutes<p/>";
	str += "<input id='service' value='4' size='6'> km/h<p/>";
	str += "<h2 onclick='document.getElementById(&#34;"+element.id+"&#34;).innerHTML=&#34;&#34;'>[close]</h2>";
	str += "</div>";
	element.innerHTML = str;
	google.maps.event.clearListeners(map,'click');
	google.maps.event.addListenerOnce(map,'click',function(event) {
			var time = parseFloat( document.getElementById('timeDist').value );
			var dist;
			
			var type = parseInt(document.getElementById('service').value);
			
			if(!type) type = 4;
			
			dist = 1000*( type *(time/60));
			
			var winkel = ((dist*1.1)/6371000) / (Math.PI/180);
			var LatLng, lat,lng;
			
			var coords = new Array();
			coords.push(event.latLng);
			
			var marker = recreateMarker(null,event.latLng,map);
			
			marker.title = "DRAWaMAP Time marker";
			marker.Info = new Array();
			marker.Info.push(new Array());
			marker.Info[0]["title"] = "speed";
			marker.Info[0]["selected"] = type + " km/h";
			marker.Info[0]["type"] = "fixed";
			marker.Info.push(new Array());
			marker.Info[1]["title"] = "duration";
			marker.Info[1]["selected"] = time + " minutes";
			marker.Info[1]["type"] = "fixed";
			
			var objekt = recreatePolygon(null,event.latLng,map);
			
			objekt.title = "DRAWaMAP Time polygon";
			objekt.Info = new Array();
			objekt.Info.push(new Array());
			objekt.Info[0]["title"] = "speed";
			objekt.Info[0]["selected"] = type + " km/h";
			objekt.Info[0]["type"] = "fixed";
			objekt.Info.push(new Array());
			objekt.Info[1]["title"] = "duration";
			objekt.Info[1]["selected"] = time + " minutes";
			objekt.Info[1]["type"] = "fixed";
			
			drawDir(event.latLng,winkel,0,mapObjekts,objekt,dist,type);
			
			element.innerHTML ="";
	});
}

function convertArray(GoogleArray) {
	var newArray = new Array();
	for(var i = 0; i < GoogleArray.getLength(); i++){
		newArray.push(GoogleArray.getAt(i));
	}
	return newArray;
}

function drawDir(center,winkel,CurrentWinkel,mapObjekts,objekt,dist,type) {
	
	var lat = winkel*Math.cos(CurrentWinkel*Math.PI/180);
	var lng = winkel*Math.sin(CurrentWinkel*Math.PI/180)*(1/Math.cos(center.lat()*Math.PI / 180));
	lng += center.lng();
	lat += center.lat();
	var LatLng = new google.maps.LatLng(lat,lng);
	
	var directionsService = new google.maps.DirectionsService();
	var coords = convertArray( objekt.getPath() );
	
	if (type >= 30 ) type = google.maps.DirectionsTravelMode.DRIVING;
	else type = google.maps.DirectionsTravelMode.WALKING;
	
	var WayOptions = {
		origin: center,
		destination: LatLng,
		travelMode: type,
		unitSystem: google.maps.DirectionsUnitSystem.METRIC,
	}
	
	directionsService.route(WayOptions, function(result , status) {
			var count = coords.length;
			
			if (status == google.maps.DirectionsStatus.OK) {
				var currentDist = 0;
				var dirRoute = result.routes;
				dirRoute = dirRoute[0].legs;
				dirRoute = dirRoute[0].steps;
				for (var i = 0; i < dirRoute.length;i++) {// genauer...
					if (dirRoute[i].distance.value + currentDist < dist ) {
						currentDist += dirRoute[i].distance.value;
						coords.push(dirRoute[i].end_location);
					} else {								
						var dLat = dirRoute[i].end_location.lat() - dirRoute[i].start_location.lat();
						var dLng = dirRoute[i].end_location.lng() - dirRoute[i].start_location.lng();
						dLat *= (dist-currentDist) / dirRoute[i].distance.value;
						dLng *= (dist-currentDist) / dirRoute[i].distance.value;// rework??
						LatLng =  new google.maps.LatLng(dirRoute[i].start_location.lat()+ dLat,dirRoute[i].start_location.lng() +dLng);
						LatLng.base = center;
						coords.push(LatLng);
						currentDist = dist;
						break;
					}
				}
			} 
			
			if (coords.length == count) {
				center.base = center;
				coords.push(center);	
			}
			
			objekt.setPath(coords);
			
			CurrentWinkel+= 20;
			
			if (CurrentWinkel < 360) {
				drawDir(center,winkel,CurrentWinkel,mapObjekts,objekt,dist,type)
			} else {				
				coords = removeDouble(coords,20); // doppelte entfernen
				coords.sort(TL);					 // sortieren nach oberstenlinken punkt
				for (var i=0;i < coords.length;i++){
					coords[i].base = coords[0];
				}
				coords.splice(0,1);					// obersten Linken punkt entfernene
				coords.sort(SortWinkel);			// nach Winkle sortieren
				coords.push(coords[0].base);		// obersten Linke punkt als letzte stelle einfŸgen
				coords = convexHull(coords);		// eine convexe Huelle erstelllen
				objekt.setPath(coords);
			}
	}, function(err){
		CurrentWinkel+= 20;
		if (CurrentWinkel < 360) {
			drawDir(center,winkel,CurrentWinkel,mapObjekts,objekt,dist,type)
		} else {				
			coords = removeDouble(coords,20); // doppelte entfernen
			coords.sort(TL);				
			for (var i=0;i < coords.length;i++){
				coords[i].base = coords[0];
			}
			coords.splice(0,1);
			coords.sort(SortWinkel);
			coords.push(coords[0].base);
			coords = convexHull(coords);
			objekt.setPath(coords);
		}
	});	
}

function TL(c1,c2) {
	var dLat = (c2.lat()-c1.lat()) * Math.PI / 180;
	var dLon = (c2.lng()-c1.lng()) * Math.PI / 180;
	if (dLon == 0) {
		return dLat;	
	}
	return dLon;
}

function SortWinkel(c1,c2) {
	var dLat = (c1.base.lat()-c1.lat()) * Math.PI / 180;
	var dLon = (c1.base.lng()-c1.lng()) * Math.PI / 180;
	var w1 = Math.atan2(dLat,dLon);
	
	dLat = (c2.base.lat()-c2.lat()) * Math.PI / 180;
	dLon = (c2.base.lng()-c2.lng()) * Math.PI / 180;
	var w2 = Math.atan2(dLat,dLon);	
	
	if (w1 > w2) {
		return 1;	
	} else if (w1 < w2){
		return -1;	
	}
	return 0;	
}

function removeDouble(coords,dist) {
	for (var i = coords.length-1;i >= 0; i--) {	
		for (var ii = i-1;ii >= 0; ii--) {
			if (coords[i] && coords[ii]) {
				if (distance(coords[i],coords[ii]) < dist) { // genauigkeit 20meter...
					coords.splice(i,1);
					break;
				}
			}
		}
	}
	return coords;
}

function convexHull(Hull) {
	var count = 1;
	while(count+1 < Hull.length ){
		var P0 = Hull[count-1];
		var P1 = Hull[count];
		var P2 = Hull[count+1];
      var CrossProdukt = (P1.lat()-P0.lat())*(P2.lng()-P0.lng()) - (P2.lat()-P0.lat())*(P1.lng()-P0.lng());
      if (CrossProdukt > 0){ 
      	Hull.splice(count,1);
      	if (count > 1) count--; 
      }
      else count ++;
   }	
   return Hull;
}


/**
* Information Marker
*/
function InformationMarker(map, mapObjekts) {
	var element = document.getElementById('Information');
	if (!element || element.innerHTML == ""){
		loadInformation();
		window.open("login.php?action=loadInformation");	
	} else {
		google.maps.event.clearListeners(map,'click');
		google.maps.event.addListenerOnce(map,"click",function(event) {
				var objekt = recreateMarker(null,event.latLng,map);
				try{
					element = document.getElementById('MapDescription');
					objekt.title = "DRAWaMAP " + element.getAttribute("title") + " marker";
					var Info = new Array();
					var str = element.getAttribute("description");
					str = str.split("\n");
					for (var item in str) {
						var elementTxt = str[item].split(":");
						var Element = new Array();
						if (elementTxt[0]){
							Element["title"] =  elementTxt[0] ;
							if (elementTxt[1]) {
								var options = elementTxt[1].split(",");
								Element["options"] = new Array();
								Element["selected"] = options[0];
								Element["type"] = "select";
								for (var i in options) {
									Element["options"].push(options[i]);
								}
							} else {
								Element["selected"] = "";
								Element["type"] = "text";
							}
							Info.push(Element);
						}
					}
					objekt.Info = Info;
				} catch(err) {
					errorHandler(err);	
				}
		});
	}
}

function loadInformation() {
	var element = document.getElementById('Information');
	if (!element){
		element = document.createElement('div');
		element.id = "Information";
		element.style.visibility = "hidden";
		document.body.appendChild(element);
	} 
	element.innerHTML = "";
	
}

function htmlentities(str) {
	var chr; 
	var OutPut="";
	for ( var i = 0; i < str.length;i++ ) {
		chr = str.charCodeAt(i);
		if ( chr < 128 ) {
			OutPut += str.charAt(i);
		} else {
			OutPut += "&#" + chr + ";";
		}
	}
	return OutPut;
}

function clearentities(str) {
	var chr; 
	var OutPut="";
	for ( var i = 0; i < str.length;i++ ) {
		chr = str.charCodeAt(i);
		if (chr < 128) {
			OutPut += str.charAt(i);
		}
	}
	return OutPut;
}

function errorHandler(err) {
	alert("following error has occoured:\n" + err);	
}

function h2d(h) {return parseInt(h,16);} 


/** 
* ADD multible locations
*/
function addMultibelLocations(map,element) {
	google.maps.event.clearListeners(map,'click');
	element = document.getElementById(element);
	var width = (window.innerWidth - 150)/12;
	var str = "<div id='inputFieldBOX' class='inputFieldBOX'>";
	str += '<div id="findList" onclick="minimize(&#34;inputFieldBOX&#34;,this)" class="minimize"></div>';
	str += "<textarea id='addElements' rows='5'  cols='30'>limited to 100 adresses / search</textarea><br/>";
	str += "<h2><span onclick='getMultiLocation(&#34;addElements&#34;)'>[find]</span> ";
	str += "<span onclick='document.getElementById(&#34;inputField&#34;).innerHTML=&#34;&#34;'>[close]</span></h2>";
	str += "</div>";
	element.innerHTML = str;
}

function getMultiLocation(str) {
	var adressTxT = document.getElementById('addElements').value;
	document.getElementById('inputField').innerHTML='';
	if(document.all) {
		var adressList = adressTxT.split("\r\n");
	} else {
		var adressList = adressTxT.split("\n");
	}
	for (var i = 0; i < adressList.length && i <= 100;i++) {
		setLocation(adressList[i]);
	}   
}

function setLocation(addressSearch) {
	var geocoder = new google.maps.Geocoder();
	if (geocoder) {
      geocoder.geocode({address: addressSearch}, function(results, status) {
      		if (status == google.maps.GeocoderStatus.OK) {
      			if (results[0]) {
      				var pos = results[0].geometry.location;
      				var marker = recreateMarker(null,pos,map);
      				marker.address = results[0].formatted_address;
      			} else {
      				alert("No location found."); 
      			}
      		} 
      });
   }	
}

