// Copyright (c) 2005 Just Objects B.V. <just@justobjects.nl>
// Distributable under LGPL license. See terms of license at gnu.org.

/*
 * Sense of the City Eindhoven app.
 *
 * PURPOSE
 * Library representing the app. All starts here.
 *
 * Author: Just van den Broecke
 * $Id: sotce.js,v 1.49 2006/11/23 14:15:57 just Exp $
 */

// This file contains specific functions for SotC Eindhoven
var SE = {
	mode:'original',  /* may be original or staalkaart */

	createMap: function() {
		GTAPP.showStatus('Kaart laden ...');

		//var WMS_URL_EINDHOVEN_MAP = 'http://bwds10.bwk.tue.nl/sotce/map/eindhoven-map.jsp?';
		// var WMS_URL_EINDHOVEN_SAT = 'http://bwds10.bwk.tue.nl/sotce/map/eindhoven-sat.jsp?';
		var WMS_URL_EINDHOVEN_MAP = 'http://www.senseofthecity.nl/sotce/map/eindhoven-map.jsp?';
		var WMS_URL_EINDHOVEN_SAT = 'http://www.senseofthecity.nl/sotce/map/eindhoven-sat.jsp?';
//		var G_MAP_EINDHOVEN_MAP = createWMSSpec(WMS_URL_EINDHOVEN_MAP, 'Kaart', 'Krt', '', '', "", "1.1.1", null, '');
//		var G_MAP_EINDHOVEN_SAT = createWMSSpec(WMS_URL_EINDHOVEN_SAT, 'Luchtfoto', 'Fot', '', '', "", "1.1.1", null, '');

		// Add map specs to app (see also menu in index.jsp)
		GTAPP.addMapSpec('satellite', G_SATELLITE_MAP);
//		GTAPP.addMapSpec('eindhoven_map', G_MAP_EINDHOVEN_MAP);
//		GTAPP.addMapSpec('eindhoven_sat', G_MAP_EINDHOVEN_SAT);

		// Create the Google Map
		var map = GTAPP.createGMap('map');

		// map.addControl(new GMapTypeControl());
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl());
//		map.setMapType(G_MAP_EINDHOVEN_MAP);
		map.setMapType(G_SATELLITE_MAP);

		// Center of Eindhoven
		map.centerAndZoom(new GPoint(5.4781, 51.4365), typeof(sotcledboard) == 'undefined'?3:2);
		GTAPP.showStatus('Kaart geladen');

		return map;
	},

	init: function() {
		GTAPP.showStatus('Starten...');

		// Prevents IE bug
		GTAPP.init();

		// Determine if we are in live / archive or autoplay mode
		var cmd = DH.getPageParameter('cmd', 'archive');
		if (cmd == 'live') {
			GTAPP.showStatus('aktieve routes ophalen...');

			// Live mode starts when all active tracks/users loaded
			SRV.get('q-active-tracks', SE.onQueryActiveUsers);
		} else if (cmd == 'autoplay') {
			// GTAPP.mAutoPlay(); (handled by GTAPP itself)
		} else {
			GTAPP.mode = 'archive';
		}

		// Use single color when not live
		if (cmd != 'live') {
			GTW.colors = [0, 'blue', '#5555FF', '#000000'];
			GTW.randomColors = ['#FF00CC'];

			// Hoe lang foto getoond wordt tijdens afspelen
			GTW.getTrackPlayer().FEATURE_DISPLAY_TIME = 4000;

			// Tijd tussen 2 punten
			GTW.getTrackPlayer().POINT_INTERVAL_TIME = 120;
		}

		if (typeof (sotcledboard) == 'undefined') {
			// Monitor the window resize event
			SE.resize();
			DH.addEvent(window, 'resize', SE.resize, false);
		}

		var login = DH.getPageParameter('login', null);
		if (login != null) {
			SE.onUserSelect(login);
		}

		GTAPP.showStatus('Laden OK');

	},

	resize: function() {
		var topmenu = DH.getObject('topmenu');
		var topOffset = topmenu.offsetTop + topmenu.offsetHeight + 4;

		var mapStyle = DH.getStyleObject("map");
		mapStyle.top = topOffset + "px";
		mapStyle.left = 3 + "px";
		mapStyle.height = DH.getInsideWindowHeight() - topOffset + "px";
		mapStyle.width = DH.getInsideWindowWidth() - 324 + "px";

		var imagename = DH.getObject("imagename");
		var newheight = DH.getInsideWindowHeight()
				- DH.getObjectY(imagename)
				- imagename.offsetHeight
				- 13
				- DH.getObject("sotcbottom").offsetHeight;
		DH.getStyleObject("fragmenttekst").height = newheight + "px";

		if (GTAPP.map) {
//			GTAPP.map.onResize();
			GTAPP.map.checkResize();
		}
	},

// Query active tracks callback
	onQueryActiveUsers: function(records) {
		// Create a Tracer for each active track
		for (i = 0; i < records.length; i++) {
			trackId = records[i].getField('id');
			trackName = records[i].getField('name');
			tracerName = records[i].getField('loginname');
			func = records[i].getField('function');
			tracer = GTW.createTracer(func, records[i].getField('lon'), records[i].getField('lat'));
			tracer.show();
			track = new Track(trackId, trackName, tracer.panel, tracer);
			tracer.activeTrack = track;
			// tracer.readTrack(trackId, trackName, true);
		}

		// Listen to Pushlet events from server (see onData)
		GTAPP.mode = 'live';
		SE.mode = 'live';

		p_join_listen('/gt');

		GTAPP.showStatus(records.length + ' aktieve routes');
	},

	onUserSelect: function(loginname) {
		GTAPP.blinkStatus("Ophalen gegevens...");
		DH.setHTML("fragmenttime", ' ');

		SE.displayPersonInfo(loginname);
		SE.displayRandomImage(loginname);
		if (SE.mode == 'original') {
			if (GTAPP.trackSelector != null) {
				GTAPP.trackSelector.hide();
				GTAPP.trackSelector.clear();
				delete GTAPP.trackSelector;
				GTAPP.trackSelector = null;
			}
			GTW.clearTracers();
			DH.hide("trackcontrols");
			GTAPP.blinkStatus('Ophalen routes...');

			SRV.get('q-tracks-by-user-sotc', SE.onQueryUserTracks, 'user', loginname);
		} else if (SE.mode == 'staalkaart') {
			SE.displayStaalkaartTrack(loginname);
		} else if (SE.mode == 'live') {
			GTAPP.showStatus("Live route van " + loginname);
			var tracer = GTW.getTracer(loginname);
			if (tracer) {
				tracer.activate();
			}
		}

		// GTAPP.hideStatus();
		return false;
	},

	onUserSelectMenu: function(loginname) {
		SE.onUserSelect(loginname);
		DH.hide("oCMenu_1_0");
	},

	onQueryUserTracks: function (records) {
		DH.hide("trackcontrols");
		GTW.getTrackPlayer();
		GTAPP.trackSelector = new Selector('Kies een Route', 'tracksel', SE.onTrackSelect);

		var trackId, trackName, userName, func;
		func = ' ';
		for (var i = 0; i < records.length; i++) {
			trackId = records[i].getField('id');
			trackName = records[i].getField('name');
			userName = records[i].getField('loginname');
			func = records[i].getField('function');
			GTAPP.trackSelector.addOption(trackId, trackName, func);
		}

		GTAPP.trackSelector.setXY(250, 38);
		GTAPP.trackSelector.show();
		DH.setHTML("fragmenttime", 'ik heb ' + records.length + ' routes');
		GTAPP.showStatus('OK');
	},

	onTrackSelect: function(trackId, trackName, tracerName) {
		// GTAPP.showStatus('Ophalen route ' + trackName + '...');
		GTW.clearTracers();
		var tracer = GTW.createTracer(tracerName);
		tracer.readTrack(trackId, trackName, true);
		tracer.show();
		GTAPP.showStatus(tracerName + ' - route ' + trackName);
		DH.setHTML("fragmenttime", ' speel route af');
		DH.show("trackcontrols");
	},

	displayPersonInfo: function(loginname) {
		GTAPP.blinkStatus("Ophalen deelnemer info");
		SRV.query(SE.displayPersonInfoCallback,
				"utopia_account,utopia_person,base_medium",
				"base_medium.id,utopia_person.extra",
				"loginname='" + loginname + "'",
				"base_medium,utopia_person,thumb;utopia_account,utopia_person",
				"",
				"");
	},

	displayPersonInfoCallback: function(records) {
		DH.setHTML("deelnemertitel", records[0].getField("function"));
		DH.setHTML("deelnemertekst", records[0].getField("desc"));
		DH.getObject("deelnemerimg").src = "media.srv?id=" + records[0].getField("id") + "&resize=75x67";
		DH.getObject("playpauseimg").src = "images/play.gif";
		if (GTAPP.mode == 'archive') DH.show("trackcontrols");
		GTAPP.showStatus('OK');
	},

	displayRandomImage: function(loginname) {
		SRV.get('q-random-image-sotc', SE.displayRandomImageCallback, 'user', loginname);
	},


	displayRandomImageCallback: function(records) {
		if (records.length == 0) {
			return;
		}
		DH.setHTML("imagename", records[0].getField("name"));
		DH.getObject("imageimg").src = "media.srv?id=" + records[0].getField('id');
		DH.setHTML("fragmenttekst", records[0].getField("description"));
		var date = GTW.formatDateAndTime(parseInt(records[0].getField("creationdate")));
		var loginName = records[0].getField("loginname");
		DH.setHTML("mediainfo", 'foto op ' + date + ' <a href="#" onclick="SE.displayRandomImage(\'' + loginName + '\')" > andere &gt;&gt; </a>');
		// GTAPP.showStatus(date + ' - foto opname');
	},

	displayImageInfo: function(mediaid) {
		// GTAPP.blinkStatus("Ophalen media gegevens...");
		SRV.query(SE.displayImageInfoCallback,
				"base_medium",
				"",
				"id=" + mediaid + "",
				"",
				"",
				"");
	},

	displayImageInfoCallback: function(records) {
		DH.setHTML("imagename", records[0].getField("name"));
		DH.getObject("imageimg").src = "media.srv?id=" + records[0].id;
		DH.setHTML("fragmenttekst", records[0].getField("description"));
		var date = GTW.formatDateAndTime(parseInt(records[0].getField("creationdate")));
		DH.setHTML("mediainfo", 'foto ' + date);
		// GTAPP.showStatus(date + ' - foto opname');
	},

	displayStaalkaartTrack: function(loginname) {
		GTAPP.blinkStatus("Ophalen staalkaart...");
		SRV.query(SE.displayStaalkaartTrackCallback,
				"utopia_account,utopia_person,g_track,g_location",
				"utopia_person.extra,g_track.id,g_track.name,g_track.state,utopia_account.loginname,g_location.lon,g_location.lat",
				"loginname='" + loginname + "'",
				"g_track,g_location,lastpt;g_track,utopia_person,staalkaart;utopia_person,utopia_account",
				"",
				"");
	},

	displayStaalkaartTrackCallback: function(records) {
		GTW.clearTracers();
		if (records.length > 0) {
			if (GTAPP.mode == 'archive') {
				GTW.displayTrackPlayer();
				DH.show("sotctrackplayer");
			}

			var tracer = GTW.createTracer(records[0].getField("function"));
			tracer.readTrack(records[0].getField("id"), records[0].getField("name"), true);
			tracer.show();
		}
		GTAPP.showStatus('OK');

	},

	play: function() {
		GTW.getTrackPlayer().play();
		return false;
	},

	playpause: function() {
		if (GTW.getTrackPlayer().isPlaying()) {
			GTW.getTrackPlayer().pause();
			DH.getObject("playpauseimg").src = "images/play.gif";
		}
		else {
			GTW.getTrackPlayer().play();
			DH.getObject("playpauseimg").src = "images/pause.gif";
		}
		return false;
	},

	stop: function() {
		GTW.getTrackPlayer().stop();
		return false;
	},

	reset: function() {
		this.stop();
		var track = GTW.getTrackPlayer().track;
		if (track) {
			track.clear();
			track.draw();
		}
	}

}

// Overrule settings in gt*js

// COLORS AND LINES
GTW.polyLineWidth = 3;
// Use fixed color

// ['#5555FF'];

// Overrule gtapp.js functions here
GTAPP.createMap = SE.createMap;

GTAPP.createMenu = function() {
	// disable menu making
}

GTAPP.addSig = function() {
	// disable "powered by"
}

GTAPP.showLiveStatus = function (tracerName, txt) {
	var tracer = GTW.getTracer(tracerName);
	GTAPP.showStatus(tracer.fun + ' ' + txt);
}

// Override Medium.display method to display on our window
Medium.prototype.display = function() {
	if (this.kind == 'image') {
		SE.displayImageInfo(this.id);
	}
}


// Disable the panel show method to prevent showing of panels
// Also the display:none is set for panels in the stylesheet
Panel.prototype.show = function() {
}

// Catch calls to trackplayer stop, and add our own actions
TrackPlayer.prototype.sotc_stop = TrackPlayer.prototype.stop;
TrackPlayer.prototype.stop = function() {
	this.sotc_stop();
	DH.getObject("playpauseimg").src = "images/play.gif";
}

// Show message in window
TrackPlayer.prototype.showInfo = function(msg) {
	if (this.curPoint != null && this.track.distance) {
		if (this.isPlaying() == false && this.track.startDate != null) {
			DH.setHTML("fragmenttime", GTW.formatDate(this.track.startDate) + ' ' + GTW.formatTime(this.track.startDate) + '-' + GTW.formatTime(this.track.endDate) + ' ' + this.track.distance.toFixed(2) + ' km');
		} else {
			DH.setHTML("fragmenttime", GTW.formatDateAndTime(this.curPoint.time) + ' - ' + this.distance.toFixed(2) + ' km - ' + this.curPoint.speed.toFixed(2) + ' km/h');
		}
	}
}

// Handle the autoplay stuff
TrackAutoPlayer.prototype._getRandomTrack = function() {
	// Need this for JS local scope in callback
	var player = this;
	// Define callback for async response
	this.onQueryTrackRsp = function (records) {
		//  id, name,state,loginname,lon,lat
		GTAPP.showStatus('read ' + records[0].getField('name'));
		SE.displayPersonInfo(records[0].getField('loginname'));
		player.tracer = GTW.createTracer(records[0].getField('function'), records[0].getField('lon'), records[0].getField('lat'));
		player.tracer.readTrack(records[0].getField('id'), records[0].getField('name'), false);
		DH.setHTML("fragmenttime", 'autoplay ' + records[0].getField('name'));

		if (player.lastTracer != null) {
			player.lastTracer.clear();
			player.lastTracer = null;
		}
	}

	SRV.get('q-random-track-sotc', this.onQueryTrackRsp);
}

// Starts it all
DH.addEvent(window, 'load', SE.init, false);
