// Copyright (c) 2005 Just Objects B.V. <just@justobjects.nl>// Distributable under LGPL license. See terms of license at gnu.org./* * GeoTracing app. * * PURPOSE * Library representing the app. All starts here. * * Author: Just van den Broecke * $Id: gtapp.js,v 1.18 2005/10/23 18:22:09 just Exp $ */ // Pushlet Data Event Callback from Server function onData(event) {   GT.onPushletData(event); } // The GeoTracing application functions var GT = {    map: null,	players : null,	live: false,    init: function() {	   // Init server.js       SRV.init();       GT.showStatus('Creating map...');       GT.map = GT.createMap();	   // Init tracer.js       TRC.init(GT.map);       // Get all active tracks       GT.showStatus('Receiving active tracks...');  //     SRV.get('q-active-tracks', GT.onQueryActiveTracks);    },	createMap: function() {    var WMS_URL_BLACK='img/blacksquare.jpg?';    var WMS_URL_STREETS='http://www.n8spel.nl//gt/geodan-topdag.jsp?';    var WMS_URL_TOP='http://www.n8spel.nl//gt/geodan-top.jsp?';    var G_MAP_BLACK = createWMSSpec(WMS_URL_BLACK, "Night", "Night", "fakelayer", "fakedef", "image/jpeg", "1.1.1");    var G_MAP_STREETS = createWMSSpec(WMS_URL_STREETS, "Streets", "Streets", "s1", "s2", "image/jpeg", "1.1.1");    var G_MAP_TOP = createWMSSpec(WMS_URL_TOP, "Topo", "Topo", "t1", "t2", "image/jpeg", "1.1.1");      // Create mapspecs array      var mapSpecs = [];      mapSpecs.push();      mapSpecs.push(G_MAP_BLACK);      mapSpecs.push(G_MAP_STREETS);      mapSpecs.push(G_MAP_TOP);      mapSpecs.push(G_SATELLITE_TYPE);      // Setup the map     var map = new GMap(document.getElementById("map"), mapSpecs);      map.setMapType(G_MAP_BLACK);      map.centerAndZoom(new GPoint(4.900435, 52.37261), 2);      GEvent.addListener(map, "move", GT.checkBounds);	        return map;    },	setNacht:  function() {		var map = GT.map;		var WMS_URL_BLACK='http://www.n8spel.nl//gt/geodan-topnacht.jsp?';      	var G_MAP_BLACK = createWMSSpec(WMS_URL_BLACK, "Night", "Night", "t5", "t6", "image/jpeg", "1.1.1");		map.setMapType(G_MAP_BLACK);	},			setDag: function () {		var map = GT.map;    	var WMS_URL_STREETS='http://www.n8spel.nl//gt/geodan-topdag.jsp?';   		var G_MAP_STREETS = createWMSSpec(WMS_URL_STREETS, "Streets", "Streets", "s1", "s2", "image/jpeg", "1.1.1");		map.setMapType(G_MAP_STREETS);		},			setBlanco:  function() {		var map = GT.map;		var WMS_URL_BLANCO='img/greysquare.jpg?';      	var G_MAP_BLANCO = createWMSSpec(WMS_URL_BLANCO, "Night", "Night", "fakelayer", "fakedef", "image/jpeg", "1.1.1");		map.setMapType(G_MAP_BLANCO);	},		setBlack:  function() {		var map = GT.map;		var WMS_URL_BLACK='img/blacksquare.jpg?';      	var G_MAP_BLACK = createWMSSpec(WMS_URL_BLACK, "Night", "Night", "fakelayer", "fakedef", "image/jpeg", "1.1.1");		map.setMapType(G_MAP_BLACK);	},			clearMap: function () {		var tracer;		for(tracer in TRC.tracers)	{			var t = TRC.getTracer(tracer);			t.hide();			if(t.activeTrack != null) { t.activeTrack.remove();}		//	TRC.deleteTrack(t.activeTrack.id, t.name);			if(t.interv != null) { clearInterval(t.interv); }			}		TRC.tracers = new Array(0);			},	   checkBounds: function () {    		var map = GT.map;        var bounds = map.getBoundsLatLng();         if (bounds.minY < 52.35) 			{ 				var center = map.getCenterLatLng();       			map.centerAndZoom(new GPoint(4.900435, 52.37261), 2);            } 		        if (bounds.maxY > 52.39) 			{ 			var center = map.getCenterLatLng();       			map.centerAndZoom(new GPoint(4.900435, 52.37261), 2);            }			if (bounds.minX < 4.8) 			{ 				var center = map.getCenterLatLng();       			map.centerAndZoom(new GPoint(4.900435, 52.37261), 2);            } 		        if (bounds.maxX > 5) 			{ 			var center = map.getCenterLatLng();       			map.centerAndZoom(new GPoint(4.900435, 52.37261), 2);            }         },     // Query active tracks callback	onQueryActiveTracks: function(records) {       //GT.showStatus('Received active ' + records.length + ' tracks');		GT.live = false;       // Create a Tracer for each active track       for (i=0; i < records.length; i++) {         tracer = TRC.createTracer(records[i].getField('name'),records[i].getField('lon'), records[i].getField('lat'),records[i].getField('loginname'));         // Draw the active track         tracer.drawTrack(records[i].getField('id'));		 tracer.show();       }       // Listen to Pushlet events from server (see onData)	//   p_join_listen('/gt');       // Hide status div       // GT.hideStatus();onQueryLiveTracks    },	onQueryArchiveTrack: function(records) {		GT.live = false;       // Create a Tracer for each active track       for (var i=0; i < records.length; i++) {         tracer = TRC.createTracer(records[i].getField('name'),records[i].getField('lon'), records[i].getField('lat'),records[i].getField('loginname'));         tracer.drawTrack(records[i].getField('id'));       }    },	archiveTrack: function(name,lon,lat,id, color) {	   if (GT.live == true) { 	      p_leave();           }		 GT.live = false;		 GT.clearMap();         tracer = TRC.createTracer(name,lon, lat, color);         tracer.drawTrack(id);		 tracer.show();    },	onQueryLiveTracks: function(records) {           var mustJoin = false;  if (GT.live == false) {    mustJoin = true;  }  GT.live = true;       for (i=0; i < records.length; i++) {         tracer = TRC.createTracer(records[i].getField('name'),records[i].getField('lon'), records[i].getField('lat'),records[i].getField('loginname'));		 var id = records[i].getField('id');		          tracer.drawTrack(id);		 tracer.show();		}		if (mustJoin == true) { 	   p_join_listen('/gt');           }    },		hideStatus: function() {      DH.hide('status');    },    showStatus: function(txt) {      DH.setHTML('status', txt);    },    blinkStatus: function() {		DH.toggleVisibility('status');		// Trick to have setTimeout() call our object method     	setTimeout('GT.blinkStatus()', DH.isVisible('status') ? 3000 : 400);	},	// Pushlet Data Event Callback from Server	onPushletData: function (event) {		if(GT.live == false) { return true;}	  // See EventPublisher.java for Event types/fields	  // Event types and attributes:	  // "user-hb" : id, name, time	  // "user-move": id, name, time, lon, lat	  // "medium-add": id, name, kind, mime, time, userid, username, trackid, trackname, lon, lat, ele	  // "poi-add": id, name, type, state, time, userid, username, trackid, trackname, lon, lat, ele	  // "poi-delete": id, userid, username, trackid, trackname	  // "poi-hit": id, name, type, state, time, userid, username, ownerid, ownername, trackid, trackname, lon, lat, ele	  //" track-create": id, name, userid, username	  // "track-delete": id, name, userid, username	  // "track-suspend": id, name, userid, username	  // "track-resume": id, name, userid, username	   var eventType = event.get('event');	//   alert(eventType);       var tracerName;	   if (eventType == 'user-move') {         var tracerName = event.get('trackname');		 var tracerId = event.get('id');         // Create Tracer if not already on map         var tracer = TRC.getTracer(tracerName);         if (!tracer) {           tracer = TRC.createTracer(tracerName, event.get('lon'), event.get('lat'));         }         // Set indicator         tracer.setLive();		 	GT.map.centerAndZoom(new GPoint(event.get('lon'), event.get('lat')), GT.map.getZoomLevel());         tracer.move(event.get('lon'), event.get('lat'));       } else if (eventType == 'user-hb') {         var tracerName = event.get('name');         // Create Tracer if not already present         var tracer = TRC.getTracer(tracerName);         if (!tracer) {           tracer = TRC.createTracer(tracerName);         }       } else if (eventType == 'medium-add') {         tracerName = event.get('trackname');         var lon = event.get('lon');         var lat = event.get('lat');         var tracer = TRC.getTracer(tracerName);         if (!tracer) {           tracer = TRC.createTracer(tracerName, lon, lat);         }         var medium = new Medium(event.get('id'),           event.get('name'),           event.get('kind'),           event.get('mime'),           event.get('time'),           tracer,           lon,           lat);         tracer.addMedium(medium);        } else if (eventType == 'track-create') {		 	var color = event.get('name');		 	tracerName = event.get('username');         // Get Tracer		 	var colors = new Array (0, 'yellow', '#FFFF00', 0, 'green','#00EE00', 0, 'orange', '#FF9933', 0,'red','#CC0000',0, 'blue','#0066FF', 0,'purple','#FF66FF');		 	for(var j = 0; j < colors.length; j++) {				if(tracerName == colors[j]) { var c = colors[j+1]; } 			}//			alert(c); 		 	for(t in TRC.tracers ) {			 if(TRC.tracers[t].activeTrack != null) {	//			 alert(TRC.tracers[t].activeTrack.color);				if (TRC.tracers[t].activeTrack.color == c) {					TRC.tracers[t].deleteTrack(TRC.tracers[t].id,TRC.tracers[t].name);				}			 }		 } 		tracer = TRC.createTracer(color,0,0,tracerName);		tracer.newTrack(event.get('id'), color);	} else if (eventType == 'track-delete') {	  	 for(t in TRC.tracers ) {			 if(TRC.tracers[t].activeTrack != null) {				if (TRC.tracers[t].activeTrack.id == event.get('id')) {			//		TRC.tracers[t].deleteTrack(TRC.tracers[t].id,TRC.tracers[t].name);				}			 }		 }         //  tracerName = event.get('trackname');         // Get Tracer         var tracer = TRC.getTracer(tracerName);         if (tracer) {        // 	tracer.deleteTrack(event.get('id'), event.get('username'));		 	}		 }/*        } else if (eventType == 'track-suspend') {       } else if (eventType == 'track-resume') {       } else {       }*/	 }   }  // Starts it all  DH.addEvent(window, 'load', GT.init, false);