From 08514a8ed6a4e7f543078a19271cb0546532e35d Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Mon, 02 Nov 2020 00:15:43 +0000
Subject: [PATCH] [map] New API approach
---
common.js | 334 +++++++++++++++++++++++++++++++------------------------
1 files changed, 190 insertions(+), 144 deletions(-)
diff --git a/common.js b/common.js
index 0bf165e..af26776 100644
--- a/common.js
+++ b/common.js
@@ -1,10 +1,10 @@
-"use strict";
+'use strict';
var ttss_urls = {
t: 'proxy_tram.php',
// t: 'http://www.ttss.krakow.pl/internetservice',
b: 'proxy_bus.php',
- // b: 'http://91.223.13.70/internetservice',
+ // b: 'http://ttss.mpk.krakow.pl/internetservice',
};
var ttss_types = ['t', 'b'];
@@ -22,29 +22,32 @@
********/
function Deferred(promise, request) {
- return {
- promise: promise,
- request: request,
- abort: function() {
- request.abort.bind(request)
- return Deferred(promise, request);
- },
- done: function(func) {
- return Deferred(promise.then(func), request);
- },
- fail: function(func) {
- return Deferred(promise.catch(func), request);
- },
- always: function(func) {
- return Deferred(promise.finally(func), request);
- },
- };
+ this.promise = promise;
+ this.request = request;
}
-
+Deferred.prototype = {
+ promise: null,
+ request: null,
+ abort: function() {
+ this.request.abort.bind(this.request);
+ return new Deferred(this.promise, this.request);
+ },
+ done: function(func) {
+ return new Deferred(this.promise.then(func.bind(this)), this.request);
+ },
+ fail: function(func) {
+ return new Deferred(this.promise.catch(func.bind(this)), this.request);
+ },
+ always: function(func) {
+ return new Deferred(this.promise.finally(func.bind(this)), this.request);
+ },
+};
Deferred.all = function(iterable) {
- return Deferred(
+ return new Deferred(
Promise.all(
- iterable.map(x => x.promise)
+ iterable.map(function(x) {
+ return x.promise;
+ })
)
);
};
@@ -52,15 +55,23 @@
var $ = {
timeout: 10000,
dataType: 'json',
- get: function(url) {
+ get: function(url, headers) {
var self = this;
var request = new XMLHttpRequest();
var promise = new Promise(function(resolve, reject) {
+ request.open('GET', url, true);
+ if(headers) {
+ Object.keys(headers).forEach(function (header) {
+ request.setRequestHeader(header, headers[header]);
+ });
+ }
request.timeout = self.timeout;
request.onreadystatechange = function() {
if(this.readyState == 4) {
- if(this.status == 200) {
- if(self.dataType == 'json') {
+ if(this.status == 304) {
+ resolve();
+ } else if(this.status == 200) {
+ if(self.dataType === 'json') {
resolve(JSON.parse(this.responseText));
} else {
resolve(this.responseText);
@@ -70,10 +81,9 @@
}
}
};
- request.open("GET", url, true);
request.send();
});
- return Deferred(promise, request);
+ return new Deferred(promise, request);
},
};
@@ -84,8 +94,6 @@
var script_version;
var script_version_xhr;
-
-var vehicles_info = {};
function checkVersion() {
if(script_version_xhr) script_version_xhr.abort();
@@ -110,124 +118,21 @@
setInterval(checkVersion, 3600000);
}
+/**********
+ * ARRAYS *
+ **********/
-/***********
- * PARSING *
- ***********/
-
-function normalizeName(string) {
- return string.replace('.', '. ').replace(' ', ' ');
-}
-
-function parseStatus(status) {
- switch(status.status) {
- case 'STOPPING':
- case 'PREDICTED':
- if(status.actualRelativeTime <= 0)
- return lang.boarding_sign;
- if(status.actualRelativeTime >= 60)
- return lang.time_minutes_prefix + Math.floor(status.actualRelativeTime / 60) + lang.time_minutes_suffix;
- return lang.time_seconds_prefix + status.actualRelativeTime + lang.time_seconds_suffix;
- case 'DEPARTED':
- return lang.time_minutes_ago_prefix + Math.floor(-status.actualRelativeTime / 60) + lang.time_minutes_ago_suffix;
- default:
- return status.mixedTime;
+function deepMerge(a1, a2) {
+ if(typeof a1 !== 'object' || typeof a2 !== 'object') {
+ return a2;
}
-}
-
-function parseTime(date, time) {
- var result = new Date(date.getFullYear(), date.getMonth(), date.getDay());
- var time_split = time.split(':');
- result.setHours(time_split[0]);
- result.setMinutes(time_split[1]);
-
- if(result.getTime() - date.getTime() > 72000000) {
- result.setTime(result.getTime() - 86400000);
- }
-
- if(date.getTime() - result.getTime() > 72000000) {
- result.setTime(result.getTime() + 86400000);
- }
-
- return result;
-}
-
-function parseDelay(status) {
- if(!status.actualTime) return lang.unknown_sign;
- if(!status.plannedTime) return lang.unknown_sign;
-
- var now = new Date();
- var actual = parseTime(now, status.actualTime);
- var planned = parseTime(now, status.plannedTime);
-
- return lang.time_minutes_prefix + ((actual.getTime() - planned.getTime()) / 1000 / 60) + lang.time_minutes_suffix;
-}
-
-function parseVehicle(vehicleId) {
- if(!vehicleId) return false;
- if(!vehicles_info || !vehicles_info[vehicleId]) {
- return false;
- } else {
- var vehicle = vehicles_info[vehicleId];
- return {
- vehicleId: vehicleId,
- prefix: vehicle['num'].substr(0, 2),
- id: vehicle['num'].substr(2, 3),
- num: vehicle['num'],
- type: vehicle['type'],
- low: vehicle['low']
- };
- }
-}
-
-function updateVehicleInfo() {
- return $.get(
- 'https://mpk.jacekk.net/vehicles/'
- ).done(function(data) {
- vehicles_info = data;
+ Object.keys(a2).forEach(function (key) {
+ a1[key] = deepMerge(a1[key], a2[key]);
+ if(a1[key] === null) {
+ delete a1[key];
+ }
});
-}
-
-function depotIdToVehicleId(depotId, typeHelper) {
- if(typeHelper) {
- for(var prop in vehicles_info) {
- if(prop.substr(0,1) == typeHelper && vehicles_info[prop]['num'].substr(2) == depotId) {
- return prop;
- }
- }
- } else {
- for(var prop in vehicles_info) {
- if(vehicles_info[prop]['num'] == depotId) {
- return prop;
- }
- }
- }
-}
-
-function displayVehicle(vehicleInfo) {
- if(!vehicleInfo) return document.createTextNode('');
-
- var span = document.createElement('span');
- span.className = 'vehicleInfo';
-
- var floor_type = '';
- if(vehicleInfo.low == 0) {
- setText(span, lang.high_floor_sign);
- floor_type = lang.high_floor;
- } else if(vehicleInfo.low == 1) {
- setText(span, lang.partially_low_floor_sign);
- floor_type = lang.partially_low_floor;
- } else if(vehicleInfo.low == 2) {
- setText(span, lang.low_floor_sign);
- floor_type = lang.low_floor;
- }
-
- span.title = lang.tram_type_pattern
- .replace('$num', vehicleInfo.num)
- .replace('$type', vehicleInfo.type)
- .replace('$floor', floor_type);
-
- return span;
+ return a1;
}
@@ -258,3 +163,144 @@
deleteChildren(element);
element.appendChild(document.createTextNode(text));
}
+
+
+/*****************
+ * VEHICLES INFO *
+ *****************/
+
+function VehiclesInfo() {
+ this.data = {};
+ this.watchers = [];
+}
+VehiclesInfo.prototype = {
+ update: function () {
+ return $.get(
+ 'https://mpk.jacekk.net/vehicles/'
+ ).done(function(data) {
+ this.data = data;
+ this.watchers.forEach(function(watcher) {
+ watcher(this);
+ });
+ }.bind(this));
+ },
+ addWatcher: function(callback) {
+ this.watchers.push(callback);
+ },
+
+ get: function(vehicleId) {
+ if(!vehicleId) return false;
+ if(typeof this.data[vehicleId] === "undefined") {
+ return false;
+ }
+ return this.data[vehicleId];
+ },
+ getParsed: function (vehicleId) {
+ var vehicle = this.get(vehicleId);
+ if(!vehicle) return false;
+ return {
+ vehicleId: vehicleId,
+ prefix: vehicle['num'].substr(0, 2),
+ id: vehicle['num'].substr(2, 3),
+ num: vehicle['num'],
+ type: vehicle['type'],
+ low: vehicle['low']
+ };
+ },
+ depotIdToVehicleId: function(depotId, typeHelper) {
+ var prop;
+ depotId = depotId.toString();
+ if(typeHelper) {
+ for(prop in this.data) {
+ if(prop.substr(0,1) === typeHelper && this.data[prop]['num'].substr(2) === depotId) {
+ return prop;
+ }
+ }
+ } else {
+ for(prop in this.data) {
+ if(this.data[prop]['num'] === depotId) {
+ return prop;
+ }
+ }
+ }
+ },
+};
+var vehicles_info = new VehiclesInfo();
+
+
+/***********
+ * PARSING *
+ ***********/
+
+function normalizeName(string) {
+ return string.replace('.', '. ').replace(' ', ' ');
+}
+
+function parseStatus(status) {
+ switch(status.status) {
+ case 'STOPPING':
+ case 'PREDICTED':
+ if(status.actualRelativeTime <= 0)
+ return lang.boarding_sign;
+ if(status.actualRelativeTime >= 60)
+ return lang.time_minutes_prefix + Math.floor(status.actualRelativeTime / 60) + lang.time_minutes_suffix;
+ return lang.time_seconds_prefix + status.actualRelativeTime + lang.time_seconds_suffix;
+ case 'DEPARTED':
+ return lang.time_minutes_ago_prefix + Math.floor(-status.actualRelativeTime / 60) + lang.time_minutes_ago_suffix;
+ default:
+ return status.mixedTime;
+ }
+}
+
+function parseTime(date, time) {
+ var result = new Date(date.getTime());
+ var time_split = time.split(':');
+ result.setHours(time_split[0], time_split[1], 0);
+
+ if(result.getTime() - date.getTime() > 72000000) {
+ result.setTime(result.getTime() - 86400000);
+ }
+
+ if(date.getTime() - result.getTime() > 72000000) {
+ result.setTime(result.getTime() + 86400000);
+ }
+
+ return result;
+}
+
+function parseDelay(status) {
+ if(!status.actualTime) return lang.unknown_sign;
+ if(!status.plannedTime) return lang.unknown_sign;
+
+ var now = new Date();
+ var actual = parseTime(now, status.actualTime);
+ var planned = parseTime(now, status.plannedTime);
+
+ return lang.time_minutes_prefix + ((actual.getTime() - planned.getTime()) / 1000 / 60) + lang.time_minutes_suffix;
+}
+
+function displayVehicle(vehicleInfo) {
+ if(!vehicleInfo) return document.createTextNode('');
+
+ var span = document.createElement('span');
+ span.className = 'vehicleInfo';
+
+ var floor_type = '';
+ if(vehicleInfo.low === 0) {
+ setText(span, lang.high_floor_sign);
+ floor_type = lang.high_floor;
+ } else if(vehicleInfo.low === 1) {
+ setText(span, lang.partially_low_floor_sign);
+ floor_type = lang.partially_low_floor;
+ } else if(vehicleInfo.low === 2) {
+ setText(span, lang.low_floor_sign);
+ floor_type = lang.low_floor;
+ }
+
+ span.title = lang.tram_type_pattern
+ .replace('$num', vehicleInfo.num)
+ .replace('$type', vehicleInfo.type)
+ .replace('$floor', floor_type);
+
+ return span;
+}
--
Gitblit v1.9.1