		    /*
			* All rights reserved.
			* copyright (c) 2005 Chris Lacy
			*/
			
			function Controller() {}
			
			Controller.sliderMax = 1000;
			Controller.minTime = null;
			Controller.maxTime = null;
			Controller.sliderToTimeRatio;
			Controller.travelerUrl = null;
			Controller.travelerArray = [];
			Controller.map = null;
			Controller.slider = null;
			Controller.numGPointsInPolyLine = 200;
			Controller.currentTravelerIndex = 0;
			
			function Contoller_getUsableWidth() {
				return screen.availWidth - 50;
			}
			Controller.getUsableWidth = Contoller_getUsableWidth;
			
			function Controller_getUsableHeight() {
				return screen.availHeight - 325;
			}
			Controller.getUsableHeight = Controller_getUsableHeight;
			
			function Controller_update(travelerArrayVar, error) {
			
				if(error != null) {
					alert(error.message);
				}
				else {
			
					Controller.travelerArray = travelerArrayVar;
					Controller.currentTravelerIndex = 0;
					var traveler = Controller.travelerArray[Controller.currentTravelerIndex];
					if(traveler.willCauseError()) {
						alert("Your file may cause problems.  If you really want to see it, keep pressing the cancel"
							+ " button when you get the \"Script warning\" dialog.");
					}
					Controller.updateMap(traveler);
					Controller.displayTravelerOptions();
				}
			}
			Controller.update = Controller_update;
			
			Controller.displayTravelerOptions = function() {
			
				var element = document.getElementById("chooseTravelerSpan");
				var elementString = "";
				if(Controller.travelerArray.length > 1) {
					
					elementString = "<select name='chooseTraveler'>";
					for(var i=0; i<Controller.travelerArray.length; i++) {
						elementString += "<option value='" + i + "'>";
						elementString += i + "_" + Controller.travelerArray[i].getName();
						elementString += "</option>";
					}
					elementString += "</select>";
					elementString +=  "<input type='button' value='select trk' onclick='Controller.getTravelerChoice()'/>";
				}
			
				element.innerHTML = elementString;
			}
			
			Controller.getTravelerChoice = function() {
				var optionsBox = document.forms['mapForm'].chooseTraveler;
				var index = optionsBox.options[optionsBox.selectedIndex].value;
				Controller.currentTravelerIndex = parseInt(index);
				Controller.updateMap(Controller.travelerArray[Controller.currentTravelerIndex]);
			}
			
			function Controller_updateMap(traveler) {
				
					var mapElement = document.getElementById("map");
					mapElement.style.width = Controller.getUsableWidth() + "px";
					mapElement.style.height = Controller.getUsableHeight() + "px";
					Controller.map = new GMap2(mapElement);
					Controller.map.addControl(new GLargeMapControl());
					Controller.map.addControl(new GMapTypeControl());
					
					var acll = traveler.getCenterLatLon();
					var centerGPoint = new GLatLng(acll.getLat(), acll.getLon());
					Controller.map.setCenter(centerGPoint);
					
					var swll = new GLatLng(traveler.getMinLat(), traveler.getMinLon());
					var nell = new GLatLng(traveler.getMaxLat(), traveler.getMaxLon());
					var bounds = new GLatLngBounds(swll, nell);
					var zoomLevel = Controller.map.getBoundsZoomLevel(bounds);
					Controller.map.setZoom(zoomLevel);

					Controller.map.setMapType(G_HYBRID_MAP);
					
					Controller.assignSliderToTimeRatio(traveler);
					traveler.addWaypoints(Controller.map);
					Controller.map.addOverlay(traveler.getGPolyline());
					Controller.initSlider();
					Controller.clearAndShowPoint(0);
			}
			Controller.updateMap = Controller_updateMap;
			
			function Controller_assignSliderToTimeRatio(traveler) {
				var difference = traveler.getMaxTime() - traveler.getMinTime();
				Controller.maxTime = traveler.getMaxTime();
				Controller.minTime = traveler.getMinTime();
				Controller.sliderToTimeRatio = difference/Controller.sliderMax;
		}
		Controller.assignSliderToTimeRatio = Controller_assignSliderToTimeRatio;
		
		Controller.speakTableInitialized = false;
		function Controller_speakTable(array) {
		
			if(!Controller.speakTableInitialized) {
				Controller.speakTableInitialized = true;
				var tableString = "<table style='border-style: solid; border-width: 1px;'>";
				for(var i=0; i<array.length; i++) {
					tableString += "<tr>";
					var innerArray = array[i];
					for(var j=0; j<innerArray.length; j++) {
						tableString += "<td id='" 
							+ i + "_" + j 
							+ "' style='border-style: solid; border-width: 1px;'>" 
							+ innerArray[j] 
							+ "</td>";
					}
					tableString += "</tr>"
				}
				tableString += "</table>";
				speakOnly(tableString);
			}
			else {
				for(var i=0; i<array.length; i++) {
					var innerArray = array[i];
					for(var j=0; j<innerArray.length; j++) {
						var element = document.getElementById(i + "_" + j);
						element.innerHTML = innerArray[j];
					}
				}
			}
		
		}
		Controller.speakTable = Controller_speakTable;
		
		function Controller_clearAndShowPoint(pointID) {
			
			var tableArray = [];
			var time = Math.floor((pointID * Controller.sliderToTimeRatio) + Controller.minTime);
			var d = new Date(time*100);

			if(d) {
			
				// var fd = (d.getYear() + 1900) + " " + (d.getMonth() + 1) + " " + d.getDate() + " " + d.getHours() + ":" + d.getMinutes() + ":" + d.getSeconds();
				var fd = d.format("dddd, mmmm d, yyyy, hh:MM:ss TT");
			}

			tableArray[0] = ["time", fd + "", "&nbsp;"];
			var traveler = Controller.travelerArray[Controller.currentTravelerIndex];
			traveler.moveToTrackPoint(time, Controller.map);
			var lonLat = traveler.getLatLonForTime(time);
			tableArray[1] = ["traveler is at",  "lat: " + lonLat.getLat().toFixed(4),  "lon: " + lonLat.getLon().toFixed(4)];
			
			Controller.speakTable(tableArray);
		}
		Controller.clearAndShowPoint = Controller_clearAndShowPoint;
		
		function Controller_initSlider() {
			if(Controller.slider == null) {
				var sliderEl = document.getElementById("slider-1");
				sliderEl.style.width = Controller.getUsableWidth() + "px";
				
				var topDiv = document.getElementById("top");
				topDiv.style.width = Controller.getUsableWidth() + "px";

				var inputEl = document.forms[0]["slider-input-1"];
				Controller.slider = new Slider(sliderEl, inputEl);
				Controller.slider.setMinimum(0);
				Controller.slider.setMaximum(Controller.sliderMax);
				Controller.slider.onchange = function () {
					var pointID = Controller.slider.getValue();
					Controller.clearAndShowPoint(pointID);
				}
			}
			else {
				Controller.resetActivity();
			}
		}
		Controller.initSlider = Controller_initSlider;
		
		function Controller_registerTravellerUrl(travelerUrl) {
			Controller.travelerUrl = travelerUrl;
		}
		Controller.registerTravellerUrl = Controller_registerTravellerUrl;
		
		function Controller_initialize() {
			// call back to update method
			try {
				TravellerFactory.createTravellers(Controller.travelerUrl, Controller.numGPointsInPolyLine);
			}
			catch (e) {
				alert(e.message);
			}
		}
		Controller.initialize = Controller_initialize;
		
		function Controller_getFile() {
			// Controller.numGPointsInPolyLine = 400;
			Controller.registerTravellerUrl("data/temp.gpx");
			Controller.initialize();
		}
		Controller.getFile = Controller_getFile;
		
		Controller.stopped = true;
		Controller.intervalId = null;
		Controller.increment = 1;
		Controller.timeInterval = 300;
		
		function Controller_resetActivity(){
			Controller.stopActivity();
			Controller.slider.setValue(0)
		}
		Controller.resetActivity = Controller_resetActivity;
		
		function Controller_startActivity(){
			Controller.intervalId = setInterval("Controller.play()", Controller.timeInterval);
		}
		Controller.startActivity = Controller_startActivity;
		
		function Controller_stopActivity(){
			clearInterval(Controller.intervalId);
		}
		Controller.stopActivity = Controller_stopActivity;
			
		function Controller_play() {
			var pointId = Controller.slider.getValue();
			if (pointId < Controller.sliderMax){
				pointId += Controller.increment;
				Controller.slider.setValue(pointId);
			}
			else {
				Controller.stopActivity();
			}
		}
		Controller.play = Controller_play;
		
		function Controller_faster() {
			Controller.increment += Controller.increment + 1;
		}
		Controller.faster = Controller_faster;
		
		function Controller_slower() {
			if(Controller.increment > 0) {
				Controller.increment -= 1;
			}
		}
		Controller.slower = Controller_slower;
		
		function Controller_doIt() {
			// Controller.numGPointsInPolyLine = 400;
			Controller.registerTravellerUrl("data/demo.gpx");
			Controller.initialize();
		}
		Controller.doIt = Controller_doIt;


