
var s = new Shortlink();

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;
}
 
var currentMarkerSettings;
function addMarker(lon, lat, iconId) {
 
    // Koordinaten in LonLat umwandeln
    var ll = new OpenLayers.LonLat(Lon2Merc(lon), Lat2Merc(lat));

    var marker = new OpenLayers.Marker(ll,makeIcon(iconId))
 
    // Erstellten Marker der Ebene hinzufügen
    layer_markers.addMarker(marker);

    currentMarker = marker;
    currentMarkerSettings = {lon:lon,lat:lat,icon:iconId};
    updatePermalink();
    setMenu("markerSet");
}

/*
 *
 * 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 icons = new Array();
	icons[0] = new Array('http://openlayers.org/api/img/marker.png','21','25','0.5','1');
	icons[1] = new Array('http://openlayers.org/api/img/marker-gold.png','21','25','0.5','1');
	icons[4] = new Array('images/pin_red.png','16','28','0','1');
	icons[5] = new Array('images/pin_blue.png','16','28','0','1');
	icons[6] = new Array('images/pin_green.png','16','28','0','1');
	icons[7] = new Array('images/pin_yellow.png','16','28','0','1');
	icons[8] = new Array('images/haus.png','20','24','0.5','0.5');
	icons[9] = new Array('images/haus_blue.png','20','24','0.5','0.5');
	icons[10] = new Array('images/haus_red.png','20','24','0.5','0.5');
	icons[11] = new Array('images/haus_green.png','20','24','0.5','0.5');
	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;
}

/*
 * Funktion zum Zerlegen der URL um die Parameter zu erhalten (für den Permalink)
 * Splits the URL in its parameters
 */
function get_parameters() {
 // erzeugt für jeden in der url übergebenen parameter einen wert
 // bsp: x.htm?nachname=Munch&vorname=Alex&bildfile=wasserfall.jpg  erzeugt
 // variable nachname mit wert Munch  und
 // variable vorname mit wert Alex
 // variable bildfile mit wert wasserfall.jpg
 var hier = document.URL;
 var parameterzeile = hier.substr((hier.indexOf("?")+1));
 var trennpos;
 var endpos;
 var paramname;
 var paramwert;
 var parameters = new Object();
 while (parameterzeile != "") {
  trennpos = parameterzeile.indexOf("=");
  endpos = parameterzeile.indexOf("&");
  if (endpos < 0) { endpos = 500000; }
  paramname = parameterzeile.substr(0,trennpos);
  paramwert = parameterzeile.substring(trennpos+1,endpos);
  parameters[paramname] = paramwert;
  //eval (paramname + " = \"" + paramwert + "\"");
  parameterzeile = parameterzeile.substr(endpos+1);
 }
 return parameters;
}

/*
 * Wie der Name schon sagt ebenfalls für den Permalink, überprüft ob die Parameter in der URL gefunden wurden und überschreibt
 * sie gegebenenfalls.
 * Checks the url for parameters of the permalink and overwrites the default values if necessary.
 */
function checkForPermalink() {
	var parameters = get_parameters();

	// Get map position from parameters, if available
	if (parameters['zoom'] != null) 
		zoom = parseInt(parameters['zoom']);
	if (parameters['lat'] != null)
		lat = parseFloat(parameters['lat']);
	if (parameters['lon'] != null)
		lon = parseFloat(parameters['lon']);
	
	// Get marker position from parameters, if available.
	// If map position wasn't set, use marker position.
	var mlon;
	var mlat;
	var micon;
	if (parameters['mlat'] != null) {
		mlat = parseFloat(parameters['mlat']);
		if (parameters['lat'] == null) {
			lat = mlat;
		}
	}
	if (parameters['mlon'] != null) {
		mlon = parseFloat(parameters['mlon']);
		if (parameters['lon'] == null) {
			lon = mlon;
		}
	}
	if (parameters['icon'] != null)
		micon = parseInt(parameters['icon']);
	
	// Get map/marker position from shortlink, if available
	var shortlinkParameter = document.URL.substr(document.URL.lastIndexOf("/")+1);
	if (parameters['s'] != null || shortlinkParameter) {
		var link = parameters['s'];
		if (link == null) {
			link = shortlinkParameter;
		}
		if (link.length == 11 || link.length == 22) {
			// This means this can be a valid shortlink (lon,lat,zoom,mlat,mlon,micon)
			var lonlatzoom = s.shortToLonlatzoom(link.substr(0,11));
			lon = parseFloat(lonlatzoom.lon);
			lat = parseFloat(lonlatzoom.lat);
			zoom = parseInt(lonlatzoom.zoom);
			if (link.length == 22) {
				var mlonlaticon = s.shortToLonlatzoom(link.substr(11,11));
				mlon = mlonlaticon.lon;
				mlat = mlonlaticon.lat;
				micon = mlonlaticon.zoom;
			}
		}
		else if (link.length == 12) {
			// This means this can be a valid shortlink (mlon,mlat,micon,zoom)
			var lonlatzoom = s.shortToLonlatzoom(link.substr(0,11));
			lon = parseFloat(lonlatzoom.lon);
			mlon = lon;
			lat = parseFloat(lonlatzoom.lat);
			mlat = lat;
			micon = parseInt(lonlatzoom.zoom);
			zoom = s.shortToNumber(link.substr(11,1),0);
		}
	}
	// Add marker only if all necessary information is set
	if (mlon != undefined && mlat != undefined && micon != undefined) {
		addMarker(mlon,mlat,micon)
	}
}





var markerPermalink;
var selectedIconId = 1;
var currentMarker;
/*
 * 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"));

		if (currentMarker != undefined) {
			layer_markers.removeMarker(currentMarker);
		}
		setStatus("changeMarker");
		addMarker(lonlat.lon,lonlat.lat,selectedIconId);
		
	}
});

var currentStatus = 0;
function toggleMarkerSelection() {
	if (getStatus() == 0) {
		setMarker();
	} else {
		setStatus(0);
	}
}
function setMarker() {
	document.getElementById("setMarkerBox").className = '';	
	click.activate();
	if (currentMarker == null) {
		setStatus("setMarker");
	} else {
		setStatus("changeMarker");
	}
}
function markerSet() {
	setStatus(0);
}
function removeMarker() {
	if (currentMarker != undefined) {
		layer_markers.removeMarker(currentMarker);
		currentMarker = undefined;
	}
	setMenu("noMarker");
	setStatus(0);
}

var currentStatus = 0;
var selectedIconId = 4;
function setStatus(newStatus) {
	currentStatus = newStatus;


	var statusElement = document.getElementById("status");
	if (newStatus == "setMarker") {
		statusElement.innerHTML = text.statusSetMarker+' <a href="javascript:markerSet()">'+text.closeMarkerMenu+'</a>.';
	}
	if (newStatus == "changeMarker") {
		statusElement.innerHTML = text.statusChangeMarker+' <a href="javascript:markerSet()">'+text.closeMarkerMenu+'</a>.<br />'+text.markerLinkEditbox+'<br /><input id="permalinkEditbox" type="text" value="" /><br />'+text.includeInWebsite+':<br /><input id="iFrameEditbox" type="text" value="" /><br />'+text.width+': <input id="iFrameWidth" type="text" value="" onchange="updateIFrame()" /> '+text.height+': <input id="iFrameHeight" type="text" value="" onchange="updateIFrame()" />';
		updatePermalink();
	}
	if (newStatus == 0) {
		statusElement.innerHTML = '';
		document.getElementById("setMarkerBox").className = 'hide';	
		click.deactivate();
	}
}
function getStatus() {
	return currentStatus;
}
function setMenu(newStatus) {
	updatePermalink();
	var menuElement = document.getElementById("menu");
	var centerMenu = document.getElementById("centerMenu");
	if (newStatus == "noMarker") {
		menuElement.innerHTML = '<a href="javascript:toggleMarkerSelection()">'+text.setMarker+'</a> &nbsp; <a href="javascript:toggleHelp()">'+text.help+'</a>';
		centerMenu.className = 'hide';
	}
	if (newStatus == "markerSet") {
		menuElement.innerHTML = '<a href="javascript:toggleMarkerSelection()">'+text.editMarker+'</a> &nbsp; <a href="javascript:removeMarker()">'+text.removeMarker+'</a> &nbsp; <a href="javascript:toggleHelp()">'+text.help+'</a>';
		centerMenu.className = '';
	}
}
function startSelectingIcon() {
	document.getElementById("chooseIcon").className = '';	
	setStatus(1);
}
function chooseIcon(iconId) {
	document.getElementById("icon"+selectedIconId).className = '';
	document.getElementById("icon"+iconId).className = 'selectedIcon';
	selectedIconId = iconId;
	if (currentMarker != undefined) {
		layer_markers.removeMarker(currentMarker);
		addMarker(currentMarkerSettings.lon,currentMarkerSettings.lat,selectedIconId);
	}
}
function stopChoosingIcon() {
	document.getElementById("chooseIcon").className = 'hide';
}

function centerMapToMarker() {
	if (currentMarker) {
		var lonlat = new OpenLayers.LonLat(currentMarkerSettings.lon,currentMarkerSettings.lat).transform(new OpenLayers.Projection("EPSG:4326"), new OpenLayers.Projection("EPSG:900913"));
		map.setCenter(lonlat);
	}
}
function updatePermalink() {
	var lonlat = map.getCenter().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
	var markerText = ' ('+text.withMarker+')';

	var permalinkParameters = '?lon='+lonlat.lon+'&amp;lat='+lonlat.lat+'&amp;zoom='+map.getZoom();
	var shortPermalinkParameters = s.lonlatzoomToShort(lonlat.lon,lonlat.lat,map.getZoom());

	var permalinkWithMarker = '';
	var shortPermalinkWithMarker = '';
	if (currentMarker != undefined && currentMarkerSettings != undefined) {
		var permalinkParametersMarker = 'mlon='+currentMarkerSettings.lon+'&amp;mlat='+currentMarkerSettings.lat+'&amp;icon='+currentMarkerSettings.icon;
		permalinkWithMarker = '(<a href="index.php'+permalinkParameters+'">'+text.withoutMarker+'</a>,';
		permalinkOnlyMarker = '<a href="index.php?'+permalinkParametersMarker+'&amp;zoom='+map.getZoom()+'">'+text.onlyMarker+'</a>';

		var shortPermalinkParametersMarker = s.lonlatzoomToShort(currentMarkerSettings.lon,currentMarkerSettings.lat,currentMarkerSettings.icon);
		shortPermalinkWithMarker = '(<a href="'+shortPermalinkParameters+'">'+text.withoutMarker+'</a>,';
		shortPermalinkOnlyMarker = '<a href="'+shortPermalinkParametersMarker+s.numberToShort(map.getZoom(),0)+'">'+text.onlyMarker+'</a>';

		document.getElementById("permalink").innerHTML = '<a href="index.php'+permalinkParameters+'&amp;'+permalinkParametersMarker+'">Permalink</a> ('+permalinkOnlyMarker+')';
		document.getElementById("shortlink").innerHTML = '<a href="'+shortPermalinkParameters+shortPermalinkParametersMarker+'">Shortlink</a> ('+shortPermalinkOnlyMarker+')';

		var editbox = document.getElementById("permalinkEditbox");
		if (editbox != null) {
			editbox.value = 'http://m.osmtools.de/'+shortPermalinkParameters+shortPermalinkParametersMarker;
		}
		updateIFrame();
	}
	else {
		document.getElementById("permalink").innerHTML = '<a href="index.php'+permalinkParameters+'">Permalink</a>';
		document.getElementById("shortlink").innerHTML = '<a href="'+shortPermalinkParameters+'">Shortlink</a>';
	}
}
function updateIFrame() {
	var editbox = document.getElementById("iFrameEditbox");
	if (editbox == null) {
		return;
	}
	var iFrameWidth = document.getElementById("iFrameWidth");
	var iFrameHeight = document.getElementById("iFrameHeight");
	if (iFrameWidth.value == "") {
		iFrameWidth.value = '700';
	}
	if (iFrameHeight.value == "") {
		iFrameHeight.value = '500';
	}
	var lonlat = map.getCenter().transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
	var permalinkParameters = '?lon='+lonlat.lon+'&lat='+lonlat.lat+'&zoom='+map.getZoom();
	if (currentMarker != undefined && currentMarkerSettings != undefined) {
		var permalinkParametersMarker = 'mlon='+currentMarkerSettings.lon+'&mlat='+currentMarkerSettings.lat+'&icon='+currentMarkerSettings.icon;
		var link = 'http://m.osmtools.de/'+permalinkParameters+"&"+permalinkParametersMarker+"&iframe=1";
		var iframe = '<iframe width="'+iFrameWidth.value+'" height="'+iFrameHeight.value+'" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="'+link+'" ></iframe>';
		editbox.value = iframe;
	}
}

function toggleHelp() {
	var helpElement = document.getElementById("help");
	if (helpElement.className == "hide") {
		helpElement.className = "";
	} else {
		helpElement.className = "hide";
	}
}


/*
 * ?lon=6.315220&lat=49.099807&zoom=18&mlon=6.151595&mlat=49.997727&icon=4
 * ?s=0NU0A2xJGWI0NTsi2xJFz4
 */

function Shortlink() {
	this.c = Array();
	for (var i=48;i<=57;i++) {
		this.c.push(String.fromCharCode(i));
	}
	for (var i=65;i<=90;i++) {
		this.c.push(String.fromCharCode(i));
	}
	for (var i=97;i<=122;i++) {
		this.c.push(String.fromCharCode(i));
	}
	this.c.push("_");
	this.c.push("@");
	this.base = this.c.length;

	this.numberToShort = function(value,nachkomma) {
		var value = Math.round(value*Math.pow(10,nachkomma));

		var result = '';
		while (value > 0) {
			var remainder = value % this.base;
			result = this.c[remainder]+result;
			var value = Math.floor(value / this.base);
		}
		return result;
	}
	this.shortToNumber = function(value,nachkomma) {
		var result = 0;
		var count = 0;
		for (var i=value.length-1;i>=0;i--) {
			for (var j=0;j<this.c.length;j++) {
				if (this.c[j] == value.charAt(i)) {
					result += j*Math.pow(this.base,count);
				}
			}
			count++;
		}
		result = result/Math.pow(10,nachkomma);
		return result;
	}
	this.lonlatToShort = function(lon,lat) {
		if (lon < 0) {
			lon = 360 + lon;
		}
		if (lat < 0) {
			lat = 180 + lat;
		}
		lon = this.minlength(this.numberToShort(lon,6),5);
		lat = this.minlength(this.numberToShort(lat,6),5);
		
		return lon+lat;
	}
	this.shortToLonlat = function(lonlatShort) {
		var lon = lonlatShort.substr(0,5);
		var lat = lonlatShort.substr(5,5);
		lon = this.shortToNumber(lon,6);
		lat = this.shortToNumber(lat,6);
		if (lon > 180) {
			lon = lon - 360;
		}
		if (lat > 90) {
			lat = lat - 180;
		}
		return {lon:lon,lat:lat};
	}
	this.lonlatzoomToShort = function(lon,lat,zoom) {
		var lonlat = this.lonlatToShort(lon,lat);
		var zoom = this.numberToShort(zoom,0);
		return lonlat+zoom;
	}
	this.shortToLonlatzoom = function(shortString) {
		var lonlat = this.shortToLonlat(shortString.substr(0,10));
		var zoom = this.shortToNumber(shortString.substr(10,1),0);
		return {lon:lonlat.lon,lat:lonlat.lat,zoom:zoom};
	}
	this.minlength = function(string,minlength) {
		if (string.length < minlength) {
			var add = minlength - string.length;
			for (var i=0;i<add;i++) {
				string = this.c[0]+string;
			}
		}
		return string;
	}
}

