var map;

/*path for markers for categories!!!!!*/
var categoryMarkersPath = './images/categories/';
 
/*handle wms & wfs getfeatureInfos at the same time.*/
var clickHandler = {};
var coordinateClickHandler = {};


//umbriel
//var wfsUrl = "http://demo.navici.com/geoserver/wfs?";

//tuotanto
var wfsUrl = "http://wms1.navici.com/wfs/a9e9a1840ee69e32d59af86dd1ffeb44?";
//tuotanto, admin
//var wfsUrl = "http://wms1.navici.com/wfs/31e1bffd17d4bed7f841449eaf73d668?";
var selectFeature = null;

//need to be global.
var poiLayer = null;
var destinationsLayer;   
var restrictionsLayer;   
 
var coordinateIconSize = new OpenLayers.Size(15,15);
var coordinateIconOffset = new OpenLayers.Pixel(-(coordinateIconSize.w/2), -(coordinateIconSize.h/2));
var icon = new OpenLayers.Icon('images/coordinatemarker.gif',coordinateIconSize,coordinateIconOffset);
var coordinateMarkerLayer = new OpenLayers.Layer.Markers("Markers");

 	//declare the map controls in the toolbar
var panel, zoomBox, zOut, dragPan, measureControls, featureInfo, navigation;
Proj4js.defs["EPSG:4326"] = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs';
Proj4js.defs["EPSG:2393"] = '+proj=tmerc +lat_0=0 +lon_0=27 +k=1 +x_0=3500000 +y_0=0 +ellps=intl +towgs84=-96.0617,-82.4278,-121.7435,4.80107,0.34543,-1.37646,1.4964 +units=m +no_defs';
Proj4js.defs["EPSG:3067"] = '+proj=utm +zone=35 +ellps=GRS80 +units=m +no_defs';

//Comment out for umbriel!
OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url=";

var panZoomBar;
//Hack-flag to tell the measurecontrols that a button in panzoombar has 
//been clicked and mouseup can be ignored.
var panZoomBarButtonClicked = false;

function init() {
	//Hack. Open "welcome" tab programmatically. By default "map layers" tab needs to be open when loading page, so
	//extjs-sliders will have a correct initial value...
	var container = dijit.byId("tabContainer");
	container.selectChild(dijit.byId("welcomeContentPane"));
	
	
	//04.10.2010 - ph - new centerpoint
//	var MBR = new Array('3000000','6550000','3800000','7900000','3380000','6730000');
	var MBR = new Array('3000000','6550000','3800000','7900000','3351723','7132072');
	OpenLayers.Util.onImageLoadErrorColor = '';
	//l,b,r,t
	
	//04.10.2010 - ph - slideFactor 150 (default 50). = Pan More
	panZoomBar = new OpenLayers.Control.PanZoomBar(
	{
		slideFactor:150
	});
	map = new OpenLayers.Map( 'map',
	{ 
		maxExtent: new OpenLayers.Bounds(0,0,3750000,7850000),
		//restrictedExtent: new OpenLayers.Bounds(3000000,6500000,3750000,7855000),
		                 controls: [panZoomBar],
		units: 'm', 
		projection: "EPSG:2393",
		resolutions: [794.034895,264.639239,132.291931,26.458386,13.229193,6.614597,4.234905,2.116577,1.411246]
	},
	{
		buffer:0
	});

	//prevent the mouseup from reaching measure tools when that is active...
	panZoomBar.zoomBarUp = function(e) {
		OpenLayers.Control.PanZoomBar.prototype.zoomBarUp.apply(this, arguments);
		panZoomBarButtonClicked = true;
	}		
	panZoomBar.buttonDown = function(e) {
		OpenLayers.Control.PanZoomBar.prototype.buttonDown.apply(this, arguments);
		panZoomBarButtonClicked = true;		
	}
	panZoomBar.divClick = function(e) {
		OpenLayers.Control.PanZoomBar.prototype.divClick.apply(this, arguments);
		panZoomBarButtonClicked = true;		
	}

	OpenLayers.DOTS_PER_INCH = 96;
    base = new OpenLayers.Layer("",{isBaseLayer: true, displayInLayerSwitcher: false});
	//areas_with_feature id -> view to all areas, with field id as featureid included. 
	destinationsLayer = new OpenLayers.Layer.WMS('Areas',wmsUrl,
		              	{layers: 'retkikartta:allareas',styles:'', transparent: true}, 
		              	{singleTile: true, layerId: 'allareas', minScale:0, maxScale: 10000000, 
		              	opacity: 1, isBaseLayer: false,displayInLayerSwitcher: true,
		              	visibility:false,buffer:0});

	restrictionsLayer = new OpenLayers.Layer.WMS('Restrictions',wmsUrl,
          	{layers: 'retkikartta:restriction_split_view',styles:'', transparent: true}, 
          	{layerId: 'restrictions', minScale:0, maxScale: 1000000, 
          	opacity: 0.4, isBaseLayer: false,displayInLayerSwitcher: true,
          	visibility:false,buffer:0});
	
	
	//Point-type geometries clustered.
	poiLayer = generateVectorLayer();

	map.addLayers([base]);
	for (var i = 0; i < mapLayers.length; i++) {
		if (mapLayers[i].layerId == "taustakartta") {
			//mapLayers[i].getURL = getUrlLogicaYKJ;
			mapLayers[i].getURL = getUrlRetkikartta;
		}
		if (mapLayers[i].visibility) {
		
			map.addLayer(mapLayers[i]);
		}
	} 
	map.addLayers([destinationsLayer, restrictionsLayer, poiLayer] );

	map.addControl(new OpenLayers.Control.ScaleLine({maxWidth: 200}));

	map.addControl(new OpenLayers.Control.Crosshair());
	
	var paramX = getRequestParam('x');
	var paramY = getRequestParam('y');
	var paramZoom = getRequestParam('zoom');
	var paramDestinationId =  getRequestParam('id');
	
	if (!paramZoom) {
		paramZoom = 0;
	}
	if (!paramX)
		paramX = parseInt(MBR[4]);
	if (!paramY)
		paramY = parseInt(MBR[5]);
	
//	map.setCenter(new OpenLayers.LonLat(parseInt(MBR[4]), parseInt(MBR[5])), 2);
	
	if (paramDestinationId) {
		
		//searches for the given id first in areas, and if doesn't find it then searches from point types.
		getAreaFeatureById(paramDestinationId, paramX, paramY, paramZoom);
		/*
		//destination not found -> just go with the "factory settings"...
		if (!getDestinationTreeNodeByFeatureId(paramDestinationId)) {
			
			
			//id of a point type!!!
			if (getFeatureById(paramDestinationId, paramX, paramY, paramZoom)) {
				map.setCenter(new OpenLayers.LonLat(paramX, paramY), paramZoom);
			}
			
		}
		*/
	} else {
		map.setCenter(new OpenLayers.LonLat(paramX, paramY), paramZoom);
	}
	
	addToolbarControls();
	
	
//	document.getElementById('layerswitcherContextHelpDiv').innerHTML =
//	"<img id='layerswitcherContextHelp' class='infoImage' src='./images/info.png' onclick='showContextHelp(this);'/>";	
}


/*** HACK. Need another way to determine when all reader are done reading... ***/
var wmsFeatureInfos = null;
/*number of asyncronous requests pending.*/
var noPendingRequests = 0;
/*number of asyncronous callbacks handled.*/
var noResponsesHandled = 0;
/*preserver the viewportpx from the latest click.... Hack...!*/
var latestClick = null;

function getWmsFeaturesAsWfs(e) {
	
		latestClick = e.xy;
		wmsFeatureInfos = [];
		noPendingRequests = 0;
		noResponsesHandled = 0;
		
		/*get the visible wms-layers' featureinfos by wfs as well!*/
		var features = [];
		for (var i = 0; i < map.layers.length; i++) {
			if (map.layers[i].CLASS_NAME == 'OpenLayers.Layer.WMS' &&
				//map.layers[i].layerId != 'kunnat' &&
				map.layers[i].layerId != 'allareas') {
				noPendingRequests++;
				
				var propNames = ["id","name_fi","name_se","name_en","minx","maxx","miny","maxy","category_id","external_link"];
				
				
				//routes -> get length as well!
				if (map.layers[i].layerId.indexOf("route-") == 0) {
					propNames.push("length");
				}
				
				if (map.layers[i].layerId == 'restrictions') {
					propNames = ["id","area_id","restr_fi","restr_se",
	        		                "restr_en","def_fi","def_se","def_en"];
				}
				
				var featureReader = new OpenLayers.Protocol.WFS.fromWMSLayer(map.layers[i], 
				{
					//22.6.2010 - ph - use the global setting!
//					url:  "http://demo.navici.com/geoserver/wfs",
					url:  wfsUrl,
					srsName: "EPSG:2393",
					featureType: map.layers[i].layerName,
					maxFeatures: 100,
					featurePrefix: "retkikartta",
					callback: addWmsFeatureInfos,
					extractAttributes: true,
					//TODO: eri propertyt alueille ja reiteille!!! mm. length reiteille?
					propertyNames: propNames
				});
				
				var point = new OpenLayers.Geometry.Point(map.getLonLatFromViewPortPx(e.xy).lon, map.getLonLatFromViewPortPx(e.xy).lat);
				
				
				var containsFilter = new OpenLayers.Filter.Spatial({
						type: OpenLayers.Filter.Spatial.CONTAINS,
						value: point
				});

				//a box to match the intersecting features with...
				//04.10.2010 - ph - boxsize from 20x20px -> 10x10px
				var l = e.xy.x - 5;
				var r = e.xy.x + 5;
				var t = e.xy.y - 5;
				var b = e.xy.y + 5;
				var lb, rt;
				lb = map.getLonLatFromViewPortPx(new OpenLayers.Pixel(l,b));
				rt = map.getLonLatFromViewPortPx(new OpenLayers.Pixel(r,t));
				var geom = new OpenLayers.Bounds(lb.lon, lb.lat, rt.lon, rt.lat).toGeometry();
				
				var intersectsFilter = new OpenLayers.Filter.Spatial({
					type: OpenLayers.Filter.Spatial.INTERSECTS,
					value: geom
				});
//				var filter = new OpenLayers.Filter.Logical ({
//					type: '||',
//					filters: [containsFilter, intersectsFilter]
//				});
					
				var filter = intersectsFilter
				featureReader.read({filter: filter});
			}
		}
		
//		displayCombinedPopup(e);
}



//18.01.2011 - ph 
//function for getting a single feature from allareas (when request parameter "id" is an id of an area type!)
function getAreaFeatureById(id, lon, lat, zoom) {
	var wfsFeatureReader = new OpenLayers.Protocol.WFS.v1_1_0(
	{
		url:  wfsUrl,
		featureType: "allareas",
		maxFeatures: 100,
		featurePrefix: "retkikartta",
		srsName:"EPSG:2393",
		callback: function(e) {
			if (e && e.features && e.features.length >= 1) {
				var node = e.features[0];
    			if (node.attributes.minx && node.attributes.miny && node.attributes.maxx && node.attributes.maxy) {
        			map.zoomToExtent(new OpenLayers.Bounds
        				(node.attributes.minx, node.attributes.miny,
        				 node.attributes.maxx,node.attributes.maxy), true);
				}
				
				
				highlightAreaById(node.attributes.id);

        		//switch on the corresponding (wfs) layer
        		var layerName;
        		layerName = categoryToLayerIdMappings[node.attributes.category_id];
        		var layerNode = tree.getNodeById(layerName);
        		if (layerNode) {
        			layerNode.ui.checkbox.checked = true;
        			layerNode.ui.onCheckChange();
        		}
        		
				//get the corresponding code for layername that are used with nimihaku...
				for (var key in nimihakuLayerMappings) {
					if (nimihakuLayerMappings[key] == layerName) {
						toggleMaplayerByName(key);
						break;
					}
				}
        		//check, whether some additional category should also be switched on
//        		if (node.attributes.maplayer) {
//					toggleMaplayerByName(node.attributes.maplayer);
//        		}
				
				
			} else {
				
				//not found in areas. Check if it's a point type destination
				getPointFeatureById(id, lon, lat, zoom);
//				map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
			}
		},
		extractAttributes: true
	});
	
	var filter = new OpenLayers.Filter.Comparison({
		type: '==',
		property:"id",
		value: id
	});
	wfsFeatureReader.read({'filter':filter});
}

//04.10.2010 - ph 
//function for getting a single feature from point_dump! (when request parameter "id" is an id of a point type!)
function getPointFeatureById(id, lon, lat, zoom) {
	var wfsFeatureReader = new OpenLayers.Protocol.WFS.v1_1_0(
	{
		url:  wfsUrl,
		featureType: "point_dump",
		maxFeatures: 100,
		featurePrefix: "retkikartta",
		srsName:"EPSG:2393",
		callback: function(e) {
			if (e && e.features && e.features.length == 1) {
				
				toggleNodeByWfsFilterId(e.features[0].data.cat_id);
				var actualZoom = parseInt(map.getNumZoomLevels()) - parseInt(e.features[0].data.dispscale) - parseInt(1);
				map.setCenter(new OpenLayers.LonLat(e.features[0].geometry.x, e.features[0].geometry.y), actualZoom);
			} else {
				map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
			}
		},
		extractAttributes: true
	});
	
	var filter = new OpenLayers.Filter.Comparison({
		type: '==',
		property:"id",
		value: id
	});
	wfsFeatureReader.read({'filter':filter});
}


function addWmsFeatureInfos(e) {
	
	if (e.features && e.features.length) {
 		for (var i = 0; i < e.features.length; i++)
			wmsFeatureInfos.push(e.features[i]);
			
	}
	noResponsesHandled++;
	
	if (noResponsesHandled == noPendingRequests) {
	        e.features = wmsFeatureInfos;
		wmsFeatureInfos = [];

		noPendingRequests = 0;
		noResponsesHandled = 0;
		e.xy = latestClick;
		latestClick = null;
		displayCombinedPopup(e);
	}
}

function getWGS84LonLat(lon, lat, type) 
{
	switch (type) {
		case "min":
			var wgs_x_deg = Math.floor(lon);
			var wgs_y_deg = Math.floor(lat);
	
			var wgs_x_min = Number((lon - wgs_x_deg) * 60).toFixed(4);
			var wgs_y_min = Number((lat - wgs_y_deg) * 60).toFixed(4);
			
			var wgs_lon = wgs_x_deg + "° " + wgs_x_min + "'";				
			var wgs_lat = wgs_y_deg + "° " + wgs_y_min + "'";
			return {lon:wgs_lon, lat:wgs_lat};
			break;
		case "sec":
			wgs_x_deg = Math.floor(lon);
			wgs_y_deg = Math.floor(lat);
	
			wgs_x_min = Number((lon - wgs_x_deg) * 60).toFixed(4);
			wgs_y_min = Number((lat - wgs_y_deg) * 60).toFixed(4);
			
			wgs_x_sec = Number((wgs_x_min - Math.floor(wgs_x_min))*60).toFixed(4);
			wgs_y_sec = Number((wgs_y_min - Math.floor(wgs_y_min))*60).toFixed(4);
			
			var wgs_lon = wgs_x_deg + "° " + Math.floor(wgs_x_min) + "' " + wgs_x_sec + "\"";
			var wgs_lat = wgs_y_deg + "° " + Math.floor(wgs_y_min) + "' "+ wgs_y_sec + "\"";;
			return {lon:wgs_lon, lat:wgs_lat};
			break;
	}
}

function isIeOrChrome() {
	
	/*chrome uses the same print-functionality...so, do the same for chrome as well...*/
	var isChrome = (navigator.userAgent.toLowerCase().indexOf('chrome') > -1);
//	alert(isChrome);
	if (navigator.appName == 'Microsoft Internet Explorer' || isChrome)
		return true;
	
	return false;
}
function isIe() {
	if (navigator.appName == 'Microsoft Internet Explorer')
		return true;
	else return false;
}
function displayCoordinatePopup(e) {
	removePopups();
//	coordinateMarkerLayer.clearMarkers();
	coordinateMarkerLayer.addMarker(new OpenLayers.Marker(map.getLonLatFromViewPortPx(e.xy), icon.clone()));
	
	var lonlat = map.getLonLatFromViewPortPx(e.xy); 
	var lonLatInWgs = transFormProjection("EPSG:2393","EPSG:4326",lonlat);			
	var lonLatInEUREF = transFormProjection("EPSG:2393","EPSG:3067",lonlat);			
	var lonLatInWGS84minmmmm = getWGS84LonLat(lonLatInWgs.lon, lonLatInWgs.lat, "min");
	var lonLatInWGS84minsec = getWGS84LonLat(lonLatInWgs.lon, lonLatInWgs.lat, "sec");
	
	htmlContent = '';
	htmlContent +=
		'<div style="padding:2px;background-color:transparent;height:auto;width:240px;overflow-x: hidden;overflow-y:hidden;">'+
		'<div class="popupContentFrame" style="height:219px;width:98%;border:2px solid #D2E4C0;">'+
			'<div id="popupCloseDiv" class="popupContentDiv" style="width:100%;border-top:1px solid #004000;border-left:1px solid #004000;border-right:1px solid #004000;border-bottom:0;padding:0px;display:block;overflow: hidden;">'+
			'<img style="float:right;padding-right:0;" class="formLabel" onclick="removePopups();" src="./images/close_green.png"/>'+
			'<a class="formLabelHeader" style="float:left;">'+Language.get('coordinateinfo')+'</a>'+
			'</div>'+
		
		'<div class="popupContentDiv" style="padding:0px;width:100%;border:1px solid #004000;height:201px;overflow-y:auto; overflow-x:hidden;">'+
			'<div style="display: block;padding-top:5px;">'+
				'<a class="formLabelHeader">ETRS-TM35FIN</a><br/>'+
				'<div style="padding-left:5px; padding-top:5px;">'+
					'<a class="formLabel">'+Language.get('north')+': '+lonLatInEUREF.lat.toFixed(0)+' m</a><br/>'+
					'<a class="formLabel">'+Language.get('east')+': '+lonLatInEUREF.lon.toFixed(0)+' m</a><br/><br/>'+
				'</div>'+
				
				'<a class="formLabelHeader">KKJ</a><br/>'+
				'<div style="padding-left:5px; padding-top:5px;">'+
					'<a class="formLabel">'+Language.get('north')+': '+lonlat.lat.toFixed(0)+' m</a><br/>'+
					'<a class="formLabel">'+Language.get('east')+': '+lonlat.lon.toFixed(0)+' m</a><br/><br/>'+
				'</div>'+
				
				'<a class="formLabelHeader">WGS84</a><br/>'+
				'<a class="formLabel" style="font-style:italic;">'+Language.get('wgs84degdddd')+'</a><br/>'+
				'<div style="padding-left:5px; padding-top:5px;">'+
					'<a class="formLabel">lat: '+lonLatInWgs.lat.toFixed(5)+' &deg;</a><br/>'+
					'<a class="formLabel">lon: '+lonLatInWgs.lon.toFixed(5)+' &deg;</a><br/><br/>'+
				'</div>'+

				'<a class="formLabel" style="font-style:italic;">'+Language.get('wgs84degminmmmm')+'</a><br/>'+
				'<div style="padding-left:5px; padding-top:5px;">'+
					'<a class="formLabel">lat: '+lonLatInWGS84minmmmm.lat+'</a><br/>'+
					'<a class="formLabel">lon: '+lonLatInWGS84minmmmm.lon+'</a><br/><br/>'+
				'</div>'+
				
				'<a class="formLabel" style="font-style:italic;">'+Language.get('wgs84degminsec')+'</a><br/>'+
				'<div style="padding-left:5px; padding-top:5px;">'+
					'<a class="formLabel">lat: '+lonLatInWGS84minsec.lat+'</a><br/>'+
					'<a class="formLabel">lon: '+lonLatInWGS84minsec.lon+'</a><br/><br/>'+
				'</div>'+

				'</div>'+
			'</div>';
	htmlContent += 
		'</div></div>';
	
	
	var height = 230;
	var width = 240;
	if (isIe()) {
		height = 235;
		width = 245;
	}
	var pp = new OpenLayers.Popup.Anchored(
    	    "coordInfo",
    	    map.getLonLatFromViewPortPx(e.xy),
    	    //size
//    	    new OpenLayers.Size(240,240),
//    	    new OpenLayers.Size(240,230),
    	    new OpenLayers.Size(width,height),
    	    //content
    	    htmlContent,
    	    //anchor
    	    null,
    	    //closebox, closeboxcallback
    	    false,null);

		//Just add a cosmetic popup to get the actual pixels for the div...
		pp.backgroundColor = "transparent";
		//pp.div.style.overflowY = "hidden";
		pp.contentDiv.style.overflow = "hidden";
		//pp.overFlow = "hidden";
		map.addPopup(pp, true);
		return;
	
//	alert(e.xy);
}


function displayCombinedPopup(e) {//, feature) {
	
	removePopups();
	
	var feature = null;
	if (poiLayer && poiLayer.selectedFeatures && poiLayer.selectedFeatures.length) {
		feature = poiLayer.selectedFeatures[0];
	}

	if (!e.features)
		e.features = wmsFeatureInfos;
	/* filter out duplicate ids */
	if (e.features) {
	    var seen = new Array();
	    var temp = new Array();
	    var len = e.features.length;
	    var c=0;
	    for (var i = 0; i < e.features.length; i++) {
		if ( seen[e.features[i].attributes["id"]] != 1 ) {
		    temp.push(e.features[i]);
		    seen[e.features[i].attributes["id"]] = 1;
		}
	    }
	    e.features = temp;
	}
	/* filter out duplicate ids */
	var noOfFeatures = 0;
	for (var t = 0; t < e.features.length; t++) {
		if (!e.features[t].attributes["area_id"])
			noOfFeatures++;
	}
	if (feature)
		noOfFeatures += feature.attributes.count;
	
	if (!noOfFeatures)
		return;

	/*
	var height = (noOfFeatures * 40) + 40;
	if (height > 250)
		height = 250;
	else if (height < 100)
		height = 100;
	*/
	var height = 265;
	htmlContent = '';
	htmlContent +=
//		'<div style="background-color:transparent;height:'+height+'px;width:250px;overflow-y: auto;overflow-x: hidden;">'+
		'<div style="background-color:transparent;height:'+height+'px;width:240px;overflow-x: hidden;overflow-y:hidden;">'+
//		'<div class="popupContentFrame">'+
		'<div class="popupContentFrame" style="border:2px solid #D2E4C0;">'+
//		'<div class="popupContentDiv">'+
		
		'<div id="popupCloseDiv" class="popupContentDiv" style="width:100%;border-top:1px solid #004000;border-left:1px solid #004000;border-right:1px solid #004000;border-bottom:0;padding:0px;display:block;overflow: hidden;">'+
		'<img style="float:right;padding-right:0;" class="formLabel" onclick="removePopups();" src="./images/close_green.png"/>'+
		'<a class="formLabelHeader" style="float:left;">'+Language.get('featureInfoPopupHeader')+'</a>'+
		'</div>'+
		'<div class="popupContentDiv" style="padding:0px;width:100%;border:1px solid #004000;height:'+parseInt(parseInt(height)-parseInt(30)).toString()+'px;overflow-y:auto; overflow-x:hidden;">';
//			'<a class="formLabelHeader">'+Language.get('featureInfoPopupHeader')+'</a><br/>';
		
			var i = 0;
			var restrictionsAlreadyAdded = {};
			if (feature) {
				for (i = 0; i < feature.cluster.length; i++) {
					htmlContent += '<div style="display: block;">';
					htmlContent += '<a class="formLabelHeader">'+(i+1)+' /  '+noOfFeatures +'&nbsp;'+
									categories[feature.cluster[i].attributes['cat_id']].name+'</a><br/>';
					htmlContent += generateInfoContentForPointType(feature.cluster[i]);
					htmlContent += '</div>';
				}
			}
			
			if (e.features && e.features.length) {
				for (var j = 0; j < e.features.length; j++) {
					//"Normal" area, not a restriction!
					if (!e.features[j].attributes["area_id"]) {
						i++;
						var name = '';
						if (e.features[j].attributes['name_'+LANGUAGE_SELECTION])
							name = e.features[j].attributes['name_'+LANGUAGE_SELECTION];
						else
							name = e.features[j].attributes['name_fi'];
						htmlContent += '<div id="area_'+e.features[j].attributes["id"]+'" style="display: block;">';
							htmlContent += '<a class="formLabelHeader">'+(i)+' / '+noOfFeatures +'&nbsp;'+
											categories[e.features[j].attributes['category_id']].name+'</a><br/>';
//							htmlContent += '<a class="formLabel">'+e.features[j].attributes['name_fi']+'</a><br/>';
							htmlContent += '<a class="formLabel">'+name+'</a><br/>';
							if (e.features[j].attributes["external_link"]) {
//								htmlContent += '<a class="formLabel" target="new" href="'+e.features[j].attributes["external_link"]+'">'+Language.get('targetinfolink')+'</a><br/>';
								htmlContent += '<a style="padding-left:3px;" target="new" href="'+e.features[j].attributes["external_link"]+'">'+Language.get('targetinfolink')+'</a><br/>';
							}
							if (e.features[j].attributes["length"]) {
								htmlContent += '<a class="formLabel">'+parseFloat(e.features[j].attributes["length"]).toFixed(2)+' km</a><br/>';
							}
							
							htmlContent += '<br/>';
								
							
						//get the restrictions for this particular area!	
						for (var g = 0; g < e.features.length; g++) {
							if (e.features[g].attributes["area_id"] && 
								parseInt(e.features[g].attributes["area_id"]) == e.features[j].attributes["id"]) {
								if (!restrictionsAlreadyAdded[parseInt(e.features[g].attributes["id"])]) {
										htmlContent += '<a class="printMapRestrictionLabel">';
									
										var restr = e.features[g].attributes["def_"+LANGUAGE_SELECTION];
										if (!restr)
											restr = e.features[g].attributes["def_fi"];
										if (!restr) {
										    restr='';
										}
                                                                                htmlContent += restr;
										htmlContent += '<br/>';

										restr = e.features[g].attributes["restr_"+LANGUAGE_SELECTION];
                                                                                if (!restr)
										    restr = e.features[g].attributes["restr_fi"];
                                                                                if (!restr) {
                                                                                    restr='';
                                                                                }

										htmlContent += restr;
									htmlContent += "<br/>";
										
									restrictionsAlreadyAdded[parseInt(e.features[g].attributes["id"])] = true;
								}
							}
						}
							
						htmlContent += '</div>';
					}
				}

				
				
			}
			/*
			htmlContent += 		
				'<div class="formInputGroup">'+
				'<a class="formActionLabel" onclick="removePopups()">'+Language.get('close')+'</a>'+
				'</div>';
			*/	
		htmlContent += '</div></div></div>';
		
		var pp = new OpenLayers.Popup.Anchored(
    	    "gfinfo",
    	    map.getLonLatFromViewPortPx(e.xy),
    	    //size
    	    new OpenLayers.Size(250,height),
    	    //content
    	    htmlContent,
    	    //anchor
    	    null,
    	    //closebox, closeboxcallback
    	    false,null);
		
		//Just add a cosmetic popup to get the actual pixels for the div...
		pp.backgroundColor = "transparent";
		pp.div.style.overflowY = "hidden";
		pp.contentDiv.style.overflow = "hidden";
		//pp.overFlow = "hidden";
		map.addPopup(pp, true);
		return;
}

/*generates the info content for a single point-type (wfs) feature*/
function generateInfoContentForPointType(feature) {

	var tempF = feature;
	var htmlContent = '';
	var name = '';
	if (tempF.attributes['name_'+LANGUAGE_SELECTION])
		name = tempF.attributes['name_'+LANGUAGE_SELECTION];
	else
		name = tempF.attributes['name_fi'];
	htmlContent += '<div style="display:block;"><img style="padding-left:3px;" src="'+categoryMarkersPath + categories[tempF.attributes['cat_id']].marker+'" />'+
//					'&nbsp;<a class="formLabel">'+tempF.attributes['name_fi']+'</a>';
					'&nbsp;<a class="formLabel">'+tempF.attributes['name_fi']+'</a><br/><br/>';

	var lonLatInKKJ = new OpenLayers.LonLat(tempF.geometry.x,tempF.geometry.y);
	var lonLatInWgs = transFormProjection("EPSG:2393","EPSG:4326",lonLatInKKJ);		
	var lonLatInEuref = transFormProjection("EPSG:2393","EPSG:3067",lonLatInKKJ);			
	
	htmlContent += '&nbsp;<a class="formLabel">ETRS-TM35FIN</a><br>';
	htmlContent += '&nbsp;<a class="formLabel">'+Language.get('north')+': '+parseInt(lonLatInEuref.lat)+'m</a><br/>';
	htmlContent += '&nbsp;<a class="formLabel">'+Language.get('east')+': '+parseInt(lonLatInEuref.lon)+'m</a><br/><br/>';

	htmlContent += '&nbsp;<a class="formLabel">WGS84</a><br>';
	htmlContent += '&nbsp;<a class="formLabel">lat: '+lonLatInWgs.lat.toFixed(5)+' &deg;</a><br/>';
	htmlContent += '&nbsp;<a class="formLabel">lon: '+lonLatInWgs.lon.toFixed(5)+' &deg;</a><br/><br/>';
	
	
	htmlContent += '</div>';	
	return htmlContent;

	
}

function removePopups() {
	
	for (var i = 0; i < map.popups.length; i++)
		map.removePopup(map.popups[i]);

	var printDiv = document.getElementById('printPopupDiv');
	if (printDiv)
		document.body.removeChild(printDiv);

	var featureInfoDiv = document.getElementById('featureinfoPopup');
	if (featureInfoDiv)
		map.layerContainerDiv.removeChild(featureInfoDiv);
	
	var measurementsDiv = document.getElementById('measurementsdiv');
	if (measurementsDiv)
		document.body.removeChild(measurementsDiv);
	
	
	//clear coordinates markers
	coordinateMarkerLayer.clearMarkers();
}


function addToolbarControls() {
	navigation = new OpenLayers.Control.Navigation();
	map.addControl(navigation);

	
	
	/*Static copyright text*/
	var attribution = new OpenLayers.Control.Attribution();
	attribution.updateAttribution = function() {
		if (!this.div.innerHTML.length) {
			var date = new Date();
			this.div.innerHTML = Language.get('copyright')+' '+date.getFullYear();			
		}
	}
	map.addControl(attribution);

	zoomBox = new OpenLayers.Control.ZoomBox({ 
		displayClass: "olControlZoomBox", 
//		title: "Zoom in box" 
		title: Language.get('zoomin') 
	});

	zOut = new OpenLayers.Control.ZoomBox({
		displayClass: "olControlZoomOutBox",
		out: true,
		title: Language.get('zoomout') 
	});

	dragPan = new OpenLayers.Control.Navigation({
//		title:'Drag map',
		zoomWheelEnabled:false,
		title: Language.get('pan'), 
		displayClass: 'olControlPanMap',
		
		activate: function() {
			OpenLayers.Control.Navigation.prototype.activate.apply(this, arguments);
//			clickHandler.activate();
			selectFeature.activate();
		},
		deactivate: function() {
			OpenLayers.Control.Navigation.prototype.deactivate.apply(this, arguments);
//			clickHandler.deactivate();
			selectFeature.deactivate();
		}

	});
	
	//Comment out for umbriel
	OpenLayers.ProxyHost = "/cgi-bin/proxy.cgi?url=";
	
	// build the measure controls
	// style the sketch fancy
	/*
	* dot
    * dash
    * dashdot
    * longdash
    * longdashdot
    * solid
	 */
	
    var sketchSymbolizers = {
        "Point": {
            pointRadius: 4,
            graphicName: "square",
//            fillColor: "#000000",
            fillColor: "#ee9900",
            fillOpacity: 1,
            strokeWidth: 1,
            strokeOpacity: 1,
//            strokeColor: "#333333"
            strokeColor: "#ee9900"
        },
        "Line": {
            strokeWidth: 3,
            strokeOpacity: 1,
//            strokeColor: "#666666",
            strokeColor: "#ee9900",
            fillColor: "#ee9900",
            strokeDashstyle: "dash"
        },
        "Polygon": {
            strokeWidth: 2,
            strokeOpacity: 1,
            strokeColor: "#ee9900",
//            strokeColor: "#000000",
            strokeDashstyle: "dash",
//            fillColor: "#666666",
            fillColor: "#ee9900",
            fillOpacity: 0.4
        }
    };
    var style = new OpenLayers.Style();
    style.addRules([
        new OpenLayers.Rule({symbolizer: sketchSymbolizers})
    ]);
    var styleMap = new OpenLayers.StyleMap({"default": style});
	
	var optionsLine = {
		handlerOptions: {
			callbacks: {
				modify: function(point, feature) {
		        	measureControls.line.measurePartial(point,feature.geometry);
		        }
			},
			persist: true,
			layerOptions: {styleMap: styleMap},
			mousedown: function(evt) {
				OpenLayers.Handler.Path.prototype.mousedown.apply(this, arguments);
				//this is only to allow propagation of the event to Navigation control.
				return true;
			},
			mouseup: function(evt) {
				
				//mouseup from panzoombar buttonclick -> ignore!
				if (panZoomBarButtonClicked) {
					panZoomBarButtonClicked = false;
					return false;
				}
				
				//was dragging -> remove the measuring point!
				if (this.lastDown && !this.lastDown.equals(evt.xy)) {
					if (this.line.geometry.components.length >= 2) {
						cancelLatestMeasurementNode();
						this.lastUp = evt.xy;
					} else if (this.line.geometry.components.length < 2) {
						//was dragging, there's nuthing but the start point -> ERAAAAAASEEEEEE!!!!!
						measureControls.line.measure(this.line.geometry.components[0],"measure");
						this.removePoint();
						this.cancel();
					}
				}
				OpenLayers.Handler.Path.prototype.mouseup.apply(this, arguments);
			},
			mousemove: function(evt) {
				if (!this.mouseDown)
					OpenLayers.Handler.Path.prototype.mousemove.apply(this, arguments);
			}
		},
		partialDelay: 100,
		displayClass: "olControlMeasureDistance",
		title: Language.get('measuredistance'),
		
		activate: function() {
		    //reset the flag, in case it had been set. Is used to prevent mouseups from panzoombar from propagating to measurecontrols.  
		    panZoomBarButtonClicked = false;
			removeMeasurementPopup();
			OpenLayers.Control.Measure.prototype.activate.apply(this, arguments);
		},
		deactivate:function() {
			removeMeasurementPopup();
			OpenLayers.Control.Measure.prototype.deactivate.apply(this, arguments);
		}
	};


	var optionsPolygon = {
		handlerOptions: {
			callbacks: {
				modify: function(point, feature) {
	            
					measureControls.area.measurePartial(point,
	                    feature.geometry);
	        	}
	    	},
			persist: true,
			layerOptions: {styleMap: styleMap},
			mousedown: function(evt) {
				OpenLayers.Handler.Polygon.prototype.mousedown.apply(this, arguments);
				//this is only to allow propagation of the event to Navigation control.
				return true;
			},
			mouseup: function(evt) {
				
				//mouseup from panzoombar buttonclick -> ignore!
				if (panZoomBarButtonClicked) {
					panZoomBarButtonClicked = false;
					return false;
				}
				//was dragging -> remove the measuring point!
				if (this.lastDown && !this.lastDown.equals(evt.xy)) {
					if (this.polygon.geometry.components[0].components.length > 2) {
						cancelLatestMeasurementNode();
						this.lastUp = evt.xy;
					} else if (this.polygon.geometry.components[0].components.length <= 2) {
						//was dragging, there's nuthing but the start point -> ERAAAAAASEEEEEE!!!!!
						measureControls.area.measure(this.polygon.geometry,"measure");
						cancelMeasurement();
						this.removePoint();
						//this.polygon.geometry.components.splice();
						this.cancel();
					}
				}
				OpenLayers.Handler.Polygon.prototype.mouseup.apply(this, arguments);
			},
			mousemove: function(evt) {
				if (!this.mouseDown)
					OpenLayers.Handler.Path.prototype.mousemove.apply(this, arguments);
			}
		},
		partialDelay: 100,
		displayClass: "olControlMeasureArea",
		title: Language.get('measurearea'), 
		activate: function() {
		    //reset the flag, in case it had been set. Is used to prevent mouseups from panzoombar from propagating to measurecontrols.  
		    panZoomBarButtonClicked = false;
			removeMeasurementPopup();
			OpenLayers.Control.Measure.prototype.activate.apply(this, arguments);
		},
		deactivate:function() {
			removeMeasurementPopup();
			OpenLayers.Control.Measure.prototype.deactivate.apply(this, arguments);
		}
	};

	measureControls = {
		line: new OpenLayers.Control.Measure(
		  OpenLayers.Handler.Path, 
		  optionsLine 
		),
		area: new OpenLayers.Control.Measure(
			OpenLayers.Handler.Polygon,
			optionsPolygon
		)
	};
                
	for(var key in measureControls) {
		control = measureControls[key];
		control.events.on({
			"measure": handleMeasurements,
			"measurepartial": handleMeasurements
		});
	}     


		/*wfs feature select*/
	
		var selectOptions = {
			displayClass: 'olControlSelectFeature',
			multiple: false,
			multipleKey: '',
			clickout: true,
			toggle: true,
			title: Language.get('wfsfeatureinfo'),
			activate: function() {
				OpenLayers.Control.SelectFeature.prototype.activate.apply(this, arguments);
				clickHandler.activate();
			},
			deactivate: function() {
				OpenLayers.Control.SelectFeature.prototype.deactivate.apply(this, arguments);
				clickHandler.deactivate();
			},
	        onUnselect: function(feature) {
				removePopups(feature);
	        }
	        
		};
	
	clickHandler = new OpenLayers.Handler.Click( 
	{ 
		'map': map 
	} , 
	{ 
		'click': function(e) { 
			getWmsFeaturesAsWfs(e);
//			featureInfo.getInfoForClick(e);
		} 
	});
	
	var selectFeature = new OpenLayers.Control.SelectFeature(poiLayer, selectOptions);

	var coordinateInfo = new OpenLayers.Control({
		displayClass: 'olControlCoordinateInfo',
		title: Language.get('coordinateinfo'),
		allowSelection: true,
		activate: function() {
			removePopups();
			map.addLayer(coordinateMarkerLayer);
//			coordinateMarkerLayer.clearMarkers();
			clickHandler.deactivate();
			coordinateClickHandler.activate();

			OpenLayers.Control.prototype.activate.apply(this, arguments);
		},
		deactivate: function() {
			removePopups();
//			coordinateMarkerLayer.clearMarkers();
			if (map.getLayerIndex(coordinateMarkerLayer) > -1)
				map.removeLayer(coordinateMarkerLayer);
			coordinateClickHandler.deactivate();
			
			OpenLayers.Control.prototype.deactivate.apply(this, arguments);
		}
	});
	
	coordinateClickHandler = new OpenLayers.Handler.Click( 
	{ 
		'map': map 
	} , 
	{ 
		'click': function(e) { 
		/*
        	coordinateMarkerLayer.clearMarkers();
			coordinateMarkerLayer.addMarker(new OpenLayers.Marker(map.getLonLatFromViewPortPx(e.xy), icon.clone()));
		*/
			displayCoordinatePopup(e);
		} 
	});


	var fullscreenMapControl = new OpenLayers.Control.Button({
		displayClass: 'olControlFullscreenMap',
		title: Language.get('fullscreen'),
		trigger: function() {
			toggleFullscreenMap();
		}
	});

	
	var printControl = new OpenLayers.Control.Button({
		displayClass: 'olControlPrintControl_'+LANGUAGE_SELECTION,
		title: Language.get('print'),
		trigger: function() {
			displayPrintPopup();
		}
	});

	
	
	//scale
	var scaleControl = new OpenLayers.Control.Scale(); 
	OpenLayers.Util.extend(scaleControl, { 
					updateScale: function() { 
		/*
								var scale = map.getScale();
								if (!scale) return;
								scale = Math.round(scale);
								document.getElementById('mapScale').innerHTML = "1 : " + scale; 
			*/					
								document.getElementById('mapScale').innerHTML = getScaleSelect();
							}
	}); 

    map.addControl(scaleControl); 

/*    
    var date = new Date();
    document.getElementById('copyRightText').innerHTML = Language.get('copyright')+' '+date.getFullYear(); 
*/
    var mapStatusStrip = document.getElementById('mapStatus');
	mapStatusStrip.style.visibility = "visible";
	mapStatusStrip.className = "mapStatus";
    map.div.appendChild(mapStatusStrip); 

    map.addControl(new OpenLayers.Control.MousePosition({ 
		div: document.getElementById('mapMousePosition'), 
		numDigits: 0,
		formatOutput: function (lonlat) {
			var lonLatInWgs = transFormProjection("EPSG:2393","EPSG:4326",lonlat);			
			var lonLatInEUREF = transFormProjection("EPSG:2393","EPSG:3067",lonlat);			
			var newHTML = 'ETRS-TM35FIN - '+Language.get('north')+': '+lonLatInEUREF.lat.toFixed(0)+' '+Language.get('east')+': '+lonLatInEUREF.lon.toFixed(0)+', '+
						  'KKJ - '+Language.get('north')+': '+lonlat.lat.toFixed(0)+' '+Language.get('east')+': '+lonlat.lon.toFixed(0)+', '+
						  'WGS84 - lat: '+lonLatInWgs.lat.toFixed(5)+' lon: '+lonLatInWgs.lon.toFixed(5);
			
			return newHTML;
			
		}
		
	}));



	//projection
/*
    if (document.getElementById('mapProjection'))
		document.getElementById('mapProjection').innerHTML = map.projection;
*/
	// create the panel where the controls will be added
    
    
	//14.6.2010 - ph 
	map.addControl(selectFeature);

    
	panel = new OpenLayers.Control.Panel({ defaultControl: dragPan});
	panel.addControls([
		zoomBox,
		zOut,
		dragPan,
//		selectFeature,
		measureControls.line,
		measureControls.area,
		coordinateInfo,
		fullscreenMapControl,
		printControl
		]);

	map.addControl(panel);
	
	
	
	indexMap = createIndexMap();
	map.addControl(indexMap);
	updateIndexMapVisualAppearance();
	indexMap.maximizeControl();
}

function removeMeasurementPopup() {
	var measurementsDiv = document.getElementById('measurementsdiv');
	if (measurementsDiv) {
		document.body.removeChild(measurementsDiv);
		cancelMeasurement();
	}
}

function updateIndexMapVisualAppearance() {
	var imgLocation = OpenLayers.Util.getImagesLocation();

	// maximize button div
	var imgLocation = './theme/img/';
	var img1 = imgLocation + 'o-layer-switcher-maximize_'+LANGUAGE_SELECTION+'.png';
	var img2 = imgLocation + 'o-layer-switcher-minimize_'+LANGUAGE_SELECTION+'.png';
	document.getElementById('olControlOverviewMapMaximizeButton').style.width = '80px';
	document.getElementById('olControlOverviewMapMaximizeButton').style.height = '18px';
	document.getElementById('olControlOverviewMapMaximizeButton').innerHTML='<img width=\"80px\"  height=\"18px\" src="'+img1+'" border=0 />';
	document.getElementById('OpenLayers_Control_minimizeDiv').style.width = '80px';
	document.getElementById('OpenLayers_Control_minimizeDiv').style.height = '18px';
	document.getElementById('OpenLayers_Control_minimizeDiv').innerHTML = '<img width=\"74px\"  height=\"17px\" src="'+img2+'" border=0 />';
}


/*shown scales are rounded to "reasonable" values. Differ slightly from actual map scales.*/
//var shownScales = [2250000,750000,375000,75000,37500,18750,12000,6000,4000];
var shownScales = [3000000,1000000,500000,100000,50000,25000,16000,8000,5000];

function getScaleSelect() {

	var scaleSelect = 	'<select id="scaleSelect" '+
						'style="margin-top:2px;vertical-align: baseline; font-size:13px;z-index:1007;"'+
						' onfocus="stopEvent(event)"'+
						' onclick="stopEvent(event)"'+
						' onmousedown="this.focus()"'+
						' onchange="setScale(this);">'; 
	
	for (var i = map.resolutions.length-1; i >= 0; i--) {
		var scale = Math.round(OpenLayers.Util.getScaleFromResolution(map.resolutions[i], "m"),true);
		if (scale == Math.round(map.getScale()))
			scaleSelect += '<option value='+i+' selected>1:'+shownScales[i].toString()+'</option>';
//			scaleSelect += '<option value='+i+' selected>1:'+scale+'</option>';
		else
			scaleSelect += '<option value='+i+'>1:'+shownScales[i].toString()+'</option>';
//			scaleSelect += '<option value='+i+'>1:'+scale+'</option>';
	}
	scaleSelect += '</select>';
	return scaleSelect;
}

function setScale(element) {

	var index = element.options[element.selectedIndex].value;
	if (index && index >= 0 && index < map.resolutions.length) {
		map.zoomToScale(OpenLayers.Util.getScaleFromResolution(map.resolutions[index],"m"), true);
	}
}

/*stop the event from propagating to the map!*/
function stopEvent(e) {
	if (!e) var e = window.event;
	e.cancelBubble = true;
	if (e.stopPropagation) e.stopPropagation();
}
function createIndexMap() {
	
	var obase = new OpenLayers.Layer("name",{visibility: true, isBaseLayer: true, displayInLayerSwitcher: false});
	var lyr = new OpenLayers.Layer.WMS('indeksikartta',"http://www.karttakone.fi/wms/ddde5aedeb05b6124a42ac8af7513f62/ykj/rs/",
          	{layers: 'rs09_suomi_5m,rs09_suomi_1m,rs09_maakuntakartta_500k,rs09_yleiskartta_250k,rs09_seutukartta_100k,rs09_kuntakartta_50k,rs09_taajamakartta_20k',styles:'', transparent: true}, 
          	{
          		projection: "EPSG:2393",
          		scales:map.scales,
          		opacity: 1, 
          		isBaseLayer: false,
          		displayInLayerSwitcher: true,
          		visibility:true,
          		buffer:0
          		/*
          		,
          		singleTile: true
          		*/
          	});
		
	var overViewOpts = {
    		mapOptions: {
				projection: map.projection,
				units:'m',
//				scales:[10000000, 5000000, 500000, 250000, 100000],
				scales:[5000000, 500000, 250000, 100000],
				maxExtent:map.maxExtent
    		},
			size: new OpenLayers.Size(200,250),
			autoPan: true,
    		layers:[obase,lyr]
    };
	
	var indexMap = new OpenLayers.Control.OverviewMap(overViewOpts);
	return indexMap;
}

function handleMeasurements(event) {
	
	
	var geometry = event.geometry;
	var units = event.units;
	var order = event.order;
	var measure = event.measure;
	var ev = event;
	
	/*the odd click that might occur, when line or area was selected, 
	 * but user has clicked at another tool in the toolbar -> ignore
	 */
	if (!measureControls.line.active && !measureControls.area.active)
		return;
	else {
		//line active, but the measure is for area -> ignore! OR
		//area active, but the measure is for line -> ignore!
		if ((measureControls.area.active && order == 1) || (measureControls.line.active && order == 2)) {
			return;
		}
	}
	
	var leftplus = 0;
	var out = '';//'<div class="popupContentDiv"><a class="formLabel">';
	if(order == 1) {
		//distance from the map's left edge to "measure distance"-icon's left edge.
		leftplus = 90;
		if (units == 'km')
			out += '<b>'+Language.get('distance')+"</b>: " + measure.toFixed(3) + " " + units;
		else
			out += '<b>'+Language.get('distance')+"</b>: " + measure.toFixed(0) + " " + units;
	} else {
		//distance from the map's left edge to "measure area"-icon's left edge.
		leftplus = 120;
		if (units == 'km')
			out += '<b>'+Language.get('area')+"</b>: " + measure.toFixed(3) + " " + units + "<sup style='font-size:6px'>2</sup>";
		else
			out += '<b>'+Language.get('area')+"</b>: " + measure.toFixed(0) + " " + units + "<sup style='font-size:6px'>2</sup>";
	}
	var measurementsPopup = document.getElementById('measurementsdiv');
	if (!measurementsPopup) {
		var inner = '';
		inner += '<div class="popupContentDiv">';
		inner += '<a class="formLabel" id="measurementresult" class="formLabel"></a><br/>';
		inner += '<div id="cancelMeasurementsDiv" style="display:inline;">';
		inner += '<br/>';
		inner += '<a class="formActionLabel" style="padding-right:3px;">';
		inner += '<img src="./images/undo_'+LANGUAGE_SELECTION+'.png" onclick="cancelLatestMeasurementNode();" title="'+Language.get('undo')+'" alt="'+Language.get('undo')+'"/>&nbsp;&nbsp;';
		inner += '<img src="./images/clear_'+LANGUAGE_SELECTION+'.png" onclick="cancelMeasurement();" title="'+Language.get('clear')+'" alt="'+Language.get('clear')+'" /><br/>';
//			inner += '<a href="javascript:;" class="formActionLabel" onclick="cancelLatestMeasurementNode();">Kumoa edellinen</a><br/>';
//			inner += '<a href="javascript:;" class="formActionLabel" onclick="cancelMeasurement();">Aloita alusta</a><br/>';
		inner += '</a>';
		inner += '</div>';
		inner += '</div>';
		inner += '</div>';
		
		measurementsPopup = document.createElement('div');
		measurementsPopup.id = 'measurementsdiv';
		measurementsPopup.className = "popupContentFrame";
		measurementsPopup.style.position = "absolute";
		measurementsPopup.style.wrap = "no-wrap";
		measurementsPopup.style.whiteSpace = "nowrap";
		measurementsPopup.style.zIndex = map.Z_INDEX_BASE.Control;
		measurementsPopup.style.width = "auto";
		measurementsPopup.style.left = parseInt(map.div.offsets[0])+parseInt(leftplus)+'px';
		measurementsPopup.style.top = parseInt(map.div.offsets[1])+parseInt(35)+'px';
		measurementsPopup.innerHTML = inner;
		document.body.appendChild(measurementsPopup);
	}

	document.getElementById('measurementresult').innerHTML = out;
}

function cancelMeasurement() {
	if (measureControls.line.active) {
		if (measureControls.line.handler.line && measureControls.line.handler.line.geometry) {
			measureControls.line.handler.line.geometry.components.splice(0, measureControls.line.handler.line.geometry.components.length -1);
			measureControls.line.measure(measureControls.line.handler.line.geometry, "measure");
		}
	    measureControls.line.handler.removePoint();
		measureControls.line.handler.destroyFeature();
	    measureControls.line.cancel();
	} else if (measureControls.area.active) {
		if (measureControls.area.handler.polygon && measureControls.area.handler.polygon.geometry) {
			if (measureControls.area.handler.polygon.geometry.components && measureControls.area.handler.polygon.geometry.components.length) {
				//preserve only the first and the last point (=the same point)!
				measureControls.area.handler.polygon.geometry.components[0].components.splice(1, measureControls.area.handler.polygon.geometry.components[0].components.length - 3);
				measureControls.area.measure(measureControls.area.handler.polygon.geometry, "measure");
			}
		}
	    measureControls.area.handler.removePoint();
		measureControls.area.cancel();
	}
}
function cancelLatestMeasurementNode() {

	//measure distance
	if (measureControls.line.active) {
		
		
		if (!measureControls.line.handler.drawing) {
			cancelMeasurement();
			return;
		}
		var components = null;
		if (measureControls.line.handler.line && measureControls.line.handler.line.geometry) {
			components = measureControls.line.handler.line.geometry.components;
		}
		if (!components)
			return;

		if (components.length >= 2) {
			//remove the latest point
			components.splice(components.length - 2, 1);
			//use the temp to do the actual measurement and use the actual one to maintain the scetch correct.

			/*
			 * not needed, 'cos mousemove updates the measurement!
			var tempGeom = measureControls.line.handler.line.geometry.clone();
			tempGeom.components.splice(tempGeom.components.length -1, 1);
			measureControls.line.measure(tempGeom, "measure");
			*/
			measureControls.line.handler.lastUp = null;
			measureControls.line.handler.mouseDown = false;
			measureControls.line.handler.mousemove(measureControls.line.handler.evt);
		}
		
		if (components.length == 1 || !measureControls.line.handler.drawing) {
			measureControls.line.handler.removePoint();
			measureControls.line.handler.destroyFeature();//removePoint();
			measureControls.line.cancel();
		}
	} else if (measureControls.area.active) {

		if (!measureControls.area.handler.drawing) {
			cancelMeasurement();
			return;
		}

		var components = null;
		if (measureControls.area.handler.polygon && measureControls.area.handler.polygon.geometry) {
			components = measureControls.area.handler.polygon.geometry.components[0].components;
		}
		if (!components)
			return;
			
		if (components.length >= 3) {
			//remove the latest point
			components.splice(components.length - 3, 1);
			//use the temp to do the actual measurement and actual one to maintain the scetch correct.
			
			/*
			 * not needed, 'cos mousemove updates the measurement!
			var tempGeom = measureControls.area.handler.polygon.geometry.components[0].clone();
			tempGeom.components.splice(tempGeom.components.length - 2, 1);
			measureControls.area.measure(tempGeom, "measure");
			*/
			
			measureControls.line.handler.lastDown = null;
			measureControls.area.handler.mouseDown = false;
			measureControls.area.handler.mousemove(measureControls.area.handler.evt);
		}
		
		if (components.length == 2 || !measureControls.area.handler.drawing) {
			measureControls.area.handler.removePoint();
			measureControls.area.handler.destroyFeature();//removePoint();
			measureControls.area.cancel();
		}
		
	}
}

/*switch on/off a layer.*/
function toggleLayer(node, checked) 
{
		if (!checked) {
		
			var lyr = map.getLayersBy('layerId',node.attributes.layer.layerId)[0];
			if (lyr)
				map.removeLayer(lyr);
		} else {
			var lyr = map.getLayersBy('layerId',node.attributes.layer.layerId)[0];
			if (!lyr) {
				node.attributes.layer.visibility = true;
				map.addLayer(node.attributes.layer);
				
			}
		}
	toggleParentsCheck(node);
	
	if (layerToRestrictionMappings[node.attributes.layer.layerId]) {
		restrictionsLayerCategoriesOn[node.attributes.layer.layerId] = checked;
		toggleRestrictionsLayer();
	}
}

var restrictionsLayerCategoriesOn = {};
function toggleRestrictionsLayer() {
	
	
	var categoriesOn = false;
	var filter =
		'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml=" http://www.opengis.net/gml">';
	filter += '<ogc:Or>'; 

	
	for (var j in restrictionsLayerCategoriesOn) {
		
		if (restrictionsLayerCategoriesOn[j]) {
			categoriesOn = true;
			for (var i = 0; i < layerToRestrictionMappings[j].length; i++) {
			filter +=
				'<ogc:PropertyIsEqualTo>' + 
				'<ogc:PropertyName>category_id</ogc:PropertyName>'+ 
				'<ogc:Literal>'+layerToRestrictionMappings[j][i]+'</ogc:Literal>' + 
				'</ogc:PropertyIsEqualTo>';
			}
		}
	}
	filter += '</ogc:Or>';
	filter += '</ogc:Filter>';
	
	if (categoriesOn) {
		restrictionsLayer.mergeNewParams({filter: filter});
		restrictionsLayer.setVisibility(true);
	} else {
		restrictionsLayer.setVisibility(false);
	}
}

/*generates an array of ids, use with map printing...*/
function generatePoiIdString() {
var checked = tree.getChecked('wfsFilterIds', tree.getRootNode());
	var checkedNodes = [];
	//remove nodes that aren't wfs nodes.
	for (var i = 0; i < checked.length; i++) {
			if (checked[i] && checked[i].length > 0)
				checkedNodes.push(checked[i]);
	}

	var filters = '';
	for (var i = 0; i < checkedNodes.length; i++) {
		for (var j = 0; j < checkedNodes[i].length; j++) {
				filters += checkedNodes[i][j]+',';
		};
	}
	
	filter = filters.substring(0, filters.length -1);	
	return filter;

}
/*generates the poi filter by a predefined array of ids, use with map printing...*/
function generatePoisFilterByIds(filterIdString) {

	var filterIdArray = filterIdString.split(',');
	var filters = [];
	for (var i = 0; i < filterIdArray.length; i++) {
			var categoryFilter = new OpenLayers.Filter.Comparison(
			{
				type: "==",
				property: "cat_id",
				value: filterIdArray[i]
			});
			filters.push(categoryFilter);
	}
	var filter = null;
	if (filters && filters.length > 0) {
		filter = new OpenLayers.Filter.Logical(
		{
			type: "||",
			filters: filters
		});
	}
	return filter;
}

function generatePoisFilter() {

	var checked = tree.getChecked('wfsFilterIds', tree.getRootNode());
	var checkedNodes = [];
	//remove nodes that aren't wfs nodes.
	for (var i = 0; i < checked.length; i++) {
			if (checked[i] && checked[i].length > 0)
				checkedNodes.push(checked[i]);
	}

	var filters = [];
	for (var i = 0; i < checkedNodes.length; i++) {
		for (var j = 0; j < checkedNodes[i].length; j++) {
			var categoryFilter = new OpenLayers.Filter.Comparison(
			{
				type: "==",
				property: "cat_id",
				value: checkedNodes[i][j]
			});
			filters.push(categoryFilter);
		}
	}
	
	var filter = null;
	if (filters && filters.length > 0) {
		filter = new OpenLayers.Filter.Logical(
		{
			type: "||",
			filters: filters
		});
	}
	return filter;
	

}





/*Generate a filter for the destinations' layer wms call, when requesting a single target.*/
function generateFilter(featureId) 
{

	var filter =
		'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml=" http://www.opengis.net/gml">'+
		'<ogc:PropertyIsEqualTo>' + 
		'<ogc:PropertyName>id</ogc:PropertyName>'+ 
		'<ogc:Literal>'+featureId+'</ogc:Literal>' + 
		'</ogc:PropertyIsEqualTo>'+  
		'</ogc:Filter>';
	return filter;
}




/*when toggling on a category, no point in updating the layer with each checkbox toggle!*/
var PAUSEWFSUPDATE = false;

function updatePois(node) {
	if (!PAUSEWFSUPDATE) {

		var filter = generatePoisFilter();
		var filterChanged = (filter != poiLayer.filter);
		
		if (!filterChanged)
			return;
		
		var visible = false;
		if (filter && filter.filters.length > 0)
			visible = true;		
		var visibilityChanged = (poiLayer.visibility != visible);
		
		//strategies[0] = BBOX, strategies[1] = cluster
		poiLayer.strategies[0].features = [];
		poiLayer.strategies[1].features = [];
		poiLayer.destroyFeatures();
		poiLayer.filter = filter;
		

		//HACK to determine if update needs to be forced. WHEN the layer's visibility is changed
		//for the first time update is forced by invalid bounds. After that visibilitychanged doesn't
		//trigger a forced update even if the layers filter has changed...Thus:
		var bounds = poiLayer.strategies[0].getMapBounds();
		var invalid = poiLayer.strategies[0].invalidBounds(bounds);
		if (invalid) {
				poiLayer.setVisibility(visible);
		}
		else if (!invalid && filterChanged && visible) {
			poiLayer.strategies[0].update({force:true});
			poiLayer.setVisibility(visible);
		} else if (!visible) {
			poiLayer.setVisibility(visible);
		}
	}
	//node only has a value when function is entered by toggling a layer checkbox.
	if (node) {
		toggleParentsCheck(node);
	}
	
}




/*switch on/off a category.*/
var tempCategoryNodeId = null;
function toggleCategory(node, checked) 
{

	//at the start of recursion, store the starter node's id, so that the update of the layer occurs
	//only once!
	if (!tempCategoryNodeId)
		tempCategoryNodeId = node.id;
	
	PAUSEWFSUPDATE = true;
	if (!node.expanded)
		node.expand();
	//toggle children.
	for (var i = 0; i < node.childNodes.length; i++) 
	{
		var child = node.childNodes[i];
		child.ui.checkbox.checked = checked;
		child.ui.onCheckChange();
	}
	
	toggleParentsCheck(node);
	//The node that started the recursion reaches the end of the function -> update poi-layer.
	if (node.id == tempCategoryNodeId) {
		PAUSEWFSUPDATE = false;
		tempCategoryNodeId = null;
	}


	//24.3.2010 - ph - ONLY update the pois, if wfscategories were toggled...!
	if (node.attributes.wfsCategory)
		updatePois();
	
	
	//need to check if any of the filter categories have changed and layer needs to be updated.
//	updatePois();
}

function toggleParentsCheck(node) {

		var tree = node.getOwnerTree();
//		var tempNode = node.parentNode;
		var tempNode = node.parentNode;
		while (tempNode && !tempNode.isRoot) {
			count = tree.getChecked(null, tempNode).length;

			//exclude self
			if (tempNode.ui.checkbox.checked)
				count -= 1;

			
			var checked = (count > 0);
			tempNode.checked = checked;
			tempNode.ui.checkbox.checked = checked;
			tempNode.attributes.checked = checked;
			tempNode = tempNode.parentNode;
		}

}


function changeCoordSys(xTxtKKJ,yTxtKKJ){


	var coordSysX = document.getElementById("coordSysX");
	var coordSysY = document.getElementById("coordSysY");	
	var coordType;
	
	 for (var i=0; i < document.coordSearchForm.coord_type.length; i++)
   {
   if (document.coordSearchForm.coord_type[i].checked)
      {
      coordType = document.coordSearchForm.coord_type[i].value;
      }
   }	
	


	var type = document.coordSearchForm.wgs_type.value;
	
	var coordTable = document.getElementById("coordInput");
	coordTable.style.display = "none";
	
	coordTable = document.getElementById("coordInputWgsD");
	coordTable.style.display = "none";
	
	coordTable = document.getElementById("coordInputWgsDM");
	coordTable.style.display = "none";
	
	coordTable = document.getElementById("coordInputWgsDMS");
	coordTable.style.display = "none";
	
	if(coordType == "kkj" || coordType == "euref") {
	
		coordTable = document.getElementById("coordInput");
		coordTable.style.display = "block";
		document.getElementById("coord_x").maxLength="7";
		document.getElementById("coord_y").maxLength="7";  
		//document.getElementById("coord_y").length="100"; 
		coordSysX.innerHTML = xTxtKKJ;		
		coordSysY.innerHTML = yTxtKKJ;
		document.getElementById("coord_x").value="";
		document.getElementById("coord_y").value="";	
	
	} else if(coordType == "wgs84"){
		
		
		switch(type){
			case "deg":
				coordTable = document.getElementById("coordInputWgsD");
				coordTable.style.display = "block";
			break;
			case "min":
				coordTable = document.getElementById("coordInputWgsDM");
				coordTable.style.display = "block";
			break;
			case "sec":
				coordTable = document.getElementById("coordInputWgsDMS");
				coordTable.style.display = "block";
			break;
		}
	}
}

/*center the map by given coordinates*/
function centerMap(alertTxt){  	
	var coordType;
	var wgsType = document.coordSearchForm.wgs_type.value;
	var coordTypeRadioButtons = document.coordSearchForm.coord_type;

	    if(coordTypeRadioButtons){
			for (var i=0; i < document.coordSearchForm.coord_type.length; i++)
			{
				if (document.coordSearchForm.coord_type[i].checked)
				{
					coordType = document.coordSearchForm.coord_type[i].value;
				}
   			}	
        }else{
          //alert("coord type not set");
          return null;       
		   }
	
	
	

	
	if(coordType == "kkj"){
			x = (document.getElementById("coord_x").value).replace(',','.');
			y = (document.getElementById("coord_y").value).replace(',','.');
	
			
	} else if (coordType == "euref") {		
		x = (document.getElementById("coord_x").value).replace(',','.');
		y = (document.getElementById("coord_y").value).replace(',','.');
		var newLonLat = EUREFToKKJ(x,y);
		x = newLonLat[0];
		y = newLonLat[1];
		
	}else{
	
		
				
		switch(wgsType){

			case "deg":
			
				x = (document.getElementById("lon_d").value).replace(',','.');
				y = (document.getElementById("lat_d").value).replace(',','.');
				if(x == null || x == "" || y == null || y == ""){
					return null;
				}
				
				
				x=parseFloat(x);
				y=parseFloat(y);
				var coords = WGSToKKJ(x,y);
			break;

			case "min":
				x = document.getElementById("lon").value;
				y = document.getElementById("lat").value;
				if(x == null || x == "" || y == null || y == ""){
					return null;
				}
				
				x=parseFloat(x);
				y=parseFloat(y);
				


				x_min = (document.getElementById("lon_min").value).replace(',','.');
				y_min = (document.getElementById("lat_min").value).replace(',','.');
				
				if(x_min == null || x_min == "" || isNaN(x_min)){
					x_min = 0;
				}
				
				if(y_min == null || y_min == "" || isNaN(y_min)){
					y_min = 0;
				}
				
				x_min=parseFloat(x_min) / 60;
				y_min=parseFloat(y_min) / 60; 
				
				
				x = x + x_min;
				y = y + y_min;
				
			break;


			case "sec":
				x = document.getElementById("lon_s").value;
				y = document.getElementById("lat_s").value;
				if(x == null || x == "" || y == null || y == ""){
					return null;
				}
				
				x=parseFloat(x);
				y=parseFloat(y);
				


				x_min = (document.getElementById("lon_min_s").value).replace(',','.');
				y_min = (document.getElementById("lat_min_s").value).replace(',','.');
				
				if(x_min == null || x_min == "" || isNaN(x_min)){
					x_min = 0;
				}
				
				if(y_min == null || y_min == "" || isNaN(y_min)){
					y_min = 0;
				}
				
				x_min=parseFloat(x_min) / 60;
				y_min=parseFloat(y_min) / 60; 
				
				
				
				x_sec = (document.getElementById("lon_sec").value).replace(',','.');
				y_sec = (document.getElementById("lat_sec").value).replace(',','.');
				
				if(x_sec == null || x_sec == "" || isNaN(x_sec)){
					x_sec = 0;
				}
				
				if(y_sec == null || y_sec == "" || isNaN(y_sec)){
					y_sec = 0;
				}
				
				x_sec=parseFloat(x_sec) / 3600;
				y_sec=parseFloat(y_sec) / 3600;
				
				
				x = x + x_min + x_sec;
				y = y + y_min + y_sec;
				
			break;
	}
	
	
		var coords = WGSToKKJ(x,y);
		x = coords[0];
		y = coords[1];
				
	}			
	
	
	if(x == null || x == "" || y == null || y == ""){
		return null;
	}
	
	if(isNaN(x)){
		this.changeTxtColor("coord_x","red");
		if(isNaN(y)){
			this.changeTxtColor("coord_y","red");
		}
		return null;		
		}
	
	if(isNaN(y)){
		this.changeTxtColor("coord_y","red");
		return null;
	}
			
	
	
	//Check that coords are inside the limits.
	/*
		if(x < AjaxMapsConfig.MAP_MIN_X || x > AjaxMapsConfig.MAP_MAX_X ||
		y < AjaxMapsConfig.MAP_MIN_Y || y > AjaxMapsConfig.MAP_MAX_Y){
			alert(alertTxt);
			return null;	}	
*/

		var lonlat = new OpenLayers.LonLat(x, y);
		map.setCenter(lonlat);
//		alert('N :'+lonlat.lat+' E: '+lonlat.lon);
  }

function changeTxtColor(elem,color){ 	
	var elem = document.getElementById(elem);
	elem.style.color = color;	
}

function selectTxtFieldContent(fieldId){

	var txtField = document.getElementById(fieldId);
	txtField.focus();
	txtField.select();
}



function enterSubmit(e, alertTxt){
	var key;

	if(window.event) {
		key = window.event.keyCode;
	} 
	else {
		key = e.which;
	}

	if(key ==13)
	{
		this.centerMap(alertTxt);
	}
}

function WGSToKKJ(x, y) {
	
	var lonlat = new OpenLayers.LonLat(x,y);
	var newLonlat = transFormProjection("EPSG:4326", "EPSG:2393",lonlat);
//	alert('N: '+lonlat.lat+' E: '+lonlat.lon +'\n'+
//		  'N: '+newLonlat.lat+' E: '+newLonlat.lat);
	return [newLonlat.lon, newLonlat.lat];
}

function EUREFToKKJ(x, y) {
	
	var lonlat = new OpenLayers.LonLat(x,y);
	var newLonlat = transFormProjection("EPSG:3067", "EPSG:2393",lonlat);
//	alert('N: '+lonlat.lat+' E: '+lonlat.lon +'\n'+
//		  'N: '+newLonlat.lat+' E: '+newLonlat.lat);
	return [newLonlat.lon, newLonlat.lat];
}

function transFormProjection(src, dest, lonlat) {
	var source = new Proj4js.Proj(src);
	var destination = new Proj4js.Proj(dest);
//	var point = new OpenLayers.Geometry.Point(parseFloat(lonlat.lon), parseFloat(lonlat.lat));	
	var point = new OpenLayers.Geometry.Point(lonlat.lon, lonlat.lat);	
	point = Proj4js.transform(source, destination, point);
	var targetLonlat = new OpenLayers.LonLat(point.x, point.y); 
	return targetLonlat;
}



function generateVectorLayer() {

	var style = new OpenLayers.Style({
			externalGraphic: "${getExternalGraphic}",
			graphicWidth: "${getGraphicWidthOrHeight}",
			graphicHeight: "${getGraphicWidthOrHeight}",

			label: "${getLabel}",
			
			
			/*PATCH #2148!
			 * Modified 
			 * feature/vector.js
			 * renderer/VML.js / SVG.js
			 * accordingly.
			 * 
			 * */
			labelSelect:true,
			
			fontColor: "#FFFFFF",
            fontSize: "12px",
            fontFamily: "Tahoma",
            fontWeight: "bold"
            
            
            /*These don't apparently do anything...At least not before OL 2.9*/
            /*
            ,labelXOffset: 50,
            labelYOffset: 60
            */
            /*
            setting this screws up IE 
            
            	,
            labelAlign: "center"
            */
            
		}, 
      	{
			context: 
			{
	            getExternalGraphic: function(feature) {
	            	//single
	            	if (feature.attributes.count == 1) {
//	            		return categoryMarkersPath + categoryMarkers[];
	            		return categoryMarkersPath + categories[feature.cluster[0].attributes.cat_id].marker
	            	} else 
	            		//return './images/poi_unknown.gif';
	            		return './images/categories/ryhmanappi.png';
	            },
	            /*18.6.2010 - ph - different sizes for different icons....*/
	            getGraphicWidthOrHeight: function(feature) {
	            	if (feature.attributes.count == 1) {
	            		return 20;
	            	} else 
	            		return 32;
	            },
	            getLabel: function(feature) {
	            	if (feature.attributes.count == 1)
	            		return '';
	            	else return feature.attributes.count;
	            		
	            }
	      	}
		
		});
	var clusterStrategy = new OpenLayers.Strategy.Cluster();
			
	var layer = new OpenLayers.Layer.Vector("WFS", {
			visibility: false,
			projection: "EPSG:2393",
            strategies: [new OpenLayers.Strategy.BBOX({ratio:1}),clusterStrategy],
            extractAttributes: true,
            geometry_column: "the_geom",
            typename: "retkikartta:point_dump",
            //Don't show features on the first two zoom levels.
//			resolutions: 	[132.291931,26.458386,13.229193,6.614597,4.234905,2.116577,0],
			resolutions: 	[26.458386,13.229193,6.614597,4.234905,2.116577,0],
            protocol: new OpenLayers.Protocol.WFS.v1_1_0({
            	
            	//22.06.2010 - ph - use the global setting
//                url:  "http://demo.navici.com/geoserver/wfs",
                url:  wfsUrl,
		  srsName:"EPSG:2393",
                featureType: "point_dump",
                maxFeatures: 500,
                featurePrefix: "retkikartta"
            }),
			styleMap: new OpenLayers.StyleMap({
                      "default": style,
                      "select": {
                          fillColor: "#8aeeef",
                          strokeColor: "#32a8a9"
                      }
                  }),
                  
	     	moveTo: function() {
				this.filter = generatePoisFilter();
//				this.strategies[0].createFilter();
//				this.strategies[0].update({force:"true"});
				OpenLayers.Layer.Vector.prototype.moveTo.apply(this, arguments);	     		
	     	}
	});
	if (!layer.protocol.format)
		layer.protocol.format = new OpenLayers.Format.WFS.v1_1_0({layerName: "retkikartta:point_dump"}, layer);
	clusterStrategy.activate();	
return layer;
}


function getUrlRetkikartta(bounds) {
    var z = this.map.getZoom();

    var res = this.map.getResolution();
    var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
    var y = Math.round((bounds.bottom - this.maxExtent.bottom) / (res * this.tileSize.h));
    var limit = Math.pow(2, z);
    
    //x = ((x % limit) + limit) % limit;
    // var a = "http://80.248.161.107:81/t/retkikartta/maps/2393x"+res+"x"+x+"x"+y+".png";
    var a = "http://ntile1.navici.com/t/retkikartta/maps/2393x" + res + "x" + x + "x" + y + ".png?cid=a9e9a1840ee69e32d59af86dd1ffeb44";
    return a;
}



function selectLinkReDirect(selectElm){		
	var url = selectElm.options[selectElm.selectedIndex].value;
	if(url!=null && url != ''){
		window.open(url,null,'width=850,height=750,toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,copyhistory=yes,resizable=yes');
	}
}

function showWindow(windowname) {
	if (windowname == 'contact') {
		window.open('contact.php?lang='+LANGUAGE_SELECTION,"guidance",'width=850,height=750,toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,copyhistory=yes,resizable=yes');
	} else if (windowname == 'feedback') {
		
		var url = '';
		if (LANGUAGE_SELECTION == 'en') {
//			url = 'http://www.luontoon.fi/page.asp?Section=4973&Item=16423';
			url = 'http://www.outdoors.fi/Pages/ExcursionmapfiFeedback.aspx';
		} else if (LANGUAGE_SELECTION == 'se') {
//			url = 'http://www.luontoon.fi/page.asp?Section=80&Item=16424';
			url = 'http://www.utinaturen.fi/Sidor/Utflyktskartafirespons.aspx';
		} else {
//			url = 'http://www.luontoon.fi/page.asp?Section=80&Item=16421';
			url = 'http://www.luontoon.fi/Sivut/Retkikarttafipalaute.aspx';
		}
		
		window.open(url, "guidance",'width=850,height=750,toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,copyhistory=yes,resizable=yes');
	} else if (windowname == 'terms') {
		window.open('termsofuse.php?lang='+LANGUAGE_SELECTION,"guidance",'width=850,height=750,toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,copyhistory=yes,resizable=yes');
	} else if (windowname == 'instructions') {
		window.open('./instructions/instructions.php?lang='+LANGUAGE_SELECTION,"guidance",'width=850,height=750,toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,copyhistory=yes,resizable=yes');
	} else if (windowname == 'releasenotes') {
		window.open('./release/releasenotes.php?lang='+LANGUAGE_SELECTION,"guidance",'width=850,height=750,toolbar=yes,location=yes,directories=yes,status=yes,menubar=yes,scrollbars=yes,copyhistory=yes,resizable=yes');
	}

}

//toggle between fullscreen / regular screen map.
function toggleFullscreenMap() {
	
	var fullScreenDiv = document.getElementById('fullscreenMapDiv');
	
	if (!fullScreenDiv) {
		
		
		var fullscreenMapDiv = document.createElement("div");
		fullscreenMapDiv.id = "fullscreenMapDiv";
		fullscreenMapDiv.style.position = "absolute";
		fullscreenMapDiv.style.backgroundColor = "#FFFFFF";
		fullscreenMapDiv.style.left = "0px";
		fullscreenMapDiv.style.top = "0px";
		fullscreenMapDiv.style.width="100%";
		fullscreenMapDiv.style.height = "100%";
		fullscreenMapDiv.style.zIndex = map.Z_INDEX_BASE.BaseLayer;
		
		var fullscreenLayertreeDiv = document.createElement("div");
		fullscreenLayertreeDiv.id = "fullscreenLayertreeDiv";
		fullscreenLayertreeDiv.className = "fullscreenLayertreeDiv";
		fullscreenLayertreeDiv.innerHTML = '<a class="formLabelHeader">'+Language.get('maplayers')+'</a><br/>'
		document.body.appendChild(fullscreenMapDiv);
		
		document.getElementById('fullscreenMapDiv').appendChild(document.getElementById('map'));
		document.getElementById('fullscreenMapDiv').appendChild(fullscreenLayertreeDiv);
		document.getElementById('fullscreenLayertreeDiv').appendChild(document.getElementById('tree-div'));
		
		var resizer = new Ext.Resizable("fullscreenLayertreeDiv", {
//		    handles: 'all',
		    handles: 's,w,sw',
		    minWidth: 250,
		    minHeight: 150,
		    maxWidth: 400,
		    maxHeight: 600,
		    pinned: true,
		    wrap: true
		});
		
		//For ie to position the whole thing correctly.
		resizer.el.setRight(0);
		resizer.el.setTop(33);
		
		
		document.getElementById('footerDiv').style.visibility = "hidden";
		
		/*updates the map's div's offsets*/
		map.moveTo(map.getCenter(), map.getZoom());
		removePopups();
		
		/*also remove measurements and labels for measurements ('cos they're poorly placed when toggling the map state)*/
		for(var key in measureControls) {
			control = measureControls[key];
			if (control.active) {
				control.deactivate();
				control.activate();
			}
		}     

		
	} else {
		document.getElementById('treeContainerContainer').appendChild(document.getElementById('tree-div'));
		document.getElementById('mapContainerContainer').appendChild(document.getElementById('map'));
		
		document.body.removeChild(document.getElementById('fullscreenMapDiv'));
//		document.body.removeChild(document.getElementById('fullscreenLayertreeDiv'));
		document.getElementById('footerDiv').style.visibility = "visible";

		/*updates the map's div's offsets*/
		map.moveTo(map.getCenter(), map.getZoom());
		removePopups();
		/*also remove measurements and labels for measurements ('cos they're poorly placed when toggling the map state)*/
		for(var key in measureControls) {
			control = measureControls[key];
			if (control.active) {
				control.deactivate();
				control.activate();
			}
		}     
	
		
	}
}





