// Connectivity JavaScript

	var map_C;
	var s;
	var boundaryPts;
	var cbound;
	var bcio;
	var bsManager;
	var bsnManager;
	var dotManager;
	var presentPoints;
	var presentRatios;
	var presentWalk;
	var presentTime;
	
	var pageState;
	
	var bshmarkers_bsid;
	var bshmarkers_coord;
	var bshmarkers_desc;
	var bshmarkers_awt;
	var bshmarkers_afs;
	var bshmarkers_awt_max;
	var bshmarkers_afs_max;
	var bshmarkers;
	
	var bsnmarkers_bsid;
	var bsnmarkers_coord;
	var bsnmarkers_desc;
	var bsnmarkers_awt;
	var bsnmarkers_afs;
	var bsnmarkers_connectors;
	
	var bsomarkers_bsid;
	var bsomarkers_coord;
	var bsomarkers_desc;
	var bsomarkers;
	
	var lisZoomEnd;
	var lisPolyCheck;
	
	var contourState;
	var dotState;
	var BSState;
	var dotClickState;
	var sensState;
	var selectedDot;
	
	var descCode;
	var otherBusCode;
	var titleCodeWT;
	var titleCodeFS;
	var barsWTCode;
	var barsFSCode;
	var viewModeState;
	
	var sd_walk;
	var sd_time;
	
	var loadingDone = true;
	
	var walkCoeff = 34.932;
	var timeCoeff = 765.405;
	var originalWalkCoeff = 34.932;
	var originalTimeCoeff = 765.405;
	var originalMaxDenominator = originalWalkCoeff * 340 + originalTimeCoeff * 12.396;
	var maxDenominator = walkCoeff * 340 + timeCoeff * 12.396;
	var dotScaling = 1.267;
	var fullDot = 110;
	var scaleFactor = 0.0;
	
	if (document.images)
	{
	  smDot= new Image(); 
	  smDot.src="images/dot.png";
	}
	
	String.prototype.trim = function () {
		return this.replace(/^\s*/, "").replace(/\s*$/, "");
	}
		
	function closeHelp() {
		document.getElementById('helpConn').style.display = 'none';
		helpSwitch = 0;
	}
	
	var helpSwitch = 1;
	
	function toggleHelp() {
		if (helpSwitch==0) document.getElementById('helpConn').style.display = 'block';
		else document.getElementById('helpConn').style.display = 'none';
		helpSwitch = 1 - helpSwitch;
	}
	
	function createMarker(point, bciXML) {
	
		var xml = GXml.parse(bciXML);
					
		var bciArr = xml.documentElement.getElementsByTagName("BCI_variables");
		presentWalk.push(parseFloat(bciArr[0].getAttribute("walk")));
		presentTime.push(parseFloat(bciArr[0].getAttribute("time")));
		var ratio = 0.0;
		if (presentWalk[presentWalk.length-1]>-1) ratio = (1 - ((walkCoeff*presentWalk[presentWalk.length-1]+timeCoeff*presentTime[presentTime.length-1])/maxDenominator))*dotScaling;
		var normRatio = ratio;
		if (normRatio<=0) normRatio = 0.001; // represent with smallest dot instead of being invisible
		var zoomVar = map_C.getZoom();
		var fullDot = 120;
		scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
		var dotSize = (scaleFactor*fullDot)*Math.pow(normRatio,.57);
		var dottie = new GIcon();
		dottie.image = "http://www.gis.nus.edu.sg/images/dot.png";
		dottie.iconSize = new GSize(dotSize, dotSize);
		dottie.iconAnchor = new GPoint(dotSize/2, dotSize/2);
		var marker = new GMarker(point, dottie);
		dotManager.addMarker(marker, 15);
		dotManager.refresh();
		presentPoints.push(point);
		presentRatios.push(normRatio);
		dotClickState.push(0);
		var number = (presentPoints.length-1);
		marker.value = number;
		
		//var px = (6378137*(point.lng()-103.75025)*(3.14159265/180)*Math.cos(point.lat()*3.14159265/180));
		//var py = (6378137*(point.lat()-1.28651)*3.14159265/180);
					
		var bsn = xml.documentElement.getElementsByTagName("BusStop");
		bsnmarkers_bsid.push(new Array());
		bsnmarkers_coord.push(new Array());
		bsnmarkers_desc.push(new Array());
		bsnmarkers_awt.push(new Array());
		bsnmarkers_afs.push(new Array());
		bsnmarkers_connectors.push(new Array());
		var bsnArrLength = bsn.length;
		for (var i=0; i<bsnArrLength; i++) {
			var bslat = parseFloat(bsn[i].getAttribute("lat"));
			var bslng = parseFloat(bsn[i].getAttribute("lng"));
			var bsnid = bsn[i].getAttribute("BSID");
			var bsndesc = bsn[i].getAttribute("desc");
			var bsnawt = parseFloat(bsn[i].getAttribute("avgWaitingTime"));
			var bsnafs = parseFloat(bsn[i].getAttribute("avgFareStage"));
			bsnmarkers_bsid[(presentPoints.length-1)].push(bsnid);
			bsnmarkers_coord[(presentPoints.length-1)].push(new GLatLng(bslat, bslng));
			bsnmarkers_desc[(presentPoints.length-1)].push(bsndesc);
			bsnmarkers_awt[(presentPoints.length-1)].push(bsnawt);
			bsnmarkers_afs[(presentPoints.length-1)].push(bsnafs);
			var nodeArr = new Array();
			nodeArr.push(point);
			nodeArr.push(new GLatLng(bslat, bslng));
			bsnmarkers_connectors[(presentPoints.length-1)].push(new GPolyline(nodeArr, "#FFFF00", 1, 1));
		}
		
		GEvent.addListener(marker, "click", function(point) {
			turnOnBSNMarkers(number);
		});

		
		
	}
	
	function toggleBSN() {
		viewModeState = 1 - viewModeState;
		refreshBSNMarkers();
		updateDotInfo();
	}
	
	function updateDotInfo() {
		if (viewModeState == 0) {
			document.getElementById("toggleWT").style.color = "#000000";
			document.getElementById("toggleWT").style.fontWeight = "bold";
			document.getElementById("toggleFS").style.color = "#898989";
			document.getElementById("toggleFS").style.fontWeight = "normal";
			document.getElementById("toggleFS").style.cursor = "pointer";
			document.getElementById("toggleWT").style.cursor = "default";
		}
		else {
			document.getElementById("toggleFS").style.color = "#000000";
			document.getElementById("toggleFS").style.fontWeight = "bold";
			document.getElementById("toggleWT").style.color = "#898989";
			document.getElementById("toggleWT").style.fontWeight = "normal";
			document.getElementById("toggleWT").style.cursor = "pointer";
			document.getElementById("toggleFS").style.cursor = "default";
		}
	}
	
	function turnOnBSNMarkers(num) {
		if (dotClickState[num] == 1) {
			dotClickState[num] = 1 - dotClickState[num];
			turnOffBSNMarkers();
			selectedDot = -1;
			document.getElementById('dotInfo').style.display = "none";
			return;
		}
		turnOffBSNMarkers();
		selectedDot = num;
		var dcsArrLength = dotClickState.length;
		for (var n=0; n<dcsArrLength; n++) {
			dotClickState[n] = 0;
		}
		dotClickState[num] = 1 - dotClickState[num]; // toggle click state
		
		// set dot info window states
		document.getElementById('dotInfo').style.display = "block";
		updateDotInfo();
		var zoomVar = map_C.getZoom();
		scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
		
		refreshBSMarkers(2);
		var bcArrLength = bsnmarkers_coord[num].length;
		for (var i=0; i<bcArrLength; i++) {
			var fullDot = 80;
			var ratio;
			if (viewModeState == 0) ratio = bsnmarkers_awt[num][i]/bshmarkers_awt_max;
			else ratio = bsnmarkers_afs[num][i]/bshmarkers_afs_max;
			var dotSize = (scaleFactor*fullDot)*Math.pow(parseFloat(ratio),.57);
			var dottie = new GIcon();
			dottie.image = "http://www.gis.nus.edu.sg/images/ydot.png";
			dottie.iconSize = new GSize(dotSize, dotSize);
			dottie.iconAnchor = new GPoint(dotSize/2, dotSize/2);
			var marker = new GMarker(bsnmarkers_coord[num][i], dottie);
			addBSListener(marker, bsnmarkers_bsid[num][i], bsnmarkers_desc[num][i]);

			map_C.addOverlay(bsnmarkers_connectors[num][i]);
			
			bsnManager.addMarker(marker, 15);
		}
		bsnManager.refresh();
	}
	
	function turnOffBSNMarkers() {
		bsnManager.clearMarkers();
		if (selectedDot == -1) return;
		var bconArrLength = bsnmarkers_connectors[selectedDot].length;
		for (var j=0; j<bconArrLength; j++) {
			map_C.removeOverlay(bsnmarkers_connectors[selectedDot][j]);
		}
	}
	
	function refreshBSNMarkers() {
		if (selectedDot == -1) return;
		turnOffBSNMarkers();
		var zoomVar = map_C.getZoom();
		scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
		var bsncArrLength = bsnmarkers_coord[selectedDot].length;
		for (var i=0; i<bsncArrLength; i++) {
			var fullDot = 80;
			var ratio;
			if (viewModeState == 0) ratio = bsnmarkers_awt[selectedDot][i]/bshmarkers_awt_max;
			else ratio = bsnmarkers_afs[selectedDot][i]/bshmarkers_afs_max;
			var dotSize = (scaleFactor*fullDot)*Math.pow(parseFloat(ratio),.57);
			var dottie = new GIcon();
			dottie.image = "http://www.gis.nus.edu.sg/images/ydot.png";
			dottie.iconSize = new GSize(dotSize, dotSize);
			dottie.iconAnchor = new GPoint(dotSize/2, dotSize/2);
			var marker = new GMarker(bsnmarkers_coord[selectedDot][i], dottie);
			addBSListener(marker, bsnmarkers_bsid[selectedDot][i], bsnmarkers_desc[selectedDot][i]);
			
			map_C.addOverlay(bsnmarkers_connectors[selectedDot][i]);
			
			bsnManager.addMarker(marker, 15);
		}
		bsnManager.refresh();
	}
	

	function refreshDotMarkers() {
		dotManager.clearMarkers();
		if (dotState == 0)  return;
		var zoomVar = map_C.getZoom();
		scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
		var ppArrLength = presentPoints.length;
		for (var i=0; i<ppArrLength; i++) {
			var ratio = (1 - ((walkCoeff*presentWalk[i]+timeCoeff*presentTime[i])/maxDenominator))*dotScaling;
			var dotSize = (scaleFactor*fullDot)*Math.pow(ratio,.57);
			var dottie = new GIcon();
			dottie.image = "http://www.gis.nus.edu.sg/images/dot.png";
			dottie.iconSize = new GSize(dotSize, dotSize);
			dottie.iconAnchor = new GPoint(dotSize/2, dotSize/2);
			var marker = new GMarker(presentPoints[i], dottie);
			dotManager.addMarker(marker, 15);
			addBSNListener(marker, presentPoints[i], i);
		}
		dotManager.refresh();
	}
	
	function refreshSensitivity() {
		dotManager.clearMarkers();
		if (dotState == 0)  return;
		var presArrLength = presentPoints.length;
		for (var i=0; i<presArrLength; i++) {
			var ratio = (1 - ((walkCoeff*presentWalk[i]+timeCoeff*presentTime[i])/maxDenominator))*dotScaling;
			var dotSize = (scaleFactor*fullDot)*Math.pow(ratio,.57);
			var dottie = new GIcon();
			dottie.image = "http://www.gis.nus.edu.sg/images/dot.png";
			dottie.iconSize = new GSize(dotSize, dotSize);
			dottie.iconAnchor = new GPoint(dotSize/2, dotSize/2);
			var marker = new GMarker(presentPoints[i], dottie);
			dotManager.addMarker(marker, 15);
			addBSNListener(marker, presentPoints[i], i);
		}
		dotManager.refresh();
	}

	function toggleDim(onOff) {
		var cbArrLength = cbound.length;
		for (var i=0; i<cbArrLength; i++) {
			map_C.removeOverlay(cbound[i]);
		}
		var lpcArrLength = lisPolyCheck.length;
		for (var i=0; i<lpcArrLength; i++) {
			GEvent.removeListener(lisPolyCheck[i]);
		}
		if (onOff==0) {
			var cbArrLength = cbound.length;
			for (var i=0; i<cbArrLength; i++) {
				cbound[i] = new GPolygon(boundaryPts[i], "#FFFFFF",  5,  0, "#000000",  0);
				map_C.addOverlay(cbound[i]);
			}
		}
		else {
			var cbArrLength = cbound.length;
			for (var i=0; i<cbArrLength; i++) {
				cbound[i] = new GPolygon(boundaryPts[i], "#FFFFFF",  5,  0, "#000000",  0.3);
				map_C.addOverlay(cbound[i]);
			}
		}
		
		if (dotState == 1) {
			for (var i=0; i<lisPolyCheck.length; i++) {
				lisPolyCheck[i] = GEvent.addListener(cbound[i], "click", function(point) {
				
					s.computeBCI(''+point.lng(), ''+point.lat(), function(response) { 
						createMarker(point, response.result);
					});
		
				});
			}
		}
	}
	
	function loadBSWindow(bsid, desc) {
	
		var maxWT = -1;
		var maxFS = 0.0;
		var aWT = new Array();
		var FS = new Array();
		var allBuses = new Array();
		var busArr = new Array();
		
		var barWidth = 125;

		descCode = "<span class=\"bsID\">"+bsid+" </span>"+desc;
		otherBusCode = "";
		titleCodeWT = "WAITING TIME TO HUB";
		titleCodeFS = "ROUTE TIME TO HUB";
		barsWTCode = "";
		barsFSCode = "";
			
		if (pageState==0) {
			s.getBuses(bsid, function(response) {
				var xml = GXml.parse(response.result);
			
				var bush = xml.documentElement.getElementsByTagName("Bus");
				
				var bushArrLength = bush.length;
				for (var i=0; i<bushArrLength; i++) {
					var bushid = bush[i].getAttribute("id").split("_");
					var avgWaitingTime = parseFloat(bush[i].getAttribute("avg"));
					var bushfs = parseFloat(bush[i].getAttribute("fareStage"));
					aWT.push(avgWaitingTime);
					FS.push(bushfs);
					busArr.push(bushid[0]);
					if (avgWaitingTime >= maxWT) maxWT = avgWaitingTime;
					if (bushfs >= maxFS) maxFS = bushfs;
					allBuses.push(bushid[0]);
				}
				for (var i=0; i<bushArrLength; i++) {
					if (FS[i]>-1) {
						barsWTCode += "<div id=\"hubBusInfo"+i+"\"><div id=\"bh"+i+"name\" style=\"top:"+ (4+(i*19)) +"px;\">" + busArr[i] +"</div><div id=\"bh"+i+"barset\" style=\"top:"+ (4+(i*19)) +"px;\"><div id=\"bh"+i+"bar\" style=\"width:"+ (aWT[i]/maxWT)*barWidth +"px;\"></div><div id=\"bh"+i+"barbg\"></div><div id=\"bh"+i+"value\">"+ aWT[i] +" min</div></div></div>";
						barsFSCode += "<div id=\"hubBusInfo"+i+"\"><div id=\"bh"+i+"name\" style=\"top:"+ (4+(i*19)) +"px;\">" + busArr[i] +"</div><div id=\"bh"+i+"barset\" style=\"top:"+ (4+(i*19)) +"px;\"><div id=\"bh"+i+"bar\" style=\"width:"+ (FS[i]/maxFS)*barWidth +"px;\"></div><div id=\"bh"+i+"barbg\"></div><div id=\"bh"+i+"value\">"+ (FS[i]*2.5) +" min</div></div></div>";
					}
				}
				
				var abArrLength = allBuses.length;
				for (var i=0; i<abArrLength; i++) {
					if (i < allBuses.length - 1) otherBusCode += allBuses[i] + ", ";
					else otherBusCode += allBuses[i];
				}
				switchBSWindow(viewModeState);
				
			});
		}
		else {
			s.getBusesSim(bsid, function(response) {
			
				var xml = GXml.parse(response.result);
			
				var bush = xml.documentElement.getElementsByTagName("Bus");
				
				var bushArrLength = bush.length;
				for (var i=0; i<bushArrLength; i++) {
					var bushid = bush[i].getAttribute("id").split("_");
					var avgWaitingTime = parseFloat(bush[i].getAttribute("avg"));
					var bushfs = parseFloat(bush[i].getAttribute("fareStage"));
					aWT.push(avgWaitingTime);
					FS.push(bushfs);
					busArr.push(bushid[0]);
					if (avgWaitingTime >= maxWT) maxWT = avgWaitingTime;
					if (bushfs >= maxFS) maxFS = bushfs;
					allBuses.push(bushid[0]);
				}
				for (var i=0; i<bushArrLength; i++) {
					if (FS[i]>-1) {
						barsWTCode += "<div id=\"hubBusInfo"+i+"\"><div id=\"bh"+i+"name\" style=\"top:"+ (4+(i*19)) +"px;\">" + busArr[i] +"</div><div id=\"bh"+i+"barset\" style=\"top:"+ (4+(i*19)) +"px;\"><div id=\"bh"+i+"bar\" style=\"width:"+ (aWT[i]/maxWT)*barWidth +"px;\"></div><div id=\"bh"+i+"barbg\"></div><div id=\"bh"+i+"value\">"+ aWT[i] +" min</div></div></div>";
						barsFSCode += "<div id=\"hubBusInfo"+i+"\"><div id=\"bh"+i+"name\" style=\"top:"+ (4+(i*19)) +"px;\">" + busArr[i] +"</div><div id=\"bh"+i+"barset\" style=\"top:"+ (4+(i*19)) +"px;\"><div id=\"bh"+i+"bar\" style=\"width:"+ (FS[i]/maxFS)*barWidth +"px;\"></div><div id=\"bh"+i+"barbg\"></div><div id=\"bh"+i+"value\">"+ (FS[i]*2.5) +" min</div></div></div>";
					}
				}
				var abArrLength = allBuses.length;
				for (var i=0; i<abArrLength; i++) {
					if (i < allBuses.length - 1) otherBusCode += allBuses[i] + ", ";
					else otherBusCode += allBuses[i];
				}
				switchBSWindow(viewModeState);
				
			});
		}
	
	}
	
	function switchBSWindow(viewMode) {
		// waiting times
		if (viewMode==0) {
			document.getElementById("bsDesc").innerHTML = descCode;
			document.getElementById("otherBuses").innerHTML = otherBusCode;
			document.getElementById("busesToHubTitle").innerHTML = titleCodeWT;
			document.getElementById("bsiInfo").innerHTML = barsWTCode;
			document.getElementById("bsInfo").style.display = "block";
			viewModeState = 0;
		}
		// fare stages
		else if (viewMode==1) {
			document.getElementById("bsDesc").innerHTML = descCode;
			document.getElementById("otherBuses").innerHTML = otherBusCode;
			document.getElementById("busesToHubTitle").innerHTML = titleCodeFS;
			document.getElementById("bsiInfo").innerHTML = barsFSCode;
			document.getElementById("bsInfo").style.display = "block";
			viewModeState = 1;
		}
		// turn off
		else {
			document.getElementById("bsInfo").style.display = "none";
			bsDotEnabled = false;
		}
		refreshBSMarkers(viewMode);
		refreshBSNMarkers();
		updateDotInfo();
	
	}
	
	var bsDotEnabled = false;
	function refreshBSMarkers(viewMode) {
	
		bsManager.clearMarkers();
		if (BSState == 0) return;
		// otherBusStops will always be simple squares
		var zoomVar = map_C.getZoom();
		scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
		var squareSize = scaleFactor*12;
		var bsoArrLength = bsomarkers_coord.length;
		for (var i=0; i<bsoArrLength; i++) {
			var squarie = new GIcon();
			squarie.image = "http://www.gis.nus.edu.sg/images/otherbusstop.jpg";
			squarie.iconSize = new GSize(squareSize, squareSize);
			squarie.iconAnchor = new GPoint(squareSize/2, squareSize/2);
			bsomarkers[i] = new GMarker(bsomarkers_coord[i], {icon:squarie, clickable:false});
			bsManager.addMarker(bsomarkers[i], 15);
		} 
		if (!bsDotEnabled || viewMode == 2) { // simple squares
			document.getElementById('busesToHubTitle').style.backgroundColor = '#CCCCCC'; // revert to original colour
			var bshArrLength = bshmarkers_coord.length;
			for (var i=0; i<bshArrLength; i++) {
				var squarie = new GIcon();
				squarie.image = "http://www.gis.nus.edu.sg/images/hubbusstop.jpg";
				squarie.iconSize = new GSize(squareSize, squareSize);
				squarie.iconAnchor = new GPoint(squareSize/2, squareSize/2);
				bshmarkers[i] = new GMarker(bshmarkers_coord[i], {icon:squarie, draggable:true, bouncy:false});
				bshmarkers[i].disableDragging();
				addBSListener(bshmarkers[i], bshmarkers_bsid[i], bshmarkers_desc[i]);
				bsManager.addMarker(bshmarkers[i], 15);
			}
		}
		else if (viewMode == 0) { // average Waiting time proportional dots
			var bshArrLength = bshmarkers_coord.length;
			for (var i=0; i<bshArrLength; i++) {
				var fullDot = 80;
				var ratio = bshmarkers_awt[i]/bshmarkers_awt_max;
				var dotSize = (scaleFactor*fullDot)*Math.pow(parseFloat(ratio),.57);
				var dottie = new GIcon();
				dottie.image = "http://www.gis.nus.edu.sg/images/ydot.png";
				dottie.iconSize = new GSize(dotSize, dotSize);
				dottie.iconAnchor = new GPoint(dotSize/2, dotSize/2);
				var marker = new GMarker(bshmarkers_coord[i], dottie);
				addBSListener(marker, bshmarkers_bsid[i], bshmarkers_desc[i]);
				bsManager.addMarker(marker, 15);
			}
		}
		else if (viewMode == 1) { // average fare stage proportional dots
			var bshArrLength = bshmarkers_coord.length;
			for (var i=0; i<bshArrLength; i++) {
				var fullDot = 80;
				var ratio = bshmarkers_afs[i]/bshmarkers_afs_max;
				var dotSize = (scaleFactor*fullDot)*Math.pow(parseFloat(ratio),.57);
				var dottie = new GIcon();
				dottie.image = "http://www.gis.nus.edu.sg/images/ydot.png";
				dottie.iconSize = new GSize(dotSize, dotSize);
				dottie.iconAnchor = new GPoint(dotSize/2, dotSize/2);
				var marker = new GMarker(bshmarkers_coord[i], dottie);
				addBSListener(marker, bshmarkers_bsid[i], bshmarkers_desc[i]);
				bsManager.addMarker(marker, 15);
			}
		}
		bsManager.refresh();
	}
		
	function addBSListener(marker, bsid, desc) {
		GEvent.addListener(marker, "click", function() {
			loadBSWindow(bsid, desc);
		});
	
	}
	
	function addBSNListener(marker, point, number) {		
		GEvent.addListener(marker, "click", function(point) {
			turnOnBSNMarkers(number);
		});
	}
	
	function initHandlers() {
	
		document.getElementById("toggleDotMap").innerHTML = "DOTS VISIBLE";
		document.getElementById("toggleBusStopMap").innerHTML = "BUS STOPS VISIBLE";
		document.getElementById("clearDotMap").innerHTML = "CLEAR ALL DOTS";
		document.getElementById("toggleSensitivity").innerHTML = "CONNECTIVITY WEIGHTS";
		document.getElementById("toggleContourMap").innerHTML = "CONTOURS VISIBLE";
		document.getElementById("dotInfo").style.display = "none";
		document.getElementById("sensitivity").style.zIndex = "-1";
		bcio.show();
		toggleDim(0);
	
		document.getElementById("instructions").onclick = toggleHelp;
		document.getElementById("instructions").onmouseover = function() {
			document.getElementById('instructions').style.backgroundColor ='#FF6600';
			document.getElementById('instructions').style.color ='#000000';
		}
		document.getElementById("instructions").onmouseup = function() {
			document.getElementById('instructions').style.color ='#000000';
		}
		document.getElementById("instructions").onmouseout = function() {
			document.getElementById('instructions').style.backgroundColor ='#DDDDDD';
			document.getElementById('instructions').style.color ='#000000';
		}
		document.getElementById("instructions").onmousedown = function() {
			document.getElementById('instructions').style.color ='#FFFFFF';
		}
		document.getElementById("helpConn").onclick = closeHelp;
		document.getElementById("toggleDotMap").onmouseover = function() {
			document.getElementById("toggleDotMap").style.backgroundColor = "#333333";
		}
		document.getElementById("toggleDotMap").onmousedown = function() {
			document.getElementById("toggleDotMap").style.backgroundColor = "#FF6600";
			document.getElementById("toggleDotMap").style.color = "#000000";
		}
		document.getElementById("toggleDotMap").onmouseup = function() {
			document.getElementById("toggleDotMap").style.backgroundColor = "#333333";
			document.getElementById("toggleDotMap").style.color = "#FF6600";
			dotState = 1 - dotState;
			refreshDotMarkers();
			if (contourState == 1) {
				toggleDim(0);
			}
			else {
				toggleDim(1);
			}
			if (dotState == 1) {
				document.getElementById("toggleDotMap").innerHTML = "DOTS VISIBLE";
				refreshBSNMarkers();
				if (presentPoints.length>0 && selectedDot != -1) document.getElementById("dotInfo").style.display = "block";
			}
			else {
				document.getElementById("toggleDotMap").innerHTML = "DOTS OFF";
				toggleDim(0);
				turnOffBSNMarkers();
				document.getElementById("dotInfo").style.display = "none";
			}
			
		}
		document.getElementById("toggleDotMap").onmouseout = function() {
			document.getElementById("toggleDotMap").style.backgroundColor = "#000000";
		}
		
		document.getElementById("toggleSensitivity").onmouseover = function() {
			document.getElementById("toggleSensitivity").style.backgroundColor = "#333333";
		}
		document.getElementById("toggleSensitivity").onmousedown = function() {
			document.getElementById("toggleSensitivity").style.backgroundColor = "#FF6600";
			document.getElementById("toggleSensitivity").style.color = "#000000";
		}
		document.getElementById("toggleSensitivity").onmouseup = function() {
			document.getElementById("toggleSensitivity").style.backgroundColor = "#333333";
			document.getElementById("toggleSensitivity").style.color = "#FF6600";
			if (sensState == 1) {
				document.getElementById("toggleSensitivity").innerHTML = "CONNECTIVITY WEIGHTS";
				document.getElementById("sensitivity").style.zIndex = "-1";
			}
			else {
				document.getElementById("toggleSensitivity").innerHTML = "WEIGHTS VISIBLE";
				document.getElementById("sensitivity").style.zIndex = "775";
			}
			sensState = 1 - sensState;
		}
		document.getElementById("toggleSensitivity").onmouseout = function() {
			document.getElementById("toggleSensitivity").style.backgroundColor = "#000000";
		}
		
		document.getElementById("toggleContourMap").onmouseover = function() {
			document.getElementById("toggleContourMap").style.backgroundColor = "#333333";
		}
		document.getElementById("toggleContourMap").onmousedown = function() {
			document.getElementById("toggleContourMap").style.backgroundColor = "#FF6600";
			document.getElementById("toggleContourMap").style.color = "#000000";
		}
		document.getElementById("toggleContourMap").onmouseup = function() {
			document.getElementById("toggleContourMap").style.backgroundColor = "#333333";
			document.getElementById("toggleContourMap").style.color = "#FF6600";
			contourState = 1 - contourState;
			if (contourState == 1) {
				document.getElementById("toggleContourMap").innerHTML = "CONTOURS VISIBLE";
				toggleDim(0);
				bcio.show();
			}
			else {
				if (dotState == 1) toggleDim(1);
				document.getElementById("toggleContourMap").innerHTML = "CONTOURS OFF";
				bcio.hide();
			}
		}
		document.getElementById("toggleContourMap").onmouseout = function() {
			document.getElementById("toggleContourMap").style.backgroundColor = "#000000";
		}
		document.getElementById("toggleBusStopMap").onmouseover = function() {
			document.getElementById("toggleBusStopMap").style.backgroundColor = "#333333";
		}
		document.getElementById("toggleBusStopMap").onmousedown = function() {
			document.getElementById("toggleBusStopMap").style.backgroundColor = "#FF6600";
			document.getElementById("toggleBusStopMap").style.color = "#000000";
		}
		document.getElementById("toggleBusStopMap").onmouseup = function() {
			document.getElementById("toggleBusStopMap").style.backgroundColor = "#333333";
			document.getElementById("toggleBusStopMap").style.color = "#FF6600";
			BSState = 1 - BSState;
			refreshBSMarkers(viewModeState);
			if (BSState == 1) {
				document.getElementById("toggleBusStopMap").innerHTML = "BUS STOPS VISIBLE";
			}
			else {
				document.getElementById("toggleBusStopMap").innerHTML = "BUS STOPS OFF";
			}
		}
		document.getElementById("toggleBusStopMap").onmouseout = function() {
			document.getElementById("toggleBusStopMap").style.backgroundColor = "#000000";
		}
		document.getElementById("clearDotMap").onmouseover = function() {
			document.getElementById("clearDotMap").style.backgroundColor = "#333333";
		}
		document.getElementById("clearDotMap").onmousedown = function() {
			document.getElementById("clearDotMap").style.backgroundColor = "#FF6600";
			document.getElementById("clearDotMap").style.color = "#000000";
		}
		document.getElementById("clearDotMap").onmouseup = function() {
			document.getElementById("clearDotMap").style.backgroundColor = "#333333";
			document.getElementById("clearDotMap").style.color = "#FF6600";
			presentRatios = new Array();
			presentPoints = new Array();
			presentWalk = new Array();
			presentTime = new Array();
			refreshDotMarkers();
			turnOffBSNMarkers();
			selectedDot = -1;
			bsnmarkers_bsid = new Array();
			bsnmarkers_coord = new Array();
			bsnmarkers_desc = new Array();
			bsnmarkers_awt = new Array();
			bsnmarkers_afs = new Array();
			bsnmarkers_connectors = new Array();
			dotClickState = new Array();
			document.getElementById("dotInfo").style.display = "none";
		}
		document.getElementById("clearDotMap").onmouseout = function() {
			document.getElementById("clearDotMap").style.backgroundColor = "#000000";
		}
		
		// BS Window
		document.getElementById("waitingTimeButton").onmouseover = function() {
			document.getElementById("waitingTimeButton").style.border = "1px solid";
			document.getElementById("waitingTimeButton").style.borderColor = "#FF6600";
		}
		document.getElementById("waitingTimeButton").onmousedown = function() {
			document.getElementById("waitingTimeButton").style.backgroundColor = "#FF6600";
			document.getElementById("waitingTimeButton").style.color = "#FFFFFF";
		}
		document.getElementById("waitingTimeButton").onmouseup = function() {
			document.getElementById("waitingTimeButton").style.backgroundColor = "#FFFFFF";
			document.getElementById("waitingTimeButton").style.color = "#FF6600";
			switchBSWindow(0);
		}
		document.getElementById("waitingTimeButton").onmouseout = function() {
			document.getElementById("waitingTimeButton").style.color = "#FF6600";
			document.getElementById("waitingTimeButton").style.backgroundColor = "#FFFFFF";
			document.getElementById("waitingTimeButton").style.border = "none";
		}
		document.getElementById("fareStageLeftButton").onmouseover = function() {
			document.getElementById("fareStageLeftButton").style.border = "1px solid";
			document.getElementById("fareStageLeftButton").style.borderColor = "#FF6600";
		}
		document.getElementById("fareStageLeftButton").onmousedown = function() {
			document.getElementById("fareStageLeftButton").style.backgroundColor = "#FF6600";
			document.getElementById("fareStageLeftButton").style.color = "#FFFFFF";
		}
		document.getElementById("fareStageLeftButton").onmouseup = function() {
			document.getElementById("fareStageLeftButton").style.backgroundColor = "#FFFFFF";
			document.getElementById("fareStageLeftButton").style.color = "#FF6600";
			switchBSWindow(1);
		}
		document.getElementById("fareStageLeftButton").onmouseout = function() {
			document.getElementById("fareStageLeftButton").style.color = "#FF6600";
			document.getElementById("fareStageLeftButton").style.backgroundColor = "#FFFFFF";
			document.getElementById("fareStageLeftButton").style.border = "none";
		}
		document.getElementById("hideButton").onmouseover = function() {
			document.getElementById("hideButton").style.border = "1px solid";
			document.getElementById("hideButton").style.borderColor = "#FF6600";
		}
		document.getElementById("hideButton").onmousedown = function() {
			document.getElementById("hideButton").style.backgroundColor = "#FF6600";
			document.getElementById("hideButton").style.color = "#FFFFFF";
		}
		document.getElementById("hideButton").onmouseup = function() {
			document.getElementById("hideButton").style.backgroundColor = "#FFFFFF";
			document.getElementById("hideButton").style.color = "#FF6600";
			switchBSWindow(2);
		}
		document.getElementById("hideButton").onmouseout = function() {
			document.getElementById("hideButton").style.color = "#FF6600";
			document.getElementById("hideButton").style.backgroundColor = "#FFFFFF";
			document.getElementById("hideButton").style.border = "none";
		}
		
		// toggling of hubStops dot maps
		document.getElementById("busesToHubTitle").onmouseover = function() {
			if (!bsDotEnabled) {
				document.getElementById("busesToHubTitle").style.backgroundColor = "#DEDEDE";
			}
			else document.getElementById("busesToHubTitle").style.backgroundColor = "#FFFFFF";
		}
		document.getElementById("busesToHubTitle").onmousedown = function() {
			document.getElementById("busesToHubTitle").style.backgroundColor = "#FFFFFF";
			document.getElementById("busesToHubTitle").style.color = "#CCCCCC";
		}
		document.getElementById("busesToHubTitle").onmouseup = function() {
			turnOffBSNMarkers();
			if (selectedDot!=-1) dotClickState[selectedDot] = 0;
			if (!bsDotEnabled) {
				document.getElementById("busesToHubTitle").style.backgroundColor = "#FFFF00";
				document.getElementById("busesToHubTitle").style.color = "#333333";
				bsDotEnabled = true;
			}
			else {
				document.getElementById("busesToHubTitle").style.backgroundColor = "#DEDEDE";
				document.getElementById("busesToHubTitle").style.color = "#333333";
				bsDotEnabled = false;
			}
			refreshBSMarkers(viewModeState);
		}
		document.getElementById("busesToHubTitle").onmouseout = function() {
			if (!bsDotEnabled) {
				document.getElementById("busesToHubTitle").style.color = "#333333";
				document.getElementById("busesToHubTitle").style.backgroundColor = "#CCCCCC";
			}
			else {
				document.getElementById("busesToHubTitle").style.color = "#333333";
				document.getElementById("busesToHubTitle").style.backgroundColor = "#FFFF00";
			}
		}
		
		// dot info
		
		document.getElementById("toggleWT").onmouseover = function() {
			if (viewModeState == 0) return;
			document.getElementById("toggleWT").style.backgroundColor = "#EDEDED";
		}
		document.getElementById("toggleWT").onmousedown = function() {
			if (viewModeState == 0) return;
			document.getElementById("toggleWT").style.backgroundColor = "#FF6600";
			document.getElementById("toggleWT").style.color = "#FFFFFF";
		}
		document.getElementById("toggleWT").onmouseup = function() {
			if (viewModeState == 0) return;
			document.getElementById("toggleWT").style.backgroundColor = "#DDDDDD";
			document.getElementById("toggleWT").style.color = "#000000";
			document.getElementById("toggleWT").style.fontWeight = "bold";
			document.getElementById("toggleFS").style.backgroundColor = "#DDDDDD";
			document.getElementById("toggleFS").style.color = "#898989";
			document.getElementById("toggleFS").style.fontWeight = "normal";
			toggleBSN();
		}
		document.getElementById("toggleWT").onmouseout = function() {
			if (viewModeState == 0) return;
			document.getElementById("toggleWT").style.backgroundColor = "#DDDDDD";
		}
		document.getElementById("toggleFS").onmouseover = function() {
			if (viewModeState == 1) return;
			document.getElementById("toggleFS").style.backgroundColor = "#EDEDED";
		}
		document.getElementById("toggleFS").onmousedown = function() {
			if (viewModeState == 1) return;
			document.getElementById("toggleFS").style.backgroundColor = "#FF6600";
			document.getElementById("toggleFS").style.color = "#FFFFFF";
		}
		document.getElementById("toggleFS").onmouseup = function() {
			if (viewModeState == 1) return;
			document.getElementById("toggleFS").style.backgroundColor = "#DDDDDD";
			document.getElementById("toggleFS").style.color = "#000000";
			document.getElementById("toggleFS").style.fontWeight = "bold";
			document.getElementById("toggleWT").style.backgroundColor = "#DDDDDD";
			document.getElementById("toggleWT").style.color = "#898989";
			document.getElementById("toggleWT").style.fontWeight = "normal";
			toggleBSN();
		}
		document.getElementById("toggleFS").onmouseout = function() {
			if (viewModeState == 1) return;
			document.getElementById("toggleFS").style.backgroundColor = "#DDDDDD";
		}
		
		// sensitivity analysis close button
		document.getElementById("sa_reset").onmousedown = function() {
			this.style.backgroundColor = "#FF6600";
			this.style.color = "#FFFFFF";
		}
		document.getElementById("sa_reset").onmouseup = function() {
			this.style.backgroundColor = "#FFFFFF";
			this.style.color = "#FF6600";
			sd_walk.setValue(originalWalkCoeff);
			sd_time.setValue(originalTimeCoeff);
			walkCoeff = originalWalkCoeff;
			timeCoeff = originalTimeCoeff;
			maxDenominator = originalMaxDenominator;
			refreshSensitivity();
		}
		document.getElementById("sa_reset").onmouseout = function() {
			this.style.backgroundColor = "#FFFFFF";
			this.style.color = "#FF6600";
		}
	}
	
	function initEditMenuHandlers() {
		
		initOptionsHandlers(document.getElementById("startEditBS"));
		initOptionsHandlers(document.getElementById("startEditBus"));
		initOptionsHandlers(document.getElementById("toggleImpact"));
		initOptionsHandlers(document.getElementById("resetChanges"));
		
		initOptionsHandlers(document.getElementById("addBS"));
		initOptionsHandlers(document.getElementById("shiftBS"));
		initOptionsHandlers(document.getElementById("removeBS"));
		initOptionsHandlers(document.getElementById("BSOk"));
		
		initOptionsHandlers(document.getElementById("addBus"));
		initOptionsHandlers(document.getElementById("removeBus"));
		initOptionsHandlers(document.getElementById("editFreq"));
		initOptionsHandlers(document.getElementById("editRoute"));
		initOptionsHandlers(document.getElementById("busOk"));
		
		initOptionsHandlers(document.getElementById("addBSOk"));
		initOptionsHandlers(document.getElementById("shiftBSOk"));
		initOptionsHandlers(document.getElementById("removeBSOk"));
		
		initOptionsHandlers(document.getElementById("addBusOk"));
		initOptionsHandlers(document.getElementById("removeBusOk"));
		initOptionsHandlers(document.getElementById("editFreqOk"));
		initOptionsHandlers(document.getElementById("editRouteOk"));
		
		document.getElementById("termBus").onmouseover = function() {
			this.style.backgroundColor = '#EEEEEE';
			this.style.borderColor = '#999999';
			this.style.color = '#999999';
		}
		
		document.getElementById("termBus").onmousedown = function() {
			this.style.backgroundColor = '#FFFFFF';
			this.style.borderColor = '#FF6600';
			this.style.color = '#FF6600';
		}
		
		document.getElementById("termBus").onmouseup = function() {
			this.style.backgroundColor = '#EEEEEE';
			this.style.borderColor = '#999999';
			this.style.color = '#999999';
			var xml = new XMLWriter();
			var remBus = document.getElementById('removeBusSel').value;
			xml.BeginNode("TerminateService");
				xml.BeginNode("RemoveBus");
				xml.Attrib("ID", remBus+"_1");
				xml.EndNode();
				xml.BeginNode("RemoveBus");
				xml.Attrib("ID", remBus+"_2");
				xml.EndNode();
			xml.EndNode();
			xml.Close();
			s.removeBusSim(xml.ToString(), function(response) {
				if (response.result!="true") {
					alert('Database server is down. Please try again later.');
					return;
				}
				reloadRemoveBusSel();
				reloadHubStops();
				if (affectedBus.indexOf(remBus+'_1')==-1) affectedBus.push(remBus+'_1'); // add to affected removed Bus list
				if (affectedBus.indexOf(remBus+'_2')==-1) affectedBus.push(remBus+'_2'); // add to affected removed Bus list
			});
		}
		
		document.getElementById("termBus").onmouseout = function() {
			this.style.backgroundColor = '#DEDEDE';
			this.style.borderColor = '#666666';
			this.style.color = '#666666';
		}

		
	}
	
	function initOptionsHandlers(divID) {
		divID.onmouseover = function() {
			this.style.backgroundColor = "#EFEFEF";
			this.style.color = "#666666";
		}
		divID.onmousedown = function() {
			this.style.backgroundColor = "#FF6600";
			this.style.color = "#FFFFFF";
		}
		divID.onmouseup = function() {
			this.style.backgroundColor = "#EFEFEF";
			this.style.color = "#666666";
			if (divID == document.getElementById("startEditBS")) {
				document.getElementById("BSOptions").style.display = "block";
			}
			else if (divID == document.getElementById("startEditBus")) {
				document.getElementById("busOptions").style.display = "block";
			}
			else if (divID == document.getElementById("BSOk")) {
				document.getElementById("BSOptions").style.display = "none";
			}
			else if (divID == document.getElementById("busOk")) {
				document.getElementById("busOptions").style.display = "none";
			}
			else if (divID == document.getElementById("addBS")) {
				document.getElementById("addBSi").style.display = "block";
				simState = 11;
				updateState();
			}
			else if (divID == document.getElementById("shiftBS")) {
				document.getElementById("shiftBSi").style.display = "block";
				simState = 21;
				updateState();
			}
			else if (divID == document.getElementById("removeBS")) {
				document.getElementById("removeBSi").style.display = "block";
				simState = 31;
				updateState();
			}
			else if (divID == document.getElementById("addBSOk")) {
				if (simState==11 && !newBSClicked) {
					document.getElementById("idRequired").innerHTML = "* Click on location";
					return;
				}
				else if (simState==11 && !addBSIDEntered) {
					document.getElementById("idRequired").innerHTML = "* ID Required";
					return;
				}
				else if (simState==12 && BSIDSelected==-1) {
					document.getElementById("selRequired").innerHTML = "* Select a bus stop";
					return;
				}
				simState++;
				updateState();
			}
			else if (divID == document.getElementById("shiftBSOk")) {
				simState++;
				updateState();
				document.getElementById("shiftBSi").style.display = "none";
			}
			else if (divID == document.getElementById("removeBSOk")) {
				document.getElementById("removeBSi").style.display = "none";
				simState++;
				updateState();
			}
			else if (divID == document.getElementById("addBus")) {
				document.getElementById("addBusi").style.display = "block";
				simState = 111;
				updateState();
			}
			else if (divID == document.getElementById("addBusOk")) {
				if (simState==111 && !addBusIDEntered) {
					document.getElementById("idDirRequired").innerHTML = "* ID Required";
					return;
				}
				else if (simState==112 && (document.getElementById("addBusWTf1").value=="" || document.getElementById("addBusWTf2").value=="" || document.getElementById("addBusWTf3").value=="" || document.getElementById("addBusWTf4").value=="")) {
					document.getElementById("idWTRequired").innerHTML = "* All fields required";
					return;
				}
				else if (simState==113) {
					var entered = false;
					var brArrLength = busRouteBSID.length;
					for (var i=0; i<brArrLength; i++) {
						if (busRouteBSID[i]!=null) {
							entered = true;
							break;
						}
					}
					if (!entered) {
						document.getElementById("addBusSelRequired").innerHTML = "* Select bus stop(s)";
						return;
					}
					for (var i=0; i<brArrLength; i++) {
						if (busRouteBSID[i]!=null && busRouteFS[i]==null)  {
							document.getElementById("addBusSelRequired").innerHTML = "* Fill in fare stage(s)";
							return;
						}
					}
				}
				simState++;
				updateState();
			}
			else if (divID == document.getElementById("removeBus")) {
				document.getElementById("removeBusi").style.display = "block";
				simState = 121;
				updateState();
			}
			else if (divID == document.getElementById("removeBusOk")) {
				simState++;
				updateState();
			}
			else if (divID == document.getElementById("editFreq")) {
				document.getElementById("editFreqi").style.display = "block";
				simState = 131;
				updateState();
			}
			else if (divID == document.getElementById("editFreqOk")) {
				if (simState==131 && document.getElementById("editFreqFields").innerHTML == "") {
					document.getElementById("editFreqi").style.display = "none";
					simState = -1;
				}
				else if (simState==131 && (document.getElementById("editFreqWTf1").value=="" || document.getElementById("editFreqWTf2").value=="" || document.getElementById("editFreqWTf3").value=="" || document.getElementById("editFreqWTf4").value=="")) {
					document.getElementById("freqWTRequired").innerHTML = "* All fields required";
					return;
				}
				simState++;
				updateState();
			}
			else if (divID == document.getElementById("editRoute")) {
				document.getElementById("editRoutei").style.display = "block";
				simState = 141;
				updateState();
			}
			else if (divID == document.getElementById("editRouteOk")) {
				if (simState==141) {
					var entered = false;
					var brArrLength = busRouteBSID.length;
					for (var i=0; i<brArrLength; i++) {
						if (busRouteBSID[i]!=null) {
							entered = true;
							break;
						}
					}
					if (!entered) {
						document.getElementById("editRouteSelRequired").innerHTML = "* Select bus stop(s)";
						return;
					}
					for (var i=0; i<brArrLength; i++) {
						if (busRouteBSID[i]!=null && busRouteFS[i]==null)  {
							document.getElementById("editRouteSelRequired").innerHTML = "* Fill in fare stage(s)";
							return;
						}
					}
				}
				simState++;
				updateState();
			}
			else if (divID == document.getElementById("toggleImpact")) {
				if (impactGrid==1) {
					var hexArrLength = hexArray.length;
					for (var i=0; i<hexArrLength; i++) {
						hexArray[i].hide();
					}
				}
				else {
					var hexArrLength = hexArray.length;
					for (var i=0; i<hexArrLength; i++) {
						hexArray[i].show();
					}
				}
				impactGrid = 1 - impactGrid;
			}
			else if (divID == document.getElementById("resetChanges")) {
				s.resetSim(function(response) {
					unInitIA();
					loadAssessment();
				});
			}
		}
		
		divID.onmouseout = function() {
			this.style.backgroundColor = "#DEDEDE";
			this.style.color = "#333333";
		}
	}
	
	var simState;
	
	var newBSCoordLng;
	var newBSCoordLat;
	var newBSClicked;
	
	var stateListener;
	var newBSID;
	var BSIDSelected;
	var newBusID;
	
	var tempNewBSM;
	var tempNewBSMDragEvent;
	var addBSIDEntered;
	var addBusIDEntered;
	var addBusWTEntered;
		
	var busRouteBSID;
	var busRouteFS;
	var busRouteBRM;
	var busRouteBRMunder;
	
	var addBusFreq;
	
	var removeBusSelect;
	var editFreqSelect;
	
	var affectedBS;
	var affectedBus;
	
	var falseEasting;
	var falseNorthing;
	
	var hexArray;
	var impactGrid = 1;
	
	function updateState() {
		if (simState==11) {
			disableZoom();
			stateListener = GEvent.addListener(map_C, "click", function(overlay, point) {
				addNewBSSim(point);
			});
			newBSClicked = false;
			addBSIDEntered = false;
			BSIDSelected = -1;
			newBSID = null;
			document.getElementById("addBSStep1").style.backgroundColor = "#DEDEDE";
			document.getElementById("addBSStep2").style.backgroundColor = "#444444";
			document.getElementById("addBSStep3").style.backgroundColor = "#444444";
			document.getElementById("addBSStep1").innerHTML = "Step 1: Click on location of new bus stop and enter bus stop details.<br />ID: <input type='text' id='bsid' class='addBusID'/><br /><div id=\"idRequired\">* ID required</div>";
			document.getElementById("bsid").onkeyup = function() {
					var inputString = document.getElementById("bsid").value;
					if ((inputString+"").trim()=="") {
						addBSIDEntered = false;
						document.getElementById("idRequired").innerHTML = "* invalid ID";
						return;
					}
					s.checkAddBSID(inputString, function(response) {
						if (response.result=="true") {
							addBSIDEntered = true;
							document.getElementById("idRequired").innerHTML = "&nbsp;";
						}
						else if (response.result=="repeat") {
							addBSIDEntered = false;
							document.getElementById("idRequired").innerHTML = "* repeated ID";
						}
						else {
							addBSIDEntered = false;
							document.getElementById("idRequired").innerHTML = "* invalid ID";
						}
					});
				}
		}
		else if (simState==12) {
			newBSID = document.getElementById("bsid").value;
			newBSID = newBSID.toUpperCase();
			tempNewBSM.disableDragging();
			GEvent.removeListener(stateListener);
			var bshArrLength = bshmarkers.length;
			for (var i=0; i<bshArrLength; i++) {
				GEvent.clearListeners(bshmarkers[i], "click");
			}
			for (var i=0; i<bshArrLength; i++) {
				addCopyListener(bshmarkers[i], bshmarkers_bsid[i], bshmarkers_desc[i]);
			}
			document.getElementById("addBSStep1").innerHTML = "Step 1: Click on location of new bus stop and enter bus stop details.<br />ID: "+newBSID+"<br /><div id=\"idRequired\">&nbsp;</div>";
			document.getElementById("addBSStep2").innerHTML = "Step 2: Click on a bus stop <strong>immediately before/after</strong> "+newBSID.toUpperCase()+" to \"copy\" bus services from.<br /><br /><div id=\"addBSServices\">Services: </div><div id=\"selRequired\">* Selection required</div>";
			document.getElementById("addBSStep1").style.backgroundColor = "#444444";
			document.getElementById("addBSStep2").style.backgroundColor = "#DEDEDE";
			document.getElementById("addBSStep3").style.backgroundColor = "#444444";
			disableZoom();
		}
		else if (simState==13) {
			s.addBSCopy(BSIDSelected, newBSID, newBSCoordLat, newBSCoordLng, function(response) {
				if (response.result!="true") {
					alert('Database server is down. Please try again later.');
					return;
				}
				reloadHubStops();
				enableZoom();
				if (affectedBS.indexOf(newBSID)==-1) affectedBS.push(newBSID); // add affected BS for ADD BS
			});
			enableZoom();
			document.getElementById("addBSStep2").style.backgroundColor = "#444444";
			document.getElementById("addBSStep3").style.backgroundColor = "#DEDEDE";
		}
		else if (simState==14) {
			document.getElementById("addBSi").style.display = "none";
			updateHexagon();
			clearAffected();
			simState = -1;
		}
		else if (simState==21) {
			disableZoom();
			var bshArrLength = bshmarkers.length;
			for (var i=0; i<bshArrLength; i++) {
				bshmarkers[i].enableDragging();
				shiftListener(bshmarkers[i], bshmarkers_bsid[i], 0);
			}
		}
		else if (simState==22) {
			var bshArrLength = bshmarkers.length;
			for (var i=0; i<bshArrLength; i++) {
				bshmarkers[i].disableDragging();
				shiftListener(bshmarkers[i], bshmarkers_bsid[i], 1);
			}
			reloadHubStops();
			enableZoom();
			updateHexagon();
			clearAffected();
			simState = -1;
		}
		else if (simState==31) {
			disableZoom();
			var bshArrLength = bshmarkers.length;
			for (var i=0; i<bshArrLength; i++) {
				removeListener(bshmarkers[i], bshmarkers_bsid[i], 0);
			}
		}
		else if (simState==32) {
			var bshArrLength = bshmarkers.length;
			for (var i=0; i<bshArrLength; i++) {
				removeListener(bshmarkers[i], bshmarkers_bsid[i], 1);
			}
			reloadHubStops();
			enableZoom();
			updateHexagon();
			clearAffected();
			simState = -1;
		}
		else if (simState==111) {
			addBusIDEntered = false;
			addBusWTEntered = false;
			busRouteBSID = new Array(20);
			busRouteFS = new Array(20);
			busRouteBRM = new Array(20);
			busRouteBRMunder = new Array(20);
			newBusID = null;
			addBusBSDisplayed = 0;
			document.getElementById("addBusStep1").innerHTML = "Step 1: Enter the bus service number and direction.<br />ID: <input type='text' id='bid' class='addBusID'/> Dir: <select name='select' id='dirSel' class='addBusDir'><option value='1' selected>1</option><option value='2'>2</option></select><br /><div id=\"idDirRequired\">* ID and Dir required</div>";
			document.getElementById("addBusStep3").innerHTML = "<div id=\"addBusToggleTitle\">Step 3: Click on the bus stops along the route and enter fare stages <strong>remaining</strong> to hub.</div><div id=\"addBusSelRequired\">&nbsp;</div><div id=\"addBusFS1\"><div id=\"addBusFSID1\"></div><div id=\"addBusFSForm1\"></div><div id=\"addBusFSDel1\"></div></div><div id=\"addBusFS2\"><div id=\"addBusFSID2\"></div><div id=\"addBusFSForm2\"></div><div id=\"addBusFSDel2\"></div></div><div id=\"addBusFS3\"><div id=\"addBusFSID3\"></div><div id=\"addBusFSForm3\"></div><div id=\"addBusFSDel3\"></div></div><div id=\"addBusFS4\"><div id=\"addBusFSID4\"></div><div id=\"addBusFSForm4\"></div><div id=\"addBusFSDel4\"></div></div><div id=\"addBusFS5\"><div id=\"addBusFSID5\"></div><div id=\"addBusFSForm5\"></div><div id=\"addBusFSDel5\"></div></div><div id=\"addBusFS6\"><div id=\"addBusFSID6\"></div><div id=\"addBusFSForm6\"></div><div id=\"addBusFSDel6\"></div></div><div id=\"addBusFS7\"><div id=\"addBusFSID7\"></div><div id=\"addBusFSForm7\"></div><div id=\"addBusFSDel7\"></div></div><div id=\"addBusFS8\"><div id=\"addBusFSID8\"></div><div id=\"addBusFSForm8\"></div><div id=\"addBusFSDel8\"></div></div><div id=\"addBusFS9\"><div id=\"addBusFSID9\"></div><div id=\"addBusFSForm9\"></div><div id=\"addBusFSDel9\"></div></div><div id=\"addBusFS10\"><div id=\"addBusFSID10\"></div><div id=\"addBusFSForm10\"></div><div id=\"addBusFSDel10\"></div></div><div id=\"addBusFS11\"><div id=\"addBusFSID11\"></div><div id=\"addBusFSForm11\"></div><div id=\"addBusFSDel11\"></div></div><div id=\"addBusFS12\"><div id=\"addBusFSID12\"></div><div id=\"addBusFSForm12\"></div><div id=\"addBusFSDel12\"></div></div><div id=\"addBusFS13\"><div id=\"addBusFSID13\"></div><div id=\"addBusFSForm13\"></div><div id=\"addBusFSDel13\"></div></div><div id=\"addBusFS14\"><div id=\"addBusFSID14\"></div><div id=\"addBusFSForm14\"></div><div id=\"addBusFSDel14\"></div></div><div id=\"addBusFS15\"><div id=\"addBusFSID15\"></div><div id=\"addBusFSForm15\"></div><div id=\"addBusFSDel15\"></div></div><div id=\"addBusFS16\"><div id=\"addBusFSID16\"></div><div id=\"addBusFSForm16\"></div><div id=\"addBusFSDel16\"></div></div><div id=\"addBusFS17\"><div id=\"addBusFSID17\"></div><div id=\"addBusFSForm17\"></div><div id=\"addBusFSDel17\"></div></div><div id=\"addBusFS18\"><div id=\"addBusFSID18\"></div><div id=\"addBusFSForm18\"></div><div id=\"addBusFSDel18\"></div></div><div id=\"addBusFS19\"><div id=\"addBusFSID19\"></div><div id=\"addBusFSForm19\"></div><div id=\"addBusFSDel19\"></div></div><div id=\"addBusFS20\"><div id=\"addBusFSID20\"></div><div id=\"addBusFSForm20\"></div><div id=\"addBusFSDel20\"></div></div>";
			document.getElementById("addBusStep1").style.backgroundColor = "#DEDEDE";
			document.getElementById("addBusStep2").style.backgroundColor = "#444444";
			document.getElementById("addBusStep3").style.backgroundColor = "#444444";
			document.getElementById("addBusStep4").style.backgroundColor = "#444444";
			document.getElementById("addBusStep2").innerHTML = "Step 2: Enter average bus waiting times.";
			document.getElementById("bid").onkeyup = function() {
					var inputString = document.getElementById("bid").value;
					if ((inputString+"").trim()=="") {
						addBusIDEntered = false;
						document.getElementById("idDirRequired").innerHTML = "* invalid ID";
						return;
					}
					s.checkAddBusID(inputString+"_"+document.getElementById("dirSel").value, function(response) {
						if (response.result=="true") {
							addBusIDEntered = true;
							document.getElementById("idDirRequired").innerHTML = "&nbsp;";
						}
						else if (response.result=="repeat") {
							addBusIDEntered = false;
							document.getElementById("idDirRequired").innerHTML = "* ID, dir already present";
						}
						else {
							addBusIDEntered = false;
							document.getElementById("idDirRequired").innerHTML = "* invalid ID";
						}
					});
				}
		}
		else if (simState==112) {
			newBusID = document.getElementById('bid').value + "_" + document.getElementById('dirSel').value;
			document.getElementById("addBusStep2").innerHTML = "Step 2: Enter average bus waiting times.<br /><br /><div id=\"addBusWT1\"><div id=\"addBusWTd1\">0630-0830:</div><div id=\"addBusWTForm1\"><input type='text' class='addBusWT' id='addBusWTf1'/> min</div></div>	<div id=\"addBusWT2\"><div id=\"addBusWTd2\">0831-1659:</div><div id=\"addBusWTForm2\"><input type='text' class='addBusWT' id='addBusWTf2'/> min</div></div><div id=\"addBusWT3\"><div id=\"addBusWTd3\">1700-1900:</div><div id=\"addBusWTForm3\"><input type='text' class='addBusWT' id='addBusWTf3'/> min</div></div><div id=\"addBusWT4\"><div id=\"addBusWTd4\">After 1900:</div><div id=\"addBusWTForm4\"><input type='text' class='addBusWT' id='addBusWTf4'/> min</div></div><div id=\"idWTRequired\">* All fields required</div>";
			document.getElementById("addBusStep1").style.backgroundColor = "#444444";
			document.getElementById("addBusStep2").style.backgroundColor = "#DEDEDE";
			document.getElementById("addBusStep3").style.backgroundColor = "#444444";
			document.getElementById("addBusStep4").style.backgroundColor = "#444444";
			document.getElementById("addBusStep1").innerHTML = "Step 1: Enter the bus number and direction.";
			for (var i=0; i<4; i++) {
				document.getElementById("addBusWTf"+(i+1)).onkeyup = function() {
					if (this.value=="") return;
					var oldnum = ""+this.value;
					var anum=/(^\d+$)|(^\d+\.\d+$)|(^\d+\.$)/;
					if (!anum.test(oldnum)) {
						this.value = oldnum.substring(0,oldnum.length-1);
						return;
					}
				};
			}
		}
		else if (simState==113) {
			addBusFreq[0] = document.getElementById("addBusWTf1").value;
			addBusFreq[1] = document.getElementById("addBusWTf2").value;
			addBusFreq[2] = document.getElementById("addBusWTf3").value;
			addBusFreq[3] = document.getElementById("addBusWTf4").value;
			refreshAddBus();
			disableZoom();
			document.getElementById("addBusStep2").innerHTML = "Step 2: Enter average bus waiting times.";
			document.getElementById("addBusStep3").style.height = "230px";
			document.getElementById("addBusStep1").style.backgroundColor = "#444444";
			document.getElementById("addBusStep2").style.backgroundColor = "#444444";
			document.getElementById("addBusStep3").style.backgroundColor = "#DEDEDE";
			document.getElementById("addBusStep4").style.backgroundColor = "#444444";
			var bshArrLength = bshmarkers.length;
			for (var i=0; i<bshArrLength; i++) {
				addBusRouteListener(bshmarkers[i], bshmarkers_bsid[i], bshmarkers_coord[i]);
			}
			var bsoArrLength = bsomarkers.length;
			for (var i=0; i<bsoArrLength; i++) {
				addBusRouteListener(bsomarkers[i], bsomarkers_bsid[i], bsomarkers_coord[i]);
			}
		}
		else if (simState==114) {
			enableZoom();
			document.getElementById("addBusStep3").style.height = "100px";
			document.getElementById("addBusStep4").style.height = "50px";
			document.getElementById("addBusStep1").style.backgroundColor = "#444444";
			document.getElementById("addBusStep2").style.backgroundColor = "#444444";
			document.getElementById("addBusStep3").style.backgroundColor = "#444444";
			document.getElementById("addBusStep4").style.backgroundColor = "#DEDEDE";
			document.getElementById("addBusStep3").innerHTML = "Step 2: Click on the bus stops along the route and enter fare stages <strong>remaining</strong> to hub.";
			var xml = new XMLWriter();
			xml.BeginNode("NewBus");
			xml.Attrib("ID", newBusID);
			xml.Attrib("waitTime1", addBusFreq[0]);
			xml.Attrib("waitTime2", addBusFreq[1]);
			xml.Attrib("waitTime3", addBusFreq[2]);
			xml.Attrib("waitTime4", addBusFreq[3]);
			var brArrLength = busRouteBSID.length;
			for (var i=0; i<brArrLength; i++) {
				if (busRouteBSID[i]=="" || busRouteBSID[i]==null) continue;
				xml.BeginNode("BusStop");
				xml.Attrib("ID", ''+busRouteBSID[i]);
				xml.Attrib("FS", ''+busRouteFS[i]);
				xml.EndNode();
			}
			xml.EndNode();
			xml.Close();
			s.addBusSim(xml.ToString(), function(response) {
				if (response.result!="true") {
					alert('Database server is down. Please try again later.');
					return;
				}
				reloadHubStops();
				if (affectedBus.indexOf(newBusID)==-1) affectedBus.push(newBusID); // add to affected Bus
			});
		}
		else if (simState==115) {
			document.getElementById("addBusi").style.display = "none";
			updateHexagon();
			clearAffected();
			simState = -1;
		}
		else if (simState==121) {
			reloadRemoveBusSel();
		}
		else if (simState==122) {
			document.getElementById("removeBusi").style.display = "none";
			if (affectedBus.length>0) {
				updateHexagon();
				clearAffected();
			}
			simState = -1;
		}
		else if (simState==131) {
			reloadEditFreqSel();
		}
		else if (simState==132) {
			var busNum = document.getElementById("editFreqSel").value;
			s.editBusFreqSim(busNum, document.getElementById("editFreqWTf1").value, document.getElementById("editFreqWTf2").value, document.getElementById("editFreqWTf3").value, document.getElementById("editFreqWTf4").value, function (response) {
				if (response.result!="true") {
					alert('Database server is down. Please try again later.');
					return;
				}
				if (affectedBus.indexOf(busNum)==-1) affectedBus.push(busNum);
				updateHexagon();
				clearAffected();
				simState = -1;
				document.getElementById("editFreqi").style.display = "none";
			});
		}
		else if (simState==141) {
			// reload the bus selection form, turn listeners on for default value
			reloadEditRouteSel();
			disableZoom();
			refreshAddBus();
			var bshArrLength = bshmarkers.length;
			for (var i=0; i<bshArrLength; i++) {
				addEBusRouteListener(bshmarkers[i], bshmarkers_bsid[i], "", bshmarkers_coord[i]);
			}
			var bsoArrLength = bsomarkers.length;
			for (var i=0; i<bsoArrLength; i++) {
				addEBusRouteListener(bsomarkers[i], bsomarkers_bsid[i], "", bsomarkers_coord[i]);
			}
			// automatically add buses
		}
		else if (simState==142) {
			enableZoom();
			var xml = new XMLWriter();
			xml.BeginNode("EditRouteBus");
			xml.Attrib("ID", document.getElementById('editRouteSel').value);
			for (var i=0; i<busRouteBSID.length; i++) {
				if (busRouteBSID[i]=="" || busRouteBSID[i]==null) continue;
				xml.BeginNode("BusStop");
				xml.Attrib("ID", ''+busRouteBSID[i]);
				xml.Attrib("FS", ''+busRouteFS[i]);
				xml.EndNode();
			}
			xml.EndNode();
			xml.Close();
			s.editBusRouteSim(xml.ToString(), function(response) {
				if (response.result!="true") {
					alert('Database server is down. Please try again later.');
					return;
				}
				reloadHubStops();
				if (loadingDone) {
					if (affectedBus.indexOf(newBusID)==-1) affectedBus.push(document.getElementById('editRouteSel').value); // add to affected Bus
					updateHexagon();
					clearAffected();
				}
				simState = -1;
				document.getElementById("editRoutei").style.display = "none";
			});
		}
	}
	
	function addPtTestLayer() {
		for (var i=0; i<cbound.length; i++) {
			cbound[i] = new GPolygon(boundaryPts[i], "#FFFFFF",  5,  1, "#000000",  1);
			map_C.addOverlay(cbound[i]);
		}
	}
	
	function flashRoute(bid) {
		s.getBusRouteSim(bid, function(response) {
			for (var i=0; i<busRouteBSID.length; i++) {
				if (busRouteBSID[i]!=null) {
					bsManager.removeMarker(busRouteBRM[i]);
					document.getElementById('editRouteFS'+(i+1)).style.display = 'none';
					busRouteBRM[i] = null;
					busRouteBRMunder[i] = null;
					busRouteBSID[i] = null;
					busRouteFS[i] = null;
				}
			}
			busRouteBSID = new Array(20);
			busRouteFS = new Array(20);
			busRouteBRM = new Array(20);
			busRouteBRMunder = new Array(20);
			newBusID = null;
			addBusBSDisplayed = 0;
			var xml = GXml.parse(response.result);
			var busr = xml.documentElement.getElementsByTagName("BusStop");
			var zoomVar = map_C.getZoom(); 
			scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
			var squareSize = scaleFactor*12;
			for (var i=0; i<busr.length; i++) {
				var tempBSID = busr[i].getAttribute("ID");
				var tempBSIDfs = parseFloat(busr[i].getAttribute("FS"));
				var tempBSIDlat = parseFloat(busr[i].getAttribute("lat"));
				var tempBSIDlng = parseFloat(busr[i].getAttribute("lng"));
				var coord = new GLatLng(tempBSIDlat, tempBSIDlng);
				addBusBSDisplayed++;
				var squarie = new GIcon();
				squarie.image = "http://www.gis.nus.edu.sg/images/newbusstop.jpg";
				squarie.iconSize = new GSize(squareSize, squareSize);
				squarie.iconAnchor = new GPoint(squareSize/2, squareSize/2);
				var brm = new GMarker(coord, {icon:squarie, clickable:true});
				var iP;
				for (iP=0; iP<busRouteBSID.length; iP++) {
					if (busRouteBSID[iP]==null) break;
				}
				busRouteBSID[iP] = tempBSID;
				busRouteFS[iP] = tempBSIDfs;
				busRouteBRM[iP] = brm;
				bsManager.addMarker(brm, 15);
				var founded = false;
				for (var m=0; m<bshmarkers_coord.length && founded==false; m++) {
					if (bshmarkers_coord[m].lat() == brm.getLatLng().lat() && bshmarkers_coord[m].lng() == brm.getLatLng().lng()) {
						busRouteBRMunder[iP] = bshmarkers[m];
						founded = true;
					}
				}
				bsManager.removeMarker(busRouteBRMunder[iP]);
				updateEditRoutePanel(tempBSID, tempBSIDfs, iP);
				addEBRMDeleteListener(brm, iP);
			}
		});
	}
	
	function flashFreq(bid) {
		document.getElementById("editFreqFields").innerHTML = "<div id=\"editFreqWT1\"><div id=\"editFreqWTd1\">0630-0830:</div><div id=\"editFreqWTForm1\"><input type='text' class='editFreqWT' id='editFreqWTf1'/> min</div></div>	<div id=\"editFreqWT2\"><div id=\"editFreqWTd2\">0831-1659:</div><div id=\"editFreqWTForm2\"><input type='text' class='editFreqWT' id='editFreqWTf2'/> min</div></div><div id=\"editFreqWT3\"><div id=\"editFreqWTd3\">1700-1900:</div><div id=\"editFreqWTForm3\"><input type='text' class='editFreqWT' id='editFreqWTf3'/> min</div></div><div id=\"editFreqWT4\"><div id=\"editFreqWTd4\">After 1900:</div><div id=\"editFreqWTForm4\"><input type='text' class='editFreqWT' id='editFreqWTf4'/> min</div></div><div id=\"freqWTRequired\">&nbsp;</div>";
		s.getBusDirSim(bid, function(response) {
			var xml = GXml.parse(response.result);
			var busf = xml.documentElement.getElementsByTagName("Times");
			document.getElementById("editFreqWTf1").value = busf[0].getAttribute("morningPeak");
			document.getElementById("editFreqWTf2").value = busf[0].getAttribute("afternoon");
			document.getElementById("editFreqWTf3").value = busf[0].getAttribute("eveningPeak");
			document.getElementById("editFreqWTf4").value = busf[0].getAttribute("night");
			s.getBusRouteSim(bid, function(response) {
				var xml = GXml.parse(response.result);
				var busr = xml.documentElement.getElementsByTagName("BusStop");
				for (var i=0; i<busr.length; i++) {
					var tempBSIDlat = parseFloat(busr[i].getAttribute("lat"));
					var tempBSIDlng = parseFloat(busr[i].getAttribute("lng"));
					var coord = new GLatLng(tempBSIDlat, tempBSIDlng);
					if (i==0) map_C.setCenter(coord);
				}
			});
		});
	}
	
	function reloadEditRouteSel() {
		s.getAllBusesDirSim(function(response) {
			var xml = GXml.parse(response.result);
		
			editFreqSelect = "";
		
			var bush = xml.documentElement.getElementsByTagName("Bus");
			
			for (var i=0; i<bush.length; i++) {
				var busNumDir = bush[i].getAttribute("numDir");
				var bid = bush[i].getAttribute("bid");
				if (i==0) editFreqSelect += "<option selected value='"+bid+"'>"+busNumDir+"</option>";
				else editFreqSelect += "<option value='"+bid+"'>"+busNumDir+"</option>";
			}
			document.getElementById('busServiceContainerER').innerHTML = "<select name='select' class='editFreqSel' id='editRouteSel' onchange='flashRoute(this.value)'>"+editFreqSelect+"</select><br /><br />";
			flashRoute(document.getElementById('editRouteSel').value);
		});
	}
	
	function reloadEditFreqSel() {
		s.getAllBusesDirSim(function(response) {
			var xml = GXml.parse(response.result);
		
			editFreqSelect = "";
		
			var bush = xml.documentElement.getElementsByTagName("Bus");
			
			for (var i=0; i<bush.length; i++) {
				var busNumDir = bush[i].getAttribute("numDir");
				var bid = bush[i].getAttribute("bid");
				editFreqSelect += "<option value='"+bid+"'>"+busNumDir+"</option>";
			}
			document.getElementById('busServiceContainer').innerHTML = "<select name='select' class='editFreqSel' id='editFreqSel' onchange='flashFreq(this.value)'>"+editFreqSelect+"</select><br /><br />";
		});
	}
	
	function reloadRemoveBusSel() {
		s.getAllBusesSim(function(response) {
			var xml = GXml.parse(response.result);
		
			removeBusSelect = "";
		
			var bush = xml.documentElement.getElementsByTagName("Bus");
			
			for (var i=0; i<bush.length; i++) {
				var busNum = bush[i].getAttribute("id");
				removeBusSelect += "<option value='"+busNum+"'>"+busNum+"</option>";
			}
			document.getElementById('selectContainer').innerHTML = "<select name='select' class='removeBusSel' id='removeBusSel'>"+removeBusSelect+"</select><br />";
		});
	}
		
	var addBusBSDisplayed = 0;
	
	function monitorTabs() {
		if (addBusBSDisplayed > 9) {
			document.getElementById('addBusToggleTitle').style.display = "none";
		}
		else document.getElementById('addBusToggleTitle').style.display = "block";
	}
	
	function updateAddBusPanel(tempBSID, i) {
		monitorTabs();
		document.getElementById('addBusFSID'+(i+1)).innerHTML =  tempBSID;
		document.getElementById('addBusFSID'+(i+1)).onmouseup = function () {
			for (var n=0; n<busRouteBRM.length; n++) {
				if (this==document.getElementById('addBusFSID'+(n+1))) {
					map_C.setCenter(busRouteBRM[n].getLatLng());
					break;
				}
			}
		}
		document.getElementById('addBusFSForm'+(i+1)).innerHTML = "<input type='text' id='fsn"+(i+1)+"' class='addBusFSN'/>";
		document.getElementById('addBusFSDel'+(i+1)).innerHTML = "x";
		document.getElementById('addBusFS'+(i+1)).style.display = "block";
		document.getElementById('fsn'+(i+1)).onkeyup = function() {
			if (this.value=="") return;
			var oldnum = ""+this.value;
			var anum=/(^\d+$)|(^\d+\.\d+$)|(^\d+\.$)/;
			if (!anum.test(oldnum)) {
				this.value = oldnum.substring(0,oldnum.length-1);
				return;
			}
			for (var m=0; m<busRouteFS.length; m++) {
				if (document.getElementById('fsn'+(m+1))==this) {
					busRouteFS[m] = parseFloat(this.value);
					break;
				}
			}
		};
		document.getElementById('addBusFSDel'+(i+1)).onmouseover = function () {
			document.getElementById('addBusFSDel'+(i+1)).style.color = "#FFFFFF";
		}
		document.getElementById('addBusFSDel'+(i+1)).onmousedown = function () {
			document.getElementById('addBusFSDel'+(i+1)).style.backgroundColor = "#FFFFFF";
			document.getElementById('addBusFSDel'+(i+1)).style.color = "#FF6600";
		}
		document.getElementById('addBusFSDel'+(i+1)).onmouseup = function () {
			document.getElementById('addBusFSDel'+(i+1)).style.backgroundColor = "#FF6600";
			document.getElementById('addBusFSDel'+(i+1)).style.color = "#FFFFFF";
			bsManager.removeMarker(busRouteBRM[i]);
			bsManager.addMarker(busRouteBRMunder[i], 15);
			document.getElementById('addBusFS'+(i+1)).style.display = 'none';
			busRouteBRM[i] = null;
			busRouteBRMunder[i] = null;
			busRouteBSID[i] = null;
			busRouteFS[i] = null;
			addBusBSDisplayed--;
			monitorTabs();
		}
		document.getElementById('addBusFSDel'+(i+1)).onmouseout = function () {
			document.getElementById('addBusFSDel'+(i+1)).style.backgroundColor = "#FF6600";
			document.getElementById('addBusFSDel'+(i+1)).style.color = "#000000";
		}
	}
	
	function updateEditRoutePanel(tempBSID, fs, i) {
		document.getElementById('editRouteFSID'+(i+1)).innerHTML =  tempBSID;
		document.getElementById('editRouteFSID'+(i+1)).onmouseup = function () {
			for (var n=0; n<busRouteBRM.length; n++) {
				if (this==document.getElementById('editRouteFSID'+(n+1))) {
					map_C.setCenter(busRouteBRM[n].getLatLng());
					break;
				}
			}
		}
		document.getElementById('editRouteFSForm'+(i+1)).innerHTML = "<input type='text' id='Rfsn"+(i+1)+"' class='editRouteFSN'/>";
		document.getElementById('editRouteFSDel'+(i+1)).innerHTML = "x";
		document.getElementById('editRouteFS'+(i+1)).style.display = "block";
		document.getElementById('Rfsn'+(i+1)).value = fs;
		document.getElementById('Rfsn'+(i+1)).onkeyup = function() {
			if (this.value=="") return;
			var oldnum = ""+this.value;
			var anum=/(^\d+$)|(^\d+\.\d+$)|(^\d+\.$)/;
			if (!anum.test(oldnum)) {
				this.value = oldnum.substring(0,oldnum.length-1);
				return;
			}
			for (var m=0; m<busRouteFS.length; m++) {
				if (document.getElementById('Rfsn'+(m+1))==this) {
					busRouteFS[m] = parseFloat(this.value);
					break;
				}
			}
		};
		document.getElementById('editRouteFSDel'+(i+1)).onmouseover = function () {
			document.getElementById('editRouteFSDel'+(i+1)).style.color = "#FFFFFF";
		}
		document.getElementById('editRouteFSDel'+(i+1)).onmousedown = function () {
			document.getElementById('editRouteFSDel'+(i+1)).style.backgroundColor = "#FFFFFF";
			document.getElementById('editRouteFSDel'+(i+1)).style.color = "#FF6600";
		}
		document.getElementById('editRouteFSDel'+(i+1)).onmouseup = function () {
			document.getElementById('editRouteFSDel'+(i+1)).style.backgroundColor = "#FF6600";
			document.getElementById('editRouteFSDel'+(i+1)).style.color = "#FFFFFF";
			bsManager.removeMarker(busRouteBRM[i]);
			bsManager.addMarker(busRouteBRMunder[i], 15);
			document.getElementById('editRouteFS'+(i+1)).style.display = 'none';
			busRouteBRM[i] = null;
			busRouteBRMunder[i] = null;
			busRouteBSID[i] = null;
			busRouteFS[i] = null;
		}
		document.getElementById('editRouteFSDel'+(i+1)).onmouseout = function () {
			document.getElementById('editRouteFSDel'+(i+1)).style.backgroundColor = "#FF6600";
			document.getElementById('editRouteFSDel'+(i+1)).style.color = "#000000";
		}
	}
	
	function addBRMDeleteListener(marker, i) {
		GEvent.addListener(marker, "click", function() {
			addBusBSDisplayed--;
			monitorTabs();
			bsManager.removeMarker(marker);
			bsManager.addMarker(busRouteBRMunder[i], 15);
			document.getElementById('addBusFS'+(i+1)).style.display = 'none';
			busRouteBRM[i] = null;
			busRouteBRMunder[i] = null;
			busRouteBSID[i] = null;
			busRouteFS[i] = null;
		});
	}
	
	function addEBRMDeleteListener(marker, i) {
		GEvent.addListener(marker, "click", function() {
			addBusBSDisplayed--;
			bsManager.removeMarker(marker);
			bsManager.addMarker(busRouteBRMunder[i], 15);
			document.getElementById('editRouteFS'+(i+1)).style.display = 'none';
			busRouteBRM[i] = null;
			busRouteBRMunder[i] = null;
			busRouteBSID[i] = null;
			busRouteFS[i] = null;
		});
	}

	function addBusRouteListener(marker, tempBSID, coord) {
		GEvent.clearListeners(marker, "click");
		GEvent.addListener(marker, "click", function() {
			addBusBSDisplayed++;
			var squarie = new GIcon();
			squarie.image = "http://www.gis.nus.edu.sg/images/newbusstop.jpg";
			var zoomVar = map_C.getZoom();
			scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
			var squareSize = scaleFactor*12;
			squarie.iconSize = new GSize(squareSize, squareSize);
			squarie.iconAnchor = new GPoint(squareSize/2, squareSize/2);
			var brm = new GMarker(coord, {icon:squarie, clickable:true});
			var iP;
			for (iP=0; iP<busRouteBSID.length; iP++) {
				if (busRouteBSID[iP]==null) break;
			}
			busRouteBSID[iP] = tempBSID;
			busRouteBRM[iP] = brm;
			busRouteBRMunder[iP] = marker;
			bsManager.addMarker(brm, 15);
			bsManager.removeMarker(marker);
			updateAddBusPanel(tempBSID, iP);
			addBRMDeleteListener(brm, iP);
		});
	}
	
	function addEBusRouteListener(marker, tempBSID, fs, coord) {
		GEvent.clearListeners(marker, "click");
		GEvent.addListener(marker, "click", function() {
			addBusBSDisplayed++;
			var squarie = new GIcon();
			squarie.image = "http://www.gis.nus.edu.sg/images/newbusstop.jpg";
			var zoomVar = map_C.getZoom();
			scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
			var squareSize = scaleFactor*12;
			squarie.iconSize = new GSize(squareSize, squareSize);
			squarie.iconAnchor = new GPoint(squareSize/2, squareSize/2);
			var brm = new GMarker(coord, {icon:squarie, clickable:true});
			var iP;
			for (iP=0; iP<busRouteBSID.length; iP++) {
				if (busRouteBSID[iP]==null) break;
			}
			busRouteBSID[iP] = tempBSID;
			busRouteBRM[iP] = brm;
			busRouteBRMunder[iP] = marker;
			bsManager.addMarker(brm, 15);
			bsManager.removeMarker(marker);
			updateEditRoutePanel(tempBSID, fs, iP);
			addEBRMDeleteListener(brm, iP);
		});
	}
	
	function removeListener(marker, tempBSID, option) {
		if (option==0) {
			GEvent.clearListeners(marker, "click");
			GEvent.addListener(marker, "click", function() {
				s.removeBSSim(tempBSID, function(response) {
					if (response.result!="true") {
						alert('Database server is down. Please try again later.');
						return;
					}
					bsManager.removeMarker(marker);
					if (affectedBS.indexOf(tempBSID)==-1) affectedBS.push(tempBSID);
				});
			});
		}
		else {
			GEvent.clearListeners(marker, "click");
		}
	}
	
	function shiftListener(marker, tempBSID, option) {
		if (option==0) {
			GEvent.clearListeners(marker, "click");

			GEvent.addListener(marker, "dragend", function() {
				s.updateCoordsSim(tempBSID, marker.getLatLng().lat(), marker.getLatLng().lng(), function(response) {				
					if (response.result!="true") {
						alert('Database server is down. Please try again later.');
						return;
					}
					if (affectedBS.indexOf(tempBSID)==-1) affectedBS.push(tempBSID); // add affected BS for SHIFT BS
				}); 
			});
		}
		else {
			GEvent.clearListeners(marker, "dragend");
		}
	}
	
	function reloadHubStops() {
		s.getHubStopsSim(function(response) { 
			var xml = GXml.parse(response.result);
			var bsh = xml.documentElement.getElementsByTagName("BusStop");
			
			bshmarkers_coord = new Array();
			bshmarkers_bsid = new Array();
			bshmarkers_desc = new Array();
			bshmarkers_awt = new Array();
			bshmarkers_afs = new Array();
			bshmarkers = new Array(bsh.length);
			
			for (var i=0; i<bsh.length; i++) {
				var bslat = parseFloat(bsh[i].getAttribute("lat"));
				var bslng = parseFloat(bsh[i].getAttribute("lng"));
				var bshid = bsh[i].getAttribute("BSID");
				var bshdesc = bsh[i].getAttribute("desc");
				var bshawt = parseFloat(bsh[i].getAttribute("avgWaitingTime"));
				var bshafs = parseFloat(bsh[i].getAttribute("avgFareStage"));
				if (bshawt >= bshmarkers_awt_max) bshmarkers_awt_max = bshawt;
				if (bshafs >= bshmarkers_afs_max) bshmarkers_afs_max = bshafs;
				bshmarkers_bsid.push(bshid);
				bshmarkers_coord.push(new GLatLng(bslat, bslng));
				bshmarkers_desc.push(bshdesc);
				bshmarkers_awt.push(bshawt);
				bshmarkers_afs.push(bshafs);
				
				loadingDone = true;
				
			}
			refreshBSMarkers(viewModeState);
		}); // getHubStops
		
		s.getOtherStopsSim(function(response) { 
				
				var xml = GXml.parse(response.result);
				
				var bso = xml.documentElement.getElementsByTagName("BusStop");
				
				bsomarkers_coord = new Array();
				bsomarkers_bsid = new Array();
				bsomarkers_desc = new Array();
				bsomarkers = new Array(bso.length);

				for (var i=0; i<bso.length; i++) {
					var bslat = parseFloat(bso[i].getAttribute("lat"));
					var bslng = parseFloat(bso[i].getAttribute("lng"));
					var bsoid = bso[i].getAttribute("BSID");
					var bsodesc = bso[i].getAttribute("desc");
					bsomarkers_bsid.push(bsoid);
					bsomarkers_coord.push(new GLatLng(bslat, bslng));
					bsomarkers_desc.push(bsodesc);
				} 
				refreshBSMarkers(viewModeState);

		}); // getOtherStops
	}
	
	function disableZoom() {
		map_C.disableScrollWheelZoom();
		map_C.removeControl(zoomControl);
	}
	
	function enableZoom() {
		map_C.enableScrollWheelZoom();
		map_C.addControl(zoomControl);
	}
	
	function addCopyListener(marker, bsid, desc) {
		GEvent.addListener(marker, "click", function(point) {
			BSIDSelected = bsid;
			var flashBSID = "Services: ";
			s.getBusesSim(bsid, function(response) {
				var xml = GXml.parse(response.result);
				var bush = xml.documentElement.getElementsByTagName("Bus");
				for (var i=0; i<bush.length; i++) {
					var bushid = bush[i].getAttribute("id").split("_");
					if (i<bush.length-1) flashBSID += bushid[0]+", ";
					else flashBSID += bushid[0];
				}
				document.getElementById("addBSServices").innerHTML = flashBSID;
				document.getElementById("selRequired").innerHTML = "&nbsp;";
			});
		});
	}
	
	function testInPolygon(point, poly) {
		var j=0;
		var oddNodes = false;
		var x = point.lng();
		var y = point.lat();
		for (var i=0; i < poly.getVertexCount(); i++) {
			j++;
			if (j == poly.getVertexCount()) {j = 0;}
			if (((poly.getVertex(i).lat() < y) && (poly.getVertex(j).lat() >= y))
					|| ((poly.getVertex(j).lat() < y) && (poly.getVertex(i).lat() >= y))) {
				if ( poly.getVertex(i).lng() + (y - poly.getVertex(i).lat())
						/  (poly.getVertex(j).lat()-poly.getVertex(i).lat())
						*  (poly.getVertex(j).lng() - poly.getVertex(i).lng())<x ) {
					oddNodes = !oddNodes
				}
			}
		}
		return oddNodes;
	}
	
	function addNewBSSim(point) {
		var withinZone = false;
		for (var n=0; n<cbound.length; n++) {
			withinZone = testInPolygon(point, cbound[n]);
			if (withinZone) break;
		}
		if (!withinZone) return;
		if (!newBSClicked) {
			var squarie = new GIcon();
			squarie.image = "http://www.gis.nus.edu.sg/images/newbusstop.jpg";
			var zoomVar = map_C.getZoom();
			var squareSize = scaleFactor*12;
			squarie.iconSize = new GSize(squareSize, squareSize);
			squarie.iconAnchor = new GPoint(squareSize/2, squareSize/2);
			tempNewBSM = new GMarker(point, {icon:squarie, draggable:true, bouncy:false});
			bsManager.addMarker(tempNewBSM, 15);
			bsManager.refresh();
			newBSCoordLng = point.lng();
			newBSCoordLat = point.lat();
			tempNewBSMDragEvent = GEvent.addListener(tempNewBSM, "dragend", function() {
				newBSCoordLng = tempNewBSM.getLatLng().lng();
				newBSCoordLat = tempNewBSM.getLatLng().lat();
			});
			newBSClicked = true;
		}
	}
	
	function refreshAddBus() {
	
		bsManager.clearMarkers();
		var zoomVar = map_C.getZoom();
		scaleFactor = Math.tan(0.25*(zoomVar/20.))*(zoomVar-14);
		var squareSize = scaleFactor*12;
		for (var i=0; i<bsomarkers_coord.length; i++) {
			var squarie = new GIcon();
			squarie.image = "http://www.gis.nus.edu.sg/images/otherbusstop.jpg";
			squarie.iconSize = new GSize(squareSize, squareSize);
			squarie.iconAnchor = new GPoint(squareSize/2, squareSize/2);
			bsomarkers[i] = new GMarker(bsomarkers_coord[i], {icon:squarie});
			bsManager.addMarker(bsomarkers[i], 15);
		} 
		for (var i=0; i<bshmarkers_coord.length; i++) {
			var squarie = new GIcon();
			squarie.image = "http://www.gis.nus.edu.sg/images/hubbusstop.jpg";
			squarie.iconSize = new GSize(squareSize, squareSize);
			squarie.iconAnchor = new GPoint(squareSize/2, squareSize/2);
			bshmarkers[i] = new GMarker(bshmarkers_coord[i], {icon:squarie});
			addBSListener(bshmarkers[i], bshmarkers_bsid[i], bshmarkers_desc[i]);
			bsManager.addMarker(bshmarkers[i], 15);
		}
		bsManager.refresh();
	}
	
	function updateHexagon() {
		impactGrid = 1;
		if (hexArray.length > 0) {
			for (var i=0; i<hexArray.length; i++) {
				map_C.removeOverlay(hexArray[i]);
			}
		}
		var xml = new XMLWriter();
		xml.BeginNode("AffectedItems");
		for (var i=0; i<affectedBS.length; i++) {
			xml.BeginNode("BusStopChanged");
			xml.Attrib("ID", affectedBS[i]);
			xml.EndNode();
		}
		for (var i=0; i<affectedBus.length; i++) {
			xml.BeginNode("BusChanged");
			xml.Attrib("ID", affectedBus[i]);
			xml.EndNode();
		}
		xml.EndNode();
		xml.Close();
		document.getElementById('loadingHex').style.display = 'block';
		s.getHexagons(xml.ToString(), function(response) {
			var xml = GXml.parse(response.result);
			
			var falseOrigin = xml.documentElement.getElementsByTagName("origin");
			falseEasting = parseFloat(falseOrigin[0].getAttribute("x"));
			falseNorthing = parseFloat(falseOrigin[0].getAttribute("y"));
			
			var vLat = 0.000898315;
			var hLng = 0.000377526;
			
			var hexagon = xml.documentElement.getElementsByTagName("hexagon");
			
			
			for (var i=0; i<hexArray.length; i++) {
				map_C.removeOverlay(hexArray[i]);
			}
			
			hexArray = new Array(hexagon.length);
			
			for (var i=0; i<hexagon.length; i++) {
				var hexLat = parseFloat(hexagon[i].getAttribute("lat"));
				var hexLng = parseFloat(hexagon[i].getAttribute("lng"));
				var hexVal = parseFloat(hexagon[i].getAttribute("value"));
				var p1Lat = parseFloat(hexagon[i].getAttribute("p1Lat"));
				var p1Lng = parseFloat(hexagon[i].getAttribute("p1Lng"));
				var p2Lat = parseFloat(hexagon[i].getAttribute("p2Lat"));
				var p2Lng = parseFloat(hexagon[i].getAttribute("p2Lng"));
				var p3Lat = parseFloat(hexagon[i].getAttribute("p3Lat"));
				var p3Lng = parseFloat(hexagon[i].getAttribute("p3Lng"));
				var p4Lat = parseFloat(hexagon[i].getAttribute("p4Lat"));
				var p4Lng = parseFloat(hexagon[i].getAttribute("p4Lng"));
				var p5Lat = parseFloat(hexagon[i].getAttribute("p5Lat"));
				var p5Lng = parseFloat(hexagon[i].getAttribute("p5Lng"));
				var p6Lat = parseFloat(hexagon[i].getAttribute("p6Lat"));
				var p6Lng = parseFloat(hexagon[i].getAttribute("p6Lng"));
				
				var hexShade = "";
				if (hexVal < 0) hexShade = "#ff0000";
				else hexShade = "#00ff00";
				
				var opacityChange = Math.pow(Math.abs(hexVal),0.5);
				
				hexArray[i] = new GPolygon([
					new GLatLng(p1Lat, p1Lng),
					new GLatLng(p2Lat, p2Lng),
					new GLatLng(p3Lat, p3Lng),
					new GLatLng(p4Lat, p4Lng),
					new GLatLng(p5Lat, p5Lng),
					new GLatLng(p6Lat, p6Lng),
					new GLatLng(p1Lat, p1Lng)
				  ], "#ffffff", 1, 0, hexShade, opacityChange, {clickable:false});
				
				map_C.addOverlay(hexArray[i]);
				document.getElementById('loadingHex').style.display = 'none';
			}
		});
	}
	
	function clearAffected() {
		affectedBS = new Array();
		affectedBus = new Array();
	}
	
	if(!Array.indexOf){
	    Array.prototype.indexOf = function(obj){
	        for(var i=0; i<this.length; i++){
	            if(this[i]==obj){
	                return i;
	            }
	        }
	        return -1;
	    }
	}
	
	function loadIA() {
		unInitVis();
		loadAssessment();
	}
	
	function loadAssessment() {
		
		bsManager = new MarkerManager(map_C);
		bsnManager = new MarkerManager(map_C);
		bshmarkers_coord = new Array();
		bshmarkers_bsid = new Array();
		bshmarkers_desc = new Array();
		bshmarkers_awt = new Array();
		bshmarkers_afs = new Array();
		bshmarkers_awt_max = -9999;
		bshmarkers_afs_max = -9999;
		bsomarkers_coord = new Array();
		bsomarkers_bsid = new Array();
		bsomarkers_desc = new Array();
		bsnmarkers_coord = new Array();
		bsnmarkers_bsid = new Array();
		bsnmarkers_desc = new Array();
		bsnmarkers_awt = new Array();
		bsnmarkers_afs = new Array();
		selectedDot = -1;
		viewModeState = 0;
		simState = -1;
		addBSIDEntered = false;
		newBSClicked = false;
		BSIDSelected = -1;
		pageState = 1; // 0 - present connectivity, 1 - impact assessment
		busRouteBSID = new Array(20);
		busRouteFS = new Array(20);
		busRouteBRM = new Array(20);
		busRouteBRMunder = new Array(20);
		addBusWTEntered = false;
		addBusFreq = new Array(4);
		removeBusSelect = "";
		editFreqSelect = "";
		affectedBS = new Array();
		affectedBus = new Array();
		addBusBSDisplayed = 0;
		falseEasting = 0.0;
		falseNorthing = 0.0;
		hexArray = new Array(0);
		impactGrid = 1;
		
		document.getElementById('helpConn').style.backgroundImage = 'url(images/instr2.png)';
		map_C.addOverlay(new ELabel(new GLatLng(1.315330, 103.764410), "CLEMENTI<br/>TRANSPORT HUB", "labelHub"));
		
		s.getHubStopsSim(function(response) { 
				
			var xml = GXml.parse(response.result);
			
			var bsh = xml.documentElement.getElementsByTagName("BusStop");
			
			bshmarkers = new Array(bsh.length);
			
			for (var i=0; i<bsh.length; i++) {
				var bslat = parseFloat(bsh[i].getAttribute("lat"));
				var bslng = parseFloat(bsh[i].getAttribute("lng"));
				var bshid = bsh[i].getAttribute("BSID");
				var bshdesc = bsh[i].getAttribute("desc");
				var bshawt = parseFloat(bsh[i].getAttribute("avgWaitingTime"));
				var bshafs = parseFloat(bsh[i].getAttribute("avgFareStage"));
				if (bshawt >= bshmarkers_awt_max) bshmarkers_awt_max = bshawt;
				if (bshafs >= bshmarkers_afs_max) bshmarkers_afs_max = bshafs;
				bshmarkers_bsid.push(bshid);
				bshmarkers_coord.push(new GLatLng(bslat, bslng));
				bshmarkers_desc.push(bshdesc);
				bshmarkers_awt.push(bshawt);
				bshmarkers_afs.push(bshafs);
				
			}

			refreshBSMarkers(viewModeState);

		}); // getHubStops
			
		s.getOtherStopsSim(function(response) { 
				
				var xml = GXml.parse(response.result);
				
				var bso = xml.documentElement.getElementsByTagName("BusStop");
				
				bsomarkers = new Array(bso.length);

				for (var i=0; i<bso.length; i++) {
					var bslat = parseFloat(bso[i].getAttribute("lat"));
					var bslng = parseFloat(bso[i].getAttribute("lng"));
					var bsoid = bso[i].getAttribute("BSID");
					var bsodesc = bso[i].getAttribute("desc");
					bsomarkers_bsid.push(bsoid);
					bsomarkers_coord.push(new GLatLng(bslat, bslng));
					bsomarkers_desc.push(bsodesc);
				} 
				refreshBSMarkers(viewModeState);

		}); // getOtherStops
		
		lisZoomEnd = GEvent.addListener(map_C, "zoomend", function(oldzoom,zoom) {
			refreshBSMarkers(viewModeState);
			refreshBSNMarkers();
		});
		
		document.getElementById("insideNavi").innerHTML = "<div id=\"navi5\"><a href=\"javascript:loadVis()\"  class=\"naviInsideSub\">present connectivity</a></div>|<div id=\"navi6\"><a href=\"index.html\" class=\"naviInside\">home</a></div><div id=\"navi7\"><a href=\"censusdisplay.html\" class=\"naviInside\">census</a></div><div id=\"navi8\"><a href=\"electoral.html\" class=\"naviInside\">elections</a></div>";
		document.getElementById("IAPanel").style.display = "block";
		initEditMenuHandlers();

	}
	
	function loadVis() {
		unInitIA();
		initVis();
		document.getElementById("toggleSensitivity").style.display = "block";
		document.getElementById("toggleDotMap").style.display = "block";
		document.getElementById("toggleBusStopMap").style.display = "block";
		document.getElementById("clearDotMap").style.display = "block";
		document.getElementById("toggleContourMap").style.display = "block";
	}
	
	function initVis() {
		bsManager = new MarkerManager(map_C);
		bsnManager = new MarkerManager(map_C);
		dotManager = new MarkerManager(map_C);
		bshmarkers_coord = new Array();
		bshmarkers_bsid = new Array();
		bshmarkers_desc = new Array();
		bshmarkers_awt = new Array();
		bshmarkers_afs = new Array();
		bshmarkers_awt_max = -9999;
		bshmarkers_afs_max = -9999;
		bsnmarkers_coord = new Array();
		bsnmarkers_bsid = new Array();
		bsnmarkers_desc = new Array();
		bsnmarkers_awt = new Array();
		bsnmarkers_afs = new Array();
		bsnmarkers_connectors = new Array();
		bsomarkers_coord = new Array();
		bsomarkers_bsid = new Array();
		bsomarkers_desc = new Array();
		presentPoints = new Array();
		presentRatios = new Array();
		presentWalk = new Array();
		presentTime = new Array();
		contourState = 1;
		dotState = 1;
		BSState = 1;
		sensState = 0;
		selectedDot = -1;
		dotClickState = new Array();
		viewModeState = 0;
		pageState = 0; // 0 - present connectivity, 1 - impact assessment
		
		document.getElementById('helpConn').style.backgroundImage = 'url(images/instr1.png)';
		map_C.addOverlay(new ELabel(new GLatLng(1.315330, 103.764410), "CLEMENTI<br/>TRANSPORT HUB", "labelHub"));
		map_C.addOverlay(bcio);
		cbound = new Array();
		s.getHubCatchment("0", function(response) {
			var xml = GXml.parse(response.result);
			var subzones = xml.documentElement.getElementsByTagName("subzone");
			boundaryPts = new Array(subzones.length);
			lisPolyCheck = new Array(subzones.length);
			//get point data from each subzone
			for (var i = 0; i < subzones.length; i++) {
				boundaryPts[i] = new Array();
				var polyVertices = subzones[i].getElementsByTagName("point");
				//we need to order the array so that the polygon will form properly
				//insert 1st point into array
				for (var j = 0; j < polyVertices.length; j++) 
				{
					var point = new GLatLng(parseFloat(polyVertices[j].getAttribute("lat")),
												parseFloat(polyVertices[j].getAttribute("lng")));
					boundaryPts[i].push(point);
				 }//for
				 cbound.push(new GPolygon(boundaryPts[i], "#FFFFFF",  5,  0, "#000000",  0));
				 map_C.addOverlay(cbound[i]);
			 }
			 for (var i=0; i<cbound.length; i++) {
				lisPolyCheck[i] = GEvent.addListener(cbound[i], "click", function(point) {
					s.computeBCI(''+point.lng(), ''+point.lat(), function(response) {
						createMarker(point, response.result);
					});
				});
			}
			
			initHandlers();

		});
		
		s.getHubStops(function(response) { 
					
				var xml = GXml.parse(response.result);
				
				var bsh = xml.documentElement.getElementsByTagName("BusStop");
				
				bshmarkers = new Array(bsh.length);

				for (var i=0; i<bsh.length; i++) {
					var bslat = parseFloat(bsh[i].getAttribute("lat"));
					var bslng = parseFloat(bsh[i].getAttribute("lng"));
					var bshid = bsh[i].getAttribute("BSID");
					var bshdesc = bsh[i].getAttribute("desc");
					var bshawt = parseFloat(bsh[i].getAttribute("avgWaitingTime"));
					var bshafs = parseFloat(bsh[i].getAttribute("avgFareStage"));
					if (bshawt >= bshmarkers_awt_max) bshmarkers_awt_max = bshawt;
					if (bshafs >= bshmarkers_afs_max) bshmarkers_afs_max = bshafs;
					bshmarkers_bsid.push(bshid);
					bshmarkers_coord.push(new GLatLng(bslat, bslng));
					bshmarkers_desc.push(bshdesc);
					bshmarkers_awt.push(bshawt);
					bshmarkers_afs.push(bshafs);
				}
				refreshBSMarkers(viewModeState);

			}); // getHubStops
			
			s.getOtherStops(function(response) { 
					
					var xml = GXml.parse(response.result);
					
					var bso = xml.documentElement.getElementsByTagName("BusStop");
					
					bsomarkers = new Array(bso.length);

					for (var i=0; i<bso.length; i++) {
						var bslat = parseFloat(bso[i].getAttribute("lat"));
						var bslng = parseFloat(bso[i].getAttribute("lng"));
						var bsoid = bso[i].getAttribute("BSID");
						var bsodesc = bso[i].getAttribute("desc");
						bsomarkers_bsid.push(bsoid);
						bsomarkers_coord.push(new GLatLng(bslat, bslng));
						bsomarkers_desc.push(bsodesc);
					} 
					refreshBSMarkers(viewModeState);

			}); // getOtherStops
		
		lisZoomEnd = GEvent.addListener(map_C, "zoomend", function(oldzoom,zoom) { 		
			refreshDotMarkers(); 
			refreshBSMarkers(viewModeState);
			refreshBSNMarkers();
		});
		
		document.getElementById("insideNavi").innerHTML = "<div id=\"navi5\"><a href=\"javascript:loadIA()\"  class=\"naviInsideSub\">impact assessment</a></div>|<div id=\"navi6\"><a href=\"index.html\" class=\"naviInside\">home</a></div><div id=\"navi7\"><a href=\"censusdisplay.html\" class=\"naviInside\">census</a></div><div id=\"navi8\"><a href=\"electoral.html\" class=\"naviInside\">elections</a></div>";


	}
	
	function unInitVis() {
		
		GEvent.removeListener(lisZoomEnd);
		
		bsManager.clearMarkers();
		bsnManager.clearMarkers();
		dotManager.clearMarkers();
		
		for (var i=0; i<cbound.length; i++) {
			map_C.removeOverlay(cbound[i]);
			GEvent.removeListener(lisPolyCheck[i]);
		}
		
		document.getElementById('BSOptions').style.display = 'none';
		document.getElementById('busOptions').style.display = 'none';
		document.getElementById('addBSi').style.display = 'none';
		document.getElementById('shiftBSi').style.display = 'none';
		document.getElementById('removeBSi').style.display = 'none';
		document.getElementById('addBusi').style.display = 'none';
		document.getElementById('removeBusi').style.display = 'none';
		document.getElementById('editFreqi').style.display = 'none';
		document.getElementById('editRoutei').style.display = 'none';
		
		map_C.clearOverlays();
		
		document.getElementById("dotInfo").style.display = "none";
		document.getElementById("bsInfo").style.display = "none";
		document.getElementById("toggleSensitivity").style.display = "none";
		document.getElementById("toggleDotMap").style.display = "none";
		document.getElementById("toggleBusStopMap").style.display = "none";
		document.getElementById("clearDotMap").style.display = "none";
		document.getElementById("toggleContourMap").style.display = "none";
		document.getElementById("sensitivity").style.zIndex = "-1";
		sensState = 0;
	
		bsManager = null;
		bsnManager = null;
		dotManager = null;
		bshmarkers_coord = null;
		bshmarkers_bsid = null;
		bshmarkers_desc = null;
		bshmarkers_awt = null;
		bshmarkers_afs = null;
		bshmarkers_awt_max = null;
		bshmarkers_afs_max = null;
		bsnmarkers_coord = null;
		bshmarkers = null;
		bsnmarkers_bsid = null;
		bsnmarkers_desc = null;
		bsnmarkers_awt = null;
		bsnmarkers_afs = null;
		bsnmarkers_connectors = null;
		bsomarkers_coord = null;
		bsomarkers_bsid = null;
		bsomarkers_desc = null;
		bsomarkers = null;
		presentPoints = null;
		presentRatios = null;
		presentWalk = null;
		presentTime = null;
		contourState = null;
		dotState = null;
		BSState = null;
		selectedDot = null;
		dotClickState = null;
		lisZoomEnd = null;
		scaleFactor = null;
	}
	
	function unInitIA() {
		
		map_C.clearOverlays();
		
		bsManager.clearMarkers();
		bsnManager.clearMarkers();
		
		bsManager = null;
		bsnManager = null;
		bshmarkers_coord = null;
		bshmarkers_bsid = null;
		bshmarkers_desc = null;
		bshmarkers_awt = null;
		bshmarkers_afs = null;
		bshmarkers_awt_max = null;
		bshmarkers_afs_max = null;
		bsomarkers_coord = null;
		bsomarkers_bsid = null;
		bsomarkers_desc = null;
		bsnmarkers_coord = null;
		bsnmarkers_bsid = null;
		bsnmarkers_desc = null;
		bsnmarkers_awt = null;
		bsnmarkers_afs = null;
		selectedDot = null;
		viewModeState = null;
		simState = null;
		addBSIDEntered = null;
		newBSClicked = null;
		BSIDSelected = null;
		pageState = 0; // 0 - present connectivity, 1 - impact assessment
		busRouteBSID = null;
		busRouteFS = null;
		busRouteBRM = null;
		busRouteBRMunder = null;
		removeBusSelect = null;
		editFreqSelect = null;
		affectedBS = null;
		affectedBus = null;
		addBusBSDisplayed = null;
		falseEasting = null;
		falseNorthing = null;
		hexArray = null;
		impactGrid = null;
		newBSCoordLng = null;
		newBSCoordLat = null;
		stateListener = null;
		newBSID = null;
		BSIDSelected = null;
		newBusID = null;;
		tempNewBSM = null;
		tempNewBSMDragEvent = null;
		addBSIDEntered = null;
		addBusIDEntered = null;
		addBusWTEntered = null;
		addBusFreq = null;
		impactGrid = null;
		
		document.getElementById("IAPanel").style.display = "none";
	}
	
    var zoomControl; 
	function load() {
	  
      if (GBrowserIsCompatible()) {
        
		s = new Connectivity();
		
		document.getElementById("cn_map").style.height = ''+(document.body.clientHeight-111-51)+'px';
		window.onresize = function () {
			document.getElementById("cn_map").style.height = ''+(document.body.clientHeight-111-51)+'px';
		}
		
        map_C = new GMap2(document.getElementById("cn_map"));
        map_C.setCenter(new GLatLng(1.313646, 103.765871), 17); 
		//map_C.setMapType(G_NORMAL_MAP);
		var boundaries = new GLatLngBounds(new GLatLng(1.291729,103.756294), new GLatLng(1.324217,103.771949));
		bcio = new GGroundOverlay("http://www.gis.nus.edu.sg/images/bcioverlay.png", boundaries);
		//map_C.setMapType(G_SATELLITE_MAP);
		map_C.setMapType(G_HYBRID_MAP);
		zoomControl = new GLargeMapControl();
		map_C.addControl(zoomControl); //Add in the map control
		map_C.addControl(new GMapTypeControl()); //Add in the Map Type Trigger
		map_C.addControl(new GScaleControl());
		map_C.enableContinuousZoom();
		map_C.enableScrollWheelZoom();
		map_C.disableDoubleClickZoom();
		
					
			initVis();
		
		

	  }
		

		sd_walk = new Slider(document.getElementById("slider_walk"), document.getElementById("slider_walk_input"));
		sd_time = new Slider(document.getElementById("slider_time"), document.getElementById("slider_time_input"));
		sd_walk.setMinimum(0); sd_walk.setMaximum(100); document.getElementById('s_walk_perc').innerHTML = walkCoeff;
		sd_time.setMinimum(0); sd_time.setMaximum(2000); document.getElementById('s_time_perc').innerHTML = timeCoeff;
		sd_walk.setValue(originalWalkCoeff); 
		sd_time.setValue(originalTimeCoeff);
		sd_walk.setUnitIncrement(1);
		sd_time.setUnitIncrement(1);
		sd_walk.onchange = function () {
			if (this.getValue()==0 && sd_time.getValue()==0) {
				walkCoeff = 0.1;
			}
			else walkCoeff = this.getValue();
			document.getElementById('s_walk_perc').innerHTML = walkCoeff;
			maxDenominator = walkCoeff * 340 + timeCoeff * 12.396;
			refreshSensitivity();
		}
		sd_time.onchange = function () {
			if (this.getValue()==0 && sd_walk.getValue()==0) {
				timeCoeff = 0.1;
			}
			else timeCoeff = this.getValue();
			document.getElementById('s_time_perc').innerHTML = timeCoeff;
			maxDenominator = walkCoeff * 340 + timeCoeff * 12.396;
			refreshSensitivity();
		}
	}