// OpenLayers-Karte mit OSM-Daten aufbauen
// "EPSG:41001" -> 4326 sonst keine KML-Marker
// Version 2010-09-20 neues control "ScaleLine" und "Permalink"

//var map; 

var projmerc = new OpenLayers.Projection("EPSG:900913");
var proj4326 = new OpenLayers.Projection("EPSG:4326");

// Parameter aus dem Aufruf auslesen
function parseParams(handler) {
    var perma = location.search.substr(1);
    if (perma != '') {
        paras = perma.split('&');
        for (var i = 0; i < paras.length; i++) {
            var p = paras[i].split('=');
            handler(p[0], p[1]);
        }
    }
}

// Karte mit den Parametern Positionieren
function jumpTo(lon, lat, zoom) {
	var lonlat = new OpenLayers.LonLat(lon, lat);
	lonlat.transform(proj4326, projmerc);
	map.setCenter(lonlat, zoom);
	return false;
}

function createMap(divName) {
	OpenLayers.Util.onImageLoadError = function() {
		this.src = OpenLayers.Util.getImagesLocation() + "404.png";
	}
	// Bedien-Elemente
	map = new OpenLayers.Map (divName, {
		//projection: projmerc,
		projection: proj4326,
		displayProjection: proj4326,
		controls:[
			new OpenLayers.Control.MouseDefaults(),

			// Umschalten Karte, zuschjalten Overlay
			new OpenLayers.Control.LayerSwitcher(),

			// Wahl der Zoom-Stufe:
			new OpenLayers.Control.PanZoomBar(),

			// Entfernungs-Beispiel links unten
			new OpenLayers.Control.ScaleLine({geodesic: true}),

			// TEST
			new OpenLayers.Control.ArgParser(proj4326),
		
			// Link mit Koordinate und Layer zur aktuellen Karte
			// FEHLER: Permalink liefert falsches Koordinatensystem			
			new OpenLayers.Control.Permalink('permalink'), //  proj4326 ?
		
			// Anzeige der Koordinate des Mauszeigers rechte untere Ecke
			//	new OpenLayers.Control.MousePosition(),
      
      	// Anzeige "Data by OpenStreetMap"          
			new OpenLayers.Control.Attribution(10,10)
		],
		maxExtent: new OpenLayers.Bounds(-20037508,-20037508,20037508,20037508),
		numZoomLevels:19, 
		maxResolution:156543, 
		units:'meters'
		}
	);

	// die Standard-OSM-Karte
	var mapnik = new OpenLayers.Layer.OSM.Mapnik("Mapnik");
	map.addLayer(mapnik);

	// Alternativ T@H: Aenderungen schneller sichtbar
	var osmarender = new OpenLayers.Layer.OSM.Osmarender("Osmarender");
	map.addLayer(osmarender);

	// Spezialkarte fuer Radfahrer
	var cyclemap = new OpenLayers.Layer.OSM.CycleMap("Radfahrer");
	map.addLayer(cyclemap);

	// Mapquest
   var osmmq = new OpenLayers.Layer.TMS( "Mapquest", 
		[
			"http://otile1.mqcdn.com/tiles/1.0.0/osm/",
			"http://otile2.mqcdn.com/tiles/1.0.0/osm/",
			"http://otile3.mqcdn.com/tiles/1.0.0/osm/",
			"http://otile4.mqcdn.com/tiles/1.0.0/osm/"
		],
		{ type:'png', getURL:getMQURL });
   map.addLayer(osmmq);

	OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;
	OpenLayers.Util.onImageLoadErrorColor = "transparent";

	return map;
}

//function getTileURL(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 OpenLayers.Util.getImagesLocation() + "404.png";
//   }
//   else
//   {
//     x = ((x % limit) + limit) % limit;
//     return this.url + z + "/" + x + "/" + y + "." + this.type;
//   }
//}

// wie "getTileURL", aber kann auch mit Tile-Server-Arrays umgehen
function get_osm_url(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;
		var path = z + "/" + x + "/" + y + "." + this.type; 
		var url = this.url;
		if (url instanceof Array) {
			url = this.selectUrl(path, url);
		}
		return url + path;
	}
}

function lonLatToMercator(ll) {
   var lon = ll.lon * 20037508.34 / 180;
   var lat = Math.log(Math.tan((90 + ll.lat) * Math.PI / 360)) / (Math.PI / 180);
   lat = lat * 20037508.34 / 180;
   return new OpenLayers.LonLat(lon, lat);
}

function scaleToZoom(scale) {
   return Math.log(360.0/(scale * 512.0)) / Math.log(2.0);
}

function AddLayerOSMSpeed(map) {
	// MaxSpeed als Overlay zuschaltbar, bis ZoomStufe 14
	var speed = new OpenLayers.Layer.TMS(
		"Geschwindigkeitsbegrenzung", 
		"http://wince.dentro.info/koord/osm/tiles/",
		{numZoomLevels: 15, type:'png', getURL: get_osm_url, displayOutsideMaxExtent: true });
	speed.setIsBaseLayer(false);
	speed.setVisibility(false);
	map.addLayer(speed);
	return map;
}

// KML-Datei "kap" zur Karte hinzufuegen.
// Symbole und PopUps hinzufuegen. Inhalte aus ExtendedData KML 2.2
//
// Popup mit FramedCloud
function onFeatureSelectK(evt) {
	var feature = evt.feature;
	var kcontent = "<h2>" + feature.attributes.name + "</h2><hr>" + feature.attributes.description;
	var popup = new OpenLayers.Popup.FramedCloud("KAP",
		feature.geometry.getBounds().getCenterLonLat(),
		new OpenLayers.Size(100,100),
		kcontent, null, true, onPopupCloseK);
	feature.popup = popup;
	map.addPopup(popup);
}

function kapMap(map, gleichAn) {
	// Symbole für die KML-Daten
	var kapstyle = new OpenLayers.Style({
		'externalGraphic': "images/favicon32.png",
		'graphicHeight': 32,	'graphicWidth': 32, 'graphicXOffset': -16,'graphicYOffset': -16
	});
	var kapMap = new OpenLayers.StyleMap({'default':kapstyle});
	var kmlkap = new OpenLayers.Layer.GML("Drachenluftbilder", "fotodrachen_kap.kml", 
		{format: OpenLayers.Format.KML, 
		formatOptions: {kmlns: "2.2", extractStyles: false, extractAttributes: true},		
		styleMap: kapMap});
	kmlkap.setIsBaseLayer(false);
	kmlkap.setVisibility(gleichAn);

// Transformieren in das Anzeige-Koordinatensystem !!!	
	
   map.addLayer(kmlkap);
	kmlkap.events.on(
		{'featureselected': onFeatureSelectK,
		'featureunselected': onFeatureUnselect}
	);
	kapcontrol = new OpenLayers.Control.SelectFeature(kmlkap);

	map.addControl(kapcontrol);
	kapcontrol.activate();

	return map;
}

// schliessen ueber button
function onPopupCloseK(evt) {
	//kapcontrol.unselect(selectedFeature);
	kapcontrol.unselectAll();
}

// KML-Datei "pano" zur Karte hinzufuegen.
// Symbole und PopUps hinzufuegen. Inhalte aus ExtendedData aus KML 2.2
//
// Popup mit FramedCloud
function onFeatureSelectP(evt) {
	var feature = evt.feature;
	var pcontent = "<h2>" + feature.attributes.name + "</h2><hr>"
		+ "<p>" + feature.attributes.description + "</p>"
	var popup = new OpenLayers.Popup.FramedCloud("PANO",
		feature.geometry.getBounds().getCenterLonLat(),
		new OpenLayers.Size(100,100),
		pcontent, null, true, onPopupCloseP);
	feature.popup = popup;
	map.addPopup(popup);
}

function panMap(map, gleichAn) {
	// Symbole fuer die KML-Daten
	var panstyle = new OpenLayers.Style({
		'externalGraphic': "images/pano32.png",
		'graphicHeight': 32,	'graphicWidth': 32, 'graphicXOffset': -16,'graphicYOffset': -16
	});
	var panMap = new OpenLayers.StyleMap({'default':panstyle});
	var kmlpan = new OpenLayers.Layer.GML("Panorama", "fotodrachen_pano.kml", 
		{format: OpenLayers.Format.KML, 
		formatOptions: {kmlns: "2.2", extractStyles: false, extractAttributes: true},		
		styleMap: panMap});
	kmlpan.setIsBaseLayer(false);
	kmlpan.setVisibility(gleichAn);
   map.addLayer(kmlpan);
	kmlpan.events.on({
		'featureselected': onFeatureSelectP,
		'featureunselected': onFeatureUnselect});
	pancontrol = new OpenLayers.Control.SelectFeature(kmlpan);
	map.addControl(pancontrol);
	pancontrol.activate();
	return map;
}

// schliessen ueber button
function onPopupCloseP(evt) {
	//pancontrol.unselect(selectedFeature);
	pancontrol.unselectAll();
}

function onFeatureUnselect(evt) {
	var feature = evt.feature;
	if (feature.popup) {
		map.removePopup(feature.popup);
		feature.popup.destroy();
		feature.popup = null;
	}
}

// Mapquest
function getMQURL(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;

        var path = z + "/" + x + "/" + y + "." + this.type; 
        var url = this.url;
        if (url instanceof Array) {
            url = this.selectUrl(path, url);
        }
        return url + path;
    }
}

