/**

 * Autor: Hendrik Kumpf @ pironex GmbH

 */



var map;

var markerLayer;

var startLong = 0;

var startLat = 0;

var startZoom = 0;

var markerIcon;



var controlPanZoom = null;

var controlNavigation = null;

var controlKeyboardDefaults = null;



var GOOGLE_LAYER = null;	// wird für das switchen (setBaseLayer) verwendet



function mapBaseLayerChanged(event) 

{

	if(event.layer.name == "Hafenbild")

	{

		// Controls entfernen (wird nicht benötigt beim Hafenbild)

		if(controlPanZoom != null)

			map.removeControl(controlPanZoom);

		if(controlNavigation != null)

			map.removeControl(controlNavigation);

		if(controlKeyboardDefaults != null)

			map.removeControl(controlKeyboardDefaults);

			

		controlPanZoom = null;

		controlNavigation = null;

		controlKeyboardDefaults = null;

		

		// Alle Marker verstecken

		markerLayer.setVisibility(false);

		

		// Zoom auf 0 setzten, damit man das ganze Bild sieht.

		//map.setCenter(new OpenLayers.LonLat(startLong, startLat), 0);

		map.zoomToMaxExtent();

	}

	else 

	{

		if(controlPanZoom == null)

		{

			// Controls hinzufügen

			controlPanZoom = new OpenLayers.Control.PanZoom();

			map.addControl(controlPanZoom);

		}

		

		if(controlNavigation == null)

		{

			// Controls hinzufügen

			controlNavigation = new OpenLayers.Control.Navigation();

			map.addControl(controlNavigation);

		}

		

		if(controlKeyboardDefaults == null)

		{

			// Controls hinzufügen

			controlKeyboardDefaults = new OpenLayers.Control.KeyboardDefaults();

			map.addControl(controlKeyboardDefaults);

		}

		

		// Alle Marker anzeigen

		markerLayer.setVisibility(true);

		

		// Korrekte Zoomstufe einstellen. (Manche Anbieter können nicht die gleichen Zoomstufe anzeigen, wie es z.B. Google schaft)

		if(event.layer.name == "Yahoo Satellite" || event.layer.name == "Yahoo Hybrid")

		{

			if(startZoom > 13)

				map.setCenter(new OpenLayers.LonLat(startLong, startLat), 13);

			else

				map.setCenter(new OpenLayers.LonLat(startLong, startLat), startZoom);

		}

		else

		{

			map.setCenter(new OpenLayers.LonLat(startLong, startLat), startZoom);

		}

	}

}

		

/**

 * Erstellt ein Map.

 * @param posLong		Ansichtposition: Longitude

 * @param posLat		Ansichtposition: Latitude

 * @param zoom			Zoomlevel

 * @param harborImage   Link zum Hafenbild

 * @param showGmap 		1 = Normale Googlemap auswählbar

 * @param showGhyp 		1 = Google Hypridmap auswählbar

 * @param showGsat 		1 = Google Satellitmap auswählbar

 * @param showYmap 		1 = Normale Yahoomap auswählbar

 * @param showYhyp 		1 = Yahoo Hypridmap auswählbar

 * @param showYsat 		1 = Yahoo Satellitmap auswählbar

 * @param showBshaded 	1 = Bing Shadedmap auswählbar

 * @param showBroad 	1 = Bing Roadmap auswählbar

 * @param showBhyp 		1 = Bing Hypridmap auswählbar

 * @param showBaerial 	1 = Bing Aerialmap auswählbar

 * @param showOsmap 	1 = OpenstreetMap auswählbar

 * @param showOsmarender 1 = OpenstreetMap (Tiles@Home) auswählbar

 */

function initMap(posLong

				,posLat

				,zoom

				,harborImage

				,showGmap

				,showGhyp

				,showGsat

				,showYmap

				,showYsat

				,showYhyp

				,showBshaded

				,showBroad

				,showBhyp

				,showBaerial

				,showOsmap

				,showOsmarender)

{

	/*

	 * Bildgröße

	 */

	var sizeWidth = 520;

	var sizeHeight = 312;

	

	startLong = posLong;

	startLat = posLat;

	startZoom = zoom;

	// Openstreet Karten zeigen falschen Ort an, daher werden sie dauerhaft deaktiviert

	showOsmap = 0;

	showOsmarender = 0;

	

	// Bing road und shaded sehen gleich aus?!?

	showBshaded = 0;

	

	// Sprache einstellen

	OpenLayers.Lang.setCode('de');

	

	// Layer für Marker

	markerLayer = new OpenLayers.Layer.Markers("Address", { projection: new OpenLayers.Projection("EPSG:4326"), 

															visibility: true, 

															displayInLayerSwitcher: false });

															

	// Die Map														

	map = new OpenLayers.Map('map', {

		controls: [],

		eventListeners: {

			"changebaselayer": mapBaseLayerChanged

		}

	});

	

	// increase reload attempts 

	OpenLayers.IMAGE_RELOAD_ATTEMPTS = 3;





	if(harborImage != "")

	{

		var options = {numZoomLevels: 1};

		var graphic = new OpenLayers.Layer.Image(

			'Hafenbild',

			harborImage,

			new OpenLayers.Bounds(20-(sizeWidth/2),-110, (sizeWidth/2)+20, sizeHeight-110),

			new OpenLayers.Size(sizeWidth, sizeHeight),

			options

		);

		/*var graphic = new OpenLayers.Layer.Image(

			'Hafenbild',

			harborImage,

			new OpenLayers.Bounds(0-map.getSize().w/2,0-map.getSize().h/2, map.getSize().w/2, map.getSize().h/2),

			new OpenLayers.Size(0,0,map.getSize().w, map.getSize().h),

			options

		);*/

		

		map.addLayer(graphic);

	}

	



	if(showGmap)

	{	

		var gmap = new OpenLayers.Layer.Google(

			"Google Karte", // the default

			{numZoomLevels: 20}

		);

		map.addLayer(gmap);

	}

	

	if(showGhyp)

	{	

		var ghyb = new OpenLayers.Layer.Google(

			"Google Hybrid",

			{type: G_HYBRID_MAP, numZoomLevels: 20}

		);

		map.addLayer(ghyb);

		

		GOOGLE_LAYER = ghyb;

	}

	

	if(showGsat)

	{	

		var gsat = new OpenLayers.Layer.Google(

			"Google Satellite",

			{type: G_SATELLITE_MAP, numZoomLevels: 20}

		);

		map.addLayer(gsat);

	}

	if(showYmap)

	{		

		var yahoomap = new OpenLayers.Layer.Yahoo(

			"Yahoo Karte",

			{}

		);

		map.addLayer(yahoomap);

	}

	

	if(showYhyp)

	{	

		var yahoohyb = new OpenLayers.Layer.Yahoo(

			"Yahoo Hybrid",

			{'type': YAHOO_MAP_HYB,numZoomLevels: 14}

		);

		map.addLayer(yahoohyb);

	}	

	if(showYsat)

	{

		var yahoosat = new OpenLayers.Layer.Yahoo(

			"Yahoo Satellite",

			{'type': YAHOO_MAP_SAT,numZoomLevels: 14}

		);

		map.addLayer(yahoosat);

	}

	

	if(showBshaded)

	{

			var bshaded = new OpenLayers.Layer.VirtualEarth("Microsoft Shaded", {

				type: VEMapStyle.Shaded

			});

			map.addLayer(bshaded);

	}

	

	if(showBroad)

	{

		var broad = new OpenLayers.Layer.VirtualEarth("Microsoft Straßen", {

				type: VEMapStyle.Road

			});

		map.addLayer(broad);

	}

	

	if(showBhyp)

	{

		var bhybrid = new OpenLayers.Layer.VirtualEarth("Microsoft Hybrid", {

			type: VEMapStyle.Hybrid

		});

		map.addLayer(bhybrid);

	}

	

	if(showBaerial)

	{

		var baerial = new OpenLayers.Layer.VirtualEarth("Microsoft Aerial", {

			type: VEMapStyle.Aerial

		});

	

		map.addLayer(baerial);

	}

	

	if(showOsmap)

	{

		// create OSM layer

		var osmap = new OpenLayers.Layer.OSM();

		map.addLayer(osmap);

	}

		

	if(showOsmarender)

	{

		// create OSM layer

		var osmarender = new OpenLayers.Layer.OSM(

			"OpenStreetMap (Tiles@Home)",

			"http://tah.openstreetmap.org/Tiles/tile/${z}/${x}/${y}.png"

		);

		map.addLayer(osmarender);

	}

	

	map.addLayers([markerLayer]);

									

	//map.setCenter(new OpenLayers.LonLat(posLong, posLat), 15);

	map.addControl(new OpenLayers.Control.LayerSwitcher());

	

	if(harborImage == "" && GOOGLE_LAYER != null)

	{

		// Wenn keine Hafenkarte vorhanden ist, wird Google Hybrid map geladen

		map.setBaseLayer(GOOGLE_LAYER);

	}

	return map;

}



/**

 * Add OnLoad Eventhandler

 * @param func Eventhandler

 */

function addLoadEvent(func) 

{

  var oldonload = window.onload;

  if (typeof window.onload != 'function') {

	window.onload = func;

  } else {

	window.onload = function() {

	  if (oldonload) {

		oldonload();

	  }

	  func();

	}

  }

}



function setMarkerIcon(icon)

{

	markerIcon = icon;

}



/**

 * OpenLayer Marker hinzufügen mit Popup Text

 */

function addMarker(layer, lon, lat, popupContentHTML,event,eventfunc)

{

	var ll = new OpenLayers.LonLat(lon, lat);

	var feature = new OpenLayers.Feature(layer, ll); 

	feature.closeBox = true;

	//feature.popupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud, {minSize: new OpenLayers.Size(300, 180) } );

	feature.popupClass = OpenLayers.Class(OpenLayers.Popup.FramedCloud, { 'autoSize': true });

	feature.data.popupContentHTML = popupContentHTML;

	feature.data.overflow = "hidden";

	

	var marker = new OpenLayers.Marker(ll,markerIcon);

	marker.feature = feature;

 

	/*var markerClick = function(evt) {

		if (this.popup == null) {

			this.popup = this.createPopup(this.closeBox);

			retMap.addPopup(this.popup);

			this.popup.show();

		} else {

			this.popup.toggle();

		}

		OpenLayers.Event.stop(evt);

	};

	marker.events.register("mousedown", feature, markerClick);*/

	if(event != "" && event != null)

	{

		marker.events.register(event, feature, eventfunc);

	}

	

	layer.addMarker(marker);

	return marker;

}