/*
adapted from OpenLinkMap Copyright (C) 2010 Alexander Matheisen
written by Alexander Matheisen
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under certain conditions.
See olm.openstreetmap.de/info for details.
*/

function createMap()
{
	var startLat = 52.2257;
	var startLon = 14.5855;
	var startZoom = 12;
	wgs84 = new OpenLayers.Projection("EPSG:4326");
	OpenLayers.Lang.setCode('de');
	map = new OpenLayers.Map('mapFrame',
	{
		controls: [],
		projection: new OpenLayers.Projection("EPSG:900913"),
		displayProjection: wgs84,
		maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34, 20037508.34, 20037508.34),
		numZoomLevels: 19,
		maxResolution: 156543,
		units: 'meters'
	});
	map.addControl(new OpenLayers.Control.PanZoomBar());
	map.addControl(new OpenLayers.Control.ScaleLine());
	map.addControl(new OpenLayers.Control.MousePosition());
	map.addControl(new OpenLayers.Control.LayerSwitcher());
	map.addControl(new OpenLayers.Control.Permalink());
	map.addControl(new OpenLayers.Control.Navigation());
	map.addControl(new OpenLayers.Control.MouseDefaults());
	var mapnikMap = new OpenLayers.Layer.OSM.Mapnik("Mapnik-Karte",
	{
		transitionEffect: 'resize'
	});
	var osmarenderMap = new OpenLayers.Layer.OSM.Osmarender("Osmarender-Karte",
	{
		transitionEffect: 'resize'
	});
	var cycleMap = new OpenLayers.Layer.OSM.CycleMap("Radkarte",
	{
		transitionEffect: 'resize'
	});
	map.addLayers([mapnikMap, osmarenderMap, cycleMap]);
	var styleGrenze = {strokeColor: "#00FF00", strokeWidth: 4, fillColor: "#00FF00", pointRadius: 5};
	var styleWander = {strokeColor: "#0000FF", strokeWidth: 2, fillColor: "#0000FF", pointRadius: 5};
	var styleHbg = {strokeColor: "#FFFF00", strokeWidth: 2, fillColor: "#CC6699", pointRadius: 5};
	var styleGast = {fillColor: "#E57300", pointRadius: 5};
	var styleSprt = {strokeColor: "#0000FF", strokeWidth: 2, fillColor: "#FFFFFF", pointRadius: 5};
	var styleKir = {fillColor: "#000000", pointRadius: 6};
	var styleDkm = {strokeColor: "#FFFFFF", strokeWidth: 2, fillColor: "#333333", pointRadius: 5};
	var styleAmt = {strokeColor: "#FF0000", strokeWidth: 3, fillColor: "#FFFFFF", pointRadius: 5};					
	var pois = new OpenLayers.Layer.Text("--", { location:"./textfile.txt", projection: new OpenLayers.Projection("EPSG:4326")} );
	map.addLayer(pois);
	pois.setVisibility(false);
	var lGrenzeGpx = new OpenLayers.Layer.Vector("Gemeindegrenzen",{
		protocol: new OpenLayers.Protocol.HTTP
		({
			url: "daten/gemeindegrenzen.gpx",
			format: new OpenLayers.Format.GPX({extractWaypoints: true, extractAttributes: true})
		}),
		strategies: [new OpenLayers.Strategy.Fixed()],
		style: styleGrenze,
		projection: new OpenLayers.Projection("EPSG:4326")
	});
	map.addLayer(lGrenzeGpx);
	lGrenzeGpx.setVisibility(true);
	var lBettGpx = new OpenLayers.Layer.Vector("Unterk&uuml;nfte",{
		protocol: new OpenLayers.Protocol.HTTP
		({
			url: "daten/pension.gpx",
			format: new OpenLayers.Format.GPX({extractWaypoints: true, extractAttributes: true})
		}),
		strategies: [new OpenLayers.Strategy.Fixed()],
		style: styleHbg,
		projection: new OpenLayers.Projection("EPSG:4326")
	});
	map.addLayer(lBettGpx);
	lBettGpx.setVisibility(false);
	var lEssenGpx = new OpenLayers.Layer.Vector("Essen und Trinken",{
		protocol: new OpenLayers.Protocol.HTTP
		({
			url: "daten/gastro.gpx",
			format: new OpenLayers.Format.GPX({extractWaypoints: true, extractAttributes: true})
		}),
		strategies: [new OpenLayers.Strategy.Fixed()],
		style: styleGast,
		projection: new OpenLayers.Projection("EPSG:4326")
	});
	map.addLayer(lEssenGpx);
	lEssenGpx.setVisibility(false);	
	var lSportGpx = new OpenLayers.Layer.Vector("Sporteinrichtungen",{
		protocol: new OpenLayers.Protocol.HTTP
		({
			url: "daten/sport.gpx",
			format: new OpenLayers.Format.GPX({extractWaypoints: true, extractAttributes: true})
		}),
		strategies: [new OpenLayers.Strategy.Fixed()],
		style: styleSprt,
		projection: new OpenLayers.Projection("EPSG:4326")
	});
	map.addLayer(lSportGpx);
	lSportGpx.setVisibility(false);
	var lKircheGpx = new OpenLayers.Layer.Vector("Kirchen",{
		protocol: new OpenLayers.Protocol.HTTP
		({
			url: "daten/kirchen.gpx",
			format: new OpenLayers.Format.GPX({extractWaypoints: true, extractAttributes: true})
		}),
		strategies: [new OpenLayers.Strategy.Fixed()],
		style: styleKir,
		projection: new OpenLayers.Projection("EPSG:4326")
	});
	map.addLayer(lKircheGpx);
	lKircheGpx.setVisibility(false);
	var lDenkmalGpx = new OpenLayers.Layer.Vector("Denkm&auml;ler",{
		protocol: new OpenLayers.Protocol.HTTP
		({
			url: "daten/denkmal.gpx",
			format: new OpenLayers.Format.GPX({extractWaypoints: true, extractAttributes: true})
		}),
		strategies: [new OpenLayers.Strategy.Fixed()],
		style: styleDkm,
		projection: new OpenLayers.Projection("EPSG:4326")
	});
	map.addLayer(lDenkmalGpx);
	lDenkmalGpx.setVisibility(false);
	var layerRathaus = new OpenLayers.Layer.Vector("Amtsgemeindeverwaltung",{
		protocol: new OpenLayers.Protocol.HTTP
		({
			url: "daten/amt.gpx",
			format: new OpenLayers.Format.GPX({extractWaypoints: true, extractAttributes: true})
		}),
		strategies: [new OpenLayers.Strategy.Fixed()],
		style: styleAmt,
		projection: new OpenLayers.Projection("EPSG:4326")
	});
	map.addLayer(layerRathaus);
	layerRathaus.setVisibility(true);
	/*
	var hills = new OpenLayers.Layer.OSM("Relief", "http://topo.geofabrik.de/relief/${z}/${x}/${y}.png",{minZoomLevel: 8, maxZoomLevel: 15 , isBaseLayer:true, transitionEffect:null, attribution: "DEM by <a href='http://srtm.csi.cgiar.org'>CIAT</a>"});
	map.addLayer(hills);
	var trails = new OpenLayers.Layer.OSM("Reit- und Wanderwege", "http://topo.geofabrik.de/trails/${z}/${x}/${y}.png",{minZoomLevel: 8, maxZoomLevel: 15 , isBaseLayer:false, transitionEffect:null, attribution: "Data by <a href='http://openstreetmap.org/'>OSM</a>"});
	map.addLayer(trails);
	//map.addLayer(lRathaus);
	//lRathaus.setVisibility(true);
	//layer_gsat = new OpenLayers.Layer.Google("Google Sat", { type: G_SATELLITE_MAP, 'sphericalMercator': true, numZoomLevels:19 } );
	//map.addLayer(layer_gsat);
	*/
	var selcontrol = new OpenLayers.Control.SelectFeature([lGrenzeGpx, lBettGpx, lEssenGpx, lSportGpx, lKircheGpx, lDenkmalGpx, layerRathaus],
	{
		onSelect: createPopup,
		onUnselect: destroyPopup,
		toggle: true,
		clickout: true
	});
	map.addControl(selcontrol);
	selcontrol.activate();
	if(!map.getCenter())
	{
		// jump to given start position
		var startPosition = new OpenLayers.LonLat(startLon, startLat).transform(wgs84, map.getProjectionObject());
		map.setCenter(startPosition, startZoom);
	}
	initEnter();
}

function initEnter(event)
{
	if (!event)
		event = window.event;
	if(navigator.appName == "Microsoft Internet Explorer")
	{
		if(event.keyCode == 13)
		{
			requestSearch();
		}
	}
	else
	{
		document.captureEvents(Event.KEYPRESS);
		document.onkeypress = keyPressed;
	}
}

function keyPressed(key)
{
	if (key.which == "13")
	{
		requestSearch();
	}
}

function translateType(placeType)
{
	var translatedType = searchTypesDE[placeType];
	if(typeof translatedType=='undefined')
		return "";
	else
		translatedType += "&nbsp;";
	return translatedType;
}

function requestSearch()
{
	document.getElementById('mapFrame').style.top = '175px';
	document.getElementById('resultList').style.height = '100px';
	var placesList;
	document.getElementById('resultList').innerHTML = "<b>Laden...</b>";
	var searchString = document.getElementById('searchBox').value;
	if (searchString.length == 0)
		document.getElementById('resultList').innerHTML = "<b>Leere Eingabe.<br />Nichts gefunden.</b>";
	else
	{
		searchString += ", simmelsdorf";
		searchString = searchString.replace(/ /g, "+");
		var searchUrl = "http://nominatim.openstreetmap.org/search?format=xml&polygon=0&addressdetails=0&q="+searchString;
		var searchRequest = OpenLayers.Request.GET(
		{
			url: searchUrl,
			async: false
		});
		document.getElementById('resultList').innerHTML = searchRequest.responseText;
		placesList = searchRequest.responseXML.getElementsByTagName('place');
		if (placesList.length > 0)
		{
			document.getElementById('resultList').innerHTML = "<br />";
			for (var i = 0; i < placesList.length; i++)
			{
				var place = placesList[i];
				var placeBoundingbox = place.getAttribute('boundingbox');
				var placeKey = place.getAttribute('class');
				var placeValue = place.getAttribute('type');
				var placeName = place.getAttribute('display_name');
				var placeId = place.getAttribute('osm_id');
				var placeLat = place.getAttribute('lat');
				var placeLon = place.getAttribute('lon');
				var placeType = placeKey+"="+placeValue;
				placeType = translateType(placeType);
				var placeBounds = placeBoundingbox.split(",");
				placeName = placeName.replace(", Amtsgemeinde Brieskow-Finkenheerd, 15295, Brandenburg, Bundesrepublik Deutschland", "");
				placeName = placeName.replace(", Amtsgemeinde Brieskow-Finkenheerd, 15295, Brandenburg, Bundesrepublik Deutschland", "");
				var placeItem = "<b>"+placeType+"</b><a href=\"javascript:showPlace("+placeBounds[2]+","+placeBounds[0]+","+placeBounds[3]+","+placeBounds[1]+","+placeId+","+placeLat+","+placeLon+");\">"+placeName+"</a><br /><br />";
				document.getElementById('resultList').innerHTML += placeItem;
			}
		}
		else
			document.getElementById('resultList').innerHTML = "<b>Nichts gefunden.</b>";
	}
}

function showPlace(left, bottom, right, top, id, lat, lon)
{
	document.getElementById('mapFrame').style.top = '75px';
	document.getElementById('resultList').style.height = '0px';
	var bounds = new OpenLayers.Bounds(left, bottom, right, top).transform(wgs84, map.getProjectionObject());
	map.zoomToExtent(bounds, true);
}

function addMarker(layer, lon, lat, popupContentHTML)
{
	var ll = new OpenLayers.LonLat(lon, lat).transform(wgs84, map.getProjectionObject());
	var feature = new OpenLayers.Feature(layer, ll);
	feature.closeBox = true;
	feature.popupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {minSize: new OpenLayers.Size(300, 180) } );
	feature.data.popupContentHTML = popupContentHTML;
	feature.data.overflow = "hidden";
	var marker = feature.createMarker();
	var markerClick = function(evt)
	{
		if (this.popup == null)
		{
			this.popup = this.createPopup(this.closeBox);
			map.addPopup(this.popup);
			this.popup.show();
		}
		else
		{
			this.popup.toggle();
		}
		OpenLayers.Event.stop(evt);
	};
	marker.events.register("mousedown", feature, markerClick);
	layer.addMarker(marker);
}

function createPopup(feature)
{
	var lonlat = feature.geometry.getBounds().getCenterLonLat().clone();
	lonlat.transform(new OpenLayers.Projection("EPSG:900913"), new OpenLayers.Projection("EPSG:4326"));
	feature.popup = new OpenLayers.Popup.FramedCloud
	(
		"gpx",
		feature.geometry.getBounds().getCenterLonLat(),
		null,
		"<b id=\"popupTitle\">"+feature.attributes.name+"</b><p id=\"popupContent\">"+feature.attributes.desc+"</p>",
		null,
		true
	);
	map.addPopup(feature.popup);
}

function destroyPopup(feature)
{
	feature.popup.destroy();
	feature.popup = null;
}

function showPosition(position)
{
	var coordinate = position.split(";");
	var position = new OpenLayers.LonLat(coordinate[0], coordinate[1]).transform(wgs84, map.getProjectionObject());
	map.setCenter(position, 17);
}
