







	

	
	
	
	
	
		
     
		
		
		
		

		
		
		
		

	


// <script>
// Copyright (C) FastROI Oy, 2008 

var map; // the Map
var base_layer; // background layer
var overlay_layer; // vector layer
var selectControl; // does selections

var latu2FIDMap;  // Map from latuID's to array of FID's
var fid2latuMap;  // Map from FID's to array of latuID's
var zoomTimer;    // timer for delayed zoom

var fid2StatusMap = new Object();  // Map from FID to special color
//var typeStyleMap;  // style which only uses latutype for styling.
var statusStyleMap;  // style which uses fid2StatusMap and latutype to determine color.

var inOnSelect = false;  // semaphore to prevent unnesessary event propagation

var latuColorSelected = "";
var latuColorGood = "";
var latuColorBad = "";
var latuColorWeak = "";
var latuColorUnknown = "#a32";
var latuOpacitySelected = "0.9";
var latuOpacityDefault = "0.9";
var latuOpacityZero = "0.0";
//var latuWidthDefault = 6;
//var latuWidthSelected = 8;
var mapBounds = new OpenLayers.Bounds(3458000, 6718000, 3528000, 6798000);
var oldBounds = new OpenLayers.Bounds(3458000, 6718000, 3528000, 6798000); // dummy bounds




// gets Feature object from overlay_layer by FID
function getFeatureByFID(fid) {
	//TBD - would it be more efficient to use a hash for this.features?
	var feature = null;
	for(var i=0, len=overlay_layer.features.length; i<len; ++i) {
		if(overlay_layer.features[i].fid == fid) {
			feature = overlay_layer.features[i];
			break;
		}
	}
	return feature;
}


// zooms to selection from overlay_layer
function zoomToSelection() {
	var maxExtent = null;
	if (overlay_layer.selectedFeatures && (overlay_layer.selectedFeatures.length > 0)) {
		maxExtent = overlay_layer.selectedFeatures[0].geometry.getBounds();
		for(var i=0, len=overlay_layer.selectedFeatures.length; i<len; i++){
			maxExtent.extend(overlay_layer.selectedFeatures[i].geometry.getBounds());
		}
		
		map.zoomToExtent(maxExtent);
	}
}

// zooms to selection with short timer to allow UI first update
function zoomToSelection_withTimer() {
	if (zoomTimer) {
		window.clearTimeout(zoomTimer);  
	}
	zoomTimer = window.setTimeout(zoomToSelection,1);
}


// selects all vector with specified latuID
// also selects from left hand menu
function selectLatu(name, noZoom) {

	// debug time
	//var currentDate = new Date();
	var startTime = new Date().getTime();

	inOnSelect = true;
	jQuery('#fragment-1 > div').removeClass('left_items_selected');
	jQuery('#l_'+name).addClass('left_items_selected');
	// handle "info color" change when "latu" becomes selected... 
	//jQuery('#fragment-1 > div > ul > li > span').removeClass('color_span_selected');
	//jQuery('#l_'+name+' > ul > li > span').addClass('color_span_selected');
	jQuery('#fragment-1 > div > span').removeClass('color_span_selected');
	jQuery('#l_'+name+' > span').addClass('color_span_selected');

	// debug jquery delay...
	var jqueryTime = new Date().getTime() - startTime;



	selectControl.unselectAll();
	
	// debug unselect delay...
	var unSelectTime = new Date().getTime() - startTime;
	

	var key = name.replace(/ /g,'').toLowerCase();
	var values = latu2FIDMap[key];
	//alert(values);
	if (values) {
		for(var index in values) {
			var value = values[index];
			//alert("v:"+value);
			var feature = getFeatureByFID(value);
			//alert("f:"+feature);
			if (feature) {
				selectControl.select(feature);
				//alert("lkkl"); 
			}
		}
	}
	
	// debug select delay...
	var selectTime = new Date().getTime() - startTime;	
	
	inOnSelect = false;
	// since this is event handler and it seems that rendering happens only after
	// completing the event handler we move map in separate "thread" after other
	// selection indicators ale updated
	if(noZoom==null || noZoom==false){
		//zoomToSelection(); 
		zoomToSelection_withTimer(); 
		// use anchor to jump proper part of the left side menu
		// should be used only when selecting from map..
		if(noZoom==null){
			window.location.href = "#" + "l_" + name;
		}
	} else{
		//alert(map.getExtent() + "---" + (new OpenLayers.Bounds(629370,6941448,648045,6951988)));
		//if(!map.getExtent().equals(new OpenLayers.Bounds(629370,6941448,648045,6951988))){
		if(!map.getExtent().equals(oldBounds)){
			//map.zoomToExtent(new OpenLayers.Bounds(629370,6941448,648045,6951988));
			
			map.zoomToExtent(mapBounds);
			
			//map.zoomToMaxExtent();
		}
		

			var selectedExtent = null;
			if (overlay_layer.selectedFeatures && (overlay_layer.selectedFeatures.length > 0)) {
				selectedExtent = overlay_layer.selectedFeatures[0].geometry.getBounds();
				for(var i=0, len=overlay_layer.selectedFeatures.length; i<len; i++){
					selectedExtent.extend(overlay_layer.selectedFeatures[i].geometry.getBounds());
				}
				//map.moveTo(selectedExtent.getCenterLonLat(),2);
				map.moveTo(selectedExtent.getCenterLonLat(),1);
			}					
		
		
		
		
		
	}
	// debug mapzoom delay...
	var zoomTime = new Date().getTime() - startTime;	
	
	//alert("jqueryTime:" + jqueryTime + ", unSelectTime:" + unSelectTime + ", selectTime:" + selectTime + ", zoomTime:" + zoomTime);
	oldBounds = map.getExtent();
	
	
}




// finds array of latunames by FID
function findLatuNamesFromFID(fid) {
	return fid2latuMap[fid];
}





// sets latulistContents from ajax
function setListHTML(response) {
	OpenLayers.Util.getElement('fragment-1').innerHTML = response.responseText;
	var refreshdata = OpenLayers.Util.getElement('refreshdata').innerHTML; 
	//alert(refreshdata);
	eval(refreshdata);
}


// sets mapping from latuname to fid from file latu2shpid.json
function setLatu2FIDMap(response) {
	latu2FIDMap = eval('('+response.responseText+')');

	fid2latuMap = new Array();
	for(var latuName in latu2FIDMap) {
		for(var fidIndex in latu2FIDMap[latuName]) {
			var fid = latu2FIDMap[latuName][fidIndex];
			if (!fid2latuMap[fid]) {
				fid2latuMap[fid] = new Array();
			}
			fid2latuMap[fid].push(latuName);
		}
	}
}


// event handler for clicking on feature on map
function onSelectFeatureFromMap(feature) {


	if (inOnSelect) {
		return;
	}
	inOnSelect = true;

	var fid = feature.fid;

	var latuNames = findLatuNamesFromFID(fid);
	var found = false;

	if (latuNames) {
		if (latuNames[0]) {
			selectLatu(latuNames[0]);
			found=true;
		}
	}
	
	// if selection is not found on our map, show fid to user
	// should be disabled on end system...
	if (!found) {
		//alert("FID: "+fid);
	}else{
		// temp debug for finding ID... JJ
		//alert("FID: "+fid);
	}
	
	inOnSelect = false;
}

// registers loadstart & loadend events for layer
function registerEvents(layer) {

    layer.events.register("loadstart", layer, function() {
        jQuery('#busyicon').css("visibility", "visible");
    });

    layer.events.register("loadend", layer, function() {
       jQuery('#busyicon').css("visibility", "hidden");
    });

}


 	
// main initialisation method
function init(){
	
	var timeDebug = false;
	var startTime = new Date().getTime();
	var rdom = new Date().getTime() +  Math.random();
	
	// initialises latu2fid mapping
	OpenLayers.loadURL('data/kouvola/latu2shpid091123.json', '?ts=' + rdom , null, setLatu2FIDMap);    

if(timeDebug) timeString = "OpenLayers.loadURL:" + (new Date().getTime() - startTime);	
	
	// creates left hand tabs
	jQuery('#latutabs > ul').tabs();
	jQuery('#latutabs').css("visibility", "visible");
	jQuery('#fragment-2').css("visibility", "visible");

	
	//OpenLayers.Feature.Vector.style['default']['strokeWidth'] = '4';
	//OpenLayers.Feature.Vector.style['select']['strokeWidth'] = '5';

	// parameters for jns_euref map
	var my_bounds = new OpenLayers.Bounds(3458000, 6718000, 3528000, 6798000);
	var my_mapOptions = {resolutions: [32.0,16.0,8.0,4.0,2.0,1.0] ,maxExtent:my_bounds, projection:'EPSG:2393', units: 'm'};

	// parameters for digiroad map
	//var my_layerName = 'kartta';
	//var my_bounds = new OpenLayers.Bounds(3918700, 6649200, 4580716, 7780464);
	//var my_mapOptions = {'maxResolution': 4096, 'minResolution':1, 'maxExtent':my_bounds, 'projection':'EPSG:2394', units: 'm'};


	// initializes the map
	//map = new OpenLayers.Map( OpenLayers.Util.getElement('map'), OpenLayers.Util.extend({controls:[]},my_mapOptions));
	//map = new OpenLayers.Map( OpenLayers.Util.getElement('map'), OpenLayers.Util.extend({controls:[], restrictedExtent: new OpenLayers.Bounds(629370,6941448,648045,6951988)},my_mapOptions));
	//map = new OpenLayers.Map( OpenLayers.Util.getElement('map'), OpenLayers.Util.extend({controls:[], restrictedExtent: new OpenLayers.Bounds(628370,6940448,649045,6952988)},my_mapOptions));
	map = new OpenLayers.Map( OpenLayers.Util.getElement('map'), OpenLayers.Util.extend({controls:[], restrictedExtent: new OpenLayers.Bounds(3458000, 6718000, 3528000, 6798000)},my_mapOptions));

if(timeDebug) timeString += "; new OpenLayers.Map:" + (new Date().getTime() - startTime);	

	/* 9.12.2008 
	var urlArray = ["http://map1.fastroi.fi/map/tilecache/tilecache.py?",
	                "http://map2.fastroi.fi/map/tilecache/tilecache.py?",
	                "http://map3.fastroi.fi/map/tilecache/tilecache.py?"];                            

	base_layer = new OpenLayers.Layer.WMS( "kartta",
			urlArray, {layers: my_layerName, format: 'image/png', transparent: 'off'},
			OpenLayers.Util.extend(
					{attribution:"&copy;FastROI 2008"}
					,my_mapOptions)
	);
	*/
	
	/* 9.12.2008 */
	base_layer = new OpenLayers.Layer.WMS( 'kartta',
			"http://map1.fastroi.fi/cgi-bin/kouvolaback",
	         {layers: 'kouvolaopas', format: 'image/png', transparent: 'off'},
			OpenLayers.Util.extend(
					{attribution:"&copy; Kouvolan kaupunki, Maankäyttö 2009", buffer:1}
					,my_mapOptions)
	); 

	
if(timeDebug) timeString += "; new OpenLayers.Layer.TileCache:" + (new Date().getTime() - startTime);	

	//(JJ) registering start and end event for base map, purpose to show "busy" icon during loading map tiles..
	registerEvents(base_layer);
	
	
	// creates style mapping
	
	var statusContext = {
			// method to determine color to use when drawing vector
		getColor : function(feature) {
			var foundColor = fid2StatusMap[feature.fid];
			//alert("foundColor=fid = " + foundColor);
			if (foundColor==latuColorGood || foundColor==latuColorBad || foundColor==latuColorWeak) {
			//alert("foundColor, fid = " + foundColor);
				return foundColor;
			}else{
				return latuColorUnknown;    
			}
		}, 
		
		getColor2 : function(feature) {
			var foundColor = fid2StatusMap[feature.fid];
			if (foundColor==latuColorGood || foundColor==latuColorBad || foundColor==latuColorWeak) {
				return latuColorSelected;
			}
			/*if (color==latuColorGood) {
				return latuColorSelected;
			}else if (color==latuColorBad) {
				return latuColorSelected;
			}*/
			return latuColorUnknown;
		},
		
		getOpacity : function(feature) {
			var foundColor = fid2StatusMap[feature.fid];
			if (foundColor==latuColorGood || foundColor==latuColorBad || foundColor==latuColorWeak || foundColor==latuColorSelected) {
				return latuOpacityDefault;
			}
			/*if (color==latuColorGood) {
				return latuOpacityDefault;
			}else if (color==latuColorBad) {
				return latuOpacityDefault;
			}else if (color==latuColorSelected) {
				return latuOpacityDefault;
			}*/
			return latuOpacityZero;
		},
		getOpacity2 : function(feature) {
			var foundColor = fid2StatusMap[feature.fid];
			if (foundColor==latuColorGood || foundColor==latuColorBad || foundColor==latuColorWeak || foundColor==latuColorSelected) {
				return latuOpacitySelected;
			}			
			/*if (color==latuColorGood) {
				return latuOpacitySelected;
			}else if (color==latuColorBad) {
				return latuOpacitySelected;
			}else if (color==latuColorSelected) {
				return latuOpacitySelected;
			}*/
			return latuOpacityZero;
		}		
		
		
	};
	// default drawing styles
	var statusTemplateDefault = {
			strokeColor : "$"+"{getColor}",
			strokeOpacity: "$"+"{getOpacity}",
			strokeWidth: 6
	};				   
	var statusTemplateSelect = {
			strokeColor : "$"+"{getColor2}",
			strokeOpacity: "$"+"{getOpacity2}",
			strokeWidth: 8
	};				   
	var statusStyleDefault = new OpenLayers.Style(statusTemplateDefault, {context: statusContext});
	var statusStyleSelect = new OpenLayers.Style(statusTemplateSelect, {context: statusContext});

	var statusStyle = {
			'default' : statusStyleDefault,
			'select'  : statusStyleSelect
	};

	statusStyleMap = new OpenLayers.StyleMap(statusStyle);


if(timeDebug)  timeString += "; statusStyleMap:" + (new Date().getTime() - startTime);	

	/*           
           // create a styleMap with a custom default symbolizer
           typeStyleMap = new OpenLayers.StyleMap({
           'default' : {
               strokeOpacity: 0.5,
               strokeWidth: 4},
           'select' : {
               strokeOpacity: 0.9,
               strokeWidth: 6}
           });

			// create a lookup table with different symbolizers for 0, 1 and 2
           var lookup = {
               21031104: {strokeColor: "yellow"}, // valaistu
               21031105: {strokeColor: "blue", strokeWidth: 2}, // perinteinen
               21031106: {strokeColor: "blue"}, // helppo
               21031107: {strokeColor: "red"}, // keskivaikea
               21031108: {strokeColor: "black"}, // vaikea
               21031109:  {strokeColor: "blue"} // vaikea
           }

           // add rules from the above lookup table, with the keyes mapped to
           // the "type" property of the features, for the "default" intent
           typeStyleMap.addUniqueValueRules("default", "laji", lookup);
	 */

	// creates KKJ4 latu vectors
	//overlay_layer = new OpenLayers.Layer.GML("Ladut", "data/ladut.gml", {
	//    styleMap: typeStyleMap, visibility: false, projection:'EPSG:2394'
	//});
	
	// creates EUREF (TM35) latu vectors
	//overlay_layer = new OpenLayers.Layer.GML("Ladut", "data/ladut_euref.gml", {
	overlay_layer = new OpenLayers.Layer.GML("Ladut", "data/kouvola/kouvolaladut091123.gml" + "?ts=" + rdom, {
		styleMap: statusStyleMap, visibility: false, projection:'EPSG:2393'
	});
	//overlay_layer = new OpenLayers.Layer();
	
if(timeDebug)  timeString += "; overlay_layer :" + (new Date().getTime() - startTime);	
	
	// (JJ)
	//registerEvents(overlay_layer);
	
	// add layers
	map.addLayers([base_layer,overlay_layer]);
	//map.addLayers([base_layer]);

	
	// create map controls
	// default controls
	map.addControl(new OpenLayers.Control.Navigation());
	map.addControl(new OpenLayers.Control.PanPanel());
	map.addControl(new OpenLayers.Control.ZoomPanel());
	map.addControl(new OpenLayers.Control.ArgParser());

	map.addControl(new OpenLayers.Control.Permalink());
	
    /*  Enable for measure tool
    // style the sketch fancy
    var sketchSymbolizers = {
        "Point": {
            pointRadius: 4,
            graphicName: "square",
            fillColor: "white",
            fillOpacity: 1,
            strokeWidth: 1,
            strokeOpacity: 1,
            strokeColor: "#333333"
        },
        "Line": {
            strokeWidth: 3,
            strokeOpacity: 1,
            strokeColor: "#666666",
            strokeDashstyle: "dash"
        }
    };
    var style = new OpenLayers.Style();
    style.addRules([
        new OpenLayers.Rule({symbolizer: sketchSymbolizers})
    ]);
    var styleMap = new OpenLayers.StyleMap({"default": style});
    
    var options = {
        handlerOptions: {
            style: "default", // this forces default render intent
            layerOptions: {styleMap: styleMap},
            persist: true
        }
    };
	
    function handleMeasurements(event) {
        var geometry = event.geometry;
        var units = event.units;
        var order = event.order;
        var measure = event.measure;
        var element = document.getElementById('moutput');
        var out = "";
        if(order == 1) {
            out += "measure: " + measure.toFixed(3) + " " + units;
        } else {
            out += "measure: " + measure.toFixed(3) + " " + units + "<sup>2</" + "sup>";
        }
        element.innerHTML = out;
    }
    
    
	var toolBar = new OpenLayers.Control.NavToolbar();
	var measure = new OpenLayers.Control.Measure(
	          OpenLayers.Handler.Path, options
    );
	measure.events.on({
        "measure": handleMeasurements,
        "measurepartial": handleMeasurements
    });
	
	toolBar.addControls([measure]);
	map.addControl(toolBar);
	
	*/
	
	/*
	 * For history control
	var historyPanel = new OpenLayers.Control.Panel();
	var history = new OpenLayers.Control.NavigationHistory();
	historyPanel.addControls([history.previous,history.next]);

	map.addControl(history);
	map.addControl(historyPanel);
    */

	//map.addControl(new OpenLayers.Control.LayerSwitcher());
	map.addControl(new OpenLayers.Control.Attribution());
	//map.addControl(new OpenLayers.Control.ScaleLine({bottomOutUnits:'',bottomInUnits:''}));
	
	

	// selection handler
	selectControl = new OpenLayers.Control.SelectFeature(overlay_layer,
			{
		multiple: true, hover: false, clickout: false, onSelect: onSelectFeatureFromMap
			});

	map.addControl(selectControl);
	selectControl.activate();            

if(timeDebug)  timeString += "; selectControls:" + (new Date().getTime() - startTime);

//	if (!map.getCenter()) map.zoomToMaxExtent();
//	if (!map.getCenter()) map.zoomToExtent(new OpenLayers.Bounds(629370,6941448,648045,6951988));





	if (!map.getCenter()) map.zoomToExtent(mapBounds);



	overlay_layer.setVisibility(true);
	
if(timeDebug)  timeString += "; zoomToExtent:" + (new Date().getTime() - startTime);	
	
	OpenLayers.loadURL('latuui/loadLatuStatusList.html', '?ts=' + rdom, null, setListHTML); 
	
if(timeDebug)  timeString += "; OpenLayers.loadURL('latuui/loadLatuStatusList.html:" + (new Date().getTime() - startTime);	 

  if(timeDebug) alert(timeString);
  oldBounds = map.getExtent();


}
// </script>
