function jumpTo(lon, lat, zoom) {
    var x = Lon2Merc(lon);
    var y = Lat2Merc(lat);
    map.setCenter(new OpenLayers.LonLat(x, y), zoom);
    return false;
}
 
function Lon2Merc(lon) {
    return 20037508.34 * lon / 180;
}
 
function Lat2Merc(lat) {
    var PI = 3.14159265358979323846;
    lat = Math.log(Math.tan( (90 + lat) * PI / 360)) / (PI / 180);
    return 20037508.34 * lat / 180;
}
 
function addMarker(layer, lon, lat, popupContentHTML, showPopupOnLoad, iconId) {
 
    // Koordinaten in LonLat umwandeln
    var ll = new OpenLayers.LonLat(Lon2Merc(lon), Lat2Merc(lat));

    // Feature erstellen und konfigurieren (Popup und Marker)
    var feature = new OpenLayers.Feature(layer, ll);
    feature.closeBox = true;
    feature.popupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {minSize: new OpenLayers.Size(200, 120) } );
    //feature.popupClass = OpenLayers.Class(OpenLayers.Popup.Anchored, {'autoSize': true, 'minSize': new OpenLayers.Size(100, 40) } );
    feature.data.popupContentHTML = popupContentHTML;
    feature.data.overflow = "auto";
    feature.data.icon = makeIcon(iconId);
 
    // Marker erstellen
    var marker = feature.createMarker();
 
    /*
     * Handler Funktionen für die Mouse-Events
     */
    // Click
    var markerClick = function(evt) {
	// Wenn das Popup nicht sichtbar ist, dann kann es nicht fest sichtbar sein
	if (!this.popup.visible())
		this.popup.clicked = false;
	if (this.popup.clicked == true) {
		this.popup.clicked = false;
		this.popup.hide();
    	}
    	else {
		this.popup.clicked = true;
		if (!this.popup.visible())
			this.popup.show();
	}
        OpenLayers.Event.stop(evt);
    };
    // Hover
    var markerHover = function(evt) {
	// Wenn das Popup nicht sichtbar ist, dann kann es nicht fest sichtbar sein
	if (!this.popup.visible())
		this.popup.clicked = false;
	if (!this.popup.clicked)
		this.popup.show();

	OpenLayers.Event.stop(evt);
    }
    // Hover End
    var markerHoverEnd = function(evt) {
	if (!this.popup.clicked) {
		this.popup.hide();
	}
	OpenLayers.Event.stop(evt);
    }

    // Events auf den Marker registrieren und als Objekt das Feature übergeben
    //marker.events.register("mousedown", feature, markerClick);
    if (showPopupOnHover) {
    	marker.events.register("mouseover", feature, markerHover);
    	marker.events.register("mouseout", feature, markerHoverEnd);
    }

    // Erstellten Marker der Ebene hinzufügen
    layer.addMarker(marker);

    // Popup erstellen, der Karte hinzufügen und anzeigen, falls gewünscht
    map.addPopup(feature.createPopup(feature.closeBox));
    
    if (showPopupOnLoad != true) {
	    // Wenn das Popup nicht angezeigt werden soll, verstecken und auf 'nicht angeklickt' setzen
	    feature.popup.hide();
	    feature.popup.clicked = false;
    } else {
	    // Das Popup wird direkt angezeigt und zwar solange bis man es explizit schließt
	    feature.popup.clicked = true;
    }

    return marker;
}

/*
 *
 * Creates a new marker icon
 *
 * using the icons-array (defined in the html-file)
 *
 * index
 * 0	address to the image
 * 1	width of the image
 * 2	height
 * 3	factor by which the image should be offset horizontally
 * 4	factor by which the image should be offset vertically
 *
 * please see the icon array itself for examples of values
 */
function makeIcon(iconId) {
	var size = new OpenLayers.Size(icons[iconId][1],icons[iconId][2]);
	var offset = new OpenLayers.Pixel(-(size.w*icons[iconId][3]), -(size.h*icons[iconId][4]));
	var icon = new OpenLayers.Icon(icons[iconId][0],size,offset);
	return icon;
}
 
function getCycleTileURL(bounds) {
   var res = this.map.getResolution();
   var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
   var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
   var z = this.map.getZoom();
   var limit = Math.pow(2, z);
 
   if (y < 0 || y >= limit)
   {
     return null;
   }
   else
   {
     x = ((x % limit) + limit) % limit;
 
     return this.url + z + "/" + x + "/" + y + "." + this.type;
   }
}


/*
 * Für den Layer-Switcher mit Buttons
 */
function setLayer(id) {
	if (document.getElementById("layers") != null) {
		for (var i=0;i<layers.length;++i)
			document.getElementById(layers[i][1]).className = "";
	}
	varName = layers[id][0];
	name = layers[id][1];
	map.setBaseLayer(varName);
	if (document.getElementById("layers") != null)
		document.getElementById(name).className = "active";
}

/*
 *
 * Icons und Marker
 *
 */

/*
 * Neues Icon setzen (Wert und Bild austauschen)
 */

function getIconIdByMarkerId(id) {
	var iconId = document.getElementById("marker"+id+"Icon").value;
	if (iconId == null)
		return -1;
	return iconId;
}

function highlightMarkerReset() {
	for (var i=0;i<markers.length;++i) {
		markers[i].setOpacity(0.5);
	}
}

function highlightMarker(id) {
	highlightMarkerReset();
	if (markers[id] != null)
		markers[id].setOpacity(1);
}

/*
 * ClickHandler zum Marker-Koordinaten Auswählen
 */
OpenLayers.Control.Click = OpenLayers.Class(OpenLayers.Control, {                
                defaultHandlerOptions: {
                    'single': true,
                    'double': false,
                    'pixelTolerance': 0,
                    'stopSingle': false,
                    'stopDouble': false
                },

                initialize: function(options) {
                    this.handlerOptions = OpenLayers.Util.extend(
                        {}, this.defaultHandlerOptions
                    );
                    OpenLayers.Control.prototype.initialize.apply(
                        this, arguments
                    ); 
                    this.handler = new OpenLayers.Handler.Click(
                        this, {
                            'click': this.trigger
                        }, this.handlerOptions
                    );
                }, 

                trigger: function(e) {
                    var lonlat = map.getLonLatFromViewPortPx(e.xy).transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
                    //alert("You clicked near " + lonlat.lat + " N, " +
                    //                          + lonlat.lon + " E");
		    

		    if (getStatus() == 0 || getStatus() == 1) {
		    	document.getElementById("marker"+clickTarget+"Lat").value = lonlat.lat;
		    	document.getElementById("marker"+clickTarget+"Lon").value = lonlat.lon;
				jumpTo(lonlat.lon,lonlat.lat)
		    
		    var iconId = getIconIdByMarkerId(clickTarget);
		    if (iconId == -1)
			    iconId = 0;
		    if (markers[clickTarget] != null) {
		    	layer_markers.removeMarker(markers[clickTarget]);

			markers[clickTarget] = addMarker(layer_markers,lonlat.lon,lonlat.lat,"Mein Standort",false,iconId);
		    }
		    else {
			var tempMarker = addMarker(layer_markers,lonlat.lon,lonlat.lat,"Mein Standort",false,iconId);
			markers[clickTarget] = tempMarker;
		    }
		    
		    setStatus(1);
		    }
		  
                }

            });

function chooseMarkerCoordinates(target) {
	clickTarget = target;
	click.activate();
	setStatus(0);
	highlightMarker(target);
}

function stopChoosingMarkerCoordinates() {
	click.deactivate();
	clickTarget = '';
	setStatus(-1);
}

/*
 * Aktuelle Kartenansicht nach jeder Bewegung der Karte speichern
 */
function mapEvent(event) {
	var lonlat = map.getCenter();
	lonlat = OpenLayers.Layer.SphericalMercator.inverseMercator(lonlat.lon,lonlat.lat);
	document.getElementById("latCurrent").value = lonlat.lat;
	document.getElementById("lonCurrent").value = lonlat.lon;
	document.getElementById("zoomCurrent").value = map.getZoom();
}

/*
 * Koordinatenwahl-Status
 */

currentStatus = -1
function setStatus(id) {
	currentStatus = id
}

function getStatus() {
	return currentStatus
}

function var_dump(obj) {
   if(typeof obj == "object") {
      return "Type: "+typeof(obj)+((obj.constructor) ? "\nConstructor: "+obj.constructor : "")+"\nValue: " + obj;
   } else {
      return "Type: "+typeof(obj)+"\nValue: "+obj;
   }
}//end function var_dump
