From f50bae766a5086ae5f9caf4668d2ec34fdb4d70c Mon Sep 17 00:00:00 2001 From: Jacek Kowalski <Jacek@jacekk.info> Date: Tue, 03 Jan 2017 21:20:18 +0000 Subject: [PATCH] Include stop name in page title --- index.js | 175 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 163 insertions(+), 12 deletions(-) diff --git a/index.js b/index.js index cdb2886..0a132bd 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,9 @@ var ttss_base = '/proxy.php'; var ttss_refresh = 20000; // 20 seconds +var page_title_pattern = 'TTSS Krak\u00F3w - $ - Real-time tram departures'; +var page_title = document.getElementsByTagName('title')[0]; + var stop_id; var stop_name = document.getElementById('stop-name'); var stop_name_form = stop_name.form; @@ -29,6 +32,8 @@ var alert = document.getElementById('alert'); 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) { @@ -76,6 +81,123 @@ 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(id == 899) { + prefix = 'RY'; + type = '126N'; + 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 = 1; + } 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, '\u2010\u00A0'); + 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); } @@ -88,11 +210,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) { @@ -101,7 +223,6 @@ } function fail(message, more) { - if(refresh_timer) clearInterval(refresh_timer); if(times_timer) clearTimeout(times_timer); setText(alert_text, message); @@ -124,6 +245,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; @@ -133,12 +266,14 @@ refresh_button.removeAttribute('disabled'); + loading_start(); times_xhr = $.get( ttss_base + '/passageInfo/stopPassages/stop' + '?stop=' + encodeURIComponent(stopId) + '&mode=departure' ).done(function(data) { setText(times_stop_name, data.stopName); + setText(page_title, page_title_pattern.replace('$', data.stopName)); deleteChildren(times_alerts); deleteChildren(times_table); deleteChildren(times_lines); @@ -156,7 +291,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, ''); @@ -168,15 +304,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 == parseStatusBoarding) 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); } @@ -226,9 +369,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) { @@ -279,7 +423,7 @@ $.ajaxSetup({ dataType: 'json', - timeout: 3000, + timeout: 10000, }); stop_name.addEventListener('input', function(e) { @@ -292,6 +436,7 @@ ).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; setText(opt, decodeEntities(data[i].name)); @@ -308,6 +453,7 @@ e.preventDefault(); if(!stop_name_autocomplete.value) return; stop_id = stop_name_autocomplete.value; + window.location.hash = '#!' + stop_id; loadTimes(stop_id, true); }); @@ -318,6 +464,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