

  	var currentLayer = null; //the alias indeed
    var lastLayer = null //the (translated) layer id in map
    var currentSelectionLayer = 1;
    var mapReady = false;
  	var cachedView;
    var currentCol = 1;
    var currentAtt = null;
    var currentLayerDesc = "none";
    var currentLayerDescSingular = "none";

	var allviews = new Array(
			'view_start',
			'view_toptab_map',
			'view_toptab_table',
			'view_table',
			'view_maptitle',
			'view_map',
			'view_legendswitch',
			'view_bottomtab_advice',
			'view_advice',
			'view_bottomtab_address',
			'view_addressform',
			'view_addressresult',
			'view_bottomtab_ad',
			'view_ad',
			'view_bottomtab_help',
			'view_help',
			'view_table2',
			'view_mailform',
			'view_mail',
			'dialoglibrary',
			'view_imprint'
      		);


	function hide(div) {

		// remember that using style.display may cause
		// the applet not to load, stop or start (this
		// is especially true for opera browser).
		// remember further to set both width and
		// height in IE to switch between divs.
		div.style.width="0px";
		div.style.height="0px";
	}

	function show(div) {
		div.style.width="";
		div.style.height="";
	}

	function showMap(div) {
		div.style.width="100%";
		div.style.height="330px";

	}

	function openExtFrame (url, name) {
		frame1 = window.open(url, name, "width=640,height=480,left=200,top=200");
		frame1.focus();
	}

	function selectTopic () {
		var radio = document.getElementsByName("ebene");

		for (i = 0; i < radio.length; i++) {
			if (radio[i].checked) {
				currentLayer = radio[i].value;
				for (var t = 0; t < allLayers.length; t++) {
					if (allLayers[t][0] == currentLayer) {
						currentLayerDesc = allLayers[t][1];
						currentLayerDescSingular = allLayers[t][2];
					}
				}
			}
		}
		if (mapReady) {
			activateGeometryLayer(currentLayer);
		}
	}

	function showView(viewRef) {
		for (var i = 0; i < allviews.length; i++) {
			view = document.getElementsByName(allviews[i]);
			if (view.length != 1) {
				alert("error creating view : view " + viewRef + " not found");
			}
			if (contains(viewRef, allviews[i]) >= 0) {
				if (hideByDisplay && allviews[i] != 'view_map') {
					view[0].style.display = "inline";
				} else {
					if ( allviews[i] == "view_map") {
						showMap(view[0]);
					} else {
						show(view[0]);
					}

					//view[0].style.visibility = "";
					//view[0].style.height = "";
					//view[0].style.width = "";
				}
			} else {

				if (hideByDisplay  && allviews[i] != 'view_map') {
					//alert("hiding " +  allviews[i] + "case A");
					view[0].style.display = "none";
				} else {
					//alert("hiding " +  allviews[i] + "case B");
					if ( allviews[i] == "view_map") {
						//continue;
						hide(view[0]);
					} else {
						hide(view[0]);
					}
					//view[0].style.visibility = "hidden";
					//view[0].style.height = "0px";
					//view[0].style.width = "0px";
				}
			}
		}
	}

	function showDialog(showViewRef) {
		view = document.getElementsByName(showViewRef);
		if (view.length != 1) {
			alert("error creating view : view " + showViewRef + " not found");
		}
		if (hideByDisplay  && showViewRef != 'view_map') {
			view[0].style.display = "inline";
		} else {
			show(view[0]);
			//view[0].style.visibility = "";
			//view[0].style.height = "";
			//view[0].style.width = "";
		}
	}

	function debugView(ref) {
		view = document.getElementsByName(ref);
		alert(	ref + " : \n" +
				"style.display " + view[0].style.display + "\n" +
				"style.height " + view[0].style.height + "\n" +
				"style.width " + view[0].style.width + "\n"
		);

		alert (map);

	}

	function unShowDialog(showViewRef) {
		view = document.getElementsByName(showViewRef);
		if (view.length != 1) {
			alert("error creating view : view " + showViewRef + " not found");
		}
		if (hideByDisplay  && showViewRef != 'view_map') {
			view[0].style.display = "none";
		} else {
			hide(view[0]);
			//view[0].style.visibility = "hidden";
			//view[0].style.height = "0px";
			//view[0].style.width = "10px";
		}
	}

	function showView2(showViewRef, unshowViewRef) {

		view = document.getElementsByName(showViewRef);
		if (view.length != 1) {
			alert("error creating view : view " + showViewRef + " not found");
		}
		if (hideByDisplay  && showViewRef != 'view_map') {
			view[0].style.display = "inline";
		} else {
			show(view[0]);
			//view[0].style.visibility = "";
			//view[0].style.height = "";
			//view[0].style.width = "";
		}

		for (var i = 0; i < unshowViewRef.length; i++) {
			view = document.getElementsByName(unshowViewRef[i]);
			if (view.length != 1) {
				alert("error creating view : view " + unshowViewRef[i] + " not found");
			}
			if (hideByDisplay  && unshowViewRef[i] != 'view_map') {
				view[0].style.display = "none";
			} else {
				hide(view[0]);
				//view[0].style.visibility = "hidden";
				//view[0].style.height = "0px";
				//view[0].style.width = "10px";
			}
		}
	}

	function cacheCurrentView() {
		cachedView = new Array();
		for (var i = 0; i < allviews.length; i++) {
			view = document.getElementsByName(allviews[i]);
			if (view.length != 1) {
				alert("error creating view : view " + viewRef + " not found");
			}

			if (hideByDisplay && view[0].style.display == "inline") {
				cachedView.push(allviews[i]);
			} else if (allviews[i] == 'view_map' && view[0].style.height == "330px") {
				cachedView.push(allviews[i]);
			} else if (!hideByDisplay && view[0].style.height == "") {
				cachedView.push(allviews[i]);
			}
		}
	}

	function restoreCachedView() {
		showView(cachedView);
	}

	function clearAdressForm() {
		var input1=document.getElementById("strasse");
		var input2=document.getElementById("plz");
		var input3=document.getElementById("ort");
		input1.value ="";
		input2.value ="";
		input3.value ="";
		map.removeAddresses();
		unShowDialog('view_addressresult');
		clearAdressResultTable();
	}

	function showTableView() {
		createTable();
	}

	function showMapView() {
		showView(new Array('view_tabtop_map','view_maptitle', 'view_legendswitch', 'view_map', 'view_advice', 'view_bottomtab_advice'));
		showView2('view_toptab_map',new Array('view_toptab_table'));
	}

	function showMailView() {

		result = fetchSelectionData();
		var number = result.length;
		var sum = 0;
		for (var t = 0; t < result.length; t++) {
			sum += parseInt(result[t][2]);
		}

		//update values
		document.getElementById("mailinsert_sum").innerHTML = sum;
		document.getElementById("mailinsert_layer").innerHTML = replace(getMessage("template_table_head_sel_on"), "%1", currentLayerDesc);
		var temp = replace(getMessage("template_table_head_stat"), "%1", number);
		document.getElementById("mailinsert_count").innerHTML = replace(temp, "%2", currentLayerDesc);
		document.getElementById("insert_help").innerHTML = replace(getMessage("template_table_head_help"), "%1", currentLayerDesc);

		if (result[0].length > 2)
			document.getElementById("insert_plz").innerHTML = getMessage("template_table_hh_plz_head");

		showView(new Array('view_mailform'));
	}

	function sendMail() {
		if (!checkMailForm()) return;
		var xmlHttp = createXMLHttpRequest();
		var params = "sendmail=true&product="+currentLayer;
		params += "&col="+currentCol;

		result = fetchSelectionData();

		var sostring = "";
		for (var t = 0; t < result.length; t++) {
			if (t != 0) sostring += "|";
			sostring += result[t][0];
		}

		params += "&so="+sostring;
		params += "&sender="+document.getElementById("email").value;
		params += "&firm="+document.getElementById("firma").value;
		params += "&name="+document.getElementById("zuname").value;
		params += "&forename="+document.getElementById("vorname").value;
		params += "&street="+document.getElementById("strasse").value;
		params += "&zip="+document.getElementById("plz").value;
		params += "&city="+document.getElementById("stadt").value;
		params += "&tel="+document.getElementById("tel").value;
		params += "&message="+document.getElementById("message").value;

		//sendXMLHttpGet(xmlHttp, selfURL, params, handleSendMail);
		sendXMLHttpPost(xmlHttp, selfURL, params, handleSendMail);
	}

	var handleSendMail = function(response) {
		if (response == "mailsend") {
			showView(new Array('view_mail'));
		} else {
			alert(getMessage("mess_common_sendError" + " " + response));
		}
	}

	function checkMailForm() {
		if (document.getElementById("vorname").value == "") {
			alert(getMessage("mess_missing_forename"));
	  	  	return false;
		}

		if (document.getElementById("zuname").value == "") {
			alert(getMessage("mess_missing_name"));
	  	  	return false;
		}

		if (document.getElementById("email").value == "" || !isEmail(document.getElementById("email").value)) {
			alert(getMessage("mess_missing_email"));
	  	  	return false;
		}

		if (document.getElementById("firma").value == "") {
			alert(getMessage("mess_missing_firm"));
	  	  	return false;
		}

		if (document.getElementById("tel").value == "") {
			alert(getMessage("mess_missing_tel"));
	  	  	return false;
		}
		return true;
	}

	function getMessage(name) {
		var messageObj = document.getElementById(name);
		if (messageObj != null)
			return messageObj.innerHTML;
		else
			return "Es ist ein Fehler aufgetreten!";
	}

	function validateAdressInput() {
		var input1=document.getElementById("strasse");
		var input2=document.getElementById("plz");
		var input3=document.getElementById("ort");

		if (input1.value == "" && input2.value == "" && input3.value == "") {
			alert(getMessage("mess_noAdressInput"));
			return false;
		}
		if (input2.value == "" && input3.value == "") {
			alert(getMessage("mess_noPLZORTInput"));
			return false;
		}
		if (input2.value.match("/^[0-9]{5}$/")) {
			alert(getMessage("mess_wrong_plz"));
			return false;
		}
		return true;
	}

	function doAdressSearch() {
		if (!validateAdressInput()) {
			return;
		}

		clearAdressResultTable();

		//adresssearch
		var input1=document.getElementById("strasse");
		var input2=document.getElementById("plz");
		var input3=document.getElementById("ort");

		try {
			var result = map.setAddresses({"street":input1.value, "postcode":input2.value, "city":input3.value, "country":"Germany"});
		} catch (e) {
			alert(getMessage("mess_noAdressMatching"));
			return;
		}

		if (result.length < 1) {
			alert(getMessage("mess_noAdressMatching"));
			return;
		}

		map.zoomToAddresses(result);

		var table = document.getElementById("table_adressresult");

		for (var k = 0; k < result.length; k++) {
			var resultAttributes = map.getAddressProperties(k+1);

			var pc = resultAttributes.postcode != null ? resultAttributes.postcode : " ";
			var mu = resultAttributes.municipality != null ? resultAttributes.municipality : " ";
			var ci = resultAttributes.city != null ? resultAttributes.city : " ";
			var st = resultAttributes.street != null ? resultAttributes.street : " ";

			var aEntry = createAdressEntry(k+1, '#f5f8fa', k+1, pc, mu, ci, st);
			var row = table.insertRow(-1); // -1 = am ende

			for (var z = 0; z < aEntry.length; z++) {
				var cell1 = row.insertCell(-1);
	    		cell1.className = aEntry[z][0];
	    		cell1.align = aEntry[z][1];
	    		cell1.valign = aEntry[z][2];
	    		cell1.width = aEntry[z][3];
	    		cell1.backgroundColor  = aEntry[z][4];
	    		cell1.marginTop = aEntry[z][5];
	    		cell1.marginLeft = aEntry[z][6];
	    		cell1.paddingRight = aEntry[z][7];
	    		cell1.paddingTop = aEntry[z][8];
	    		cell1.paddingLeft = aEntry[z][9];
	    		cell1.borderWidth = aEntry[z][10];
	    		cell1.borderStyle = aEntry[z][11];
	    		cell1.borderColor = aEntry[z][12];
	    		cell1.height = aEntry[z][13];
	    		//nix
	    		cell1.innerHTML = aEntry[z][15];

			}

		}
		showDialog('view_addressresult');
	}

	function clearAdressResultTable(){
		var table = document.getElementById("table_adressresult");
		while (table.rows.length > 1){
			table.deleteRow(1);
		}
	}

	function zoomToAddress(ref) {
		map.zoomToAddresses([ref]);
	}

	function replace(src, search, replace) {
		if ((src == null) || (search == null)) {
          return null;
        }
        if ((src.length == 0) || (search.length == 0)) {
          return src;
        }
        if ((replace == null) || (replace.length == 0)) {
          replace = "";
        }

        var searchlength = search.length;
        var replaceLength = replace.length;
        var Pos = src.indexOf(search, 0);

        while (Pos >= 0)
        {
        	src = src.substring(0, Pos) + replace + src.substring(Pos + searchlength);
            Pos = src.indexOf(search, Pos + replaceLength);
        }
        return src;
    }

	function showAdressResultView() {
		var table = document.getElementById("table_adressresult");
		if (table.rows.length > 1){
			showDialog('view_addressresult');
		}
	}

	function initMap() {

		mapReady = true;
		currentSelectionLayer = map.addSelectionLayer({"name":"Verteilgebiet"});
		map.setSelectionLayerStyle(currentSelectionLayer, {'fill.color':'#e74db0','stroke.color':'#e74db0','label.visibility':'false'});
		map.showSelectionLayer(currentSelectionLayer, true);
		map.activateSelectionLayer(currentSelectionLayer);

		if (currentLayer != null)
			activateGeometryLayer(currentLayer);
	}

	function cleanUpMap() {
		if (lastLayer != null) deactivateGeometryLayer(lastLayer);
		map.clearSelections({'selectionLayerIds':[currentSelectionLayer]});
		map.removeStatistics();
	}

	function activateGeometryLayer(productRef) {
		cleanUpMap();
		if (productRef.match("/[0-9]/")) {
			productId = productRef;
		} else {
			productId = map.getGeometryLayerId({'productId':productRef})
		}

	  	lastLayer = productId;
	  	map.activateGeometryLayer(productId);
	  	map.showGeometryLayer(productId, true);
	  	map.addStatistics({"type":"count", "key":replace(getMessage("content_selected_at"), "%1", currentLayerDesc), "selectionLayerId":currentSelectionLayer, "geometryLayerId":productId});

	  	//fetch attrbute layer
	  	var attLayer = map.getAttributeLayerIds({'geometryLayerId':productId});
	  	currentAtt = attLayer[0];
		var attCols = map.getAttributeColumnIds(currentAtt,  {}); //,'type':'numeric'
		currentCol = attCols[0];
		//for (var t = 0; t < attCols.length; t++) {
		  	var myCol = attCols[0]; //by default, households
		  	var colProps = map.getAttributeColumnProperties(currentAtt, myCol );
		  	map.addStatistics({"type":"sum", "key":getMessage("content_selected_hh"), "selectionLayerId":currentSelectionLayer, "attributeLayerId":currentAtt, "attributeColumnId":myCol});
		//}
		map.setStatisticsStyle({
			"outer.panel.stroke.color":"#c7d7de",
			'outer.panel.fill.color':'#f5f8fa',
			'inner.panel.light.stroke.color':'#ebf1f5',
			'inner.panel.dark.stroke.color':'#808080',
			'inner.panel.fill.color':'#ebf1f5',
			'arrow.fill.color':'#b3c1c9',
			'arrow.panel.fill.color':'#ebf1f5',
			'arrow.panel.stroke.color':'#c7d7de',
			'keys.font.color':'#57696f',
			'keys.font.style':'plain',
			'keys.font.size':'10',
			'keys.font.name':'Arial',
			'values.fill.color':'#c7d7de'
		});
	}

	function deactivateGeometryLayer(productId) {
		map.showGeometryLayer(productId, false);
	}

	function checkExistingSelections() {
		var des = false;
		try {
			if (map.getSelection({'selectionLayerId':currentSelectionLayer, 'geometryLayerId':lastLayer}).length > 0)
				des = (getConfirm("mess_del_selections"));
			else
				des = false;
		} catch (e) {des = true;}

		if (des) {
			showView(new Array('view_start'));
		}
	}

	function getConfirm(name) {
		var messageObj = document.getElementById(name);
	    if (messageObj != null)
	    	return confirm(messageObj.innerHTML);
	    else {
	    	alert("Es ist ein Fehler aufgetreten!");
	    	return true;
	    }
	}

	function fetchSelectionData() {
		var selObjProp = null;
		var request = {
				"geometryLayerId":lastLayer,
				"selectionLayerId":currentSelectionLayer,
				"geometryColumnIds":["name"],
				"attributeColumns":[
					{
						// unique attribute layer example
						"attributeLayerId":currentAtt,
						"attributeColumnIds":[currentCol]
					}
				]
			};

		try {
			selObjProp = map.getAttributes(request);
		} catch (e) {
			alert(getMessage("common_error") + getMessage("error_to_many_selections") );
			return;
		}
		//alert(selObjProp);

		var gColumnIds=selObjProp["geometryColumnIds"];
		var gContent=selObjProp["geometryContent"];
		var aColumns=selObjProp["attributeColumns"];
		var s = "";
		var result = new Array();

		for (key in gContent) {
			v1 = "";
			v2 = "";
			v3 = "";

			s+="";
			s+=""+key+"";

			v1 = key;
			var array=gContent[key];
			for (value in array) {
				s+=" "+array[value]+" ";
				v2 = array[value];
			}

			// att content
			for (g in aColumns) {
				var columnGroup=aColumns[g];
				var aContent=columnGroup.attributeContent;
				if (!columnGroup.isAmbiguous) {
					var values=aContent[key];
					for (var i=0; i<values.length; i++) {
						s+=" "+values[i]+" ";
						v3 = values[i];
					}
				}
				else {
					var datasets=aContent[key];
					for (values in datasets) {
						for (var i=0; i<values.length; i++) {
							s+=" "+values[i]+" ";
							v3 = values[i];
						}
					}
				}
			}
			result.push(new Array(v1, v2, Math.round(v3)));
		}
		return result;
	}

	function createTable() {
		try {
			if (map.getSelection({'selectionLayerId':currentSelectionLayer, 'geometryLayerId':lastLayer}).length < 1) {
			 	alert(getMessage("mess_common_noSelection"));
			 	return;
			}
		} catch (e) {
			alert(getMessage("mess_common_noSelection"));
		 	return;
		}
		result = fetchSelectionData();

		var number = result.length;
		var sum = 0;
		for (var t = 0; t < result.length; t++) {
			sum += parseInt(result[t][2]);
		}

		document.getElementById("insert_layer").innerHTML = replace(getMessage("template_table_head_sel_on"), "%1", currentLayerDescSingular);
		var temp = replace(getMessage("template_table_head_stat"), "%1", number);
		document.getElementById("insert_count").innerHTML = replace(temp, "%2", currentLayerDescSingular);

		document.getElementById("insert_sum").innerHTML = sum;

		document.getElementById("insert_help").innerHTML = replace(getMessage("template_table_head_help"), "%1", currentLayerDescSingular);

		document.getElementById("insert_layername").innerHTML = currentLayerDescSingular;


		//if (result[0].length > 2)
		//	document.getElementById("insert_plz").innerHTML = getMessage("template_table_hh_plz_head");

		//adds resultlines
		var table = document.getElementById("table_hh");

		//clear old entries
		while (table.rows.length > 1){
			table.deleteRow(1);
		}
		//table.removeRow(1);
	    for (var k = 0; k < result.length; k++) {

	    	var insert = "";

	    	var row = table.insertRow(-1); // -1 = am ende

	    	if (k == 0) {

	    		var cell1 = row.insertCell(-1);
	    		cell1.className = 'data_topleft';
	    		cell1.align = 'right';
	    		cell1.innerHTML = "<p class='normal' style='font-family:Arial; font-size:11px; color:#57696f; line-height:14px; text-align:right; line-height:20px;'>"+(k+1)+"</p>";

	    		var cell2 = row.insertCell(-1);
	    		cell2.className = 'data_topcenter';
	    		cell2.align = 'right';
	    		cell2.innerHTML = "<p class='normal' style='font-family:Arial; font-size:11px; color:#57696f; line-height:14px; text-align:right; line-height:20px;padding-right:5px; '>&nbsp;</p>";


	    		var cell3 = row.insertCell(-1);
	    		cell3.className = 'data_topcenter';
	    		cell3.align = 'right';
	    		cell3.innerHTML = "<p class='normal' style='font-family:Arial; font-size:11px; color:#57696f; line-height:14px; padding-right:5px; line-height:20px;'>"+result[k][1]+"</p>";


	    		var cell4 = row.insertCell(-1);
	    		cell4.className = 'data_topright';
	    		cell4.align = 'right';
	    		cell4.innerHTML = "<p class='normal' style='font-family:Arial; font-size:11px; color:#57696f; line-height:14px; text-align:right; padding-right:5px; line-height:20px;'>"+result[k][2]+"</p>";
	    	} else {

	    		var cell1 = row.insertCell(-1);
	    		cell1.className = 'data_left';
	    		cell1.align = 'right';
	    		cell1.innerHTML = "<p class='normal' style='line-height:20px;'>"+(k+1)+"</p>";

	    		var cell2 = row.insertCell(-1);
	    		cell2.className = 'data_center';
	    		cell2.align = 'right';
	    		cell2.innerHTML = "<p class='normal' style='line-height:20px;padding-right:5px; '>&nbsp;</p>";


	    		var cell3 = row.insertCell(-1);
	    		cell3.className = 'data_center';
	    		cell3.align = 'right';
	    		cell3.innerHTML = "<p class='normal' style='padding-right:5px; line-height:20px;'>"+result[k][1]+"</p>";


	    		var cell4 = row.insertCell(-1);
	    		cell4.className = 'data_right';
	    		cell4.align = 'right';
	    		cell4.innerHTML = "<p class='normal' style='padding-right:5px; line-height:20px;'>"+result[k][2]+"</p>";

	    	}
	    }
	    showView(new Array('view_tabtop_table', 'view_table', 'view_table2', 'view_bottomtab_advice')); showView2('view_toptab_table',new Array('view_toptab_map'));
	}

	function showMaxView() {
		var r = map.maximize();
		if(!r) alert(getMessage("common_error"));
	}

	function showLegendSymbol(value) {
		//aktuelles thema klassifizierung sichtbar schalten
		map.showAttributeLayer(currentAtt,value);
	}

	function contains(heystack, needle) {
		for (var i = 0; i < heystack.length; i++) {
     		if (heystack[i] == needle) {
				return i;
			}
		}
		return -1;
	}

	function sendXMLHttpGet(http, url, params, callback) {
		if (http) {
			//alert("sending " +  url+"?"+params);
			http.open('GET', url+"?"+params, true);
			http.onreadystatechange = function () {
				if (http.readyState == 4) {
					callback(http.responseText);
		        }
		    };
		    http.send(null);
		}
	}

	function sendXMLHttpPost(http, url, params, callback) {
		if (http) {
			http.open("POST", url, true);
			http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
			http.setRequestHeader("Content-length", params.length);
			http.setRequestHeader("Connection", "close");

			http.onreadystatechange = function() {//Call a function when the state changes.
				if(http.readyState == 4 && http.status == 200) {
					callback(http.responseText);
				}
			}
			http.send(params);
		}
	}

	function createXMLHttpRequest () {
		var xmlHttp = null;
		// Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
		if (typeof XMLHttpRequest != 'undefined') {
			xmlHttp = new XMLHttpRequest();
		}
		if (!xmlHttp) {
			// Internet Explorer 6 und �lter
		    try {
		        xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");
		    } catch(e) {
		        try {
		            xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");
		        } catch(e) {
		            xmlHttp  = null;
		        }
		    }
		}
		return xmlHttp;
	}


	function isEmail (s) {
		var a = false;
		var res = false;
		if(typeof(RegExp) == 'function') {
			var b = new RegExp('abc');
			if(b.test('abc') == true){a = true;}
		}

		if(a) {
			reg = new RegExp('^([a-zA-Z0-9\\-\\.\\_]+)'+
		                   	'(\\@)([a-zA-Z0-9\\-\\.]+)'+
							'(\\.)([a-zA-Z]{2,4})$');
			res = (reg.test(s));
		 } else {
			 res = (s.search('@') >= 1 &&
		         s.lastIndexOf('.') > s.search('@') &&
		         s.lastIndexOf('.') >= s.length-5)
		 }
		 return(res);
	}

