function createMarker(map, point, options)
{
	var marker = new GMarker(point);

	if (options.info != null) {
		GEvent.addListener(marker, "click", function() {
			var point = marker.getPoint();
			marker.openInfoWindowHtml(options.info);
		});
	} else {
		if (options.url != null) {
			GEvent.addListener(marker, "click", function() {
				window.location = options.url;
			});
		}
	}

	return marker;
}

function createPolygon(map, points, options) {
	var strokeColor = "#0066cc";
	var strokeWeight = 5;
	var strokeOpacity = 1;
	var fillColor = "#0066cc";
	var fillOpacity = 0.15;
	var polygon = new GPolygon(points, strokeColor, strokeWeight, strokeOpacity, fillColor, fillOpacity);
	
	if (options.editable) {
		if (points.length < 3) {
			polygon.enableDrawing();
		}
		
	    GEvent.addListener(polygon, "click", function(latlng) {
			if (polygon.getVertexCount() <= 4) {
				polygon.disableEditing();
				map.removeOverlay(polygon);
				areas.splice(areas.indexOf(polygon, 0), 1);
			} else {
				for (var i = 0; i < polygon.getVertexCount(); i++) {
					if (polygon.getVertex(i).equals(latlng)) {
						polygon.deleteVertex(i);
						break;
					}
				};
			}
	    });

		GEvent.addListener(polygon, "lineupdated", function() {
			// anzeige aller Gebiete auf der Seite
		});
		
		GEvent.addListener(polygon, "mouseover", function() {
			polygon.enableEditing();
		})

		GEvent.addListener(polygon, "mouseout", function() {
			polygon.disableEditing();
		})
	}
	
	areas.push(polygon);
	map.addOverlay(polygon);
	return polygon;
}

function loadMap(id, url, options) {
  if (GBrowserIsCompatible()) {
	mapIcons = Array();
	mapIcons["party"] = new GIcon();
	mapIcons["party"].image = "/images/party.png";
	mapIcons["party"].shadow = "/images/partyshadow.png";
	mapIcons["party"].iconSize = new GSize(37, 39);
	mapIcons["party"].shadowSize = new GSize(49, 39);
	mapIcons["party"].iconAnchor = new GPoint(14, 34);
	mapIcons["party"].infoWindowAnchor = new GPoint(12, 7);

	mapIcons["pointblue"] = new GIcon();
	mapIcons["pointblue"].image = "/images/pointblue.png";
	mapIcons["pointblue"].shadow = "/images/pointshadow.png";
	mapIcons["pointblue"].iconSize = new GSize(12, 12);
	mapIcons["pointblue"].shadowSize = new GSize(18, 12);
	mapIcons["pointblue"].iconAnchor = new GPoint(6, 6);
	mapIcons["pointblue"].infoWindowAnchor = new GPoint(6, 6);

	mapIcons["pointred"] = new GIcon();
	mapIcons["pointred"].image = "/images/pointred.png";
	mapIcons["pointred"].shadow = "/images/pointshadow.png";
	mapIcons["pointred"].iconSize = new GSize(12, 12);
	mapIcons["pointred"].shadowSize = new GSize(18, 12);
	mapIcons["pointred"].iconAnchor = new GPoint(6, 6);
	mapIcons["pointred"].infoWindowAnchor = new GPoint(6, 6);

	mapIcons["dish1"] = new GIcon();
	mapIcons["dish1"].image = "/images/route1.png";
	mapIcons["dish1"].shadow = "/images/routeshadow.png";
	mapIcons["dish1"].iconSize = new GSize(32, 34);
	mapIcons["dish1"].shadowSize = new GSize(46, 34);
	mapIcons["dish1"].iconAnchor = new GPoint(14, 34);
	mapIcons["dish1"].infoWindowAnchor = new GPoint(12, 7);

	mapIcons["dish2"] = new GIcon();
	mapIcons["dish2"].image = "/images/route2.png";
	mapIcons["dish2"].shadow = "/images/routeshadow.png";
	mapIcons["dish2"].iconSize = new GSize(32, 34);
	mapIcons["dish2"].shadowSize = new GSize(46, 34);
	mapIcons["dish2"].iconAnchor = new GPoint(14, 34);
	mapIcons["dish2"].infoWindowAnchor = new GPoint(12, 7);

	mapIcons["dish3"] = new GIcon();
	mapIcons["dish3"].image = "/images/route3.png";
	mapIcons["dish3"].shadow = "/images/routeshadow.png";
	mapIcons["dish3"].iconSize = new GSize(32, 34);
	mapIcons["dish3"].shadowSize = new GSize(46, 34);
	mapIcons["dish3"].iconAnchor = new GPoint(14, 34);
	mapIcons["dish3"].infoWindowAnchor = new GPoint(12, 7);

	var map = new GMap2(document.getElementById(id));
	map.addControl(new GSmallMapControl());
	map.addControl(new GMapTypeControl());
	
	GDownloadUrl(url, function(data, responseCode) {
		var xml = GXml.parse(data);
		
		var editable = xml.documentElement.getElementsByTagName("editable").length > 0;

		var center = xml.documentElement.getElementsByTagName("center");
		var centerlat = parseFloat(center[0].getElementsByTagName("lat")[0].firstChild.data);
		var centerlng = parseFloat(center[0].getElementsByTagName("lng")[0].firstChild.data);
		var centerPt = new GLatLng(centerlat, centerlng);
		var zoomfactor = parseInt(center[0].getElementsByTagName("zoomfactor")[0].firstChild.data);

		// define areas globally if map is editable 
		areas = Array();
		var polygons = xml.documentElement.getElementsByTagName("polygon");
		for (var i = 0; i < polygons.length; i++) {
			var polygon = polygons[i];
			var points = Array();
			var coordinates = polygon.getElementsByTagName("coordinate");
			for (var j = 0; j < coordinates.length; j++) {
				var lat = parseFloat(coordinates[j].getElementsByTagName("lat")[0].firstChild.data);
				var lng = parseFloat(coordinates[j].getElementsByTagName("lng")[0].firstChild.data);
				points[j] = new GLatLng(lat, lng);
			}
			var strokeColor = "#0066cc";
			var strokeWeight = 5;
			var strokeOpacity = 1;
			var fillColor = "#0066cc";
			var fillOpacity = 0.15;
			if (polygon.getElementsByTagName("strokeColor").length > 0) {
				strokeColor = polygon.getElementsByTagName("strokeColor")[0].firstChild.data;
			}
			if (polygon.getElementsByTagName("strokeWeight").length > 0) {
				strokeWeight = parseInt(polygon.getElementsByTagName("strokeWeight")[0].firstChild.data);
			}
			if (polygon.getElementsByTagName("strokeOpacity").length > 0) {
				strokeOpacity = parseFloat(polygon.getElementsByTagName("strokeOpacity")[0].firstChild.data);
			}
			if (polygon.getElementsByTagName("fillColor").length > 0) {
				fillColor = polygon.getElementsByTagName("fillColor")[0].firstChild.data;
			}
			if (polygon.getElementsByTagName("fillOpacity").length > 0) {
				fillOpacity = parseFloat(polygon.getElementsByTagName("fillOpacity")[0].firstChild.data);
			}
			createPolygon(map, points, {editable: editable, points: points, strokeColor: strokeColor, strokeWeight: strokeWeight, strokeOpacity: strokeOpacity, fillColor: fillColor, fillOpacity: fillOpacity});
		}

		var goverlays = Array();
		
		var polylines = xml.documentElement.getElementsByTagName("polyline");
		for (var i = 0; i < polylines.length; i++) {
			var points = Array();
			var coordinates = polylines[i].getElementsByTagName("coordinate");
			for (var j = 0; j < coordinates.length; j++) {
				var lat = parseFloat(coordinates[j].getElementsByTagName("lat")[0].firstChild.data);
				var lng = parseFloat(coordinates[j].getElementsByTagName("lng")[0].firstChild.data);
				points[j] = new GLatLng(lat, lng);
			}
			var strokeColor = "#119ccc";
			if (polylines[i].getElementsByTagName("strokeColor").length > 0) {
				strokeColor = polylines[i].getElementsByTagName("strokeColor")[0].firstChild.data;
			}
			var strokeWeight = 5;
			if (polylines[i].getElementsByTagName("strokeWeight").length > 0) {
				strokeWeight = parseInt(polylines[i].getElementsByTagName("strokeWeight")[0].firstChild.data);
			}
			var strokeOpacity = 0.5;
			if (polylines[i].getElementsByTagName("strokeOpacity").length > 0) {
				strokeOpacity = parseFloat(polylines[i].getElementsByTagName("strokeOpacity")[0].firstChild.data);
			}
			goverlays.push(new GPolyline(points, strokeColor, strokeWeight, strokeOpacity));
		}

		var markers = xml.documentElement.getElementsByTagName("marker");
		for (var i = 0; i < markers.length; i++) {
			var lat = parseFloat(markers[i].getElementsByTagName("lat")[0].firstChild.data);
			var lng = parseFloat(markers[i].getElementsByTagName("lng")[0].firstChild.data);
			var m_point = new GLatLng(lat, lng);
			var m_editable = markers[i].getElementsByTagName("editable").length > 0;
			var m_icon = null;
			var m_url = null;
			var m_info = null;

			if (markers[i].getElementsByTagName("icon").length > 0) {
				m_icon = mapIcons[markers[i].getElementsByTagName("icon")[0].firstChild.data];
			}

			if (markers[i].getElementsByTagName("url").length > 0) {
				m_url = markers[i].getElementsByTagName("url")[0].firstChild.data;
			}

			if (markers[i].getElementsByTagName("info").length > 0) {
				m_info = markers[i].getElementsByTagName("info")[0].firstChild.data;
			}
			
			goverlays.push(new GMarker(m_point, m_icon));
		}

		if (editable) {
		    GEvent.addListener(map, "click", function(overlay, latlng) {
				if (overlay == null) {
					var lat = latlng.lat();
					var lng = latlng.lng();
					var points = new Array(latlng, new GLatLng(lat+0.01, lng+0.015), new GLatLng(lat, lng+0.03), new GLatLng(lat-0.01, lng+0.015), latlng);
					var strokeColor = "#0066cc";
					var strokeWeight = 5;
					var strokeOpacity = 1;
					var fillColor = "#0066cc";
					var fillOpacity = 0.15;
					createPolygon(map, points, {editable: editable, points: points, strokeColor: strokeColor, strokeWeight: strokeWeight, strokeOpacity: strokeOpacity, fillColor: fillColor, fillOpacity: fillOpacity});
				}
		    });
		}

		if (areas.length > 0) {
			var bounds = new GLatLngBounds(centerPt, centerPt);
			for (var i = 0; i < areas.length; i++) {
				var bnds = areas[i].getBounds();
				bounds.extend(bnds.getNorthEast());
				bounds.extend(bnds.getSouthWest());
			}
			zoomfactor = map.getBoundsZoomLevel(bounds);
		}
		map.setCenter(centerPt, zoomfactor);

		for (var i = 0; i < goverlays.length; i++) {
			map.addOverlay(goverlays[i]);
		}

	});
  }
}

function saveMap() {
	for (var i = 0; i < areas.length; i++) {
		var currentElement;
		if (i > 0) {
			currentElement = document.createElement("input");
			currentElement.setAttribute("type", "hidden");
			currentElement.setAttribute("id", "geo_areas_" + i.toString() + "_event_id");
			currentElement.setAttribute("name", "geo_areas[" + i.toString() + "][event_id]");
			currentElement.setAttribute("value", document.forms['map_form'].elements['geo_areas_0_event_id'].value);
			document.forms['map_form'].appendChild(currentElement);
		}
		if (areas[i].getVertexCount() > 0) {
		for (var j = 0; j < areas[i].getVertexCount(); j++) {
			var vertex = areas[i].getVertex(j);
			var id_string = "geo_areas_" + i.toString() + "_coordinates_" + j.toString();
			var name_string = "geo_areas[" + i.toString() + "][coordinates][" + j.toString() + "]";
			currentElement = document.createElement("input");
			currentElement.setAttribute("type", "hidden");
			currentElement.setAttribute("id", id_string + "_lat");
			currentElement.setAttribute("name", name_string + "[lat]");
			currentElement.setAttribute("value", vertex.lat());
			document.forms['map_form'].appendChild(currentElement);
			currentElement = document.createElement("input");
			currentElement.setAttribute("type", "hidden");
			currentElement.setAttribute("id", id_string + "_lng");
			currentElement.setAttribute("name", name_string + "[lng]");
			currentElement.setAttribute("value", vertex.lng());
			document.forms['map_form'].appendChild(currentElement);
		}
		}
	}
}
