From 7ca6a15943ffd4dc600aca0afd22835b18ce99c0 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Mon, 17 Apr 2017 10:42:47 +0000
Subject: [PATCH] Add hash (#!) in map for stop, stopPoint or tram

---
 map.js    |  114 ++++++++++++++++++++++++++++++--------
 common.js |    8 ++
 2 files changed, 98 insertions(+), 24 deletions(-)

diff --git a/common.js b/common.js
index f899e51..37368a1 100644
--- a/common.js
+++ b/common.js
@@ -135,6 +135,14 @@
 	};
 }
 
+function tramIdToVehicleId(tramId) {
+	if(0 <= tramId && tramId <= 999) {
+		var vehicleId = '0000' + (tramId + 736);
+		vehicleId = vehicleId.substr(vehicleId.length - 4)
+		return '635218529567218' + vehicleId;
+	}
+}
+
 // Element mangling
 function deleteChildren(element) {
 	while(element.lastChild) element.removeChild(element.lastChild);
diff --git a/map.js b/map.js
index 34493f9..51d6314 100644
--- a/map.js
+++ b/map.js
@@ -20,6 +20,8 @@
 var popup = null;
 var fail_element = document.getElementById('fail');
 
+var ignore_hashchange = false;
+
 function fail(msg) {
 	console.log(msg);
 	
@@ -142,6 +144,8 @@
 			updateVehicles();
 		}, ttss_refresh);
 	}).fail(fail_ajax);
+	
+	return vehicles_xhr;
 }
 
 function updateStopSource(stops, prefix, source) {
@@ -166,7 +170,7 @@
 }
 
 function updateStops() {
-	$.get(
+	return $.get(
 		ttss_base + '/geoserviceDispatcher/services/stopinfo/stops'
 			+ '?left=-648000000'
 			+ '&bottom=-324000000'
@@ -178,7 +182,7 @@
 }
 
 function updateStopPoints() {
-	$.get(
+	return $.get(
 		ttss_base + '/geoserviceDispatcher/services/stopinfo/stopPoints'
 			+ '?left=-648000000'
 			+ '&bottom=-324000000'
@@ -187,6 +191,80 @@
 	).done(function(data) {
 		updateStopSource(data.stopPoints, 'p', stop_points_source);
 	}).fail(fail_ajax);
+}
+
+function featureClicked(feature) {
+	if(!feature) {
+		popupHide();
+		
+		ignore_hashchange = true;
+		window.location.hash = '';
+		
+		return;
+	}
+	
+	var coordinates = feature.getGeometry().getCoordinates();
+	
+	deleteChildren(popup_element);
+	
+	addParaWithText(popup_element, feature.get('name')).className = 'bold';
+	switch(feature.getId().substr(0, 1)) {
+		case 'v':
+			var vehicle_type = parseVehicle(feature.get('id'));
+			if(vehicle_type) {
+				addParaWithText(popup_element, vehicle_type.num + ' ' + vehicle_type.type);
+			}
+		break;
+	}
+	
+	ignore_hashchange = true;
+	window.location.hash = '#!' + feature.getId();
+	
+	popupShow(coordinates, feature.getId());
+}
+
+function hash() {
+	if(ignore_hashchange) {
+		ignore_hashchange = false;
+		return;
+	}
+	
+	var tramId = null;
+	
+	var vehicleId = null;
+	var stopId = null;
+	var stopPointId = null;
+	
+	var feature = null;
+	
+	if(window.location.hash.match(/^#!t[0-9]{3}$/)) {
+		tramId = parseInt(window.location.hash.substr(3));
+	} else if(window.location.hash.match(/^#![A-Za-z]{2}[0-9]{3}$/)) {
+		tramId = parseInt(window.location.hash.substr(4));
+	} else if(window.location.hash.match(/^#!v[0-9]+$/)) {
+		vehicleId = window.location.hash.substr(3);
+	} else if(window.location.hash.match(/^#!s[0-9]+$/)) {
+		stopId = window.location.hash.substr(3);
+	} else if(window.location.hash.match(/^#!p[0-9]+$/)) {
+		stopPointId = window.location.hash.substr(3);
+	}
+	
+	if(tramId) {
+		vehicleId = tramIdToVehicleId(tramId);
+	}
+	
+	if(vehicleId) {
+		feature = vehicles_source.getFeatureById('v' + vehicleId);
+	} else if(stopId) {
+		feature = stops_source.getFeatureById('s' + stopId);
+	} else if(stopPointId) {
+		feature = stop_points_source.getFeatureById('p' + stopPointId);
+	}
+	
+	featureClicked(feature);
+	if(feature) {
+		map.getView().setCenter(feature.getGeometry().getCoordinates());
+	}
 }
 
 function init() {
@@ -261,25 +339,7 @@
 	// Display popup on click
 	map.on('singleclick', function(e) {
 		var feature = map.forEachFeatureAtPixel(e.pixel, function(feature) { return feature; });
-		if(feature) {
-			var coordinates = feature.getGeometry().getCoordinates();
-			
-			deleteChildren(popup_element);
-			
-			addParaWithText(popup_element, feature.get('name')).className = 'bold';
-			switch(feature.getId().substr(0, 1)) {
-				case 'v':
-					var vehicle_type = parseVehicle(feature.get('id'));
-					if(vehicle_type) {
-						addParaWithText(popup_element, vehicle_type.num + ' ' + vehicle_type.type);
-					}
-				break;
-			}
-			
-			popupShow(coordinates, feature.getId());
-		} else {
-			popupHide();
-		}
+		featureClicked(feature);
 	});
 
 	// Change mouse cursor when over marker
@@ -300,9 +360,15 @@
 		}
 	});
 	
-	updateVehicles();
-	updateStops();
-	updateStopPoints();
+	$.when(
+		updateVehicles(),
+		updateStops(),
+		updateStopPoints()
+	).done(function() {
+		hash();
+	});
+	
+	window.addEventListener('hashchange', hash);
 	
 	setTimeout(function() {
 		if(vehicles_xhr) vehicles_xhr.abort();

--
Gitblit v1.9.1