var map;
//var untiled;
var tiled;
// pink tile avoidance
OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
// make OL compute scale according to WMS spec
OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;

//controls
var	zoomBox,zOut,dragPan,coordinatesInfo;

//eventhandlers
var coEventHandler;

//show wms metadata - hoverhandler.
var metadataInfoHandler;

//the active tab in left panel.
var activeTab;


//var drawPoint, pointLayer, featurePopup;
var drawPoint, featurePopup;
//left-bottom, right-top
var MAX_BOUNDS =	new OpenLayers.Bounds(
    	4420000, 6650000.35185,
        4660000.5397, 7040000
);

var DEFAULT_ZOOM = 2;

var SEARCHRESULTLISTMAXLENGTH = 201;

var poiClassesMapping = [];
var mapOptions;

var maxLat = 63.00331; 
var maxLon = 32.90285; 
var minLat = 60.20206; 
var minLon = 27.23968;

function initMap(id, opts){


	mapOptions = opts;
	OpenLayers.ImgPath = './style/img/';

	var reqParamE = getRequestParam('E');
	var reqParamN = getRequestParam('N');
	var reqParamScale = getRequestParam('scale');
	var reqParamBaseLayer = getRequestParam('base');
	
	var reqParamPrint = getRequestParam('print');
	//is there a popup?
	var reqParamPopupText = getRequestParam('text');

	var bounds = MAX_BOUNDS;
    var options = {
        controls: [],
		maxExtent: MAX_BOUNDS,
        projection: "EPSG:2394",
        units: 'm',
		scales: [2000000, 750000, 500000, 100000, 75000, 50000, 40000, 30000, 20000, 15000, 10000, 5000, 2000],
        
        moveTo: function() {
        	var oldZoom = map.getZoom();
        	OpenLayers.Map.prototype.moveTo.apply(this, arguments);
        	//zoom changed, check whether baselayer needs to be changed.
        	var newZoom = map.getZoom();
        	if (oldZoom != map.getZoom()) {
				checkActiveLayer();
        		renderLayerList();
        	}
        }
    };

    map = new OpenLayers.Map(id, options);
    map.events.register("moveend",map, function() { toggleMetadata();});
    
	//add wms layers defined in opts            
	for (var i = 0; i < opts.layers.length; i++){
		if (opts.layers[i]) {
			map.addLayer(opts.layers[i]);
		}	
	}
	
	
	//construct the controls for the map, only for nonprintable map
	if (!reqParamPrint || reqParamPrint == null || reqParamPrint == 'null') {
		addMapControls(id, mapOptions);
		toggleLeftpanelActiveTab();
	}
	
	if (reqParamN && reqParamE && reqParamScale) {
		map.setCenter(new OpenLayers.LonLat(reqParamE, reqParamN));
		map.zoomToScale(reqParamScale, true);
	} 
	else {
		map.setCenter(bounds.getCenterLonLat(), 1);
	}
	
	if (reqParamBaseLayer)
		toggleLayer(reqParamBaseLayer);
	
	if (reqParamPopupText != 'null' && reqParamN && reqParamE) {
		featurePopup = null;
		var lonlat = new OpenLayers.LonLat(reqParamE, reqParamN);
		var htmlContent =
			'<br/><span align="center" class="leftpanelheader">'+decodeURIComponent(escape(reqParamPopupText))+'</span><br/><br/>';
		
		featurePopup = new OpenLayers.Popup.FramedCloud(
							'featurePopup', 
							lonlat, 
							new OpenLayers.Size(350,250),
							htmlContent,
							null,
							true
							);
	map.addPopup(featurePopup);
	}
	
	
	//should the leftpanel already be resized...?
	resizeLeftPanel();
	
}

function addMapControls(id, opts) {

	//clickHandlers.
    coEventHandler = new OpenLayers.Handler.Click( { 'map': map } , { 'click': function(e) { getCN(e); } });
	
	metadataInfoHandler = new OpenLayers.Handler.Click(
					{ 'map': map }, 
					{ 'click': function(e) { getWMSFeatureInfo(e); } 
				});

	drawPoint = new OpenLayers.Handler.Click(
					{ 'map': map }, 
					{ 'click': function(e) { createFeaturePopup(e);} 
				});
    
    //Mouseposition
    var mousePosition = new OpenLayers.Control.MousePosition({ 
		div: document.getElementById('mapMousePosition'), 
		numDigits: 5,
		prefix: 'WGS84: N / Lat: ',
		separator: ', E / Lon: ',
		
		formatOutput: function (lonlat) {
			
			lonlat =  transFormProjection("EPSG:2394","EPSG:4326",lonlat);
			
			/*swap the order.*/
			
			var tempLon = lonlat.lon;
			var tempLat = lonlat.lat;
			lonlat.lat = tempLon;
			lonlat.lon = tempLat;
			
			var newHTML = OpenLayers.Control.MousePosition.prototype.formatOutput.apply(this, arguments);
			return newHTML;
		}
	}) 
    map.addControl(mousePosition);
	
	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(id + 'mapScale').innerHTML = "1 : " + scale; 
							} 
	}); 
    map.addControl(scaleControl); 
	
	/*show coordinates*/
	coordinatesInfo = new OpenLayers.Control({
	});
	// register events to the coordinatesInfo tool
	coordinatesInfo.events.register("activate", 
		coordinatesInfo, 
		function() { toggleCOMode(); 
	});
	
	coordinatesInfo.events.register("deactivate", 
		coordinatesInfo, 
		function() { toggleCOMode(); 
	});                            
	if (opts.footer) {
		if (document.getElementById(id)) {
			document.getElementById(id).appendChild(document.getElementById('mapStatus')); 
			document.getElementById('mapStatus').className='mapStatus';
		}
	}
	else {
		if (document.getElementById('mapStatus')) 
			document.getElementById('mapStatus').style.display = "none";
	}	
   
    // build up all controls            
    map.addControl(new OpenLayers.Control.PanZoom({
        position: new OpenLayers.Pixel(2, 15)
    }));
    map.addControl(new OpenLayers.Control.Navigation());
    map.addControl(coordinatesInfo);

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

	//method adds the indexmap.
	addIndexMap(opts);
}

function toggleDrawPoint(onOrOff) 
{
	if (onOrOff)
		drawPoint.activate();
	else 
		drawPoint.deactivate();
}

//function createFeaturePopup(feature) {
function createFeaturePopup(evt) {
	
	if (featurePopup)
		map.removePopup(featurePopup);
	
	var featureLonlat = map.getLonLatFromViewPortPx(evt.xy);
	var htmlContent =
			'<span class="leftpanellabel">'+Language.get('makelinkpopuplabel')+'</span><br/>'+
			'<input class="leftpanelinput" type="text" id="popupLinkName"'+ 
			'onkeyup="if (checkEnter(event)) document.getElementById(\'popupButtonMakelink\').click();"/>'+
			'<br/>'+
			'<input class="popupbutton leftpanelinput" type="button" id="popupButtonMakelink" value="'+Language.get('makelink')+'" onclick="makeLink(\''+featureLonlat.lon+'\',\''+featureLonlat.lat+'\');destroyFeaturesAndPopups();"/>';
		
	featurePopup = new OpenLayers.Popup.FramedCloud(
							'featurePopup', 
							featureLonlat, 
							new OpenLayers.Size(400,300),
							htmlContent,
							null,
							true,
							destroyFeaturesAndPopups
							);
	map.addPopup(featurePopup);
	document.getElementById('popupLinkName').focus();
}

function toggleCOMode()
{             
	if(coordinatesInfo.active) {
		if (metadataInfoHandler) {
			metadataInfoHandler.deactivate();
			toggleMetadataCheckbox();	
		}
		coEventHandler.activate();
	}
	else {
		coEventHandler.deactivate();
	}
}


/*coordinates popup*/	
function getCN(event) {

	var lonlat = map.getLonLatFromViewPortPx(event.xy);  

	//conversion to wgs84.
	var lonlatinwgs =  transFormProjection("EPSG:2394","EPSG:4326",lonlat);
	
	//5 decimals max!
	lonlatinwgs.lon = lonlatinwgs.lon.toFixed(5);
	lonlatinwgs.lat = lonlatinwgs.lat.toFixed(5);
	document.getElementById('centerthemapX').value = lonlatinwgs.lon;
	document.getElementById('centerthemapY').value = lonlatinwgs.lat;
}

function transFormProjection(src, dest, lonlat) {
	var source = new Proj4js.Proj(src);
	var destination = new Proj4js.Proj(dest);
	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 setCenter() {
   	
	document.getElementById('nocoordinateserror').innerHTML = '';//Language.get('nocoordinateserror');
   	var lon = document.getElementById('centerthemapX').value;
   	var lat = document.getElementById('centerthemapY').value;

	lon = lon.replace(',','.');
	lat = lat.replace(',','.');
	if (!isNaN(lon) && !isNaN(lat)) {
		if (lon <= maxLon && lon >= minLon && lat <= maxLat && lat >= minLat) {
		   	var lonlat = new OpenLayers.LonLat(lon, lat)
			var targetLonlat = transFormProjection("EPSG:4326", "EPSG:2394",lonlat)   	
		   	if (targetLonlat) {
			   	var zmlevel = map.getZoom();
				map.setCenter(targetLonlat, zmlevel);
			}		
		} else {
			document.getElementById('nocoordinateserror').innerHTML = Language.get('nocoordinateserror');
		}
	}	
	 else {
		document.getElementById('nocoordinateserror').innerHTML = Language.get('nocoordinateserror');
	}
}				

/*render layerlist content to left panel!*/
function renderLayerList() {
	var elementListDiv = document.getElementById('layerListRadiobuttons');
	var htmlContent = '';
	
	if (elementListDiv) 
	{
		var message = '';
		htmlContent += 		
		
				'<div class="divider"></div><div class="divider"></div>'+
				'<span id="selectlayerlabel" class="leftpanelheader">'
				+Language.get('selectlayerlabel')+
				'</span><br/>';
		
		htmlContent +='<span class="leftpanellabel">';
		for (i = 0; i < map.layers.length; i++) {
				var mapname = '';
				if  (map.layers[i].options && 
					 map.layers[i].options.names &&
					 map.layers[i].options.names[Language.LANGUAGE_SELECTION])
					
					mapname = map.layers[i].options.names[Language.LANGUAGE_SELECTION]
				else
					mapname = map.layers[i].name;
			if (map.layers[i].displayInLayerSwitcher && 
				map.layers[i].visibility && 
				map.layers[i].inRange) {
				htmlContent +=
						'<input class="leftpanelinput" type="radio" checked="true"'+
						' name="mapLayer" id="mapLayer" value="'+map.layers[i].id+'" onclick="toggleLayer(\''+map.layers[i].id+'\');">'+
//						map.layers[i].name+'<br/>'+
						mapname+'<br/>'+
						'<div class="divider"></div>';
			} else if (map.layers[i].displayInLayerSwitcher){
				htmlContent +=
						'<input class="leftpanelinput" type="radio"'+
						' name="mapLayer" id="mapLayer"'+ 
						' value="'+map.layers[i].id+'"';
				htmlContent +=		
						' onclick="toggleLayer(\''+map.layers[i].id+'\');">'+
//						map.layers[i].name+'<br/>'+
						mapname+'<br/>'+
						'<div class="divider"></div>';
			}
		}
		//check / uncheck / en- / disable metadatacheckbox.
		elementListDiv.innerHTML = htmlContent;
		toggleMetadataCheckbox();
	}
}

/*used when automatically switching layers...*/
function toggleMetadataCheckbox() {
	var chkMetadata = document.getElementById('chkshowmetadata');
	
	if (chkMetadata) {
		//Toggled on when sending the request...
		var infolayer_topo = map.getLayersBy('layerId','topo20_info')[0]; 
		var infolayer_pitaja = map.getLayersBy('layerId','pitaja20_info')[0]
		//topo20 / pitäjä20 -> voidaan enabloida "metadata"
		var metadataEnabled = false;
		var layer = getActiveLayer();
		
		/*metadata available ONLY for search tab.*/
		if (this.activeTab && this.activeTab != 'searchTab') {
			infolayer_topo.setVisibility(false);
			infolayer_pitaja.setVisibility(false);
			chkMetadata.disabled = true;
			chkMetadata.checked = false;
			metadataInfoHandler.deactivate();
			return;
		}
		
		if (layer && layer != null && 
				(layer.layerId == 'topo20' ||
				layer.layerId == 'pitaja20')) {
					metadataEnabled = true;
				
				/*switch on the grid  as well.*/
				if (layer.layerId == 'topo20' && metadataInfoHandler.active) {
					infolayer_topo.setVisibility(true);
					infolayer_pitaja.setVisibility(false);
				} else if (layer.layerId == 'pitaja20' && metadataInfoHandler.active){
					infolayer_topo.setVisibility(false);
					infolayer_pitaja.setVisibility(true);
				} else {
					infolayer_topo.setVisibility(false);
					infolayer_pitaja.setVisibility(false);
				}
			} else {
				metadataInfoHandler.deactivate();
				metadataEnabled = false;
			}
	
			chkMetadata.disabled = !metadataEnabled;
			chkMetadata.checked = metadataInfoHandler.active;
			
			
			try {
				var elem = document.getElementById('wmsFeatureInfoDiv');
					if (elem) {
						elem.style.visibility = metadataInfoHandler.active?'visible':'hidden';
					if (elem.style.visibility == 'hidden')
						elem.innerHTML = '';
					}
			} catch (e) {
				
			}
	}
}


function toggleMetadata() {
	var elem = document.getElementById('chkshowmetadata');
	if (elem && elem.checked) 
	{
		metadataInfoHandler.activate();

		var centerpixel = map.getViewPortPxFromLonLat(map.getCenter());
		centerpixel.x = parseInt(centerpixel.x);
		centerpixel.y = parseInt(centerpixel.y);
	
		var evt;
		if (document.createEventObject) {
			evt = document.createEventObject("MouseEvents");
			evt.xy = centerpixel;
			getWMSFeatureInfo(evt);
		} else { // firefox!!!
			var evt = window.document.createEvent("MouseEvents");
			evt.initEvent("click", true, true);
			evt.xy = centerpixel;
			getWMSFeatureInfo(evt);
		}

	//if printable map -> neither metadatahandler or the checkbox exist!!!!
	} else if (elem) {
		metadataInfoHandler.deactivate();
	}
	toggleMetadataCheckbox();
}

function getActiveLayer() {
	for (var i = 0; i < map.layers.length; i++) 
	{
		//already a visible layer toggled on.
		if (map.layers[i].visibility && map.layers[i].displayInLayerSwitcher) {
			return map.layers[i];
		}
	}
	return null;
}

function checkActiveLayer() {
	var foundVisibleLayer = false;
	for (var i = 0; i < map.layers.length; i++) 
	{
		//already a visible layer toggled on.
		if (map.layers[i].visibility && 
			map.layers[i].displayInLayerSwitcher&& 
			map.layers[i].inRange) {
			foundVisibleLayer = true;
			toggleMetadataCheckbox();
			break;
		}
	}
	
	//no visible layers -> turn on the first one that fits in range... 
	if (!foundVisibleLayer) {
		for (var i = 0; i < map.layers.length; i++) 
		{
			if (map.layers[i].inRange && map.layers[i].displayInLayerSwitcher) {
				toggleLayer(map.layers[i].id);
				break;
			}
		}
	}
}

function toggleLayer(id) {
	var layer = map.getLayer(id);
	
	//toggle on the layer in question, and toggle off all other layers (except base layer).
	if (!layer.visibility)
		layer.setVisibility(true);
	
	for (var i = 0; i < map.layers.length; i++) 
	{
		if (map.layers[i].id != layer.id && !map.layers[i].isBaseLayer) {
			map.layers[i].setVisibility(false);
		}
	}
	
	
	if (!layer.inRange || layer.inRange == 'false' || layer.inRange == false) 
	{
		if (layer.minScale < map.getScale())
			map.zoomToScale(layer.minScale, true);
		else if (layer.maxScale >= map.getScale())
			map.zoomToScale(layer.maxScale, true);
	} 
	
	toggleMetadata();
	renderLayerList();
}

function loadInitialView() 
{
	map.setCenter(MAX_BOUNDS.getCenterLonLat(), DEFAULT_ZOOM);
	toggleLeftpanelActiveTab('searchTab');
}

function reloadPage(language) 
{
	Language.changeLanguage(language);
	renderLayerList();
	
	if (this.activeTab)
		toggleLeftpanelActiveTab(this.activeTab);
	else
		toggleLeftpanelActiveTab('searchTab');
}

/*
Generates the requestparameters for the current map view. 
i.e. language, center, scale and baselayer info*/
function createRequestParams() 
{
	var baseLayer = getMapvisibleLayer();//map.baseLayer;
	var scale = map.getScale();
	var center = map.getCenter();
	var E = center.lon;
	var N = center.lat;

	var paramString =
								'&E='+E+
								'&N='+N+
								'&scale='+scale+
								'&base='+baseLayer.id;
	return paramString;
}


/*
gets a given parameter from the curren requeststring.
i.e. language etc.
*/
function getRequestParam(parameterName) {

		var queryString = window.top.location.search.substring(1);
		// Add "=" to the parameter name (i.e. parameterName=value)
		var parameterName = parameterName + "=";
		if ( queryString.length > 0 ) {
		// Find the beginning of the string
		begin = queryString.indexOf ( parameterName );
		// If the parameter name is not found, skip it, otherwise return the value
		if ( begin != -1 ) {
			// Add the length (integer) to the beginning
			begin += parameterName.length;
			// Multiple parameters are separated by the "&" sign
			end = queryString.indexOf ( "&" , begin );
			if ( end == -1 ) {
				end = queryString.length
			}
		// Return the string
		return unescape ( queryString.substring ( begin, end ) );
		}
		// Return "null" if no parameter has been found
		return "null";
	}
}		

/*left panel div manipulation methods.*/
function toggleLeftpanelActiveTab(tabId) 
{
	coordinatesInfo.deactivate();
	toggleDrawPoint(false);
	
	
	
	if (!tabId)
		tabId = 'searchTab';
	
	
	this.activeTab = tabId;
	var leftpanelTabContainer = document.getElementById("leftPanelActiveTab");
	destroyFeaturesAndPopups();
	/*search tab active.*/
	if (tabId == 'searchTab') {
	
		//When search tab is activated, reinitialize mappings in case language has changed.	
		poiClassesMapping = 
		{
			C: Language.get('city'),
			K: Language.get('village'),
			R: Language.get('structure'),
			M: Language.get('landmark'),
			V: Language.get('water'),
			S: Language.get('church')
		};
	
		hideWmsFeatureInfo();	
		leftpanelTabContainer.innerHTML =
		
			'<div id="tabChangeButtons" class="tabchangebuttons">'+
			'<input type="button" title="'+Language.get('tabbuttonlabelsearchtitle')+'" class="tabbuttonactive" value="'+Language.get('tabbuttonlabelsearch')+'" onclick="toggleLeftpanelActiveTab(\'searchTab\');"/>'+
			'<input type="button" title="'+Language.get('tabbuttonlabelmakelinktitle')+'" class="tabbuttoninactive makelinkbutton" value="'+Language.get('tabbuttonlabelmakelink')+'" onclick="toggleLeftpanelActiveTab(\'linkTab\');makeLinkWithoutText();"/>'+
			'<input type="button" title="'+Language.get('tabbuttonlabelcoordtitle')+'" class="tabbuttoninactive" value="'+Language.get('tabbuttonlabelcoord')+'" onclick="toggleLeftpanelActiveTab(\'coordTab\');"/>'+
			'<br/>'+
			'<br/>'+
			'</div>'+
		
			'<div class="divider"></div>'+
			'<span id="labelsearch" class="leftpanellabel">'+Language.get('labelsearch')+'</span>'+
			'<br/>'+

			'<div class="divider"></div>'+

			'<input class="leftpanelinput" type="text" id="placename" onkeyup="checkIfInputValid(event);"/>'+
			'<br/>'+
			'<div class="divider"></div>'+

				'<input class="leftpanelinput" type="checkbox" checked name="chkcity" id="chkcity"  value="C"/>'+
				'<span class="leftpanellabel" id="city">'+Language.get('city')+'</span>'+
			'<br/>'+
			'<div class="divider"></div>'+

				'<input class="leftpanelinput" type="checkbox" checked name="chkvillage" id="chkvillage"  value="K"/>'+
				'<span class="leftpanellabel" id="village">'+Language.get('village')+'</span>'+
			'<br/>'+
			'<div class="divider"></div>'+
				'<input class="leftpanelinput" type="checkbox" checked name="chkstructure" id="chkstructure"  value="R"/>'+
				'<span class="leftpanellabel" id="structure">'+Language.get('structure')+'</span>'+
			'<br/>'+
			'<div class="divider"></div>'+
				'<input class="leftpanelinput" type="checkbox" checked name="chklandmark" id="chklandmark"  value="M"/>'+
				'<span class="leftpanellabel" id="landmark">'+Language.get('landmark')+'</span>'+
			'<br/>'+
			'<div class="divider"></div>'+
				'<input class="leftpanelinput" type="checkbox" checked name="chkwater" id="chkwater"  value="V"/>'+
				'<span class="leftpanellabel" id="water">'+Language.get('water')+'</span>'+
			'<br/>'+
			'<div class="divider"></div>'+
				'<input class="leftpanelinput" type="checkbox" name="chkchurch" id="chkchurch" value="S"/>'+
				'<span class="leftpanellabel" id="church">'+Language.get('church')+'</span>'+
			'<br/>'+
			'<div class="divider"></div>'+
			'<input class="leftpanelinput" type="checkbox" name="chkonlymaparea" id="chkonlymaparea"/>'+
			'<span class="leftpanellabel" id="onlymaparea">'+Language.get('onlymaparea')+'</span>'+
			'<br/><br/>'+
			'<div class="tabactionbutton">'+
			'<span class="leftpanellabel leftpanellabelforactionbutton" id="foundtotal"></span>'+
			'<input id="buttonsearch" disabled="true" class="tabactionbutton" type="button" value="'+Language.get('buttonsearch')+'" onclick="searchByPlace();"></input>'+
			'</div>'+
			'<div id="searchResults">'+
			'</div>'+
			'<br/>';
			
			leftpanelTabContainer.innerHTML += 	
						'<input type="checkbox" name="chkshowmetadata" id="chkshowmetadata" onclick="toggleMetadata();"/>'+
						'<span id="showmetadatalabel" class="leftpanellabel">'+Language.get('showmetadatalabel')+'</span><br/>';
			document.getElementById('placename').focus();
			toggleMetadata();
			
		} else if (tabId == 'linkTab') 
		{
		
			toggleMetadata();
			hideWmsFeatureInfo();		
			toggleDrawPoint(true);

			leftpanelTabContainer.innerHTML =
			'<div id="tabChangeButtons" class="tabchangebuttons">'+
			'<input type="button" title="'+Language.get('tabbuttonlabelsearchtitle')+'" class="tabbuttoninactive" value="'+Language.get('tabbuttonlabelsearch')+'" onclick="toggleLeftpanelActiveTab(\'searchTab\');"/>'+
			'<input type="button" title="'+Language.get('tabbuttonlabelmakelinktitle')+'" class="tabbuttonactive  makelinkbutton" value="'+Language.get('tabbuttonlabelmakelink')+'" onclick="toggleLeftpanelActiveTab(\'linkTab\');makeLinkWithoutText();"/>'+
			'<input type="button" title="'+Language.get('tabbuttonlabelcoordtitle')+'" class="tabbuttoninactive" value="'+Language.get('tabbuttonlabelcoord')+'" onclick="toggleLeftpanelActiveTab(\'coordTab\');"/>'+
				'<br/>'+
				'<br/>'+
				'</div>'+
				'<div class="divider"></div>'+
				'<span class="leftpanellabel">'+Language.get('makelinkinfo')+'</span><br/>'+
				'<div class="divider"></div>'+
				'<br/>'+
				'<textarea id="textareaLink" rows="5" class="leftpanelinput linkbox">'+
				'</textarea>'+
				'<br/>';
		} else if (tabId == 'coordTab') 
		{
			coordinatesInfo.activate();
			toggleMetadata();
			hideWmsFeatureInfo();		
			leftpanelTabContainer.innerHTML =

			'<div id="tabChangeButtons" class="tabchangebuttons">'+
			'<input type="button" title="'+Language.get('tabbuttonlabelsearchtitle')+'" class="tabbuttoninactive" value="'+Language.get('tabbuttonlabelsearch')+'" onclick="toggleLeftpanelActiveTab(\'searchTab\');"/>'+
			'<input type="button" title="'+Language.get('tabbuttonlabelmakelinktitle')+'" class="tabbuttoninactive  makelinkbutton" value="'+Language.get('tabbuttonlabelmakelink')+'" onclick="toggleLeftpanelActiveTab(\'linkTab\');makeLinkWithoutText();"/>'+
			'<input type="button" title="'+Language.get('tabbuttonlabelcoordtitle')+'" class="tabbuttonactive" value="'+Language.get('tabbuttonlabelcoord')+'" onclick="toggleLeftpanelActiveTab(\'coordTab\');"/>'+
				'<br/>'+
				'<br/>'+
				'</div>'+
				'<div class="divider"></div>'+
				'<span class="leftpanellabel">'+Language.get('coordinatesinfo')+'</span><br/><br/>'+
				'<span class="leftpanellabel">'+Language.get('coordinatesinfonote')+'</span><br/><br/>'+
				'<span class="leftpanellabel">'+Language.get('coordinatesysteminfo')+'</span><br/>'+
				'<span id="labelcentermap" class="leftpanellabel"></span>'+
				'<br/>'+
					'<table><tr><td><span class="leftpanellabel">N / lat :</span></td>'+
					'<td><input class="leftpanelinput" type="text" id="centerthemapY" maxlength="8"/></td></tr>'+
				'<tr><td><span class="leftpanellabel">E / lon :</span></td>'+
					'<td><input class="leftpanelinput" type="text" id="centerthemapX" maxlength="8"/></td></tr></table>'+
				'<br/><div class="tabactionbutton"><input id="buttoncenter" class="tabactionbutton" type="button" value="'+Language.get('buttoncenter')+'" onclick="setCenter();"></input></div>'+
				'<br/>'+
				'<div class="leftpanelerror" id="nocoordinateserror"></div>'+
				'<br/>';
			document.getElementById('centerthemapY').focus();
		}
		
		//content size might've changed -> check the need to resize!
		resizeLeftPanel();
		
}


function hideWmsFeatureInfo() {
	/*hidewmsfeatureinfo!*/		
	try {
		var elem = document.getElementById('wmsFeatureInfoDiv');
		if (elem) {
			elem.style.visibility = 'hidden';
			elem.innerHTML = '';
		}
	} catch (e) {
		
	}
}
function checkIfInputValid(e) 
{
	var name = document.getElementById('placename').value; 
	name = name.replace(/^\s+/,"");
	// right
	name = name.replace(/\s+$/,"");
	if (name.length >=3) {
		document.getElementById('buttonsearch').disabled = false;
	} else {
		document.getElementById('buttonsearch').disabled = true;
	} 
	
	if (checkEnter(e)) {
		document.getElementById('buttonsearch').click();
	}
}

function checkEnter(e) {

	var characterCode; // literal character code will be stored in this variable
	
	if(e && e.which) { //if which property of event object is supported (NN4)
		e = e;
		characterCode = e.which; //character code is contained in NN4's which property
	}
	else{
		e = window.event;
		characterCode = e.keyCode; //character code is contained in IE's keyCode property
	}
	
	if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
		return true;
	}
	return false;

}



function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}


function getMapvisibleLayer() {

for (var i = 0; i < map.layers.length; i++) {
	if (map.layers[i].displayInLayerSwitcher  && 
		map.layers[i].visibility )
			return map.layers[i];

}

}


function makeLinkWithoutText() {
	var lonlat = map.getCenter();
	makeLink(lonlat.lon, lonlat.lat);
	
}

function makeLink(lon, lat) 
{
	var linkTextarea = document.getElementById("textareaLink");
	var linkName = '';
	try {
		linkName = document.getElementById("popupLinkName").value;
	} catch (e) {
	}
	
	var baseLayer = getMapvisibleLayer();//map.baseLayer;
	var scale = map.getScale();
	var E = lon;//lonlat.lon;
	var N = lat;//lonlat.lat;
	var paramString = '';
	if (Language.LANGUAGE_SELECTION) 
	{
		paramString  = '?language='+Language.LANGUAGE_SELECTION;
	}
	paramString +=
				'&E='+E+
				'&N='+N+
				'&scale='+scale+
				'&base='+baseLayer.id;
				
	if (linkName && linkName != '')
		paramString += '&text='+encodeURIComponent(linkName);
	var url = 
		self.location.protocol +'//'+
		self.location.hostname +
		self.location.pathname +
		paramString;

	linkTextarea.value = url;
	linkTextarea.focus();
	linkTextarea.select();
}

// Get the HTTP Object
function getHTTPObject(){
	if (window.ActiveXObject) {return new ActiveXObject("Microsoft.XMLHTTP");}
	else if (window.XMLHttpRequest) {return new XMLHttpRequest();}
	else {
		alert("Your browser does not support AJAX.");
		return null;
	}
}

var httpObject;

function searchByPlace() {

var poiClassesArray = [];
httpObject = null;
/*clear searchresults*/
if (searchResultList && searchResultList.length)
	searchResultList = null;
	
	var elementLabel = document.getElementById("foundtotal");
	var element = document.getElementById("searchResults");
	element.innerHTML = '';
	elementLabel.innerHTML = '';



if (document.getElementById('chkcity').checked) {
	poiClassesArray.push('10');
	poiClassesArray.push('20');
}
if (document.getElementById('chkvillage').checked) {
	poiClassesArray.push('11');
	poiClassesArray.push('21');
}
if (document.getElementById('chkstructure').checked) {
	poiClassesArray.push('12');
	poiClassesArray.push('22');
}
if (document.getElementById('chklandmark').checked) {
	poiClassesArray.push('13');
	poiClassesArray.push('23');
}
if (document.getElementById('chkwater').checked) {
	poiClassesArray.push('14');
	poiClassesArray.push('24');
}
if (document.getElementById('chkchurch').checked) {
	poiClassesArray.push('15');
	poiClassesArray.push('25');
}

var poiClassesString = '';
if (poiClassesArray && poiClassesArray.length > 0) {

	for (var i = 0; i < poiClassesArray.length; i++) {
		poiClassesString +=poiClassesArray[i];
		if (i < poiClassesArray.length -1)
			poiClassesString += ',';
	}

} else {
	poiClassesString = '10,20,11,21,12,22,13,23,14,24,15,25';
}


/*Bounding box!!!!*/

var boundingBoxXml = '';
if (document.getElementById('chkonlymaparea').checked) {
	
	var extent = map.getExtent();//.toBBOX();
	
	boundingBoxXml =
	     '<BoundingBox srid="2394">'+  
		 '<pos>'+extent.left+' '+extent.bottom+'</pos>'+ 
		 '<pos>'+extent.right+' '+ extent.top+'</pos>'+ 
		 '</BoundingBox>'; 
}

var xmlToSend =
	 '<navici_request>'+
	  '<ajax_request_object object_id="4" service="Geocoding">'+
	   '<Request methodName="LocationRequest" requestID="0" maximumResponses="'+SEARCHRESULTLISTMAXLENGTH+'">'+
	    '<LocationRequest>'+
	     '<FreeFormLocationName>'+
		document.getElementById('placename').value +
	     '</FreeFormLocationName>'+
	     
	     boundingBoxXml +
	     
	     '<LocationTypeList>'+
	      '<LocationType name="POI" />'+
	     '</LocationTypeList>'+
	     '<POIProperties>'+
	     '<POIProperty name="POIClass" classIds="'+poiClassesString+'"  />'+
	     '</POIProperties>'+
	     
'<SortBy>'+ 
'<OrderElement name="POI" order="ascent" case="sensitive" />'+
'<OrderElement name="Municipality" order="ascent" case="sensitive" />'+ 
'</SortBy>'+	     
	    '</LocationRequest>'+
	   '</Request>'+
	  '</ajax_request_object>'+
	 '</navici_request>';

	httpObject = getHTTPObject();
	if (httpObject != null) {
		httpObject.open("POST", "ajaxNaviciRequest.php", true);
		httpObject.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
//		alert(xmlToSend);
		
		httpObject.send("requestXml=" + xmlToSend);
		httpObject.onreadystatechange = searchByPlaceCallback;
	}

}

//array for searchresults.
var searchResultList = null; 

function searchByPlaceCallback() {
	searchResultList = Array();
	 if(httpObject.readyState == 4) {
		var xml = httpObject.responseXML;

		var pois = xml.getElementsByTagName('POI');
		for(var i = 0; i < pois.length; ++i) {
			var leaf;
			
			var year;
			var type;
			
			var infos = pois[i].getElementsByTagName('POIInfo');
			for(var j = 0; j < infos.length; ++j) {
				if(infos[j].attributes.getNamedItem('name').nodeValue == 'source')
					leaf = infos[j].attributes.getNamedItem('value').nodeValue;
				if(infos[j].attributes.getNamedItem('name').nodeValue == 'type')
					type = infos[j].attributes.getNamedItem('value').nodeValue;
					
			}
			var pos = pois[i].getElementsByTagName('pos')[0].firstChild.nodeValue.split(' ');
			
			var item = {
					id: i,
					name: pois[i].attributes.getNamedItem('POIName').nodeValue,
					
					//Topo || pitaja.
					poiclass: pois[i].attributes.getNamedItem('poiClassId').nodeValue.startsWith('1')?'T':'P',
					
					kunta: pois[i].getElementsByTagName('Place')[0].firstChild.nodeValue,
					mapleaf: leaf,
					lonlat: new OpenLayers.LonLat(pos[0], pos[1]),
					year: year,
					type: poiClassesMapping[type]
				   };
			searchResultList.push(item);
		}
	}

	var elementLabel = document.getElementById("foundtotal");
	if (searchResultList && searchResultList.length >= 0) {
		
		var foundAmount = 
			(searchResultList.length >= SEARCHRESULTLISTMAXLENGTH)?'> '+(parseInt(SEARCHRESULTLISTMAXLENGTH) -parseInt(1)):searchResultList.length;
		elementLabel.innerHTML = Language.get('foundtotal') + foundAmount;
		if (searchResultList.length > 0) {
			var element = document.getElementById("searchResults");
			
				var contentHtml =			
					'<div class="divider"></div>'+
					'<select onchange="showResultOnMap(this.value);" id="searchresultslist" class="leftpanelinput searchresultsbox" size="6">';
				for(var i = 0; i < searchResultList.length; ++i) {
					var valueString = searchResultList[i].name + ', ' + searchResultList[i].kunta.toUpperCase()+ ' ('+searchResultList[i].poiclass + '), ' + searchResultList[i].type;
					contentHtml += '<option title="'+valueString+'" value="' + searchResultList[i].id + '" >';
					contentHtml += valueString;
					contentHtml += '</option>';
				}
						
				contentHtml += '</select>';
			element.innerHTML = contentHtml;
		}
	}
	
		//content size might've changed -> check the need to resize!
		resizeLeftPanel();
	
		
}

//Centers the map and zooms in to the selected option on searchresults' list 
function showResultOnMap(par) 
{
	if (featurePopup) {
		destroyFeaturesAndPopups();
	}
	
	for (var i = 0; i < searchResultList.length; i++) 
	{
		
		if (searchResultList[i].id == par) {
			
			var found = searchResultList[i];
			var zoomLevel = map.getZoom();

			var layerId = '';
			if (found.poiclass == 'T') {
				layerId = 'topo20';
			} else if (found.poiclass == 'P') {
				layerId = 'pitaja20';
			}  
			var layers = map.getLayersBy('layerId', layerId);

			map.setCenter(found.lonlat, 15);
			toggleLayer(layers[0].id);
			break;
		}
	}
}

function destroyFeaturesAndPopups() {
	if (featurePopup) {
		map.removePopup(featurePopup);
	}
}


function addIndexMap(opts) {

	
	//17.4.2009 - opts.projection, numzoomlevels
	var indexMapLayer = '';
	
	indexMapLayer = new OpenLayers.Layer.Image(
                'indexMap',
              	'./indeksikartta2.jpg',
                new OpenLayers.Bounds(4358537, 6615919, 4672842, 7011282),
                new OpenLayers.Size(155, 231),
                {
                	projection: 'EPSG:2394',
                	units: 'm',
                	maxExtent: new OpenLayers.Bounds(4358537, 6615919, 4672842, 7011282),
                	restrictedExtent: new OpenLayers.Bounds(4358537, 6615919, 4672842, 7011282),
					isBaseLayer: true
                }
            );
	
	var optionsOverview = {
		mapOptions: {
			projection: 'EPSG:2394', 
			units: 'm', 
			maxExtent: new OpenLayers.Bounds(4358537, 6615919, 4672842, 7011282),
            restrictedExtent: new OpenLayers.Bounds(4358537, 6615919, 4672842, 7011282),
			minScale: 6000000,
			numZoomLevels: 1
			},
			layers:[indexMapLayer], 
			size: new OpenLayers.Size(155,231)
	};

		
	    var overview = new OpenLayers.Control.OverviewMap(optionsOverview);

	    map.addControl(overview); 
	    overview.maximizeControl();
	    var imgLocation = OpenLayers.Util.getImagesLocation();

		  // maximize button div
	    var img1 = imgLocation + 'o-layer-switcher-maximize.png';
	    var img2 = imgLocation + 'o-layer-switcher-minimize.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 />';
}

function openPrintWindow() 
{

	var paramString;
	//if "make link" - tab is open, take all parameters from there (includes popup!)
	try {
		var textAreaLink = document.getElementById('textareaLink'); 
		if (textAreaLink && textAreaLink.value && textAreaLink.value != '') {
			paramString = textAreaLink.value;
		}
	} catch (e) {
	}

	if (!paramString || paramString == '') {
		paramString = createRequestParams();
	}
	
	paramString += '&print=true';
	var url = './karjala_print.html?'+paramString;
	var printwindow = window.open (url,"printwindow","location=0, menubar=1,status=0,scrollbars=0,width=700,height=700");
	printwindow.moveTo(0,0);
	
}



function resizeLeftPanel() {

	var leftpanel = document.getElementById('leftPanel');
	
	if (leftpanel) {
	
		if (leftpanel.scrollHeight && leftpanel.offsetHeight) {
			if (leftpanel.scrollHeight > leftpanel.offsetHeight) {
				leftpanel.className = 'leftpanelwithscrollbar';
			} else
				leftpanel.className = 'leftpanel';
			
		} 
	}
}
