var MIN_ZOOM = 9;
var ANZ_PRO_GRUPPE = 8;
var WLW_PATH_IMAGE = '../image/common'; 

var map; /* Globale Variable für die IWMap */
var measuringTool; /* Tool der Entfernungsmessung */

/*
 * das Firmenobjekt fuer die Map 
 */
function Firma(coordLcc, icon, firmaid, name, plzort) {
	this.coordLcc = coordLcc;
	this.icon = icon;
	this.firmaid = firmaid;
	this.name = name;
	this.plzort = plzort;
}

/*
 * der WLW Marker
 */
function WlwMarker(map, coordinate, name, firmaid, plzort) {
	IWMarker.call(this, map, coordinate);
	var _self=this;
	this.name = name;
	this.firmaid = firmaid;
	this.plzort = plzort;
}

/*
 * liefert den Mittelpunkt bei der Variante "ohne Standort"
 */
function getCenterCoordinateOS(myFirmen) {
	var xmin = xmax = ymin = ymax = 0;
	for (var i=0; i<myFirmen.length; i++) {
		//alert(myFirmen[i]);
		if (i==0) {
			xmin = xmax = myFirmen[i].coordLcc.getX();
			ymin = ymax = myFirmen[i].coordLcc.getY();
		} else {
			if (xmin > myFirmen[i].coordLcc.getX()) xmin = myFirmen[i].coordLcc.getX();
			if (xmax < myFirmen[i].coordLcc.getX()) xmax = myFirmen[i].coordLcc.getX();
			if (ymin > myFirmen[i].coordLcc.getY()) ymin = myFirmen[i].coordLcc.getY();
			if (ymax < myFirmen[i].coordLcc.getY()) ymax = myFirmen[i].coordLcc.getY();
		}
	}
	var x = xmin + (xmax - xmin) / 2;
	var y = ymin + (ymax - ymin) / 2;
	return new IWCoordinate(x, y);
}

/*
 * liefert den Zoomfaktor bei der Variante "mit Standort"
 */
function getZoomMS(map, standort, myFirmen) {
	var distX = distY = 0;
	var ratio = map.getOptions().getSize().getWidth() / map.getOptions().getSize().getHeight();
	for (var i=0; i<myFirmen.length; i++) {
		var tmpX = standort.distanceFrom(new IWCoordinate(myFirmen[i].coordLcc.getX(), standort.getY()));
		var tmpY = standort.distanceFrom(new IWCoordinate(standort.getX(), myFirmen[i].coordLcc.getY()));
		if (tmpX > distX) distX = tmpX;
		if (tmpY > distY) distY = tmpY;
	}
	distX = 2 * distX;
	distY = 2 * ratio * distY;
	var zoomlevel = (distX > distY) ? 1 + map.getZoomByMeter(distX) : 1 + map.getZoomByMeter(distY);
	return zoomlevel < MIN_ZOOM ? MIN_ZOOM : zoomlevel;
}

/*
 * liefert den Zoomfaktor bei der Variante "ohne Standort"
 */
function getZoomOS(map, myFirmen) {
	var xmin = xmax = ymin = ymax = 0;
	var ratio = map.getOptions().getSize().getWidth() / map.getOptions().getSize().getHeight();
	for (var i=0; i<myFirmen.length; i++) {
		if (i==0) {
			xmin = xmax = myFirmen[i].coordLcc.getX();
			ymin = ymax = myFirmen[i].coordLcc.getY();
		} else {
			if (xmin > myFirmen[i].coordLcc.getX()) xmin = myFirmen[i].coordLcc.getX();
			if (xmax < myFirmen[i].coordLcc.getX()) xmax = myFirmen[i].coordLcc.getX();
			if (ymin > myFirmen[i].coordLcc.getY()) ymin = myFirmen[i].coordLcc.getY();
			if (ymax < myFirmen[i].coordLcc.getY()) ymax = myFirmen[i].coordLcc.getY();
		}
	}
	var distX = new IWCoordinate(xmax, 0).distanceFrom(new IWCoordinate(xmin, 0));
	var distY = ratio * new IWCoordinate(0, ymax).distanceFrom(new IWCoordinate(0, ymin));
	var zoomlevel = distX > distY ? 1 + map.getZoomByMeter(distX) :  1 + map.getZoomByMeter(distY);
	return zoomlevel < MIN_ZOOM ? MIN_ZOOM : zoomlevel; 
}

function mapZurueck() {
	blaettern(-1);
}

function mapWeiter() {
	blaettern(1);
}

function showLegende(seite) {
	var attValue = 'legende' + seite;
	var idDiv = document.getElementById('idLegende');
	var divs = idDiv.getElementsByTagName("div");
	for (var i = 0; i<divs.length; i++) {
		var node = divs[i];
		if (node.getAttribute('name') == attValue) {
			node.style.display = 'block';
		} else if (node.getAttribute('name')) {
			node.style.display = 'none';
		}
	}
}

function blaettern(step) {
	var neueSeite = mapSeite + step;
	showLegende(neueSeite);
	// bedingungen des wechsels ueberpruefen
	if (getFirstIndex(step) < 0) return
	// Anzeige der Blaetter-Pfeile bestimmen
	if (step < 0) {
		if (getFirstIndex(step-1) > -1) {
			document.getElementById("BlaetternBack").style.visibility = "visible";
		} else {
			document.getElementById("BlaetternBack").style.visibility = "hidden";
		}
		document.getElementById("BlaetternForward").style.visibility = "visible";
	}
	if (step > 0) {
		if (getFirstIndex(step+1) > -1) {
				document.getElementById("BlaetternForward").style.visibility = "visible";
		} else {
			document.getElementById("BlaetternForward").style.visibility = "hidden";
		}
		document.getElementById("BlaetternBack").style.visibility = "visible";
	}
	// Marker entfernen
	map.getOverlayManager().getLayer(0).removeAllOverlays();
	for (var i=getFirstIndex(step); i<=getLastIndex(step); i++) {
		map.getOverlayManager().getLayer(0).addOverlay(marker[i]);
	}
	mapSeite = neueSeite;
	setCenter(getCurrentFirmen());
}

/*
 * initialisiert die Map der Firmenuebersicht - wird durch ein body-onload aufgerufen
 */
function initMapFU(mapID, sprache, pathImage)
{
	if(pathImage){
		WLW_PATH_IMAGE = pathImage;
	}
	map = new IWMap(document.getElementById(mapID));

    showLegende(1);

    var options = map.getOptions();
	options.setLeftMouseAction(IWMapOptions.CONTROL_MOVE);
	options.setRightMouseAction(IWMapOptions.CONTROL_ZOOM);
	options.setLanguage(sprache);
  	
	for (var i=0; i<firmen.length; i++) {
		marker[i] = new WlwMarker(map, firmen[i].coordLcc, firmen[i].name, firmen[i].firmenid, firmen[i].plzort);
		marker[i].setDefaultIcon(firmen[i].icon);
	}
	var firstFirmen = new Array(ANZ_PRO_GRUPPE);
	IWEventManager.addListener(map, 'afterinitialized', 
		function() {  
			// add controller
			map.getLayoutManager().getLayer(0).setBorder(0, 0);                                                                   
			map.getLayoutManager().getLayer(0).addControl(new IWScalarControl(map), IWAlignment.LEFT, IWAlignment.BOTTOM, 0, 0);  
			map.getLayoutManager().getLayer(0).addControl(new WlwNavigationControl(map), IWAlignment.RIGHT, IWAlignment.TOP, 0, 0);  
			map.getLayoutManager().getLayer(0).addControl(new WlwZoomControl(map), IWAlignment.RIGHT, IWAlignment.TOP, 0, 0);
			measuringTool = new WlwMeasuringControl(map);
			map.getLayoutManager().getLayer(2).addControl(measuringTool, IWAlignment.CENTER, IWAlignment.CENTER, 0, 0);
			map.getLayoutManager().getLayer(2).addControl(measuringTool.getInfoWindow(), IWAlignment.TOP, IWAlignment.RIGHT, 33, 84);
			map.getLayoutManager().getLayer(0).addControl(new WlwToolbar(map, measuringTool), IWAlignment.TOP, IWAlignment.RIGHT, 0, 0);
			
			// map.getLayoutManager().getLayer(1).addControl(new IWOverviewMapControl(map, 'roadmap'), IWAlignment.LEFT, IWAlignment.TOP, 0, 0);
			
			// add marker
			for (var i=0; i<firmen.length; i++) {
				if (i < ANZ_PRO_GRUPPE) { // die ersten 8 anzeigen
					map.getOverlayManager().getLayer(0).addOverlay(marker[i]);
				}
				IWEventManager.addListener(marker[i], 'onclick', 
						function(event) {
							var txt = "";
							for (var j=getFirstIndex(); j<=getLastIndex(); j++) {
								var x = this.getCoordinate().distanceFrom(marker[j].getCoordinate());
								if (x / map.getMeterPerPixel() < 10) { // falls Pixelabstand kleiner 10
									txt += "<p style='font-size:1.0em; color:#254E9B'><strong>" + marker[j].name + "</strong><br/>"+ marker[j].plzort + "</p>";
								}
							}
							map.openInfoBalloon(this.getCoordinate(), txt); 
						}.iwclosure(marker[i])
				);
			}
		}.iwclosure(this)
	);
	// Kartenmittelpunkt setzen
	setCenter(getCurrentFirmen());			
}

/*
 * initialisiert die Map der Firmeninformation - wird durch ein body-onload aufgerufen
 */
function initMapFI(mapID, sprache, pathImage)  
{
	if(pathImage){
		WLW_PATH_IMAGE = pathImage;
	}
	map = new IWMap(document.getElementById(mapID));
	var options = map.getOptions();
	options.setLeftMouseAction(IWMapOptions.CONTROL_MOVE);
	options.setRightMouseAction(IWMapOptions.CONTROL_ZOOM);
	options.setLanguage(sprache);
  	
	marker[0] = new WlwMarker(map, firmen[0].coordLcc);
	marker[0].setDefaultIcon(firmen[0].icon);
	
	IWEventManager.addListener(map, 'afterinitialized', 
		function() {  
			// add controller
      		map.getLayoutManager().getLayer(0).setBorder(0, 0);                                                                   
			map.getLayoutManager().getLayer(0).addControl(new IWScalarControl(map), IWAlignment.LEFT, IWAlignment.BOTTOM, 0, 0);
			map.getLayoutManager().getLayer(0).addControl(new WlwNavigationControl(map), IWAlignment.RIGHT, IWAlignment.TOP, 0, 0);  
			map.getLayoutManager().getLayer(0).addControl(new WlwZoomControl(map), IWAlignment.RIGHT, IWAlignment.TOP, 0, 0);
			
			map.getLayoutManager().getLayer(1).setBorder(0, 0);
			map.getLayoutManager().getLayer(1).addControl(new IWOverviewMapControl(map, 'roadmap'), IWAlignment.LEFT, IWAlignment.TOP, 0, 0);
			
			measuringTool = new WlwMeasuringControl(map);
			map.getLayoutManager().getLayer(2).addControl(measuringTool, IWAlignment.CENTER, IWAlignment.CENTER, 0, 0);
			map.getLayoutManager().getLayer(2).addControl(measuringTool.getInfoWindow(), IWAlignment.TOP, IWAlignment.RIGHT, 33, 84);
			map.getLayoutManager().getLayer(0).addControl(new WlwToolbar(map, measuringTool), IWAlignment.TOP, IWAlignment.RIGHT, 0, 0);
			
			// add marker
			map.getOverlayManager().getLayer(0).addOverlay(marker[0]);
			// keine Maussymbolaenderung bei mouse over
			IWEventManager.addListener(marker[0], 'onmouseover',  
			function(e)  
			{  
				marker[0].getContainer().style.cursor = 'default';
				var listener = IWEventManager.addListener(marker[0].getContainer(), 'onmouseout',  
						function(e)  
						{  
							IWEventManager.removeListener(listener);  
				        }.iwclosure(this)  
					);                            
				}.iwclosure(marker[0])  
			); 
		}.iwclosure(this)
	);
	// Kartenmittelpunkt setzen
	setCenter(getCurrentFirmen());			
}

/*
 * setzt den Mittelpunkt der Map
 */
function setCenter(myFirmen) {
	if (mapStandortModus == 'ms') {
		//map.getOverlayManager().getLayer(0).addOverlay(new IWMarker(map, myPosition));
		map.setCenter(myPosition, getZoomMS(map, myPosition, myFirmen));
	} else if (mapStandortModus == 'ez') {
		map.setCenter(marker[0].getCoordinate(), MIN_ZOOM);
	} else {
		map.setCenter(getCenterCoordinateOS(myFirmen), getZoomOS(map, myFirmen));
	}
}

/*
 * liefert die Firmen der aktuellen Map-Seite
 */
function getCurrentFirmen(){
	var start = getFirstIndex();
	var stop = getLastIndex();
	var myFirmen = new Array(1+stop-start);
	var j = 0;
	for (var i = start; i <= stop; i++){
		myFirmen[j] = firmen[i];
		j++;
	}
	return myFirmen;
}

/*
 * liefert den Index der ersten Firma der Seite
 * 
 * @param step - numerische Schrittweite (-1 = eine Seite zurueck; 0 = aktuelle Seite; 1= eine Seite weiter) 
 */
function getFirstIndex(step) {
	if (!step) step = 0;
	neueSeite = mapSeite + step;
	if (neueSeite < 1 || neueSeite > (firmen.length + ANZ_PRO_GRUPPE - 1) / ANZ_PRO_GRUPPE ) {
		return -1;
	} else {
		return ANZ_PRO_GRUPPE * neueSeite - ANZ_PRO_GRUPPE;
	}
}

/*
 * liefert den Index der letzten Firma der Seite
 * 
 * @param step - numerische Schrittweite (-1 = eine Seite zurueck; 0 = aktuelle Seite; 1= eine Seite weiter) 
 */
function getLastIndex(step) {
	if (!step) step = 0;
	neueSeite = mapSeite + step;
	if (neueSeite < 1 || neueSeite > (firmen.length + ANZ_PRO_GRUPPE - 1) / ANZ_PRO_GRUPPE ) {
		return -1;
	} else {
		return ANZ_PRO_GRUPPE * neueSeite > firmen.length ? firmen.length-1 : ANZ_PRO_GRUPPE * neueSeite - 1;
	}
}

/*
 * zeigt die Map in der Firmeninfo an
 * @param zustand - sollgeoeffnet oder geschlossen werden
 * @param sprache - optional, setzt die Sprache der Infoware Map
 */
function showMap(zustand, sprache, pathImage) {
	if(zustand == 'open') {
		document.getElementById('theMap').style.display='block';
		document.getElementById('stadtplanclose').style.display='none';
		document.getElementById('stadtplanopen').style.display='block';
		document.getElementById('idMap').style.display='block';
		if (map == null) {
			initMapFI('idMap', sprache, pathImage);
		}
	} else {
		document.getElementById('theMap').style.display='none';
		document.getElementById('stadtplanopen').style.display='none';
		document.getElementById('stadtplanclose').style.display='block';
	}
	/* Der IE6 schiebt den Fuss nicht automatisch ans Ende */
	if (navigator.appVersion.indexOf("MSIE 6")) {
	  /* weiterer Bug: Der Container muss einmal "bewegt" werden */
	  document.getElementById("fussKomplett").style.bottom = 10 + "px";
	  document.getElementById("fussKomplett").style.bottom = 0 + "px";
	}
}