var map;
var geocoder;
var vismarkers = [];
var lastmarker = 0;
var circlemarker = 0;

function initializeMap(lat,lng,zoom) {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("gmap"));
		geocoder = new GClientGeocoder();
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
        
		var mt = map.getMapTypes();
      	for (var i=0; i<mt.length; i++) {
	        mt[i].getMinimumResolution = function() {return 5;}
	        mt[i].getMaximumResolution = function() {return 18;}
      	}
      	
		map.setCenter(new GLatLng(lat, lng), zoom);
		
		new GKeyboardHandler(map);
		map.enableDoubleClickZoom();
		map.enableContinuousZoom();
		map.setMapType(G_NORMAL_MAP);
		
		GEvent.addListener(map, "moveend", function() {
		  	updateMap();
		});
		GEvent.addListener(map, "click", function(overlay,point) {
		  	lastmarker = overlay;
		});
		
		updateMap();
	}
}

function initializeMapUnpolluted(lat,lng,zoom) {
	if (GBrowserIsCompatible()) {
		map = new GMap2(document.getElementById("gmap"));
		geocoder = new GClientGeocoder();
		        
		var mt = map.getMapTypes();
      	for (var i=0; i<mt.length; i++) {
	        mt[i].getMinimumResolution = function() {return 5;}
	        mt[i].getMaximumResolution = function() {return 18;}
      	}
      	
		map.setCenter(new GLatLng(lat, lng), zoom);
		map.setMapType(G_NORMAL_MAP);
		
	}
}

function initializeMapCircle(lat,lng,zoom,distance) {
	initializeMap(lat,lng,zoom);
	drawCircle(lat,lng,distance);
}

function createMarker(lat,lng,description,img,img_w,img_h) {
	var icon = new GIcon();
	icon.image = img;
	icon.iconSize = new GSize(img_w, img_h);
	subt = img_h / 100 * 11;
	subt = Math.ceil(subt);
	var anchor = img_h - subt;
	icon.iconAnchor= new GPoint(10, anchor);
	var infoanchor = img_h / 3;
	infoanchor = Math.floor(infoanchor);
	icon.infoWindowAnchor = new GPoint(infoanchor, 2);
	var marker = new GMarker(new GLatLng(lat,lng),icon);
	GEvent.addListener(marker, "click", function() {marker.openInfoWindowHtml(description);});
	return marker;
}

function newAddOverlay(lat,lng,description,img,img_w,img_h) {
	var marker = createMarker(lat,lng,description,img,img_w,img_h);
	vismarkers[vismarkers.length] = marker;
	map.addOverlay(marker);
	return marker;
}

function geocodeAddress(address,img,img_w,img_h,zoom,errorid) {
	geocoder.getLatLng(address,
								function(point) {
									if (!point) {
										var errorobj = document.getElementById(errorid);
										if (errorobj) {
											errorobj.innerHTML = address+' nicht gefunden!';
										}
									} else {
																				
										var marker = createMarker(point.lat(),point.lng(),address,img,img_w,img_h);
										
										map.clearOverlays();
										map.addOverlay(marker);
										
										map.setCenter(new GLatLng(point.lat(), point.lng()), zoom);
										
										var errorobj = document.getElementById(errorid);
										if (errorobj) {
											errorobj.innerHTML = '';
										}
									}
								}
						);
}

function drawCircle(lat,lng, radius) {
	var point = new GLatLng(lat,lng);
	var d2r = Math.PI/180;
	var r2d = 180/Math.PI;
	var Clat = (radius/6377.83027)*r2d;
	var Clng = Clat/Math.cos(point.lat()*d2r);
	var Cpoints = Array();
	for (var i=0; i < 33; i++) {
		var theta = Math.PI * (i/16);
		var CPlng = parseFloat(point.lng()) + parseFloat(Clng * Math.cos(theta));
		var CPlat = parseFloat(point.lat()) + parseFloat(Clat * Math.sin(theta));
		var P = new GLatLng(CPlat,CPlng);
		Cpoints.push(P);
	}
	var cmark = new GPolygon(Cpoints,"#cc0000",2,0.8);
	circlemarker = cmark;
    map.addOverlay(cmark);
}

function newClearOverlays() {
	if (lastmarker == 0 && circlemarker == 0) {
		map.clearOverlays();
	} else {
		for (var i = 0; i < vismarkers.length; i++) {
			if (vismarkers[i] != lastmarker) {
				map.removeOverlay(vismarkers[i]);
			}
		}
	}
}

function updateMap() {
	var center = map.getCenter();
	var zoomlevel = map.getZoom();
	var bounds = map.getBounds();
	$.get("ajaxlocations.js", { "zoomlevel": zoomlevel, "latC": center.lat(), "lngC": center.lng(), "latNE": bounds.getNorthEast().lat(), "lngNE":bounds.getNorthEast().lng() },
	function(data){
		newClearOverlays();
		eval(data);
	});
};