/*********************************************************************************************************
 * MAP                                                                                                   *
 *********************************************************************************************************/


var mapName = "";
var mapID = null;
var mandator = null;
var stylesheetname = "";

	/* additional legend image */
var legendImage = null;

	/* for the address searching */
var addressShown = false;
var cityID = null;
var streetID = null;
var streetName = null;
var addressID = null;

var restoreCityID = null;
var restoreStreetID = null;
var restoreStreetName = null;
var restoreAddressID = null;

var arrCacheCity = null;
var arrCacheStreet = null;
var arrCacheHouseNumber = null;

var addressCoordX = 0;
var addressCoordY = 0;

	/* for showing the layers */
var arrLayerGroup = null;
var strLayerQuery = "";
var activeBackgroundGroupNum = null;

var arrPOICategories = null;
var strPOIsQuery = "";
	/* for the POI searching */
var poiListHTML = null;


var xOrigin = yOrigin = 0;

var initialCoordX = 50;
var initialCoordY = 0;

	//some state tracking variables
var bMouseDown = false;
var lastx = 0;
var lasty = 0;
var til = null; // the inside layer - the one that moves
var glassLayer = null;
var al = null; // the address layer - the red circle


var viewportWidth = null;
var viewportHeight = null;

var viewportHalfWidth = null;
var viewportHalfHeight = null;

var bInit = false; // track first mouse move over map
var xOffset = 0;
var yOffset = 0;

	//global configuration variables
var nLayers = 1;
var tileWidth = 200;
var tileHeight = 200;
var buffer = 1;
var referenceScale = null;
var startScale = null;
var scale = null;
var cellSize = null;
var resolution = 0;
var inchesPerUnit = 0;

var minX = 0;
var maxX = 0;
var minY = 0;
var maxY = 0;
var extentWidth = 0;
var extentHeight = 0;

var overviewXOffset = 0;
var overviewWidth = 0;
var overviewHeight = 0;

var overviewViewportWidth = 0;
var overviewViewportHeight = 0;

	//these are calculated in the page initialization
var wide = 0;
var high = 0;

	//current top and left are tracked when the map moves
	//to start the map at some offset, these would be set to
	//the appropriate pixel value.
var currentTop = null;
var currentLeft = null;

var loadingImage = null;

var currentScale = 0;
var arrScale = new Array(); // initialized by the init.php script

	/* accordion tab states */
var accTabAddressSearch = null;
var accTabLayers = null;
var accTabOverview = null;
var accTabPOIs = null;

	/* Fullscreen mode*/
var fullscreen = false;
	/* Print mode*/
var printing = false;

var viewPort_latch_showing = false;

var legendPopupWindow = false;


function getEventSrc(e) {
	if(window.event)
	{
		return window.event.srcElement;
	} else if(e) {
		return e.target;
	} else {
		return 0;
	}
}


function popuplegende(groupName, img) {
		if (img) legendImage = img;
		legendPopupWindow = window.open('','','left='+viewportWidth+',width=320,height=300,resizable=1,scrollbars=1');
		legendPopupWindow.document.write('<html><head><title>Legende '+ groupName+'</title></head><body marginwidth=0 marginheight=0 topmargin=0 leftmargin=0>'+ toolbar_getLegendForm()+'</body></html>');
		legendPopupWindow.focus();
}

	/* create all necessary layers to hold the map layers */
function createLayers()
{
	bMouseDown = false;
	var viewport = getRawObject("viewport");
	til = document.createElement("div");
	til.id = "theInsideLayer";
	til.style.position = "absolute";
	til.style.left = "0px";
	til.style.top = "0px";
	til.style.width = "100%";
	til.style.height = "100%";
	til.style.zIndex = "1";
	viewport.appendChild(til);

	glassLayer = document.createElement("div");
	glassLayer.id = "glassLayer";
	glassLayer.style.position = "absolute";
	glassLayer.style.left = "0px";
	glassLayer.style.top = "0px";
	glassLayer.style.width = "100%";
	glassLayer.style.height = "100%";
	glassLayer.style.zIndex = "3";
	glassLayer.innerHTML = "&nbsp;";
	til.appendChild(glassLayer);

		//add transparent layer except in Opera
	if(!isOpera)
	{
		glassLayer.style.backgroundColor = "red";
		glassLayer.style.filter = "Alpha(opacity=0)";
		glassLayer.style.MozOpacity = 0;
		glassLayer.style.opacity = 0; //for CSS3
	}

	util_addEventHandler(glassLayer, "mousedown", map_mousedown);
	util_addEventHandler(glassLayer, "mouseup", map_mouseup);
	util_addEventHandler(glassLayer, "mouseover", map_mouseover);
	util_addEventHandler(glassLayer, "dblclick", map_dblclick);
	util_addEventHandler(glassLayer, "click", map_click);
	util_addEventHandler(glassLayer, "contextmenu", map_contextmenu);
	util_addEventHandler(document, "mousemove", map_mousemove);

	util_addEventHandler(document, "mouseout", map_mouseout);
	util_addEventHandler(document, "keypress", map_keypress);
	util_addEventHandler(document, "keydown", map_keydown);

	util_addEventHandler(glassLayer, "dragstart", new Function([], 'var e=e?e:event;e.cancelBubble=true;e.returnValue=false;return false;'));

	util_setObjectCursor(viewport, ["url(images/grab.cur),move", "-moz-grab", "grab", "move"]);

		/* add the map layers */
	for(var k = 0; k < nLayers; k++)
	{
		var mapLayer = document.createElement('div');
		mapLayer.id = "mapLayer" + k;
		mapLayer.className = "mapLayer1";
		mapLayer.style.zIndex = "1";
		til.appendChild(mapLayer);
	}

		// add the address layer
	al = document.createElement('div');
	al.className = "addressLayer";
	al.style.zIndex = "2";
	var aimg = document.createElement('img');
	aimg.id = "addressImage";
	aimg.src = "images/redcircle.gif";
	aimg.className = "pngFix";
	aimg.width = 50;
	aimg.height = 50;
	aimg.style.position = "absolute";
	aimg.style.top = 0;
	aimg.style.left = 0;
	aimg.style.width = 50+"px";
	aimg.style.height = 50+"px";
	al.appendChild(aimg);
	til.appendChild(al);

	// POI init
	for(var k = 0; k < arrPOICategories.length; k++)
	{
		// creating POI DIVs
		for(var i = 0; i < arrPOICategories[k].pois.length; i++)
		{
			var poi = arrPOICategories[k].pois[i];
			if(poi.icon == '') {
				poi.icon = arrPOICategories[k].icon;
			}

			var poil = getPOILayer(poi.id, k, i, getPoiHTML(poi.name, poi.icon, "normal"));

		}
	}
}

function getPoiHTML(name, icon, state)
{
	if(state == "normal")
	{
		return "<TABLE cellpadding=0 cellspacing=0>" +
			" <TR>" +
			"  <TD class=poiCell><IMG SRC=\"resources/mandator/" + mandator + "/icons/" +icon + "\"></TD>" +
			" </TR>" +
			"</TABLE>";
	}
	else
	{
		return "<TABLE cellpadding=0 cellspacing=0>" +
			" <TR>" +
			"  <TD class=poiIconCell><IMG SRC=\"resources/mandator/" + mandator + "/icons/" + icon + "\"></TD>" +
			"  <TD class=poiNameCell>" + name  + "&nbsp;</TD>" +
			" </TR>" +
			"</TABLE>";

	}
}

function safeParseInt(val)
{
	return Math.round(parseFloat(val));
}

function setTile(img)
{
	var force = '';
	if(arguments[1])
		force = '&force=true';

	if(aErrorStack[img.id] != null) {
		force = '&errornum=' + aErrorStack[img.id];
	}

	var l = safeParseInt(img.style.left) + xOrigin;
	var t = safeParseInt(img.style.top) + yOrigin;

	img.width = tileWidth;
	img.height = tileHeight;

	img.src = loadingImage.src;
	img.lowsrc = loadingImage.src;

	img.src = 'index.php?action=frontend_getTile&mapid='+mapID+'&t='+t+'&l='+l+'&w='+tileWidth+'&h='+tileHeight+'&s='+scale+force+strLayerQuery;
	//console.log('index.php?action=frontend_getTile&mapid='+mapID+'&t='+t+'&l='+l+'&w='+tileWidth+'&h='+tileHeight+'&s='+scale+force+strLayerQuery);
}

var gImageID = 0;
function createImage( top, left )
{
	var img = document.createElement('img');
	img.src = loadingImage.src;
	img.lowsrc = loadingImage.src;

	img.width = tileWidth;
	img.Height = tileHeight;

		//first for firefox, rest for IE :(
	img.setAttribute('style', 'position:absolute; top:'+top+'px; left:'+left+'px;width:'+tileWidth+'px;height:'+tileHeight+'px;');
	img.style.position = 'absolute';
	img.style.top = (top - yOrigin)+'px';
	img.style.left = (left - xOrigin)+'px';
	img.style.width = tileWidth+'px';
	img.style.height = tileHeight+'px';
	util_addEventHandler(img, "error", imgOnError);
	util_addEventHandler(img, "load", imgOnLoad);
	img.errorCount = 0;
	img.id = "i" + gImageID;
	gImageID = gImageID + 1;

	setTile(img);
	return img;
}

var aErrorStack = new Array();
var aTimeOutStack = new Array();
function imgOnError(e)
{
	if(aErrorStack[this.id]) {
		aErrorStack[this.id] += 1;
	} else {
		aErrorStack[this.id] = 0;
	}

	if(!aTimeOutStack[this.id])
	{
		var img = getRawObject(this.id);

		util_removeEventHandler(img, "error", imgOnError);
		util_removeEventHandler(img, "load", imgOnLoad);

		img.src = loadingImage.src;

		aTimeOutStack[this.id] = window.setTimeout('resetImage("'+this.id+'")', 250);
	}
}

function resetImage(id)
{
	if(aTimeOutStack[id])
	{
		var img = getRawObject(id);

		clearTimeout(aTimeOutStack[id]);
		aTimeOutStack[id] = null;

		var bForce = (aErrorStack[id] > 5);
		//console.log(img);
		setTile(img, bForce);
		//console.log(img);

		util_addEventHandler(img, "load", imgOnLoad);
		util_addEventHandler(img, "error", imgOnError);
	}
}

function imgOnLoad(e)
{
	aErrorStack[this.id] = null;
	if(aTimeOutStack[this.id])
	{
		clearTimeout(aTimeOutStack[this.id]);
		aTimeOutStack[this.id] = null;
	}
}

	/* append a row of tiles at the bottom */
function appendRow()
{
	if(wide == 0)
		return;

	for(var k = 0; k < nLayers; k++)
	{
		var d = getRawObject('mapLayer'+k);
		for(var i = 0; i < wide; i++)
		{
			var top = currentTop + (high * tileHeight);
			var left = currentLeft + (i * tileWidth);
			d.appendChild(createImage(top, left));
		}
	}
	high = high + 1;
}

function appendColumn()
{
	if(high == 0)
		return;

	for(var k = 0; k < nLayers; k++)
	{
		var d = getRawObject('mapLayer' + k);
		for(var j = high - 1; j >= 0; j--)
		{
			var top = currentTop + (j * tileHeight);
			var left = currentLeft + (wide * tileWidth);
			var img = createImage(top, left);
			if(j < high - 1)
				d.insertBefore(img, d.childNodes[((j + 1) * wide)]);
			else
				d.appendChild(img);
		}
	}
	wide = wide + 1;
}

function removeColumn()
{
	if(wide < 4)
		return;

	for(var k = 0; k < nLayers; k++)
	{
		var d = getRawObject('mapLayer'+k);
		for(var j = high - 1; j >= 0; j--)
		{
			var img = d.childNodes[((j + 1) * wide) - 1];
			d.removeChild(img);
		}
	}
	wide = wide - 1;
}

function removeRow()
{
	if(high < 4)
		return;

	for(var k = 0; k < nLayers; k++)
	{
		var d = getRawObject('mapLayer' + k);
		for(var i = wide - 1; i >= 0; i--)
		{
			var img = d.childNodes[((high - 1) * wide) + i];
			d.removeChild(img);
		}
	}
	high = high - 1;
}

	/* update the layer URLs based on their current positions */
	/* updates the POIs catgories visibility*/
function initializeLayers(nFactor)
{
	var deltaMouseX = currentLeft + safeParseInt(til.style.left) - xOrigin;
	var deltaMouseY = currentTop + safeParseInt(til.style.top) - yOrigin;

	var vpWidth = getObjectWidth( 'viewport' );
	var vpHeight = getObjectHeight( 'viewport' );

	var vpTop = currentTop - deltaMouseY;
	var vpLeft = currentLeft - deltaMouseX;

	var vpCenterX = vpLeft + vpWidth / 2;
	var vpCenterY = vpTop + vpHeight / 2;

	var currentTileX = Math.floor(vpCenterX / tileWidth) * tileWidth;
	var currentTileY = Math.floor(vpCenterY / tileHeight) * tileHeight;

	var tileDeltaX = currentTileX - currentLeft;
	var tileDeltaY = currentTileY - currentTop;

	var newVpCenterX = vpCenterX * nFactor;
	var newVpCenterY = vpCenterY * nFactor;

	var newTileX = Math.floor(newVpCenterX / tileWidth) * tileWidth;
	var newTileY = Math.floor(newVpCenterY / tileHeight) * tileHeight;

	var newCurrentLeft = newTileX - tileDeltaX;
	var newCurrentTop = newTileY - tileDeltaY;

	currentLeft = newCurrentLeft;
	currentTop = newCurrentTop;

	var newTilLeft = -newVpCenterX + viewportWidth / 2;
	var newTilTop = -newVpCenterY + viewportHeight / 2;

	xOrigin = currentLeft;
	yOrigin = currentTop;

	til.style.left = (newTilLeft + xOrigin) + "px";
	til.style.top = (newTilTop + yOrigin)+ "px";

	for(var k = 0; k < nLayers; k++)
	{
		var d = getRawObject('mapLayer' + k);
		for(var j = 0; j < high; j++)
		{
			for(var i = 0; i < wide; i++)
			{
				var img = d.childNodes[(j * wide) + i];
				img.src = loadingImage.src;
				img.style.top = (currentTop + j * tileHeight - yOrigin) + "px";
				img.style.left = (currentLeft + i * tileWidth - xOrigin) + "px";
				setTile(img);
			}
		}
	}
	checkWrap();

	if(addressShown)
	{
		var dx = (currentLeft - xOffset) - Math.round(addressCoordX / cellSize);
		var dy = (currentTop - yOffset) - Math.round(-1 * addressCoordY / cellSize);
		var newLeft = safeParseInt(til.style.left)*-1 - dx - 25;
		var newTop = safeParseInt(til.style.top)*-1 - dy - 25;
		al.style.left = newLeft;
		al.style.top = newTop;
	}

	poiListArray = new Array();
	global_i = 0;
	//alert("POI");
	// POI Categories
	for(var k = 0; k < arrPOICategories.length; k++)
	{
		// if Category showing
		if (arrPOICategories[k].visibility)
		{
			// showing POIs
			for(var i = 0; i < arrPOICategories[k].pois.length; i++)
			{
				var poi = arrPOICategories[k].pois[i];
				var poil = getPOILayer(poi.id, k, i, false);
				var aDim = getLayerDimensions(poil);
				var poi_dx = (currentLeft - xOffset) - Math.round(poi.coordX / cellSize);
				var poi_dy = (currentTop - yOffset) - Math.round(-1 * poi.coordY / cellSize);
				var poi_newLeft = safeParseInt(til.style.left)*-1 - poi_dx;
				var poi_newTop = safeParseInt(til.style.top)*-1 - poi_dy;
				poil.style.left = poi_newLeft;
				poil.style.top = poi_newTop;
				show(poil);

				// building POIList
				temp_poiListHTML = "<tr><td>";
				if(arrPOICategories[k].icon != '') temp_poiListHTML += "<img width=10 src=\"resources/mandator/"+mandator+"/icons/"+arrPOICategories[k].icon+"\">";
				temp_poiListHTML += "</td><td><a href=\"\" id=\"poi_"+poi.id+"\" onclick=\"if(this.style.textDecoration=='none')this.style.textDecoration='underline';else this.style.textDecoration='none';poilist_mouseclick(" + k + "," + i + ");return false\" style=\"font-family:Arial;font-size:8pt;color:000000;text-decoration:";
				if (poi.open) temp_poiListHTML += "underline";
				else temp_poiListHTML += "none";
				temp_poiListHTML += ";\">&nbsp;"+poi.name+"</span></td></tr>";
				poiListArray[global_i++] = poi.name+"____"+temp_poiListHTML;
			}
		} else {
			// hiding POIs
			for(var i = 0; i < arrPOICategories[k].pois.length; i++) {
				hide(getPOILayer(arrPOICategories[k].pois[i].id, k, i, false));
			}
		}
	}
	// sorting POIList
	poiListHTML = "<table name=\"poilist_table\" id=poilist_table cellpadding=0 cellspacing=0 border=0>";
	poiListArray.sort(alfanum);
	for(var i = 0; i < poiListArray.length; i++) {
			poiListHTML += poiListArray[i].substring(poiListArray[i].indexOf("<tr><td>"),poiListArray[i].length);
	}
	poiListHTML += "</table>";

	//kz
	if (arrPOICategories.length != 0) {
		var frame = getRawObject("poisearch_frame");
		if (global_i > 7) {
			frame.style.height="102px";
			frame.style.display="";
		} else if (global_i > 0) {
			frame.style.height=""+(Math.round(global_i*14.5)+1)+"px";
			frame.style.display="";
		} else {
			frame.style.display="none";
		}
		frame.innerHTML = poiListHTML;
	}
	}

function alfanum(a,b) {
	var result = 0;
	if ((typeof(a)=='number')&&(typeof(b)=='number')) {
		result = a-b;
	} else if ((typeof(a)=='string')&&(typeof(b)=='string')) {
		if (a < b) {result = -1;}
		else if (a > b) {result = 1;}
		else {result = 0;}
	} else if (typeof(a)=='string'){
		result = 1;
	} else {
		result = -1
	}
	return result;
}


function getPOILayer(poiID, catIndex, poiIndex, poiHTML)
{
	var l = getRawObject("POILayer_" + poiID,false);
	if (!l && poiHTML)
	 {
		l = document.createElement('div');
		l.innerHTML = poiHTML;
		l.id = "POILayer_" + poiID;
		l.className = "POILayer";
		l.style.zIndex = "4";
		l.style.filter = "Alpha(opacity=90)";
		l.style.MozOpacity = 0.9;
		l.style.opacity = 0.9; //for CSS3
		til.appendChild(l);
		util_addEventHandler(l, "mouseover", new Function("e", "e=util_fixEventObj(e);poi_mouseover(e," + catIndex + "," + poiIndex + ");"));
		util_addEventHandler(l, "mouseout", new Function("e", "e=util_fixEventObj(e);poi_mouseout(e," + catIndex + "," + poiIndex + ");"));
	}
	return l;
}

function poi_mouseover(e, catIndex, poiIndex)
{
	var poi = arrPOICategories[catIndex].pois[poiIndex];
	if(!poi.open)
	{
		poi.open = true;
		var l = getRawObject("POILayer_" + poi.id,false);
		l.style.zIndex = "5";
		l.style.filter = "Alpha(opacity=100)";
		l.style.MozOpacity = 1;
		l.style.opacity = 1; //for CSS3
		l.innerHTML = getPoiHTML(poi.name, poi.icon, "content");
		arrPOICategories[catIndex].pois[poiIndex] = poi;
		//document.frames[0].
		document.getElementById('poi_'+poi.id).style.textDecoration='underline';
	}

	return cancelEvent(e);
}
function poilist_mouseclick(catIndex, poiIndex)
{
	var poi = arrPOICategories[catIndex].pois[poiIndex];
	//if(!poi.open) {
		//poi.open = true;
		var l = getRawObject("POILayer_" + poi.id,false);
		l.style.zIndex = "5";
		l.style.filter = "Alpha(opacity=100)";
		l.style.MozOpacity = 1;
		l.style.opacity = 1; //for CSS3
		l.innerHTML = getPoiHTML(poi.name, poi.icon, "content");
		arrPOICategories[catIndex].pois[poiIndex] = poi;

		//	slide if clicked POI is out of visible area

		/*var newLeft = Math.round(poi.coordX / cellSize)-viewportHalfWidth;
		var newTop = Math.round(-1 * poi.coordY / cellSize)-viewportHalfHeight;
		var dx = (currentLeft - xOffset) - newLeft - 10; // border=10pixel
		var dy = (currentTop - yOffset) - newTop - 10;

		if (dx > viewportHalfWidth || dx < -1*(viewportHalfWidth-90) || dy > viewportHalfHeight || dy < -1*(viewportHalfHeight)) {
			moveBy(dx,dy);
		}*/
    zoomSecondMax();
    map_moveToCenter(poi.coordX, poi.coordY);

	/*} else {
		poi.open = false;
		var l = getRawObject("POILayer_" + poi.id,false);
		l.style.zIndex = "4";
		l.style.filter = "Alpha(opacity=80)";
		l.style.MozOpacity = 0.8;
		l.style.opacity = 0.8; //for CSS3
		l.innerHTML = getPoiHTML(poi.name, poi.icon, "normal");
		arrPOICategories[catIndex].pois[poiIndex] = poi;
	}*/
	return false;
}

function poi_mouseout(e, catIndex, poiIndex)
{
	var poi = arrPOICategories[catIndex].pois[poiIndex];
	if(poi.open)
	{
		poi.open = false;
		var l = getRawObject("POILayer_" + poi.id,false);
		l.style.zIndex = "4";
		l.style.filter = "Alpha(opacity=80)";
		l.style.MozOpacity = 0.8;
		l.style.opacity = 0.8; //for CSS3
		l.innerHTML = getPoiHTML(poi.name, poi.icon, "normal");
		arrPOICategories[catIndex].pois[poiIndex] = poi;
		//document.frames[0].
		document.getElementById('poi_'+poi.id).style.textDecoration='none';
	}
	return cancelEvent(e);
}

	/**
	* MAP moving
	*/

	/* take last image from each row and put it at the beginning */
function wrapR2L()
{
	xOffset = xOffset - (buffer * tileWidth);

	for(var k = 0; k < nLayers; k++)
	{
		var d = getRawObject('mapLayer' + k);
		var refLeft = safeParseInt(d.childNodes[0].style.left);
		for(var j = 0; j < high; j++)
		{
			var imgLast = d.childNodes[((j + 1) * wide) - 1];
			var imgNext = d.childNodes[j * wide];

			imgLast.style.left = (refLeft - tileWidth) + 'px';
			imgLast.src = loadingImage.src;
			d.removeChild(imgLast);
			d.insertBefore(imgLast, imgNext);
			setTile(imgLast);
		}
	}
}

	/* take first image from each row and put it at the end */
function wrapL2R()
{
	xOffset = xOffset + (buffer * tileWidth);
	for(var k = 0; k < nLayers; k++)
	{
		var d = getRawObject('mapLayer' + k);
		var refLeft = safeParseInt(d.childNodes[wide - 1].style.left);
		for(var j = 0; j < high; j++)
		{
			var imgFirst = d.childNodes[j * wide];
			var imgNext;
			/* need to use insertBefore to get a node at the end of a 'row'
			 * but this doesn't work for the very last row :(*/
			if(j < high - 1)
				imgNext = d.childNodes[((j + 1) * wide)];
			else
				imgNext = null;

			imgFirst.style.left = (refLeft + tileWidth) + 'px';
			imgFirst.src = loadingImage.src;

			d.removeChild(imgFirst);
			if(imgNext)
				d.insertBefore(imgFirst, imgNext);
			else
				d.appendChild(imgFirst);
			setTile(imgFirst);
		}
	}
}

	/* take top image from each column and put it at the bottom */
function wrapT2B()
{
	yOffset = yOffset + (buffer * tileHeight);
	for(var k = 0; k < nLayers; k++)
	{
		var d = getRawObject('mapLayer' + k);
		var refTop = safeParseInt(d.childNodes[(high * wide) - 1]						// show icon image if defined
.style.top);
		for(var i = 0; i < wide; i++)
		{
			var imgBottom = d.childNodes[0];

			imgBottom.style.top = (refTop + tileHeight) + 'px';
			imgBottom.src = loadingImage.src;

			d.removeChild(imgBottom);
			d.appendChild(imgBottom);
			setTile(imgBottom);
		}
	}
}

	/* take bottom image from each column and put it at the top */
function wrapB2T()
{
	yOffset = yOffset - (buffer * tileHeight);

	for(var k=0; k<nLayers; k++)
	{
		var d = getRawObject('mapLayer' + k);
		var refTop = safeParseInt(d.childNodes[0].style.top);
		for(var i = 0; i < wide; i++)
		{
			var imgTop = d.childNodes[(high * wide) - 1];

			imgTop.style.top = (refTop - tileHeight) + 'px';
			imgTop.src = loadingImage.src;

			d.removeChild(imgTop);
			d.insertBefore(imgTop, d.childNodes[0]);
			setTile(imgTop);
		}
	}
}

	/* handle wrapping the images to keep everything visible */
function checkWrap()
{
	xOffset = safeParseInt(til.style.left) + currentLeft - xOrigin;
	yOffset = safeParseInt(til.style.top) + currentTop - yOrigin;

	while(xOffset > 0) {
		wrapR2L();
	}
	while(xOffset < -(buffer * tileWidth)) {
		wrapL2R();
	}
	while(yOffset > -(buffer * tileHeight)) {
		wrapB2T();
	}
	while(yOffset < -(2 * buffer * tileHeight)) {
		wrapT2B();
	}

	var layer = getRawObject('mapLayer0');
	var img = layer.childNodes[0].style;
	currentTop = safeParseInt(img.top) + yOrigin;
	currentLeft = safeParseInt(img.left) + xOrigin;

	updateOverview();
}

function moveBy(x, y)
{
	var newTop = safeParseInt(til.style.top) + y;
	var newLeft = safeParseInt(til.style.left) + x;
	til.style.top = newTop + 'px';
	til.style.left = newLeft + 'px';
	glassLayer.style.top = (0-newTop) + 'px';
	glassLayer.style.left = (0-newLeft) + 'px';
	checkWrap();
}

var as = slideid = null;
var accelerationFactor = 1;
var pixelsPerStep = 30;
var timePerStep = 25;
function slideBy(x, y)
{
	if(slideid!=null)
		window.clearTimeout(slideid);

	as = new Array();

	var absX = Math.abs(x);
	var absY = Math.abs(y);

	var signX = x / absX;
	var signY = y / absY;

	var distance = absX > absY ? absX : absY;
	var steps = Math.floor(distance / pixelsPerStep);

	var dx = dy = 0;
	if(steps > 0)
	{
		dx = (x) / (steps * pixelsPerStep);
		dy = (y) / (steps * pixelsPerStep);
	}

	// kz hack for the "no slide possible"-BUG
	else if (steps == 0 && x == 0 && y == 0) {
		as[0] = new Array(0, 0);
		remainderX = 1;
		remainderY = 1;
	}

	var remainderX = x - dx * steps * pixelsPerStep;
	var remainderY = y - dy * steps * pixelsPerStep;

	var px = py = 0;

	var curspeed = accelerationFactor;
	var i = 0;
	while(i < steps)
	{
		if(i > 0)
		{
		  px += as[i - 1][0];
		  py += as[i - 1][1];
		}

		var cx = px + Math.round(dx * pixelsPerStep);
		var cy = py + Math.round(dy * pixelsPerStep);

		as[i] = new Array(cx - px, cy - py);
		i++;
	}
	if(remainderX != 0 || remainderY != 0)
	{
	    as[i] = new Array(remainderX, remainderY);
	}



	slideid = window.setTimeout('slide(0)', timePerStep);
}

function slide(pos)
{
	if(pos >= as.length)
	{
		as = slideid = null;
		return;
	}

	moveBy(as[pos][0], as[pos][1]);

	pos++;
	slideid = window.setTimeout('slide('+pos+')', timePerStep);
}

	/**
	* MAP event handling
	*/

function startMapDrag(e)
{
	var viewport = getRawObject("viewport");
	util_setObjectCursor(viewport, ["url(images/grabbing.cur),move", "-moz-grabbing", "grabbing", "move"]);

	bMouseDown = true;
	lastx = sx = e.clientX;
	lasty = sy = e.clientY;
}

function stopMapDrag()
{
	var viewport = getRawObject("viewport");
	util_setObjectCursor(viewport, ["url(images/grab.cur),move", "-moz-grab", "grab", "move"]);
	bMouseDown = false;
	lastx = null;
	lasty = null;
}

	/* on mouse down handler */
function map_mousedown(e)
{
	e = util_fixEventObj(e);
	if(e.button == 2)
	{
		e.cancelBubble = true;
		e.returnValue = false;

		if(e.stopPropogation)
			e.stopPropogation();
		if (e.preventDefault)
			e.preventDefault();

		return false;
	}
	else
	{
		startMapDrag(e);
	}
}

	/* on mouse up handler */
function map_mouseup(e) {
	stopMapDrag();
}

	/* on mouse move handler */
function map_mousemove(e)
{
	if(!bMouseDown) {
		return false;
	}

	e = util_fixEventObj(e);

	var newTop = safeParseInt(til.style.top);
	var newLeft = safeParseInt(til.style.left);

	newTop = newTop - lasty + e.clientY;
	newLeft = newLeft - lastx + e.clientX;

	til.style.top = newTop + 'px';
	til.style.left = newLeft + 'px';
	glassLayer.style.top = (0-newTop) + 'px';
	glassLayer.style.left = (0-newLeft) + 'px';

	checkWrap();

	lastx = e.clientX;
	lasty = e.clientY;

	e.cancelBubble = true;
	e.returnValue = false;

	if(e.preventDefault)
		e.preventDefault();

	return false;
}

function map_dblclick(e)
{
	e = util_fixEventObj(e);
	var x = e.clientX - getObjectLeft('viewport');
	var y = e.clientY - getObjectTop('viewport');
	var dx = x - viewportHalfWidth;
	var dy = y - viewportHalfHeight;
	slideBy(-dx, -dy);
}

function map_click(e) {
}

function cancelEvent(e)
{
	e = util_fixEventObj(e);
	e.returnValue = false;

	if(e.preventDefault) {
		e.preventDefault();
	}

	return false;
}

function map_mouseover(e) {
}

function map_mouseout(e) {
	bMouseDown = false;
}

function map_contextmenu(e) {
	return cancelEvent(e);
}

function map_keydown(e)
{
	e = util_fixEventObj(e);
	if(e)
	{
		var charCode = (e.charCode) ? e.charCode : e.keyCode;
		var b = true;

		switch(charCode)
		{
			case 8:
				// backspace -> disabled
				if (getEventSrc(e).id == 'addresssearch_street') b = false;
				else b = true;
				break;
			default:
					b = false;
		}

		if(b)
		{
			e.cancelBubble = true;
			return cancelEvent(e);
		}

		return true;
	}
}

function map_keypress(e)
{
	e = util_fixEventObj(e);
	if(e)
	{
		var charCode = (e.charCode) ? e.charCode : e.keyCode;
		var b = true;
		var step = 16;

		switch(charCode)
		{
			case 8:
				// backspace -> disabled
				if (getEventSrc(e).id == 'addresssearch_street') b = false;
				else b = true;

				break;
			case 38:
				moveBy(0, step);
				break;
			case 40:
				moveBy(0, -step);
				break;
			case 37:
				moveBy(step, 0);
				break;
			case 39:
				moveBy(-step, 0);
				break;

			case 33:
				slideBy(0, viewportHeight / 2);
				break;
			case 34:
				slideBy(0, -viewportHeight / 2);
				break;
			case 36:
				slideBy(viewportWidth / 2, 0);
				break;
			case 35:
				slideBy(-viewportWidth / 2, 0);
				break;
			case 43:
				zoomIn();
				break;
			case 45:
				zoomOut();
				break;

			default:
				b = false;
		}

		if(b)
		{
			e.cancelBubble = true;
			return cancelEvent(e);
		}

		return true;
	}
}

	/**
	* MAP drawing
	*/
function resizeViewport()
{

	drawPage();

	var newViewportWidth = getObjectWidth('viewport');
	var newViewportHeight = getObjectHeight('viewport');

	if(viewportWidth == null)
	{
		til.style.top = (-1 * currentTop + yOrigin) + "px";
		til.style.left = (-1 * currentLeft + xOrigin) + "px";
		viewportWidth = newViewportWidth;
		viewportHeight = newViewportHeight;
	}
	var newWide = Math.ceil((newViewportWidth / tileWidth) + 2 * buffer);
	var newHigh = Math.ceil((newViewportHeight / tileHeight) + 2 * buffer);

	til.style.top = (safeParseInt(til.style.top) + (newViewportHeight - viewportHeight) / 2)+"px";
	til.style.left = (safeParseInt(til.style.left) + (newViewportWidth - viewportWidth) / 2)+"px";

	viewportWidth = newViewportWidth;
	viewportHeight = newViewportHeight;

	viewportHalfWidth = viewportWidth/2;
	viewportHalfHeight = viewportHeight/2;

	if (high == 0 && wide == 0) wide = newWide;

	while (high < newHigh)
	    appendRow();
	while (high > newHigh)
	    removeRow();
	while (wide < newWide)
	    appendColumn();
	while (wide > newWide)
	    removeColumn();

	var layer = getRawObject('mapLayer0');
	var img = layer.childNodes[0].style;
	currentTop = safeParseInt(img.top) + yOrigin;
	currentLeft = safeParseInt(img.left) + xOrigin;

	updateOverviewViewportSize();
	setViewport_latch(-1);

	checkWrap();
}

function drawPage()
{
	var browserWidth = getInsideWindowWidth();
	var browserHeight = getInsideWindowHeight();

	var header_height = 72;

	var vPadding = 20;
	var hPadding = 20;

  var outterTableFrame = getObject('outterTableFrame');
  outterTableFrame.width = (browserWidth - hPadding) + 'px';
  outterTableFrame.height = (browserHeight - vPadding) + 'px';

	var viewport = getRawObject('viewport');

	var toolbar = getObject('toolbar');

	var header = getObject('header');

	if (!fullscreen) {
		viewport.style.width = ((browserWidth > hPadding + getObjectWidth('toolbar')) ? (browserWidth - getObjectWidth('toolbar') - hPadding) :"1") + "px";
		viewport.style.height = ((browserHeight > hPadding + header_height) ? (browserHeight - header_height -vPadding) :"1") + "px";
		viewport.style.position='relative';
	} else {
		viewport.style.position='absolute';
		shiftTo('viewport',0,0);
		if (!printing) viewport.style.width = ((browserWidth > hPadding) ? (browserWidth ) :"1") + "px";
		else viewport.style.width = 650 + "px";
		viewport.style.height = ((browserHeight > hPadding) ? (browserHeight-vPadding)  :"1") + "px";
	}
	toolbar.height = (getObjectHeight('viewport') - header_height ) + "px";
}


	/**
	* MAP zooming
	*/
function zoomSecondMax()
{
	if(currentScale < arrScale.length - 2)
	{
		var zoomFactor = arrScale[currentScale] / arrScale[arrScale.length - 2];
		currentScale = arrScale.length - 2;
		scale = arrScale[currentScale];
		cellSize = scale / (resolution * inchesPerUnit);
		initializeLayers(zoomFactor);
		updateScale();
		updateOverviewViewportSize();
	}
}

function zoomIn()
{
	if (currentScale < arrScale.length - 1)
	{
		zoomTo(currentScale+1);
		//var zoomFactor = arrScale[currentScale] / arrScale[currentScale + 1];
		//currentScale = currentScale + 1;
		//scale = arrScale[currentScale];
		//cellSize = scale / (resolution * inchesPerUnit);
		//initializeLayers(zoomFactor);
		//updateScale();
		//updateOverviewViewportSize();
	}

}

function zoomOut()
{
	if(currentScale > 0)
	{
		zoomTo(currentScale-1);
		//var zoomFactor = arrScale[currentScale] / arrScale[currentScale - 1];
		//currentScale = currentScale - 1;
		//scale = arrScale[currentScale];
		//cellSize = scale / (resolution * inchesPerUnit);
		//initializeLayers(zoomFactor);
		//updateScale();
		//updateOverviewViewportSize();
	}
}
function zoomTo(scaleindex)
{
	//alert (arrScale.length);
	if (scaleindex < arrScale.length)
	{
		var zoomFactor = arrScale[currentScale] / arrScale[scaleindex];
		currentScale = scaleindex;
		scale = arrScale[currentScale];
		cellSize = scale / (resolution * inchesPerUnit);
		initializeLayers(zoomFactor);
		updateScale();
		updateOverviewViewportSize();
		slideBy(0,0);
	}

}
	/**
	* MAP initializing
	*/
function frontend_init(n, map, m, css)
{
	bMouseDown = false;
	initDHTMLAPI();
	drawPage();

	mapName = n;
	mapID = map;
	mandator = m;
	stylesheetname = css;

	var vpw = getObjectWidth('viewport');
	var vph = getObjectHeight('viewport');

	call('index.php?action=frontend_initMap&mapid='+map+'&vpw='+vpw+'&vph='+vph, frontend_init_callback);
}

function frontend_init_callback(init)
{
if (init.substr(0,1) != "/")
	{
		alert(init);
		return;
	}
	eval(init);
	//console.log(init);

	toolbar_updateLayerQueryString();
	toolbar_updatePOIsQueryString();

		// cache loading image permanently for this session.
	loadingImage = new Image(tileWidth, tileHeight);
	loadingImage.src = "images/loading.gif";

	xOrigin = currentLeft;
	yOrigin = currentTop;

	extentWidth = maxX-minX;
	extentHeight = maxY-minY;

	overviewHeight = 120;
	overviewWidth = Math.round((extentWidth/extentHeight) / (256/120) * 256);
	overviewXOffset = (256-overviewWidth)/2;

	startScale = scale;

	createLayers();

	/* Toolbar, Header, ViewPort_latch */
	initToolBar();
	setToolbar(-1);
	setHeader();

	resizeViewport();
	util_addEventHandler(window, "resize", resizeViewport);

	/* show Splash */
	var spl = getRawObject('splash');
	spl.innerHTML = "<span class=text>Karte mit Maus bewegen.<br>Doppelklick zum Zentrieren.</span>";
	spl.style.left = (getObjectWidth('viewport')-getObjectWidth('splash')) / 2 +"px";
	spl.style.top = (getObjectHeight('viewport')+getObjectTop('viewport')-getObjectHeight('splash')) / 2 +"px";
	show(spl);
	util_addEventHandler(spl, "mouseover", splash_omover);
	window.setTimeout("hide(getRawObject('splash'))", 3500);

	/* move to initial coordinates */
	map_moveToCenter(initialCoordX, initialCoordY);
}


function map_moveToCenter(coordX, coordY)
{
	//alert('moving to '+coordX+' , '+coordY);

		// convert coordinates
	var newLeft = Math.round(coordX / cellSize);
	var newTop = Math.round(-1 * coordY / cellSize);

		// center
	newLeft -= viewportHalfWidth;
	newTop -= viewportHalfHeight;

	var dx = (currentLeft - xOffset) - newLeft - 10; // border=10pixel
	var dy = (currentTop - yOffset) - newTop - 10;

	moveBy(dx, dy);
}

/****************************************************************
* MAP toolbar
****************************************************************/

function toolbar_getLegendForm()
{
	var strHTML = "&nbsp;";
	if(legendImage != null && legendImage != "")
	{
		strHTML = "<TABLE>" +
			" <TR>" +
			"  <TD><DIV style=\"width:100%;height:100%;overflow:auto\"><IMG src=\"resources/mandator/" + mandator +
				"/userspace/" + legendImage + "\"></DIV></TD>" +
			" </TR>" +
			"</TABLE>";
	}
	return strHTML;
}

	/**
	* titlebar
	*/
function toolbar_getTitleForm()
{
	var strHTML = "<TABLE>" +
		" <TR>" +
		"  <TD><DIV id=div_mandatorLogo class=mandatorLogo></DIV></TD>" +
		"  <TD><SPAN class=mapTitle>" + mapName + "</SPAN></TD>" +
		" </TR>" +
		"</TABLE>";
	return strHTML;
}

var logo = new Image();
function toolbar_initTitleForm()
{

	logo.src = "resources/mandator/"+mandator+"/logo.gif";
	window.setTimeout("toolbar_initTitleForm_waitForLogo()",350);
	window.setTimeout("toolbar_initTitleForm_waitForLogo()",1200);
}
function toolbar_initTitleForm_waitForLogo()
{
	if (logo.complete) {
		var logo_div = getRawObject('div_mandatorLogo');
		var logo_src = "<img class=mandator_logo src=resources/mandator/"+mandator+"/logo.gif>";
		logo_div.innerHTML = logo_src;
	}
}

	/**
	* POIs
	*/
function toolbar_getPOIsForm()
{
	return "<DIV id=pois_div>" + __toolbar_getPOIsForm() + "</DIV>";
}
function __toolbar_getPOIsForm()
{
  var toolbar = getRawObject("toolbar");
	var strHTML = "<TABLE style=\"width:270px;\" cellspacing=0 cellpadding=0>";

	for(var i = 0; i < arrPOICategories.length; i++)
	{
		strHTML += " <TR valign=top>" +
			"  <TD width=25>" +
			"<INPUT type=checkbox name=POICatVis id=POICatVis " +
			"onclick=\"toolbar_updatePOIsVisibility(" + i + ");\"";
		if(arrPOICategories[i].visibility)
		{
			strHTML += " checked";
		}
		strHTML += "></TD><TD>";
		if(arrPOICategories[i].icon != '')
		{
			strHTML += "<img src=\"resources/mandator/"+mandator+"/icons/"+arrPOICategories[i].icon+"\">";
		}
		strHTML += "</TD>" +
			"  <TD class=legend_poicat><a style=\"color:000000;text-decoration:none;\" href=\"\" onclick=\"toolbar_updatePOIsVisibility("+i+"); return false\">" + arrPOICategories[i].name.replace("&nbsp;"," ") + "</a></TD>" +
			" </TR>";
	}
	strHTML += "</TABLE>"+

		"<TABLE style=\"width:270px;\" cellspacing=0 cellpadding=0>" +
		" <TR valign=top>" +
		"  <TD align=right>" +
		"		<TABLE style=\"width:270px;\" cellspacing=0 cellpadding=0 id=poisearch_table>" +
		"    <TR>" +
		"     <TD>" +
		'        <DIV id="poisearch_frame" style="width:270px;display:none;overflow:auto;"></DIV>' +
		"   	</TD>" +
		"    </TR>" +
		"   </TABLE>" +
		"  </TD>" +
		" </TR>" +
		"</TABLE>";

	return strHTML;
}

function toolbar_getPOIList()
{
	return poiListHTML;
}


function toolbar_updatePOIsVisibility(POICatIdx)
{
	arrPOICategories[POICatIdx].visibility = !arrPOICategories[POICatIdx].visibility;

	var div = getRawObject('pois_div');
	div.innerHTML = __toolbar_getPOIsForm();

	toolbar_updatePOIsQueryString();
	initializeLayers(1);

	slideBy(0,0);
}

function toolbar_updatePOIsQueryString()
{
	var strCategories = "";
	var firstGroup = 1;
	for(var i = 0; i < arrPOICategories.length; i++)
	{
		if (arrPOICategories[i].visibility) {
			if(firstGroup) {
				firstGroup = 0;
			} else {
				strCategories += ",";
			}
			strCategories += arrPOICategories[i].id;
		}
	}
	strPOIsQuery = "catids=" + strCategories;
}


	/**
	* layers visibility
	*/
function toolbar_getLayersForm()
{
	return "<DIV id=layers_div>" + __toolbar_getLayersForm() + "</DIV>";
}

function __toolbar_getLayersForm()
{
	var strHTML = "<TABLE style=\"width:100%\">";

	var numBackgrounds = 0;
	for(var i = 0; i < arrLayerGroup.length; i++)
	{
		if(arrLayerGroup[i][3]) {
			numBackgrounds++;
		}
	}

	for(var i = 0; i < arrLayerGroup.length; i++)
	{
		strHTML += " <TR valign=top>" +
			"  <TD width=25>";

		if(arrLayerGroup[i][3])
		{
			/* background layergroup */
			if(numBackgrounds == 1)
			{
				activeBackgroundGroupNum = i;
				strHTML += "<INPUT type=checkbox name=layerGroupBackgroundVis checked disabled>";
			}
			else
			{
				strHTML += "<INPUT type=radio name=layerGroupBackgroundVis " +
					"onclick=\"toolbar_updateLayerVisibility(" + i + ", -1);\"";

				if(arrLayerGroup[i][0])
				{
					strHTML += " checked";
					activeBackgroundGroupNum = i;
				}

				strHTML += ">";
			}
				/* enable legend popup if legend-image defined */
			if(activeBackgroundGroupNum == i && arrLayerGroup[i][5] != '')
			{

				/*arrToolbar[6].open = true;
				arrToolbar[6].visible = true;*/
				legendImage = arrLayerGroup[i][5];
			}
			else
			{
				/*arrToolbar[6].open = false;
				arrToolbar[6].visible = false;*/
				legendImage = null;
			}
		}
		else
		{
			/* transparent layergroup */
			strHTML += "<INPUT type=checkbox name=layerGroupTransparentVis_" + i + " " +
				"onclick=\"toolbar_updateLayerVisibility(" + i + ", -1);\"";

			if(arrLayerGroup[i][0]) {
				strHTML += " checked";
			}

			strHTML += ">";
		}

		strHTML += "</TD>" +
			"  <TD><SPAN class=legend_layergroup" + (arrLayerGroup[i][0] ? "_active" : "") +
				">" + arrLayerGroup[i][2] + "</SPAN>";
			// if (layergroup is active && layergroup has legendimage)
			if (arrLayerGroup[i][0] && arrLayerGroup[i][5] != '') {
				// print popup-legende-link
				strHTML += " <a href=\"\" class=legend_layergroup onclick=\"popuplegende('"+arrLayerGroup[i][2]+"','"+arrLayerGroup[i][5]+"');return false\">Legende</a>";
			} else if (legendPopupWindow) {
				// else if popup-window exists -> close popup-window
				legendPopupWindow.close();
			}
			strHTML += "</TD></TR>";

			/* layers */
		if(arrLayerGroup[i][0])
		{
			var arrLayer = arrLayerGroup[i][4];

			if(arrLayer.length > 0)
			{
				strHTML += " <TR valign=top>" +
					"  <TD>&nbsp;</TD>" +
					"  <TD><DIV style=\"width:100%;overflow:auto;\">" +
					"   <TABLE style=\"width:100%\">";

				// show each layername only once per layergroup
				// (virtual layer grouping via name - hacked by rg)

				var strSwitchableLayersNames = "";
				var strNOTSwitchableLayersNames = "";
				var boolNameAlreadyListed = false;

				for(var k = 0; k < arrLayer.length; k++)
				{

						/* switchable layer */
					if(arrLayer[k][3] == 2)
					{
						if (strSwitchableLayersNames.indexOf(","+arrLayer[k][2]+",") == -1)
						{
							strSwitchableLayersNames += ","+arrLayer[k][2]+",";
							strHTML += " <TR valign=top>" +
										"  <TD>" +
										"   <INPUT type=checkbox name=layerVis_" + i + "_" + k + " " +
										"		onclick=\"toolbar_updateLayerVisibility(" + i + "," + k + ");\"";

							if(arrLayer[k][0])
							{
								strHTML += " checked";
							}

							strHTML += "></TD>";
						} else
							boolNameAlreadyListed = true;
					}
					else
					{
						if (strNOTSwitchableLayersNames.indexOf(","+arrLayer[k][2]+",") == -1)
						{
							strNOTSwitchableLayersNames += ","+arrLayer[k][2]+",";
							strHTML += " <TR valign=top>" +
									"  <TD>&nbsp;</TD>";
						} else
							boolNameAlreadyListed = true;
					}
					if (!boolNameAlreadyListed) {
						strHTML += "  <TD width=10>";
						// show icon image if defined, else show colored box
						if (arrLayer[k][5] == "") {
              strHTML += "   <DIV class=legend_layercolor style=\"width:8px;height:8px;background-color:#" + arrLayer[k][4] + ";\"><IMG src=\"images/empty.gif\" width=8 height=8></DIV>";
						} else {
              strHTML += "   <DIV class=legend_layercolor><IMG width=8 heigth=8 src=\"resources/mandator/" + mandator + "/userspace/" + arrLayer[k][5] + "\"></DIV>";
            }
						strHTML += "  </TD>" +
							"  <TD>" +
							"   <DIV class=legend_layer style=\"width:100%;overflow:hidden;white-space:nowrap;\">" + arrLayer[k][2] + "</DIV>" +
							"  </TD>" +
							" </TR>";
					}
					boolNameAlreadyListed = false;
				}
				strHTML += "   </TABLE></DIV>" +
				  "  </TD>" +
					" </TR>";
			}
		}
	}
	strHTML += "</TABLE>";


	return strHTML;
}

function toolbar_updateLayerVisibility(layerGroupIdx, layerIdx)
{
	oldActiveBackgroundGroupNum = activeBackgroundGroupNum;
	if(layerIdx == -1)
	{
		if(arrLayerGroup[layerGroupIdx][3])
		{
			/* background group */
			if(layerGroupIdx == activeBackgroundGroupNum) {
				return;
			}

			arrLayerGroup[layerGroupIdx][0] = true;
			arrLayerGroup[activeBackgroundGroupNum][0] = false;
			activeBackgroundGroupNum = layerGroupIdx;
			toolbar_initOverviewForm();
		}
		else
		{
			/* transparent group */
			arrLayerGroup[layerGroupIdx][0] = !arrLayerGroup[layerGroupIdx][0];
		}
	}
	else
	{
		arrLayerGroup[layerGroupIdx][4][layerIdx][0] = !arrLayerGroup[layerGroupIdx][4][layerIdx][0];

		//Toggling ALL layers of same name
		// (virtual layer grouping by name - hacked by rg)
		for(var i = 0; i < arrLayerGroup[layerGroupIdx][4].length; i++)
		{
			if (i != layerIdx ) // && arrLayerGroup[layerGroupIdx][4][i][3] == 2
			{
				if (arrLayerGroup[layerGroupIdx][4][i][2] == arrLayerGroup[layerGroupIdx][4][layerIdx][2])
				{
					arrLayerGroup[layerGroupIdx][4][i][0] = !arrLayerGroup[layerGroupIdx][4][i][0];
				}
			}
		}
	}

	var div = getRawObject('layers_div');
	div.innerHTML = __toolbar_getLayersForm();

	toolbar_updateLayerQueryString();
	initializeLayers(1);

	var backgroundGroupChanged = activeBackgroundGroupNum != oldActiveBackgroundGroupNum;
	if(backgroundGroupChanged)
	{
			/* DON't actualize toolbar (legend) */
			/* wait for click on popup link */

			/* move to initial coordinates */
		for(var i = 0; i < arrScale.length; i++)
		{
			if(arrScale[i] == startScale) {
				break;
			}
		}
		zoomTo(i);
		map_moveToCenter(initialCoordX, initialCoordY);
	}
}

function toolbar_updateLayerQueryString()
{
	var strGroups = "";
	var strGroupLayers = "";
	var strLayers = "";
	var firstGroup = 1;
	var firstGroupLayer = 1;
	for(var i = 0; i < arrLayerGroup.length; i++)
	{
		if(!arrLayerGroup[i][0])
		{
			if(firstGroup) {
				firstGroup = 0;
			} else {
				strGroups += ",";
			}

			strGroups += arrLayerGroup[i][1];
		}
		else
		{
			var firstLayer = 1;
			var addLayerGroup = false;

			var arrLayer = arrLayerGroup[i][4];
			for(var k = 0; k < arrLayer.length; k++)
			{
				if(!arrLayer[k][0])
				{
					addLayerGroup = true;
					if(firstLayer) {
						firstLayer = 0;
						strLayers += "&layers_" + arrLayerGroup[i][1] + "=";
					} else {
						strLayers += ",";
					}

					strLayers += arrLayer[k][1];
				}
			}

			if(addLayerGroup) {
				strGroupLayers += arrLayerGroup[i][1];
			}
		}
	}

	strLayerQuery = "&groupids=" + strGroups + "&grouplayerids=" + strGroupLayers +
		strLayers;
}

	/**
	* address searching
	**/
function toolbar_showAddress()
{
	var sel = getRawObject('addresssearch_housenumber');
	addressID = sel.value;
	if(addressID) {
		call('index.php?action=frontend_getAddress&addressid='+addressID, toolbar_showAddress_callback);
	} else {
		alert('Bitte w�hlen Sie die gesuchte Adresse.');
	}
}

function toolbar_showAddress_callback(init)
{
	if (init.substr(0,1) != "/")
	{
		alert(init);
		return;
	}

	eval(init);

	if (coordX!=-1 && coordY!=-1) {

		if (minX <coordX < maxX && minY <coordY < maxY) {

			/* move coordinate to center and zoom-in */
			zoomSecondMax();
			map_moveToCenter(coordX, coordY);

			/* show address circle */
			al.style.left = safeParseInt(til.style.left)*-1 + (viewportHalfWidth-10) - 25;
			al.style.top = safeParseInt(til.style.top)*-1 + (viewportHalfHeight-10) - 25;
			al.style.visibility = "visible";

			addressShown = true;
			addressCoordX = coordX;
			addressCoordY = coordY;
		} else {
			alert('Die Koordinaten dieser Adresse liegen ausserhalb des Kartenbereichs!');
		}
	} else {
		alert('Bitte w&auml;hlen Sie die gesuchte Adresse.');
	}
}

function toolbar_storeAddressTemporary()
{
	restoreCityID = cityID;
	restoreStreetName = streetName;
	restoreStreetID = streetID;
	restoreAddressID = addressID;
}

function toolbar_restoreTemporaryAddress()
{
	cityID = restoreCityID;
	streetName = restoreStreetName;
	streetID = restoreStreetID;
	addressID = restoreAddressID;
	toolbar_clearTemporaryAddress();
}

function toolbar_clearTemporaryAddress()
{
	restoreCityID = null;
	restoreStreetName = "";
	restoreStreetID = null;
	restoreAddressID = null;
}

function toolbar_showAddressStreetList(e)
{
	e = util_fixEventObj(e);



	var fieldObj = getRawObject('addresssearch_street');
	var listWidth = getObjectWidth(fieldObj);
	var val = fieldObj.value;

	if(e.type == "click" && streetID != null)
	{
		streetName = val;
		toolbar_storeAddressTemporary();

		streetName = "";
		streetID = null;
		addressID = null;
		fieldObj.value = "";
		val = "";

			/* force resizing of street input box */
		var selObj = getRawObject('addresssearch_housenumber');
		hide(selObj);
		listWidth = (getObjectWidth("addresssearch_street_table")-4);
	}
	else
	{
		toolbar_clearTemporaryAddress();

	}

	showList(e, 'addresssearch_street', val, arrCacheStreet, 7, 0, toolbar_updateAddressSearchForm_street, toolbar_hideAddressStreetList, listWidth);

}

function toolbar_hideAddressStreetList()
{
	var fieldObj = getRawObject('addresssearch_street');
	if(fieldObj.value == "" && restoreStreetName != "")
	{
		toolbar_restoreTemporaryAddress();
		toolbar_updateAddressSearchForm_callback("useCache");
	}
}


function toolbar_getAddressSearchForm()
{
	var strHTML =
		"<TABLE style=\"width:100%\">" +
		" <TR valign=top>" +
		"  <TD width=10><SPAN class=text>Ort:</SPAN></TD>" +
		"  <TD align=right>" +
		"   <SPAN id=addresssearch_city_area class=text></SPAN>" +
		"  </TD>" +
		" </TR>" +
		"</TABLE>" +
		"<TABLE style=\"width:100%\">" +
		" <TR valign=top>" +
		"  <TD width=90><SPAN class=text>Strasse, Nr:</SPAN></TD>" +
		"  <TD align=right>" +
		"		<TABLE style=\"width:100%;\" id=addresssearch_street_table>" +
		"    <TR>" +
		"     <TD>" +
		"   	 <INPUT style=\"width:100%\" id=addresssearch_street type=text value=\"\" " +
			"onclick=\"toolbar_showAddressStreetList(event);\" " +
			"onkeyup=\"toolbar_showAddressStreetList(event);\" disabled>" +
		"   	</TD>" +
		"     <TD width=1>" +
		"      <SELECT style=\"width:1px;visibility:hidden;%\" id=addresssearch_housenumber " +
			"onchange=\"addressID = this.value\">" +
		"       <OPTION value=-1></OPTION>" +
		"   	 </SELECT>" +
		"		  </TD>" +
		"    </TR>" +
		"   </TABLE>" +
		"  </TD>" +
		" </TR>" +
		" <TR>" +
		"  <TD align=right colspan=2>" +
		"   <INPUT class=Button type=button value=Suchen onclick=\"javascript:toolbar_showAddress();\">" +
		"  </TD>" +
		" </TR>" +
		"</TABLE>";
	return strHTML;
}

function toolbar_initAddressSearchForm()
{
	if(addressID != null || cityID != null) {
		toolbar_updateAddressSearchForm_callback("useCache");
	} else {
		call('index.php?action=frontend_getAddresses&mapid='+mapID, toolbar_updateAddressSearchForm_callback);
	}
}

function toolbar_updateAddressSearchForm_city(cid)
{
	cityID = cid;
	call('index.php?action=frontend_getAddresses&mapid='+mapID+'&cityid='+cid, toolbar_updateAddressSearchForm_callback);
}
function toolbar_updateAddressSearchForm_street(sid, sname)
{
	if(sid == -1)
	{
		streetID = null;
		streetName = null;
		var sel = getRawObject('addresssearch_housenumber');
		sel.options.length = 0;
		sel.style.width = 1;
		sel.disabled = true;
		hide(sel);
	}
	else
	{
		var inputObj = getRawObject('addresssearch_street');
		inputObj.value = sname;
		streetID = sid;
		streetName = sname;
		call('index.php?action=frontend_getAddresses&mapid='+mapID+'&cityid='+cityID+'&streetid='+sid, toolbar_updateAddressSearchForm_callback);
	}
}

function toolbar_updateAddressSearchForm_callback(init)
{
	var arrCity = -1;
	var arrStreet = -1;
	var arrHouseNumber = -1;

	if(init == "useCache")
	{
		 arrCity = arrCacheCity;
		 arrStreet = arrCacheStreet;
		 arrHouseNumber = arrCacheHouseNumber;
	}
	else
	{
		if(init.substr(0,1) != "/")
		{
			alert(init);
			return;
		}

		eval(init);
	}

		/* cities */
	if(arrCity != -1)
	{
		arrCacheCity = arrCity;
		var span = getRawObject('addresssearch_city_area');
		var strHTML = "";

		if(arrCity.length == 2)
		{
			strHTML = arrCity[1][1];
		}
		else
		{
			strHTML = "<SELECT style=\"width:100%\" id=addresssearch_city onchange=\"updateAddressSearchForm_city(this.value)\">";
			for(var i = 1; i < arrCity.length; i++)
			{
				if(arrCity[i][0] == cityID) {
					strHTML += " <OPTION value=" + arrCity[i][0] + " selected>" + arrCity[i][1] + "</OPTION>";
				} else {
					strHTML += " <OPTION value=" + arrCity[i][0] + ">" + arrCity[i][1] + "</OPTION>";
				}
			}
			strHTML += "</SELECT>";
		}
		cityID =  arrCity[1][0];

		span.innerHTML = strHTML;
	}

		/* streets */
	if(arrStreet != -1)
	{
		arrCacheStreet = arrStreet;
		var input = getRawObject('addresssearch_street');
		input.disabled = false;
		if(streetName != null) {
			input.value = streetName;
			var sel = getRawObject('addresssearch_housenumber');
			sel.value = '';
		}
	}

		/* housenumbers */
	if(arrHouseNumber != -1 && streetID != null)
	{
		arrCacheHouseNumber = arrHouseNumber;
		var sel = getRawObject('addresssearch_housenumber');
		sel.disabled = false;
		sel.options.length = 0;
		show(sel);
		sel.style.width=null;

		for(var i = 1; i < arrHouseNumber.length; i++)
		{
			sel.options[i-1] = new Option(arrHouseNumber[i][1], arrHouseNumber[i][0]);
			if(arrHouseNumber[i][0] == addressID) {
				sel.options[i-1].selected = true;
			}
		}
	}
}


	/**
	* map overview
	*/
function toolbar_getOverviewForm()
{
	var strHTML = "<TABLE width=280 width=100%>" +
		" <TR>" +
		"  <TD><DIV id=overviewLayer>" +
			"<IMG id=overviewImage src=\"images/empty.gif\" width=256 height=120>" +
			"<DIV id=overviewPositionDisplayer></DIV>" +
			"</DIV></TD>" +
		" </TR>" +
		" <TR>" +
		"  <TD>" +
		"   <SPAN class=bold_text>Koordinaten:</SPAN><BR>" +
		"   <SPAN id=coordinates class=text></SPAN>" +
		"  </TD>" +
		" </TR>" +
		"</TABLE>";
	return strHTML;
}

var overviewLayerPos = [0,0];
function toolbar_initOverviewForm()
{
	var img = getRawObject('overviewImage');
	if (img) {
		//console.log('index.php?action=frontend_getOverviewImage&mapid='+mapID+'&layergroupid='+activeBackgroundGroupNum);
		img.src = 'index.php?action=frontend_getOverviewImage&mapid='+mapID+'&layergroupid='+activeBackgroundGroupNum;

		var d = getRawObject('overviewLayer');

		util_setObjectCursor(d, "crosshair");
		util_addEventHandler(d, "mouseup", overview_omup);
		overviewLayerPos = getLayerPosition(d);

		var posDisplayer = getRawObject('overviewPositionDisplayer');
		posDisplayer.style.width = overviewViewportWidth + "px";
		posDisplayer.style.height = overviewViewportHeight + "px";
		updateOverview();
	}

}

function updateOverviewViewportSize()
{
	overviewViewportWidth = Math.round((viewportWidth*cellSize)/extentWidth * overviewWidth);
	overviewViewportHeight = Math.round((viewportHeight*cellSize)/extentHeight * overviewHeight);
	//alert("viewport");
	var posDisplayer = getRawObject('overviewPositionDisplayer');
	if(posDisplayer)
	{
		posDisplayer.style.width = overviewViewportWidth + "px";
		posDisplayer.style.height = overviewViewportHeight + "px";
		updateOverview();
	}
}

function updateOverview()
{
	var coord_span = getRawObject('coordinates');
	if(coord_span)
	{
		var left = (currentLeft - xOffset) * cellSize;
		var top = (currentTop - yOffset) * -cellSize;

		var posDisplayer = getRawObject('overviewPositionDisplayer');

		if ( getObjectHeight('overviewPositionDisplayer') > getObjectHeight('overviewLayer')  ||
			  getObjectWidth('overviewPositionDisplayer') > getObjectWidth('overviewLayer')  )
			hide(posDisplayer);
		else if (viewPort_latch_showing)
			show(posDisplayer);


		posDisplayer.style.left = Math.round((left-minX)/extentWidth * overviewWidth + overviewXOffset - 1) + "px";
		posDisplayer.style.top = Math.round((maxY-top)/extentHeight * overviewHeight - 1) + "px";

			// coordinate display
		left += viewportHalfWidth * cellSize;
		top += viewportHalfHeight * -cellSize;

		var wgs84 = util_convertCoordinates(COORD_CH1903, [left,top], COORD_WGS84);
		var longParts = util_getDegDecParts(wgs84[0]);
		var latParts = util_getDegDecParts(wgs84[1]);

		coord_span.innerHTML = left.toFixed(2) + "m / " + top.toFixed(2) + 'm<BR>' +
			longParts[0] + "&deg; " + longParts[1] + "' " + longParts[2] + "\" E / " +
				latParts[0] + "&deg; " + latParts[1] + "' " + latParts[2] + "\" N";
	}

}

function overview_omup(e)
{
		/* get correct click position */
	e = util_fixEventObj(e);
	var x, y;

	if(e.offsetX)
	{
		x = e.offsetX;
		y = e.offsetY;
	}
	else
	{
		x = e.layerX;
		y = e.layerY;
	}

	var obj = getEventSrc(e);
	if(obj.id == 'overviewPositionDisplayer')
	{
		x += safeParseInt(obj.style.left);
		y += safeParseInt(obj.style.top);
	}

		/* compute map coordinates and center over */
	var coordX = (x-overviewXOffset)/overviewWidth * extentWidth + minX;
	var coordY = maxY - (y/overviewHeight * extentHeight);
	map_moveToCenter(coordX, coordY);

		/* adjust the overview position displayer */
	var posDisplayer = getRawObject('overviewPositionDisplayer');
	posDisplayer.style.left = (x-1-overviewViewportWidth/2) + "px";
	posDisplayer.style.top = (y-1-overviewViewportHeight/2) + "px";
}

	/**
	* button bar
	*/
function toolbar_getButtonForm()
{
	var strHTML = "";
	if (!fullscreen) {
		strHTML = strHTML + "<TABLE width=600 align=right>" +
		" <TR>" +
		"  <TD>" +
		"   <SPAN class=bold_text>Zoom:&nbsp;</SPAN>" +
		"  </TD>";
	} else {
		strHTML = strHTML + "<TABLE width=230 id=fullscreenButtonbar align=right>" +
			" <TR>";
	}
	strHTML = strHTML + "  <TD>" +
		"   <A href=\"javascript:zoomOut();\">" +
			"<IMG alt=\"Wegzoomen\" title=\"Wegzoomen\" src=\"images/zoomout.gif\" border=0></A>" +
		"  </TD>" +
		"  <TD>" +
		"	<SPAN id=zoomlevelselector></SPAN>" +
		"  </TD>" +
		"  <TD>" +
		"   <A href=\"javascript:zoomIn();\">" +
			"<IMG alt=\"Heranzoomen\" title=\"Heranzoomen\" src=\"images/zoomin.gif\" border=0></A>" +
		"  </TD>";
	if (!fullscreen) {
		strHTML = strHTML + "  <TD width=200 align=right>"+
		"  <TD>" +
		"   <SPAN class=bold_text>Massstab:&nbsp;</SPAN>";
	} else {
		strHTML = strHTML + "  <TD align=right><SPAN class=bold_text>&nbsp;</SPAN>";
	}
	strHTML = strHTML +
		"<SPAN id=scale class=bold_text></SPAN>" +
		"  </TD>" +
		"  <TD width=200 align=right>" +
		"   <A class=buttonbarButton href=\"javascript:toggleFullScreen();\"><IMG ";
	if (!fullscreen) {
		strHTML = strHTML + "alt=\"Karte maximieren\" title=\"Karte maximieren\" class=buttonbarButton src=\"images/fullscreen.gif\" "+
				"onmouseover=\"this.src='images/fullscreen_over.gif'\"  onmouseout=\"this.src='images/fullscreen.gif'\"  border=0>";
	}	else {
		strHTML = strHTML + "alt=\"Zur&uuml;ck zur Normalansicht\" title=\"Zur&uuml;ck zur Normalansicht\" class=buttonbarButton src=\"images/fullscreen_revert.gif\" "+
					"onmouseover=\"this.src='images/fullscreen_revert_over.gif'\"  onmouseout=\"this.src='images/fullscreen_revert.gif'\" border=0><span style='font-size: 8pt;' class=bold_text>Zur&uuml;ck&nbsp;</span>";
	}
	strHTML = strHTML + "</A>";
	strHTML += "   <A class=buttonbarButton href=\"javascript:printMap();\"><IMG alt=\"Drucken\" title=\"Drucken\" class=buttonbarButton src=\"images/print.gif\" " +
    "		onmouseover=\"this.src='images/print_over.gif'\" " +
		"		onmouseout=\"this.src='images/print.gif'\" " +
		"		border=0></A>" +
		"  </TD>" +
		" </TR>" +
		"</TABLE>";

	return strHTML;
}

function updateScale()
{
	var s = getRawObject('scale');
	if(s) {
		s.innerHTML = "1:" + scale;
	}
	var theHTML = "<TABLE><TR><TD><IMG src=images/spacer.gif width=6></td>";
	var zoomlevelselector = getRawObject('zoomlevelselector');

	if (zoomlevelselector)
	{
		if (!fullscreen)
		{
			for (i=0;i<arrScale.length;i++)
			{
				var cellsize = 4 + 2*i;
				if (i != currentScale) {
					html_zoomlevelbox = "<TD width="+cellsize+">"+
											" <SPAN class=zoomlevelbox><A href=\"javascript:zoomTo("+i+");\">" +
											" <IMG src=\"images/spacer.gif\" width="+cellsize+" border=0></A></SPAN></td>";

				} else {
					html_zoomlevelbox = "<TD width="+cellsize+">" +
											" <SPAN height=100% class=zoomlevelbox_active>" +
											" <IMG src=\"images/spacer.gif\" width="+cellsize+" border=0></SPAN></td>";
				}
				theHTML = theHTML +
					html_zoomlevelbox +
					"<TD><IMG src=images/spacer.gif width=6></TD>";
			}
			theHTML = theHTML + "</TR></TABLE>";
			zoomlevelselector = getRawObject('zoomlevelselector');
			zoomlevelselector.innerHTML = theHTML;
		}
		else
		{
		zoomlevelselector.innerHTML = "&nbsp;";
		}
	}
}

/*
	LIST of tools. Each entry as array with the following
	items:

		[0] => name
		[1] => icon
		[2] => draw-functionpointer
		[3] => init-functionpointer
		[4] => always-open-flag
		[5] => open-flag,
		[6] => minheight,
		[7] => maxheight
		[8] => visible-flag
		[9] => custom_position
*/
var arrToolbar = [];

function initToolBar()
{
	arrToolbar = [
		{
			name : "Title",
			icon : "",
			drawfunction : toolbar_getTitleForm,
			initfunction : toolbar_initTitleForm,
			alwaysopen : true,
			open : true,
			minheight : 0,
			maxheight : 0,
			visible : true,
			customposition : "header",
			infotext : ""
		},
		{
			name : "&Uuml;bersichtskarte&nbsp;&nbsp;&nbsp;",
			icon : "overview.png",
			drawfunction : toolbar_getOverviewForm,
			initfunction : toolbar_initOverviewForm,
			alwaysopen : false,
			open : (accTabOverview == 2),
			minheight : 150,
			maxheight : 150,
			visible : (accTabOverview != 0),
			customposition : "viewport_latch",
			infotext : "Das rote Ausschnittsrechteck wird durch Klick in einen anderen Kartenabschnitt verschoben."
		},
		{
			name : "Scale",
			icon : "",
			drawfunction : toolbar_getButtonForm,
			initfunction : updateScale,
			alwaysopen : true,
			open : true,
			minheight : 0,
			maxheight : 0,
			visible : true,
			customposition : "header",
			infotext : ""
		},
		{
			name : "Adresssuche",
			icon : "address.png",
			drawfunction : toolbar_getAddressSearchForm,
			initfunction : toolbar_initAddressSearchForm,
			alwaysopen : false,
			open : (accTabAddressSearch == 2),
			minheight : 120,
			maxheight : 120,
			visible : (accTabAddressSearch != 0),
			customposition : false,
			infotext : "Beim Klick in das Dialogfeld erscheint das komplette Strassenverzeichnis. W&auml;hlen Sie " +
				"die Strasse Ihrer Wahl aus oder geben Sie den Anfangsbuchstaben der gew&uuml;nschten Strasse in das " +
				"Dialogfeld ein. Klicken Sie anschliessen auf &laquo;Suchen&raquo;."
		},
		{
			name : "Wichtige Geb&auml;ude und Anlagen",
			icon : "pois.png",
			drawfunction : toolbar_getPOIsForm,
			initfunction : false,
			alwaysopen : false,
			open : (accTabPOIs == 2),
			minheight : 120,
			maxheight : 120,
			visible : (accTabPOIs != 0),
			customposition : false,
			infotext : "W&auml;hlen Sie die Kategorien, die in der Karte angezeigt werden sollen. "+
			"Klicken Sie dann die einzelnen Eintr&auml;ge in der Liste "+
			" an oder &uuml;berfahren Sie die angezeigten Punkte auf der Karte mit der Maus."
		},
		{
			name : "Karte / Ansicht",
			icon : "layers.png",
			drawfunction : toolbar_getLayersForm,
			initfunction : false,
			alwaysvisible : false,
			open : (accTabLayers == 2),
			minheight : 100,
			maxheight : 0,
			visible : (accTabLayers != 0),
			customposition : false,
			infotext : "W&auml;hlen Sie die gew&uuml;nschte Karte. Die verschiedenen " +
				"Ebenen der Karte k&ouml;nnen ein- und ausgeblendet werden. " +
				"Mit Klick auf `Legende` werden zus&auml;tzliche Detail-Informationen " +
				"in einem PopUp-Fenster ge&ouml;ffnet."
		}/*,
		{
			name : "Legende",
			icon : "",
			drawfunction : toolbar_getLegendForm,
			initfunction : false,
			alwaysvisible : false,
			open : false,
			minheight : 100,
			maxheight : 0,
			visible : false,
			customposition : false,
			infotext : ""
		}*/
	];
}

function splash_omover() {
	hide(getRawObject('splash'));
}

function showInfoText(buttonID, text)
{
	var l = getRawObject("infotextDisplayer");
	if(!l)
	{
		l = document.createElement("div");
		l.id = "infotextDisplayer";
		l.className = "infotextDisplayer";
		l.style.position = "absolute";
		document.body.appendChild(l);
	}

	l.innerHTML = "<SPAN>" + text + "</SPAN>";
	var dim = getLayerDimensions(l);

	var posObj = getRawObject(buttonID);
	var pos = getLayerPosition(posObj);
	l.style.left = (pos[0]-dim[0]) + "px";
	l.style.top = pos[1] + "px";
	l.style.visibility = "visible";
}

function hideInfoText(buttonID)
{
	var l = getRawObject("infotextDisplayer");
	if(l) {
		l.style.visibility = "hidden";
	}
}


function setToolbar(toolIndex)
{
	var arrInitList = [];
	var toolbar = getRawObject('toolbar');
	var h = getObjectHeight('toolbar');
	toolbar.style.height = getObjectHeight('viewport');

		/* tool-toggling */
	if(toolIndex > -1) {
		arrToolbar[toolIndex].open = !arrToolbar[toolIndex].open;
	}

		/* drawing main toolbar */
	var strHTML = "<TABLE width=290 cellspacing=0 cellpadding=0>";
	for(var i = 0; i < arrToolbar.length; i++)
	{
		var tool = arrToolbar[i];
		if(tool.visible && !tool.customposition)
		{
			if(tool.name)
			{
				var open = tool.alwaysopen || tool.open ? "open" : "closed";
				strHTML += " <TR>" +
					"  <TD class=toolbarTab " +
						"onclick=\"setToolbar(" + i + ");\" " +
						"onmouseover=\"toggleClass(this, 'toolbarTab', 'toolbarTab_over');" +
							"document.getElementById('tab" + i + "').src='images/tooltabbg_" + open + "_over.png';\" " +
						"onmouseout=\"toggleClass(this, 'toolbarTab', 'toolbarTab_over');" +
							"document.getElementById('tab" + i + "').src='images/tooltabbg_" + open + ".png';\">" +
					"   <TABLE width=\"100%\" cellpadding=0 cellspacing=0 >" +
					"    <TR>" +
					"     <TD width=25><IMG id=\"tab" + i + "\" src=\"images/tooltabbg_" + open + ".png\" class=pngFix></TD>" +
					"     <TD width=25>";

				if(tool.icon) {
					strHTML += "      <IMG src=\"images/" + tool.icon + "\" class=tabIcon width=20 height=20>";
				} else {
					strHTML += "&nbsp;";
				}

				strHTML += "     </TD>" +
					"     <TD><SPAN class=tabTitle>" + tool.name + "</SPAN></TD>";

				if(tool.infotext != "")
				{
					strHTML += "     <TD width=25 align=right>" +
						"<A href=\"javascript:hideInfoText();\" id=\"infotext_" + i + "\" " +
							"onmouseover=\"showInfoText('infotext_" + i + "','" + util_makeJavaScriptSafe(tool.infotext) + "');\" " +
							"onmouseout=\"hideInfoText();\">" +
						"<IMG src=\"images/info.gif\" border=0></A></TD>";
				}
				else
				{
					strHTML += "    <TD width=25>&nbsp;</TD>";
				}

				strHTML += "    </TR>" +
					"   </TABLE>" +
					"  </TD>" +
					" </TR>";
			}

			if(tool.alwaysopen || tool.open)
			{
				strHTML += " <TR>" +
					"  <TD class=toolbarTabContent>" +
					tool.drawfunction() +
					"  </TD>" +
					" </TR>";

				if(tool.initfunction) {
					arrInitList[arrInitList.length] = tool.initfunction;
				}
			}

			if(i != arrToolbar.length-1)
			{
				strHTML += " <TR>" +
					"  <TD class=toolbarSpacer></TD>" +
					" </TR>";
			}
		}
	}
	//strHTML += "<TR><TD align=right><a target=_blank href=http://www.mozilla.com><img border=0 src=images/firefox.gif></A></TD></TR>";
	strHTML += "</TABLE>";
	toolbar.innerHTML = strHTML;

		/* initing */
	for(var i = 0; i < arrInitList.length; i++) {
		arrInitList[i]();
	}
}

function setHeader()
{
	var arrInitList = [];
	var header = getRawObject('header');

		/* drawing header */
	var strHTML = "<TABLE class=header height=60 width=100%><TR>";
	for(var i = 0; i < arrToolbar.length; i++)
	{
		var tool = arrToolbar[i];
		if(tool.visible && tool.customposition == "header")
		{

			if(tool.alwaysopen || tool.open)
			{
				strHTML += "" +
					"  <TD class=toolbarContent>" +
					tool.drawfunction() +
					"  </TD>";

				if(tool.initfunction) {
					arrInitList[arrInitList.length] = tool.initfunction;
				}
			}


		}
	}
	strHTML += "</TR></TABLE>";
	header.innerHTML = strHTML;

		/* initing */
	for(var i = 0; i < arrInitList.length; i++) {
		arrInitList[i]();
	}
}

function setViewport_latch(toolIndex)
{
	var arrInitList = [];
	var viewport_latch = getRawObject('viewport_latch');


		/* tool-toggling */
	if(toolIndex > -1) {
		arrToolbar[toolIndex].open = !arrToolbar[toolIndex].open;
	}
	var open_counter = 0;

		/* drawing Viewport_latch */
	var strHTML = "<TABLE cellpadding=0 cellspacing=0><TR>";
	for(var i = 0; i < arrToolbar.length; i++)
	{
		var tool = arrToolbar[i];
		if(tool.visible && tool.customposition == "viewport_latch")
		{
			if(tool.name)
			{
				var open = tool.alwaysopen || tool.open ? "open" : "closed";
				strHTML += "<TD valign=top><TABLE cellpadding=0 cellspacing=0>";
				if(tool.name != "Scale") {

					strHTML += "<TR>" +
						"  <TD class=toolbarTab " +
							"onclick=\"hideInfoText();setViewport_latch(" + i + ");\" " +
							"onmouseover=\"toggleClass(this, 'toolbarTab', 'toolbarTab_over');" +
								"document.getElementById('tab" + i + "').src='images/tooltabbg_" + open + "_over.png';\" " +
							"onmouseout=\"toggleClass(this, 'toolbarTab', 'toolbarTab_over');" +
								"document.getElementById('tab" + i + "').src='images/tooltabbg_" + open + ".png';\">" +
						"   <TABLE width=100% border=0 cellpadding=0 cellspacing=0>" +
						"    <TR>" +
						"     <TD width=25><IMG id=\"tab" + i + "\" src=\"images/tooltabbg_" + open + ".png\" class=pngFix></TD>" +
						"     <TD width=25>";

					if(tool.icon) {
						strHTML += "      <IMG src=\"images/" + tool.icon + "\" class=tabIcon width=20 height=20>";
					} else {
						strHTML += "&nbsp;";
					}
					strHTML += "     </TD>";
					if(printing) {
						strHTML += "     <TD><SPAN class=tabTitle>" + mapName + "&nbsp;</SPAN></TD>";
					} else {
						strHTML += "     <TD><SPAN class=tabTitle>" + tool.name + "</SPAN></TD>";
					}
					if(tool.open || tool.alwaysopen) {
						strHTML += "     <TD width=25 align=right>" +
								"<A href=\"javascript:hideInfoText();\" id=\"infotext_" + i + "\" " +
									"onmouseover=\"showInfoText('infotext_" + i + "','" + util_makeJavaScriptSafe(tool.infotext) + "');\" " +
									"onmouseout=\"hideInfoText();\">" +
								"<IMG src=\"images/info.gif\" border=0></A></TD>";
					}
					if(i == 1 && tool.open || tool.alwaysopen) {
						strHTML += "     <TD width=25 align=center><IMG src=\"images/close.gif\"></TD>";
					}

					strHTML += "    </TR>" +
						"   </TABLE>" +
						"  </TD>" +
						" </TR>";
					if(tool.alwaysopen || tool.open)
					{
						strHTML += " <TR>" +
							"  <TD";
						if(i == 1) { // Ãƒbersichtskarte
							strHTML += " class=toolbarTabContent_overview";
						} else {
							strHTML += " class=toolbarTabContent";
						}
						strHTML += ">" +
							tool.drawfunction() +
							"  </TD>" +
							" </TR>";

						if(tool.initfunction) {
							arrInitList[arrInitList.length] = tool.initfunction;
						}
						open_counter++;
					}
				} else {
					// Scale
					if (!printing)
					{
						strHTML += " <TR>" +
							"  <TD class=toolbarTab>" +
							tool.drawfunction() +
							"  </TD>" +
							" </TR>";
						if(tool.initfunction) {
							arrInitList[arrInitList.length] = tool.initfunction;
						}
					}
				}
			}



			strHTML += " </TABLE></td>";
		}
	}
	strHTML += "</TR></TABLE>";
	viewport_latch.innerHTML = strHTML;

	/* initing */
	for(var i = 0; i < arrInitList.length; i++) {
		arrInitList[i]();
	}

	/* positioning */
	var h = getObjectHeight('viewport_latch');
	var w = getObjectWidth('viewport_latch');

	// IE Hack: sometimes 32px are missing -> ???
	if(document.all && h==186) {
		h = 218;
	}

	var vp_h = getObjectHeight('viewport');
	var vp_w = getObjectWidth('viewport');
	var vp_l = getObjectLeft('viewport');

	// MOZ Hack: 1px => 9px -> ???
	if(vp_l == 1) {
		vp_l = 9;
	}

	var vp_t = getObjectTop('viewport');
	// viewport_latch is printed only if it fits into the viewport
	if (!isNaN(vp_l) && w < vp_w && h < vp_h) {
		//shiftTo('viewport_latch', vp_l+1, vp_t+vp_h-h-1);
		shiftTo('viewport_latch', vp_l+1, vp_t);
		viewPort_latch_showing = true;
		show('viewport_latch');
		show('overviewPositionDisplayer');
		updateOverview();
	} else {
		viewPort_latch_showing = false;
		hide('viewport_latch');
		hide('overviewPositionDisplayer');
	}
}


function toggleFullScreen() {
	fullscreen = fullscreen ? false : true;
	if (fullscreen) {
		hide('toolbar');

		//move buttonBar to viewport_latch
		arrToolbar[2].customposition = 'viewport_latch';

		//hide the housenumber Select (buggy IE shows it over the map)
		hide(getRawObject('addresssearch_housenumber'));
	} else {

		show('toolbar');

		//printing Stuff
		printing = false;
		show('header');
		show(getRawObject('glassLayer'));

		//move buttonBar to header
		arrToolbar[2].customposition = 'header';

		//show the housenumber Select (buggy IE)
		show(getRawObject('addresssearch_housenumber'));
	}
	resizeViewport();
}

function printMap()
{
  var left = (currentLeft - xOffset) * cellSize;
  var top = (currentTop - yOffset) * -cellSize;
  left += viewportHalfWidth * cellSize;
  top += viewportHalfHeight * -cellSize;

	window.open('index.php?action=frontend_getPrintImage&mapid='+mapID+'&l='+left+'&t='+top+'&w='+viewportWidth+'&h='+viewportHeight+'&s='+scale+strLayerQuery);
  /*if(!fullscreen) {toggleFullScreen();}
	printing = true;

	hide('header');

	//resizeViewport();
	viewport.style.width = 841 + "px";
  viewport.style.height = 595 + "px";

	// enable IE to print the Map area
	if (getRawObject('glassLayer')) hide(getRawObject('glassLayer'));

	//hide the housenumber Select
	//hide(getRawObject('addresssearch_housenumber'));

	window.setTimeout("window.print();printing=false;",750);*/
}

	/********************************************************************
	* JS search list
	*********************************************************************/
var showListDiv = null;
var showListCallbackFunc = null;
var hideListCallbackFunc = null;
var sld_top = 0;
var sld_bottom = 0;
var sld_left = 0;
var sld_right = 0;

function hideList(e)
{
	e = util_fixEventObj(e);
	if(showListDiv) {
		var pos = getMousePosition(e);
		if(pos[0] < sld_left || pos[0] > sld_right || pos[1] < sld_top || pos[1] > sld_bottom) {
			hideList_do();
		}
	}
}

function hideList_do()
{
	util_removeEventHandler(document, "click", hideList);

	showListDiv.style.visibility = "hidden";

	if(hideListCallbackFunc) {
		hideListCallbackFunc();
	}

	showListDiv = null;
	showListCallbackFunc = null;
	hideListCallbackFunc = null;
	sld_top = 0;
	sld_bottom = 0;
	sld_left = 0;
	sld_right = 0;
}

function clickList(listObj)
{
	var val = listObj.options[listObj.selectedIndex].value;
	var text = listObj.options[listObj.selectedIndex].text;
	listObj.selectedIndex = -1;
	listObj.blur();

	if(showListCallbackFunc) {
		showListCallbackFunc(val, text);
	}

	hideList_do();
}

function showList(e, fieldObjId, val, arrVal, maxItems, doSort, callBackFunc, hideCallbackFunc, width)
{
	e = util_fixEventObj(e);

	var fieldObj = getRawObject(fieldObjId);
	var val = val.toUpperCase();
	showListCallbackFunc = callBackFunc;
	hideListCallbackFunc = hideCallbackFunc;

	if(!showListDiv)
	{
		showListDiv = document.createElement("div");
		showListDiv.id = "showListDiv";
		showListDiv.style.position = "absolute";
		showListDiv.style.visibility = "hidden";
		document.body.appendChild(showListDiv);
	}

	var charCode = (e.charCode) ? e.charCode : e.keyCode;
	if(!width) {
		width = getObjectWidth(fieldObj);
	}

	var regExp = new RegExp("^" + val);
	var matchCnt = 0;
	var matchIndex = 0;
	var strOpt = "";
	for(var i = 1; i < arrVal.length; i++)
	{
		if(regExp.test((arrVal[i][1]).toUpperCase()))
		{
			matchCnt++;
			matchIndex = i;
			strOpt +=" <OPTION value=\"" + arrVal[i][0] + "\">" +
				arrVal[i][1] + "</OPTION>";
		}
	}

	if(matchCnt == 1) {
		if(val == (arrVal[matchIndex][1]).toUpperCase()) {
			showListCallbackFunc(arrVal[matchIndex][0], arrVal[matchIndex][1]);
			hideList_do();
			return;
		} else {
			showListCallbackFunc(-1, "");
		}
	} else {
		showListCallbackFunc(-1, "");
	}

	if(charCode == 13) {
		hideList_do();
		return;
	}

	if(matchCnt < maxItems) {
		maxItems = Math.max(2, matchCnt);
	}

	var strHTML =
		"<SELECT id=showListDiv_select onclick=\"clickList(this);\" style=\"width:" + width + "px;\" size=" + maxItems + ">" +
		strOpt +
		"</SELECT>";

	if(matchCnt > 0) {
		showListDiv.innerHTML = strHTML;

		var isFirefox = navigator.userAgent.indexOf("Firefox") != -1;
		var pos = getLayerPosition(fieldObj);
		sld_top = pos[1] - 1;
		sld_left = pos[0];

			/* hack firefox */
		if(isFirefox) {
			sld_left += 8;
		}

		sld_bottom = sld_top + getObjectHeight(showListDiv);
		sld_right = sld_left + width;

		if(showListDiv.style.visibility != "visible")
		{
			showListDiv.style.left = sld_left + "px";
			showListDiv.style.top = sld_top + getObjectHeight(fieldObj) + "px";
			showListDiv.style.visibility = "visible";

			util_addEventHandler(document, "click", hideList);
		}
	} else {
		hideList_do();
	}

	return false;
}

