All Downloads are FREE. Search and download functionalities are using the official Maven repository.

META-INF.resources.js.geojsf.GeoJSF.js Maven / Gradle / Ivy

/**
 * Protect window.console method calls, e.g. console is not defined on IE
 * unless dev tools are open, and IE doesn't define console.debug
 */
(function() {
  if (!window.console) {
    window.console = {};
  }
  // union of Chrome, FF, IE, and Safari console methods
  var m = [
    "log", "info", "warn", "error", "debug", "trace", "dir", "group",
    "groupCollapsed", "groupEnd", "time", "timeEnd", "profile", "profileEnd",
    "dirxml", "assert", "count", "markTimeline", "timeStamp", "clear"
  ];
  // define undefined methods as noops to prevent errors
  for (var i = 0; i < m.length; i++) {
    if (!window.console[m[i]]) {
      window.console[m[i]] = function() {};
    }    
  } 
})();

var GeoJSF = {	
		map: null,
		switcher: null,
		commandCorrect: true,
		viewportCenterLon: null,
		viewportCenterLat: null,
		viewportBoundTop: null,
		viewportBoundBottom: null,
		viewportBoundLeft: null,
		viewportBoundRight: null,
		updateOnClick: null,
		updateOnMove: null,
		id: null,
		lastLayer: null,
		eventsRegistered: false,
		baseLayer: null,
		scaleValues: null,
		
		setAjaxUpdates : function(updateClicks, updateMove)
		{
			this.updateOnClick = updateClicks;
			this.updateOnMove  = updateMove;
		},
		
		setScaleValues : function(values)
		{
			GeoJSF.scaleValues = values;
			console.log('Allowed scale values are: ' +this.scaleValues);
		},
		
		// Deprecated, now done in "loadend" event of last layer
		addLoadEvent : function()
		{
		//	OpenLayers.Event.observe(GeoJSF.map.div, "load", GeoJSF.registerEventHandlers ); 
		},
		
		getCurrentLocation : function()
		{
			navigator.geolocation.getCurrentPosition(GeoJSF.processCurrentLocation);
		},
		
		processCurrentLocation : function(location)
		{
		    console.log("You are at: (lat/lon) (" +location.coords.latitude +"/" +location.coords.longitude +") with an accurancy of " +location.coords.accuracy);
		},
		
		register : function(layerName)
		{
			try {
				var layers = this.map.getLayersByName(layerName);
				if(layers.length === 1) {
					loadLayer = layers[0];
				    loadLayer.events.register("loadend", loadLayer, function(e) {GeoJSF.lastLayer = layerName; GeoJSF.registerEventHandlers(e);} );
			    }
			    console.log("loadend event processing completed."); 
			} catch (e)
			{
					console.log("Problem when adding loadend event listener: " +e);
			}
		},
		
		registerEventHandlers : function(e)
		{
			if (!GeoJSF.eventsRegistered){
				try {
				console.log("Trying to register event handlers");
				GeoJSF.map.events.register("click",  GeoJSF.map,GeoJSF.processEventClick,true);
				GeoJSF.map.events.register("movestart",GeoJSF.map,GeoJSF.processEventMoveStart ,true);
				GeoJSF.map.events.register("moveend",GeoJSF.map,GeoJSF.processEventMove ,true);
			 	console.log("Done registering.");
			 	GeoJSF.eventsRegistered = true;
				}
				catch (e) {alert("Problem with registering Map events: " +e)}
			}
			else
			{
				try{
					console.log("Removing listener for " +GeoJSF.lastLayer);
					var layers = this.map.getLayersByName(GeoJSF.lastLayer);
					if(layers.length === 1) {
						loadLayer = layers[0];
						loadLayer.events.remove("loadend");
					}
				} catch (e)
				{
					console.log("Problem when removing loadend listener: " +e);}
			}
		},
		
		processEventMove : function(event)
		{
			console.log("mapMove");
			this.centerLon = event.object.getCenter().lon;
			this.centerLat = event.object.getCenter().lat;
			this.viewportBoundTop = event.object.getExtent().top;
			this.viewportBoundBottom = event.object.getExtent().bottom;
			this.viewportBoundLeft = event.object.getExtent().left;
			this.viewportBoundRight = event.object.getExtent().right;
			console.log(event.type +" has triggered change to center " +this.centerLon +"/"  +this.centerLat);
			$('.olTileImage').each(function(idx){
		        console.log( $(this) );
		    });
			
			try {
				
				PrimeFaces.ab({
					process:  '@form', 
		 			source:   GeoJSF.map.div, 
		 			event:    'mapMove', 
		 			update:   GeoJSF.updateOnMove,
					params: [
		 			         {name: 'org.geojsf.viewport.center.lon',     value: this.centerLon},
		 			         {name: 'org.geojsf.viewport.center.lat',     value: this.centerLat},
		 			         {name: 'org.geojsf.viewport.bottom',  value: this.viewportBoundBottom},
		 			         {name: 'org.geojsf.viewport.top',     value: this.viewportBoundTop},
		 			         {name: 'org.geojsf.viewport.left',    value: this.viewportBoundLeft},
		 			         {name: 'org.geojsf.viewport.right',   value: this.viewportBoundRight},
		 			         {name: 'org.geojsf.viewport.scale', value:   Math.floor( GeoJSF.map.getScale())},
		 			        ],
		 			oncomplete: function(xhr, status, args) {console.log('map move AJAX request sent.')}
				});
			} catch(e) {
				 console.log("MapMove failed." +e);
			}
			finally {}
		},
		
		processEventMoveStart : function(event)
		{
			console.log("mapMoveStart");
			$('.olTileImage').each(function(idx){
		        console.log( $(this) );
		//      $(this).css('cursor','default ');
		    });
		},
		
		processEventClick : function(event)
		{
			console.log("mapClick detected");
			GeoJSF.map.div.style.cursor = 'default ';
			console.log(GeoJSF.map.div);
			$(GeoJSF.map.div).css('cursor','default ');
		    $(GeoJSF.map.div.id).children( ".olTileImage" ).each(function(i) { 
		    });
		    $('.olTileImage').each(function(idx){
		        $(this).css('cursor','default ');
		    });
			try {
				PrimeFaces.ab({
					process:  '@form', 
		 			source:   GeoJSF.map.div, 
		 			event:    'mapClick', 
		 			update:   GeoJSF.updateOnClick,
					params: [
		 			         {name: 'org.geojsf.click.lon',				value: GeoJSF.map.getLonLatFromViewPortPx(event.xy).lon},
		 			         {name: 'org.geojsf.click.lat',				value: GeoJSF.map.getLonLatFromViewPortPx(event.xy).lat},
		 			         {name: 'org.geojsf.viewport.center.lat',	value: GeoJSF.map.getExtent().getCenterLonLat().lat},
		 			         {name: 'org.geojsf.viewport.center.lon',  	value: GeoJSF.map.getExtent().getCenterLonLat().lon},
		 			         {name: 'org.geojsf.viewport.bottom',		value: GeoJSF.map.getExtent().bottom},
		 			         {name: 'org.geojsf.viewport.top',			value: GeoJSF.map.getExtent().top},
		 			         {name: 'org.geojsf.viewport.left',			value: GeoJSF.map.getExtent().left},
		 			         {name: 'org.geojsf.viewport.right',		value: GeoJSF.map.getExtent().right},
		 			         {name: 'org.geojsf.viewport.scale',		value: Math.floor( GeoJSF.map.getScale())}
		 			        ],
		 			oncomplete: function(xhr, status, args) {console.log('mapClick AJAX request sent.')}
				});
			} catch(e) {
				 console.log("MapClick failed." +e);
			}
				finally {}
		},
		
		initMap : function(mapDiv,msOptions,height, width)
		{
			sizeParam = new OpenLayers.Size(256,256);
			GeoJSF.map = new OpenLayers.Map(mapDiv,{
			//	eventListeners: {
				//	'moveend': GeoJSF.processEventMove,
				//	'click':   GeoJSF.processEventClick
		       // },
				controls: [new OpenLayers.Control.Navigation()], 
				version: '1.1.0', 
				request: 'GetMap',
				srs: 'EPSG:4326', 
				height: height, 
				width: width, 
				theme: null, 
				tileSize: sizeParam,
			//	allOverlays: true,
				});

			/* This is experimental adding of Google and/or OpenStreetMap layers
					 GeoJSF.baseLayer = new OpenLayers.Layer.Google(
					            "Google Streets", // the default
					            {numZoomLevels: 20}
					        );
					 GeoJSF.baseLayer = new OpenLayers.Layer.OSM();
				 	var osm = new OpenLayers.Layer.OSM();            
				    var gmap = new OpenLayers.Layer.Google("Google Streets");
				    var google_maps = new OpenLayers.Layer.Google(
				   	     "Google Maps", {
				   	          numZoomLevels: 20
				   	     }
				   	);
				   	var google_satellite = new OpenLayers.Layer.Google(
				        "Google Satellite", {
				           type: google.maps.MapTypeId.SATELLITE,
				         numZoomLevels: 20
				    }
				  	);
				  	GeoJSF.map.addLayers([this.google_maps, this.google_satellite]);
				    GeoJSF.map.addLayers([osm]);
					this.map.addLayer(new OpenLayers.Layer.OSM());
					GeoJSF.map.addLayer(GeoJSF.baseLayer);
			*/
			
		    OpenLayers.DOTS_PER_INCH = 25.4 / 0.28;
		    // For centering the map
		    // GeoJSF.map.setCenter( new OpenLayers.LonLat(30.06119013, -1.95854944) .transform( new OpenLayers.Projection("EPSG:4326"), this.map.getProjectionObject() ), 17 );

		    // Bootstrapping jQuery
		    if (!window.jQuery) {
		    	  console.log("Bootstrap jQuery if not present.");
		    	  var jq = document.createElement('script'); jq.type = 'text/javascript';
		    	  // Path to jquery.js file, eg. Google hosted version
		    	  jq.src = '//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js';
		    	  document.getElementsByTagName('head')[0].appendChild(jq);
		    	  alert("Added jQuery.");
		    	}
		    $(GeoJSF.map.div).on('mouseout', function() {
		    	$(this).css('cursor','default ');
		    });
		},
		
		// Remove all layers and add the base layer again
			resetLayers : function()
		{
			if (this.map.layers)
				{
					for (var i = this.map.layers.length - 1; i >= 0; i--) {
					    this.map.removeLayer(map.layers[i]);
					}
				}
		},
		
		/*		
		resetLayers : function()
		{
			if (GeoJSF.map)
				{
					if (GeoJSF.map.layers)
					{
						for (var i = GeoJSF.map.layers.length - 1; i >= 0; i--) {
						    GeoJSF.map.removeLayer(GeoJSF.map.layers[i]);
						}
					}
				}
			
			GeoJSF.map.addLayer(GeoJSF.baseLayer);
		},
		*/
		addLayer : function(name, url, layers, params)
		{
		//	layers.tiled = true;
	    //    layers.tilesorigin = GeoJSF.map.maxExtent.left + ',' + GeoJSF.map.maxExtent.bottom;
	        
			var layer = new OpenLayers.Layer.WMS(
					  name, 
					  url, 
					  layers,
					  params);
			this.map.addLayer(layer);
			this.map.zoomToMaxExtent();
		},
		
		ajaxResponse : function(data)
		{
			console.log(data);
		},
		
		updateTime : function(layerName, time)
		{
			 var layers = this.map.getLayersByName(layerName);
			 var layer  = layers[0];
			 var params = {};
			 var date  = new Date(time);
			 var isoTime = date.toISOString();
			 params.time = isoTime;
			 console.log("Merging new Time parameter: " +isoTime);
			 layer.mergeNewParams(params);
			 
			// This is the PrimeFaces based solution along with an 'oncomplete' call
			 PrimeFaces.ab({process: '@all', 
				 			source: this.map.div, 
				 			event: 'updateTime', 
				 			params: [{name: 'org.geojsf.update.time', value: time}],
				 			oncomplete: function(xhr, status, args) {console.log("Back in client.");}});
		
		},
		
		updateSqlViewParams : function(parameters)
		{
			 console.log("SQL View Parameter Update requested.");
			 var params = {};
			 params.viewparams = parameters;
			 if (GeoJSF.map.layers)
				{
					for (var i = GeoJSF.map.layers.length - 1; i >= 0; i--) {
					    GeoJSF.map.layers[i].mergeNewParams(params);
					}
				}
			 console.log("Merging new SqlViewParameter parameter: " +params.viewparams);
		},
		
		updateSldParams : function(parameters)
		{
			 console.log("SLD Parameter Update requested.");
			 var params = {};
			 params.env = parameters;
			 if (GeoJSF.map.layers)
				{
					for (var i = GeoJSF.map.layers.length - 1; i >= 0; i--) {
					    GeoJSF.map.layers[i].mergeNewParams(params);
					}
				}
			 console.log("Merging new SldParameter parameter: " +params.env);
		},
		
		switchLayerClassic : function(layerId)
		{
			 // This is the pure JSF based approach, not having an 'oncomplete' method:	 
			 // jsf.ajax.request(elementId, 'layerChange', {execute: '@form', 'javax.faces.behavior.event': 'layerSwitch','javax.faces.partial.event': 'layerSwitch','org.geojsf.switch.service': serviceId,  'org.geojsf.switch.layer': layerId, 'org.geojsf.switch.on': active});
			 
			console.log("switch request detected for layer " +layerId);
			try{ 
				PrimeFaces.ab({
			 			process: '@form', 
			 			source: GeoJSF.map.div, 
			 			event: 'layerSwitch', 
			 			update: '@form',
			 			params: [{name: 'org.geojsf.switch.layer', value: layerId}],
			 			oncomplete: function(xhr, status, args) {GeoJSF.performLayerSwitch(xhr, status, args);}
				});
			} catch(e) {
				 console.log("layer switch failed." +e);
			} 
			finally {}
		},
		
		secondRun : function()
		{
			PrimeFaces.ab({process: '@all', 
				 			source: GeoJSF.map.div, 
				 			update: '@form',
				 			event: 'updateModel', 
				 			oncomplete: function(xhr, status, args) {console.log("Update complete.");}
			});
		},
		
		refreshMap : function()
		{
			 // This is the pure JSF based approach, not having an 'oncomplete' method:	 
			 // jsf.ajax.request(elementId, 'layerChange', {execute: '@form', 'javax.faces.behavior.event': 'layerSwitch','javax.faces.partial.event': 'layerSwitch','org.geojsf.switch.service': serviceId,  'org.geojsf.switch.layer': layerId, 'org.geojsf.switch.on': active});
			 
			 // This is the PrimeFaces based solution along with an 'oncomplete' call
			 PrimeFaces.ab({process: '@all', 
				 			source: GeoJSF.map.div, 
				 			event: 'updateMap', 
				 			params: [],
				 			oncomplete: function(xhr, status, args) {GeoJSF.performLayerSwitch(xhr, status, args);}});
		},
		
		performLayerSwitch : function(xhr, status, args)
		{
			try {
			console.log("Performing layer switch via OpenLayers.");
			var command = JSON.parse(args.toggleLayer);
			
		//    alert("OpenLayers: Please set " +command.serviceId +" to have the layers " +command.layer +" using the method " +command.command);
			if (command.command == "hide")
				{
					var layers = this.map.getLayersByName(command.serviceId);
				    if(layers.length === 1) {
				    	layers[0].setVisibility(false);
				    } else {console.log('big problem');}
				}
			if (command.command == "show")
				{
					var layers = this.map.getLayersByName(command.serviceId);
				    if(layers.length === 1) {
				    	layers[0].setVisibility(true);
				    } else {console.log('big problem');}
				}
		    if (command.command == "merge")
				{
			    	var layers = this.map.getLayersByName(command.serviceId);
			    	var layersToAdd = "";
				    if(layers.length === 1) {
				    	var wmsLayer = layers[0];
				    	var params = wmsLayer.params;
				    	for (var counter in command.layer)
				    		{
					    		layersToAdd += command.layer[counter];
					    		layersToAdd += ",";
				    		}
				    	var layerList = layersToAdd.substring(0, layersToAdd.length - 1);
				    	var wmsLayer = layers[0];
				    	console.log("Trying to add " +layerList +" to Layer " +wmsLayer.url);
				    	params.layers = layerList;
				    	console.log("New parameter set: " +params);
				    	wmsLayer.mergeNewParams(params);
				    	} else {console.log('big problem');}
			}
			} catch(e) {
				 console.log("A problem occured when interpreting layer switch command. Maybe NULL?");
			}
			finally {}
			GeoJSF.secondRun();
		}
};




© 2015 - 2025 Weber Informatics LLC | Privacy Policy