|  |  | 
 |  |  |        | 
 |  |  |       ttss_types.forEach(function(ttss_type) { | 
 |  |  |          vehicles[ttss_type].source.forEachFeature(function(feature) { | 
 |  |  |             if(feature.get('vehicle_type') && feature.get('vehicle_type').num.indexOf(query) > -1) { | 
 |  |  |             if(feature.get('type') && feature.get('type').num.indexOf(query) > -1) { | 
 |  |  |                features.push(feature); | 
 |  |  |             } | 
 |  |  |          }); | 
 |  |  | 
 |  |  |    }, | 
 |  |  |    _removeFeature: function(feature) { | 
 |  |  |       if(!feature) return; | 
 |  |  |       this.source.removeFeature(feature); | 
 |  |  |       if(this.selectedFeatureId === feature.getId()) { | 
 |  |  |          this.deselect(); | 
 |  |  |       } | 
 |  |  |       this.source.removeFeature(feature); | 
 |  |  |    }, | 
 |  |  |    loadFullData: function(data) { | 
 |  |  |       var self = this; | 
 |  |  | 
 |  |  |    return path_xhr; | 
 |  |  | } | 
 |  |  |  | 
 |  |  | function vehicleTable(feature, table) { | 
 |  |  | function vehicleTable(feature, table, post, trip) { | 
 |  |  |    if(feature_xhr) feature_xhr.abort(); | 
 |  |  |    if(feature_timer) clearTimeout(feature_timer); | 
 |  |  |     | 
 |  |  | 
 |  |  |    var featureSource = featureDiscriminator.substr(1, 1); | 
 |  |  |    var featureStatus = feature.get('status'); | 
 |  |  |     | 
 |  |  |    var isTripCurrent = !trip || feature.get('trip') == trip; | 
 |  |  | 	 | 
 |  |  |    feature_xhr = $.get( | 
 |  |  |       api_url + '/trip/?type=' + featureSource + '&id=' + feature.get('trip') | 
 |  |  |    ).done(function(data) { | 
 |  |  |       api_url + '/trip/?type=' + featureSource + '&id=' + (trip ? trip : feature.get('trip')) | 
 |  |  |    ).done(function(results) { | 
 |  |  |       var data = results['data']; | 
 |  |  | 		 | 
 |  |  |       deleteChildren(table); | 
 |  |  |        | 
 |  |  |       var tr; | 
 |  |  | 
 |  |  |           | 
 |  |  |          stopsToMark.push(data[i].stop); | 
 |  |  |           | 
 |  |  |          if(data[i].seq < feature.get('seq')) { | 
 |  |  |             tr.className = 'active'; | 
 |  |  |          } else if(data[i].seq == feature.get('seq') && featureStatus < 2) { | 
 |  |  |             tr.className = 'success'; | 
 |  |  |          if(isTripCurrent) { | 
 |  |  |             if(data[i].seq < feature.get('seq')) { | 
 |  |  |                tr.className = 'active'; | 
 |  |  |             } else if(data[i].seq == feature.get('seq') && featureStatus < 2) { | 
 |  |  |                tr.className = 'success'; | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |          table.appendChild(tr); | 
 |  |  |       } | 
 |  |  | 
 |  |  |          tr.className = 'active'; | 
 |  |  |       } | 
 |  |  |        | 
 |  |  |       deleteChildren(post); | 
 |  |  | 		 | 
 |  |  |       if(results['prev']) { | 
 |  |  |          tr = addElementWithText(post, 'a', lang.trip_previous); | 
 |  |  |          tr.className = 'left'; | 
 |  |  |          tr.onclick = function() { | 
 |  |  |             vehicleTable(feature, table, post, results['prev']); | 
 |  |  |          }; | 
 |  |  |       } else { | 
 |  |  |          tr = document.createElement('span'); | 
 |  |  |          post.appendChild(tr); | 
 |  |  |       } | 
 |  |  |       if(!isTripCurrent) { | 
 |  |  |          tr = addElementWithText(post, 'a', lang.trip_current); | 
 |  |  |          tr.className = 'center'; | 
 |  |  |          tr.onclick = function() { | 
 |  |  |             vehicleTable(feature, table, post); | 
 |  |  |          }; | 
 |  |  |       } else { | 
 |  |  |          tr = document.createElement('span'); | 
 |  |  |          post.appendChild(tr); | 
 |  |  |       } | 
 |  |  |       if(results['next']) { | 
 |  |  |          tr = addElementWithText(post, 'a', lang.trip_next); | 
 |  |  |          tr.className = 'right'; | 
 |  |  |          tr.onclick = function() { | 
 |  |  |             vehicleTable(feature, table, post, results['next']); | 
 |  |  |          }; | 
 |  |  |       } else { | 
 |  |  |          tr = document.createElement('span'); | 
 |  |  |          post.appendChild(tr); | 
 |  |  |       } | 
 |  |  | 		 | 
 |  |  |       markStops(stopsToMark, featureSource, true); | 
 |  |  |        | 
 |  |  |       feature_timer = setTimeout(function() { vehicleTable(feature, table); }, api_refresh); | 
 |  |  |       feature_timer = setTimeout(function() { vehicleTable(feature, table, post, trip); }, api_refresh); | 
 |  |  |    }).fail(fail_ajax_popup); | 
 |  |  |    return feature_xhr; | 
 |  |  | } | 
 |  |  | 
 |  |  |    var featureSource = featureDiscriminator.substr(1, 1); | 
 |  |  |     | 
 |  |  |    feature_xhr = $.get( | 
 |  |  |       api_url + '/stop/?type=' + featureSource + '&id=' + feature.getId() | 
 |  |  |       api_url + '/schedule/?type=' + featureSource + '&id=' + feature.getId() | 
 |  |  |    ).done(function(data) { | 
 |  |  |       deleteChildren(table); | 
 |  |  |        | 
 |  |  |       var all_departures = data.old.concat(data.actual); | 
 |  |  |       var tr, dir_cell, vehicle, status, status_cell, delay, delay_cell; | 
 |  |  |       for(var i = 0, il = all_departures.length; i < il; i++) { | 
 |  |  |       for(var i = 0, il = data.length; i < il; i++) { | 
 |  |  |          tr = document.createElement('tr'); | 
 |  |  |          addCellWithText(tr, all_departures[i].patternText); | 
 |  |  |          dir_cell = addCellWithText(tr, normalizeName(all_departures[i].direction)); | 
 |  |  |          addCellWithText(tr, data[i].line); | 
 |  |  |          dir_cell = addCellWithText(tr, data[i].direction); | 
 |  |  |          //vehicle = vehicles_info.getParsed(all_departures[i].vehicleId); | 
 |  |  |          dir_cell.appendChild(displayVehicle(vehicle)); | 
 |  |  |          status = parseStatus(all_departures[i]); | 
 |  |  |          status_cell = addCellWithText(tr, status); | 
 |  |  |          delay = parseDelay(all_departures[i]); | 
 |  |  |          delay_cell = addCellWithText(tr, delay); | 
 |  |  | 			 | 
 |  |  |          //dir_cell.appendChild(displayVehicle(vehicle)); | 
 |  |  |          //status = parseStatus(all_departures[i]); | 
 |  |  |          status_cell = addCellWithText(tr, data[i].time); | 
 |  |  |          //delay = parseDelay(all_departures[i]); | 
 |  |  |          delay_cell = addCellWithText(tr, ''); | 
 |  |  |          /* | 
 |  |  |          if(i < data.old.length) { | 
 |  |  |             tr.className = 'active'; | 
 |  |  |          } else if(status === lang.boarding_sign) { | 
 |  |  | 
 |  |  |          } else if(parseInt(delay) > 3) { | 
 |  |  |             tr.className = 'warning'; | 
 |  |  |          } | 
 |  |  | 			 | 
 |  |  |          */ | 
 |  |  |          table.appendChild(tr); | 
 |  |  |       } | 
 |  |  |        | 
 |  |  | 
 |  |  |    var tbody = document.createElement('tbody'); | 
 |  |  |    table.appendChild(thead); | 
 |  |  |    table.appendChild(tbody); | 
 |  |  |    var post; | 
 |  |  |     | 
 |  |  |    var tabular_data = true; | 
 |  |  |     | 
 |  |  | 
 |  |  |       var span = displayVehicle(feature.get('type')); | 
 |  |  |        | 
 |  |  |       additional = document.createElement('p'); | 
 |  |  |       if(span.title) { | 
 |  |  |          setText(additional, span.title); | 
 |  |  |       if(span.dataset.typeShort) { | 
 |  |  |          setText(additional, span.dataset.typeShort); | 
 |  |  |          additional.title = span.dataset.typeAdditional; | 
 |  |  |          span.removeAttribute('title'); | 
 |  |  |       } else { | 
 |  |  |          setText(additional, feature.getId()); | 
 |  |  |       } | 
 |  |  | 
 |  |  |       addElementWithText(thead, 'th', lang.header_time); | 
 |  |  |       addElementWithText(thead, 'th', lang.header_stop); | 
 |  |  |        | 
 |  |  |       vehicleTable(feature, tbody); | 
 |  |  |       post = document.createElement('div'); | 
 |  |  |       post.className = 'post-nav'; | 
 |  |  | 		 | 
 |  |  |       vehicleTable(feature, tbody, post); | 
 |  |  |       //vehiclePath(feature); | 
 |  |  |    } | 
 |  |  |    // Stop or stop point | 
 |  |  | 
 |  |  |     | 
 |  |  |    if(tabular_data) { | 
 |  |  |       div.appendChild(table); | 
 |  |  |    } | 
 |  |  | 	 | 
 |  |  |    if(post) { | 
 |  |  |       div.appendChild(post); | 
 |  |  |    } | 
 |  |  |     | 
 |  |  |    showOnMapFunction(); | 
 |  |  | 
 |  |  |       return false; | 
 |  |  |    }, | 
 |  |  |    _updateOld: function() { | 
 |  |  |       if(window.location.hash.match(/^#![bt][0-9]{3}$/)) { | 
 |  |  |       if(window.location.hash.match(/^#!s[bt][0-9]{1,3}$/)) { | 
 |  |  |          this.go('s' + window.location.hash.charAt(3) + window.location.hash.substr(4).padStart(4, '0')); | 
 |  |  |       } else if(window.location.hash.match(/^#![bt][0-9]{3}$/)) { | 
 |  |  |          this.go('v' + window.location.hash.substr(2)); | 
 |  |  |       } else if(window.location.hash.match(/^#![RHrh][A-Za-z][0-9]{3}$/)) { | 
 |  |  |          this.go('vt'+ window.location.hash.substr(4)); | 
 |  |  | 
 |  |  |     | 
 |  |  |    hash = new Hash(); | 
 |  |  |    Deferred.all(future_requests).done(hash.ready.bind(hash)); | 
 |  |  | 	 | 
 |  |  |    setTimeout(function() { | 
 |  |  |       ttss_types.forEach(function(type) { | 
 |  |  |          if(vehicles_xhr[type]) { | 
 |  |  |             vehicles_xhr[type].abort(); | 
 |  |  |          } | 
 |  |  |          if(vehicles_timer[type]) { | 
 |  |  |             clearTimeout(vehicles_timer[type]); | 
 |  |  |          } | 
 |  |  |       }); | 
 |  |  | 		 | 
 |  |  |       fail(lang.error_refresh); | 
 |  |  |    }, 1800000); | 
 |  |  | } | 
 |  |  |  | 
 |  |  | init(); |