|  |  |  | 
|---|
|  |  |  | 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'; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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) { | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | function fail(message, more) { | 
|---|
|  |  |  | if(refresh_timer) clearInterval(refresh_timer); | 
|---|
|  |  |  | if(times_timer) clearTimeout(times_timer); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | setText(alert_text, message); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | refresh_button.removeAttribute('disabled'); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | loading_start(); | 
|---|
|  |  |  | times_xhr = $.get( | 
|---|
|  |  |  | ttss_base + '/passageInfo/stopPassages/stop' | 
|---|
|  |  |  | + '?stop=' + encodeURIComponent(stopId) | 
|---|
|  |  |  | 
|---|
|  |  |  | 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, ''); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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) { | 
|---|
|  |  |  | 
|---|
|  |  |  | }, 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.'); | 
|---|
|  |  |  | 
|---|
|  |  |  | ).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); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | e.preventDefault(); | 
|---|
|  |  |  | if(!stop_name_autocomplete.value) return; | 
|---|
|  |  |  | stop_id = stop_name_autocomplete.value; | 
|---|
|  |  |  | window.location.hash = '#!' + stop_id; | 
|---|
|  |  |  | loadTimes(stop_id, true); | 
|---|
|  |  |  | }); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | 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(); | 
|---|