From e0f5a368c8cf5c3cd5814b55d95711edd1b3b190 Mon Sep 17 00:00:00 2001 From: Jacek Kowalski <Jacek@jacekk.info> Date: Sun, 25 Dec 2016 20:36:48 +0000 Subject: [PATCH] Ignore invalid duplicated tram stops returned in autocomplete response (id > 6000) --- index.js | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 164 insertions(+), 14 deletions(-) diff --git a/index.js b/index.js index 54b901a..ed03ca4 100644 --- a/index.js +++ b/index.js @@ -30,13 +30,16 @@ var alert_text = document.getElementById('alert-text'); var alert_close = document.getElementById('alert-close'); +var nav = document.getElementsByTagName('nav')[0]; + +var parseStatusBoarding = '>>>'; function parseStatus(status) { switch(status.status) { case 'STOPPING': - return '<<<'; + return parseStatusBoarding; case 'PREDICTED': if(status.actualRelativeTime <= 0) - return '<<<'; + return parseStatusBoarding; if(status.actualRelativeTime >= 60) return Math.floor(status.actualRelativeTime / 60) + ' min'; return status.actualRelativeTime + ' s'; @@ -75,6 +78,119 @@ return ((actual.getTime() - planned.getTime()) / 1000 / 60) + ' min'; } +function parseVehicle(vehicleId) { + if(!vehicleId) return; + if(vehicleId.substr(0, 15) != '635218529567218') { + console.log('Unknown vehicle, vehicleId=' + vehicleId); + return; + } + + var id = parseInt(vehicleId.substr(15)) - 736; + var prefix; + var type; + var low; // low floor: 0 = no, 1 - semi, 2 - full + + if(101 <= id && id <= 173) { + prefix = 'HW'; + type = 'E1'; + low = 0; + + if((108 <= id && id <= 113) || id == 127 || id == 131 || id == 132 || id == 134 || (137 <= id && id <= 139) || (148 <= id && id <= 150) || (153 <= id && id <= 166) || id == 161) { + prefix = 'RW'; + } + } else if(201 <= id && id <= 293) { + prefix = 'RZ'; + type = '105Na'; + low = 0; + + if(246 <= id) { + prefix = 'HZ'; + } + if(id == 290) { + type = '105Nb'; + } + } else if(301 <= id && id <= 328) { + prefix = 'RF'; + type = 'GT8S'; + low = 0; + + if(id == 313) { + type = 'GT8C' + low = 1; + } + } else if(401 <= id && id <= 440) { + prefix = 'HL'; + type = 'EU8N'; + low = 1; + } else if(451 <= id && id <= 462) { + prefix = 'HK'; + type = 'N8S-NF'; + low = 0; + + if((451 <= id && id <= 453) || id == 462) { + type = 'N8C-NF'; + low = 1; + } + } else if(601 <= id && id <= 650) { + prefix = 'RP'; + type = 'NGT6 (3)'; + low = 2; + + if(id <= 613) { + type = 'NGT6 (1)'; + } else if (id <= 626) { + type = 'NGT6 (2)'; + } + } else if (801 <= id && id <= 824) { + prefix = 'RY'; + type = 'NGT8'; + low = 2; + } else if (901 <= id && id <= 936) { + prefix = 'RG'; + type = '2014N'; + low = 2; + + if(915 <= id) { + prefix = 'HG'; + } + } else if(id === 999) { + prefix = 'HX'; + type = '405N-Kr'; + low = 2; + } else { + console.log('Unknown vehicle, vehicleId=' + vehicleId + ', id=' + id); + return; + } + + return { + vehicleId: vehicleId, + prefix: prefix, + id: id, + num: prefix + id, + type: type, + low: low + }; +} + +function displayVehicle(vehicleInfo) { + if(!vehicleInfo) return document.createTextNode(''); + + var span = document.createElement('span'); + span.className = 'vehicleInfo'; + span.title = vehicleInfo.num + ' ' + vehicleInfo.type; + if(vehicleInfo.low == 0) { + setText(span, '\u25CB'); + span.title += ' (high floor)'; + } else if(vehicleInfo.low == 1) { + setText(span, '*\u267F'); + span.title += ' (partially low floor)'; + } else if(vehicleInfo.low == 2) { + setText(span, '\u267F'); + span.title += ' (low floor)'; + } + return span; +} + function deleteChildren(element) { while(element.lastChild) element.removeChild(element.lastChild); } @@ -87,11 +203,11 @@ } function addCellWithText(parent, text) { - addElementWithText(parent, 'td', text); + return addElementWithText(parent, 'td', text); } function addParaWithText(parent, text) { - addElementWithText(parent, 'p', text); + return addElementWithText(parent, 'p', text); } function setText(element, text) { @@ -100,7 +216,6 @@ } function fail(message, more) { - if(refresh_timer) clearInterval(refresh_timer); if(times_timer) clearTimeout(times_timer); setText(alert_text, message); @@ -123,6 +238,18 @@ } } +function fail_hide() { + alert.style.display = 'none'; +} + +function loading_start() { + nav.className += ' loading'; +} + +function loading_end() { + nav.className = nav.className.replace(' loading', ''); +} + function loadTimes(stopId = null, clearRoute = false) { if(!stopId) stopId = stop_id; if(!stopId) return; @@ -132,6 +259,7 @@ refresh_button.removeAttribute('disabled'); + loading_start(); times_xhr = $.get( ttss_base + '/passageInfo/stopPassages/stop' + '?stop=' + encodeURIComponent(stopId) @@ -155,7 +283,8 @@ for(var i = 0, il = data.old.length; i < il; i++) { var tr = document.createElement('tr'); addCellWithText(tr, data.old[i].patternText); - addCellWithText(tr, data.old[i].direction); + var dir_cell = addCellWithText(tr, data.old[i].direction); + dir_cell.appendChild(displayVehicle(parseVehicle(data.old[i].vehicleId))); var status = parseStatus(data.old[i]); addCellWithText(tr, status); addCellWithText(tr, ''); @@ -167,15 +296,22 @@ for(var i = 0, il = data.actual.length; i < il; i++) { var tr = document.createElement('tr'); addCellWithText(tr, data.actual[i].patternText); - addCellWithText(tr, data.actual[i].direction); + var dir_cell = addCellWithText(tr, data.actual[i].direction); + dir_cell.appendChild(displayVehicle(parseVehicle(data.actual[i].vehicleId))); var status = parseStatus(data.actual[i]); - addCellWithText(tr, status); + var status_cell = addCellWithText(tr, status); var delay = parseDelay(data.actual[i]); - addCellWithText(tr, delay); + var delay_cell = addCellWithText(tr, delay); - if(status == '<<<') tr.className = 'success'; - else if(parseInt(delay) > 9) tr.className = 'danger'; - else if(parseInt(delay) > 3) tr.className = 'warning'; + if(status == parseStatusBoarding) { + tr.className = 'success'; + status_cell.className = 'status-boarding'; + } else if(parseInt(delay) > 9) { + tr.className = 'danger'; + delay_cell.className = 'status-delayed'; + } else if(parseInt(delay) > 3) { + tr.className = 'warning'; + } times_table.appendChild(tr); } @@ -225,9 +361,10 @@ } startTimer(new Date()); + fail_hide(); times_timer = setTimeout(function(){ loadTimes(); }, ttss_refresh); - }).fail(fail_ajax); + }).fail(fail_ajax).always(loading_end); } function declinate(num, singular, plural) { @@ -264,6 +401,12 @@ }, interval); } +var decodeEntitiesTextArea = document.createElement('textarea'); +function decodeEntities(text) { + decodeEntitiesTextArea.innerHTML = text; + return decodeEntitiesTextArea.value; +} + function init() { if(!window.jQuery) { fail('Required JavaScript jQuery library failed to load. You may try refreshing the page.'); @@ -285,9 +428,10 @@ ).done(function(data) { deleteChildren(stop_name_autocomplete); for(var i = 1, il = data.length; i < il; i++) { + if(data[i].id > 6000) continue; var opt = document.createElement('option'); opt.value = data[i].id; - opt.appendChild(document.createTextNode(data[i].name)); + setText(opt, decodeEntities(data[i].name)); stop_name_autocomplete.appendChild(opt); } @@ -301,6 +445,7 @@ e.preventDefault(); if(!stop_name_autocomplete.value) return; stop_id = stop_name_autocomplete.value; + window.location.hash = '#!' + stop_id; loadTimes(stop_id, true); }); @@ -311,6 +456,11 @@ alert_close.addEventListener('click', function(e) { alert.style.display = 'none'; }); + + if(window.location.hash.match(/^#![0-9]+$/)) { + stop_id = parseInt(window.location.hash.slice(2)); + loadTimes(stop_id); + } } init(); -- Gitblit v1.9.1