Improved www.ttss.krakow.pl
9 files modified
301 ■■■■ changed files
index.css 3 ●●●●● patch | view | raw | blame | history
index.html 8 ●●●● patch | view | raw | blame | history
index.js 96 ●●●● patch | view | raw | blame | history
lang_en.js 1 ●●●● patch | view | raw | blame | history
lang_pl.js 1 ●●●● patch | view | raw | blame | history
map.html 2 ●●● patch | view | raw | blame | history
map.js 96 ●●●● patch | view | raw | blame | history
stops/stops.db patch | view | raw | blame | history
stops/stops.php 94 ●●●●● patch | view | raw | blame | history
index.css
@@ -34,6 +34,9 @@
    font-size: inherit;
}
h2#times-stop {
    margin-top: 0;
}
.vehicleInfo {
    font-size: 21px;
}
index.html
@@ -56,7 +56,7 @@
            
            <div class="row">
                <div class="col-md-6">
                    <h2 id="times-stop-name"></h2>
                    <h2 id="times-stop"><small id="times-stop-type"></small><br /><span id="times-stop-name"></span></h2>
                    
                    <div id="times-alerts"></div>
                    
@@ -129,13 +129,13 @@
                    
                    <p class="small" data-translate="help_text">Względne czasy (np. 3 min) są podawane na podstawie faktycznej lokalizacji pojazdów. Czasy bezwzględne (np. 8:01) to odjazdy rozkładowe, pokazywane gdy pojazd nie może być zlokalizowany. "?" oznacza nieznane opóźnienie.</p>
                    
                    <p class="small">&copy; 2016-2017 Jacek Kowalski - <a href="https://github.com/jacekkow/mpk-ttss" data-translate="help_source">Źródło</a> - <a href="https://raw.githubusercontent.com/jacekkow/mpk-ttss/master/LICENSE" data-translate="help_license">Licencja</a></p>
                    <p class="small">&copy; 2016-2019 Jacek Kowalski - <a href="https://github.com/jacekkow/mpk-ttss" data-translate="help_source">Źródło</a> - <a href="https://raw.githubusercontent.com/jacekkow/mpk-ttss/master/LICENSE" data-translate="help_license">Licencja</a></p>
                </div>
            </div>
        </div>
        <script src="https://polyfill.io/v3/polyfill.min.js?features=Promise,XMLHttpRequest"></script>
        <script type="text/javascript" src="lang_pl.js?v7" id="lang_script"></script>
        <script type="text/javascript" src="lang_pl.js?v8" id="lang_script"></script>
        <script type="text/javascript" src="common.js?v8"></script>
        <script type="text/javascript" src="index.js?v6"></script>
        <script type="text/javascript" src="index.js?v7"></script>
    </body>
</html>
index.js
@@ -17,6 +17,7 @@
var times_xhr;
var times_timer;
var times_stop_type = document.getElementById('times-stop-type');
var times_stop_name = document.getElementById('times-stop-name');
var times_alerts = document.getElementById('times-alerts');
var times_table = document.getElementById('times-table');
@@ -54,9 +55,9 @@
function fail_ajax(data) {
    // abort() is not a failure
    if(data.readyState == 0 && data.statusText == 'abort') return;
    if(data.readyState === 0) return;
    
    if(data.status == 0) {
    if(data.status === 0) {
        fail(lang.error_request_failed_connectivity, data);
    } else if (data.statusText) {
        fail(lang.error_request_failed_status.replace('$status', data.statusText), data);
@@ -98,54 +99,62 @@
    window.location.hash = '#!' + language + stopId;
    refresh_button.removeAttribute('disabled');
    
    var alternative_stop = null;
    var candidate = null;
    for(var i = 0; i < stop_name_autocomplete.options.length; i++) {
        candidate = stop_name_autocomplete.options[i].value;
        if(candidate.substr(0, 1) != prefix && candidate.substr(1) == stop) {
            alternative_stop = candidate;
            break;
        }
    }
    times_xhr = $.get(
        url + '/services/passageInfo/stopPassages/stop'
            + '?stop=' + encodeURIComponent(stop)
            + '&mode=departure'
    ).done(function(data) {
        setText(times_stop_type, lang.types['s' + prefix]);
        setText(times_stop_name, data.stopName);
        setText(page_title, lang.page_title_stop_name.replace('$stop', data.stopName));
        deleteChildren(times_alerts);
        deleteChildren(times_table);
        //deleteChildren(times_lines);
        
        if(alternative_stop !== null) {
            var a = addParaWithText(times_alerts, '');
            a = addElementWithText(a, 'a', (prefix == 'b' ? lang.departures_for_trams : lang.departures_for_buses));
            a.href = '';
            a.onclick = function(e) {
                e.preventDefault();
                loadTimes(alternative_stop);
            };
        }
        for(var i = 0, il = data.generalAlerts.length; i < il; i++) {
            addParaWithText(times_alerts, data.generalAlerts[i].title);
        }
        
        for(var i = 0, il = data.old.length; i < il; i++) {
        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++) {
            var tr = document.createElement('tr');
            addCellWithText(tr, data.old[i].patternText);
            var dir_cell = addCellWithText(tr, data.old[i].direction);
            var vehicle = parseVehicle(prefix + data.old[i].vehicleId);
            addCellWithText(tr, all_departures[i].patternText);
            var dir_cell = addCellWithText(tr, all_departures[i].direction);
            var vehicle = parseVehicle(prefix + all_departures[i].vehicleId);
            dir_cell.appendChild(displayVehicle(vehicle));
            addCellWithText(tr, (vehicle ? vehicle.num : '')).className = 'vehicleData';
            var status = parseStatus(data.old[i]);
            addCellWithText(tr, status);
            addCellWithText(tr, '');
            tr.className = 'active';
            tr.addEventListener('click', function(tripId, vehicleInfo) {
                return function(){ loadRoute(tripId, vehicleInfo); }
            }(prefix + data.old[i].tripId, vehicle));
            times_table.appendChild(tr);
        }
        for(var i = 0, il = data.actual.length; i < il; i++) {
            var tr = document.createElement('tr');
            addCellWithText(tr, data.actual[i].patternText);
            var dir_cell = addCellWithText(tr, data.actual[i].direction);
            var vehicle = parseVehicle(prefix + data.actual[i].vehicleId);
            dir_cell.appendChild(displayVehicle(vehicle));
            addCellWithText(tr, (vehicle ? vehicle.num : '')).className = 'vehicleData';
            var status = parseStatus(data.actual[i]);
            var status = parseStatus(all_departures[i]);
            var status_cell = addCellWithText(tr, status);
            var delay = parseDelay(data.actual[i]);
            var delay = parseDelay(all_departures[i]);
            var delay_cell = addCellWithText(tr, delay);
            
            if(data.actual[i].status == 'STOPPING') {
            if(i < data.old.length) {
                tr.className = 'active';
            } else if(all_departures[i].status === 'STOPPING') {
                tr.className = 'success';
                if (data.actual[i].actualRelativeTime <= 0) {
                if (all_departures[i].actualRelativeTime <= 0) {
                    status_cell.className = 'status-boarding';
                }
            } else if(parseInt(delay) > 9) {
@@ -157,7 +166,7 @@
            
            tr.addEventListener('click', function(tripId, vehicleInfo) {
                return function(){ loadRoute(tripId, vehicleInfo); }
            }(prefix + data.actual[i].tripId, vehicle));
            }(prefix + all_departures[i].tripId, vehicle));
            times_table.appendChild(tr);
        }
        
@@ -189,14 +198,13 @@
    
    var prefix = tripId.substr(0, 1);
    var trip = tripId.substr(1);
    var url = ttss_urls[prefix];
    
    route_id = tripId;
    route_vehicle_info = vehicleInfo;
    
    if(route_xhr) route_xhr.abort();
    route_xhr = $.get(
        url + '/services/tripInfo/tripPassages'
        ttss_urls[prefix] + '/services/tripInfo/tripPassages'
            + '?tripId=' + encodeURIComponent(trip)
            + '&mode=departure'
    ).done(function(data) {
@@ -218,25 +226,19 @@
        
        deleteChildren(route_table);
        
        for(var i = 0, il = data.old.length; i < il; i++) {
            var tr = document.createElement('tr');
            addCellWithText(tr, data.old[i].actualTime || data.old[i].plannedTime);
            addCellWithText(tr, data.old[i].stop_seq_num + '. ' + data.old[i].stop.name);
        var all_departures = data.old.concat(data.actual);
        var tr;
        for(var i = 0, il = all_departures.length; i < il; i++) {
            tr = document.createElement('tr');
            addCellWithText(tr, all_departures[i].actualTime || all_departures[i].plannedTime);
            addCellWithText(tr, all_departures[i].stop_seq_num + '. ' + all_departures[i].stop.name);
            
            tr.className = 'active';
            tr.addEventListener('click', function(stopId){ return function(){ loadTimes(stopId); } }(prefix + data.old[i].stop.shortName) );
            route_table.appendChild(tr);
        }
        for(var i = 0, il = data.actual.length; i < il; i++) {
            var tr = document.createElement('tr');
            addCellWithText(tr, data.actual[i].actualTime || data.actual[i].plannedTime);
            addCellWithText(tr, data.actual[i].stop_seq_num + '. ' + data.actual[i].stop.name);
            if(data.actual[i].status == 'STOPPING') {
            if(i < data.old.length) {
                tr.className = 'active';
            } else if(all_departures[i].status === 'STOPPING') {
                tr.className = 'success';
            }
            tr.addEventListener('click', function(stopId){ return function(){ loadTimes(stopId); } }(prefix + data.actual[i].stop.shortName) );
            tr.addEventListener('click', function(stopId){ return function(){ loadTimes(stopId); } }(prefix + all_departures[i].stop.shortName) );
            route_table.appendChild(tr);
        }
    }).fail(fail_ajax);
lang_en.js
@@ -20,6 +20,7 @@
    refresh_button: '\u27f3 Refresh',
    last_refreshed: 'Last refreshed: $time',
    loading: 'Loading...',
    no_data: 'Data unavailable',
    
    line_alert_pattern: 'Line $line: $alert',
    
lang_pl.js
@@ -20,6 +20,7 @@
    refresh_button: '\u27f3 Odśwież',
    last_refreshed: 'Ostatnio odświeżone $time',
    loading: 'Ładowanie...',
    no_data: 'Brak danych',
    
    line_alert_pattern: 'Linia $line: $alert',
    
map.html
@@ -23,7 +23,7 @@
<div id="panel"></div>
<script src="https://polyfill.io/v3/polyfill.min.js?features=Array.prototype.forEach,Array.prototype.includes,Array.prototype.map,Element.prototype.classList,Promise,String.prototype.startsWith,XMLHttpRequest,requestAnimationFrame"></script>
<script src="https://cdn.jsdelivr.net/gh/openlayers/openlayers.github.io@master/en/v5.3.0/build/ol.js" integrity="sha384-iQkGyyH4ioz3m+maM3s9MX1Oq67mACa4B9Z3ovUv3Sv37LJ96fx3WnZfLoiC3Wfl" crossorigin="anonymous"></script>
<script tyle="text/javascript" src="lang_pl.js?v7" id="lang_script"></script>
<script tyle="text/javascript" src="lang_pl.js?v8" id="lang_script"></script>
<script tyle="text/javascript" src="common.js?v8"></script>
<script tyle="text/javascript" src="map.js?v20"></script>
</body>
map.js
@@ -151,9 +151,9 @@
function fail_ajax_generic(data, fnc) {
    // abort() is not a failure
    if(data.readyState == 0) return;
    if(data.readyState === 0) return;
    
    if(data.status == 0) {
    if(data.status === 0) {
        fnc(lang.error_request_failed_connectivity, data);
    } else if (data.statusText) {
        fnc(lang.error_request_failed_status.replace('$status', data.statusText), data);
@@ -226,8 +226,7 @@
    
    stop_selected_layer.setStyle(style);
    
    var feature = null;
    var prefix = null;
    var feature, prefix;
    for(var i = 0; i < stops.length; i++) {
        feature = null;
        if(stops[i].getId) {
@@ -360,7 +359,7 @@
    ).done(function(data) {
        if(!data || !data.paths || !data.paths[0] || !data.paths[0].wayPoints) return;
        
        var point = null;
        var point;
        var points = [];
        for(var i = 0; i < data.paths[0].wayPoints.length; i++) {
            point = data.paths[0].wayPoints[i];
@@ -390,34 +389,38 @@
            + '?tripId=' + encodeURIComponent(feature.get('tripId'))
            + '&mode=departure'
    ).done(function(data) {
        if(!data.routeName || !data.directionText) {
        if(typeof data.old === "undefined" || typeof data.actual === "undefined") {
            return;
        }
        
        deleteChildren(table);
        
        for(var i = 0, il = data.old.length; i < il; i++) {
            var tr = document.createElement('tr');
            addCellWithText(tr, data.old[i].actualTime || data.old[i].plannedTime);
            addCellWithText(tr, data.old[i].stop_seq_num + '. ' + data.old[i].stop.name);
            tr.className = 'active';
            table.appendChild(tr);
        }
        var all_departures = data.old.concat(data.actual);
        var tr;
        var stopsToMark = [];
        for(var i = 0, il = data.actual.length; i < il; i++) {
            var tr = document.createElement('tr');
            addCellWithText(tr, data.actual[i].actualTime || data.actual[i].plannedTime);
            addCellWithText(tr, data.actual[i].stop_seq_num + '. ' + data.actual[i].stop.name);
        for(var i = 0, il = all_departures.length; i < il; i++) {
            tr = document.createElement('tr');
            addCellWithText(tr, all_departures[i].actualTime || all_departures[i].plannedTime);
            addCellWithText(tr, all_departures[i].stop_seq_num + '. ' + all_departures[i].stop.name);
            
            stopsToMark.push('s' + ttss_type + data.actual[i].stop.id);
            if(i >= data.old.length) {
                stopsToMark.push('s' + ttss_type + all_departures[i].stop.id);
            }
            
            if(data.actual[i].status == 'STOPPING') {
            if(i < data.old.length) {
                tr.className = 'active';
            } else if(all_departures[i].status === 'STOPPING') {
                tr.className = 'success';
            }
            table.appendChild(tr);
        }
        if(all_departures.length === 0) {
            tr = document.createElement('tr');
            table.appendChild(tr);
            tr = addCellWithText(tr, lang.no_data);
            tr.colSpan = '2';
            tr.className = 'active';
        }
        
        markStops(stopsToMark, ttss_type, true);
@@ -438,32 +441,22 @@
    ).done(function(data) {
        deleteChildren(table);
        
        for(var i = 0, il = data.old.length; i < il; i++) {
            var tr = document.createElement('tr');
            addCellWithText(tr, data.old[i].patternText);
            var dir_cell = addCellWithText(tr, data.old[i].direction);
            var vehicle = parseVehicle(data.old[i].vehicleId);
        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++) {
            tr = document.createElement('tr');
            addCellWithText(tr, all_departures[i].patternText);
            dir_cell = addCellWithText(tr, all_departures[i].direction);
            vehicle = parseVehicle(all_departures[i].vehicleId);
            dir_cell.appendChild(displayVehicle(vehicle));
            var status = parseStatus(data.old[i]);
            addCellWithText(tr, status);
            addCellWithText(tr, '');
            status = parseStatus(all_departures[i]);
            status_cell = addCellWithText(tr, status);
            delay = parseDelay(all_departures[i]);
            delay_cell = addCellWithText(tr, delay);
            
            tr.className = 'active';
            table.appendChild(tr);
        }
        for(var i = 0, il = data.actual.length; i < il; i++) {
            var tr = document.createElement('tr');
            addCellWithText(tr, data.actual[i].patternText);
            var dir_cell = addCellWithText(tr, data.actual[i].direction);
            var vehicle = parseVehicle(data.actual[i].vehicleId);
            dir_cell.appendChild(displayVehicle(vehicle));
            var status = parseStatus(data.actual[i]);
            var status_cell = addCellWithText(tr, status);
            var delay = parseDelay(data.actual[i]);
            var delay_cell = addCellWithText(tr, delay);
            if(status == lang.boarding_sign) {
            if(i < data.old.length) {
                tr.className = 'active';
            } else if(status === lang.boarding_sign) {
                tr.className = 'success';
                status_cell.className = 'status-boarding';
            } else if(parseInt(delay) > 9) {
@@ -642,18 +635,19 @@
        
        addParaWithText(div, lang.select_feature);
        
        var feature, p, a, full_type, typeName;
        for(var i = 0; i < features.length; i++) {
            var feature = features[i];
            feature = features[i];
            
            var p = document.createElement('p');
            var a = document.createElement('a');
            p = document.createElement('p');
            a = document.createElement('a');
            p.appendChild(a);
            a.addEventListener('click', function(feature) { return function() {
                featureClicked(feature);
            }}(feature));
            
            var full_type = feature.getId().match(/^[a-z]+/)[0];
            var typeName = lang.types[full_type];
            full_type = feature.getId().match(/^[a-z]+/)[0];
            typeName = lang.types[full_type];
            if(typeof typeName === 'undefined') {
                typeName = '';
            }
stops/stops.db
Binary files differ
stops/stops.php
@@ -102,7 +102,7 @@
  't2811' => 'Muzeum Lotnictwa',
  't3141' => 'Muzeum Narodowe',
  't2688' => 'Norymberska',
# 't372'  => 'Nowohucka', # nowa nazwa # 't3041' => 'Rondo 't308'. Dywizjonu',
# 't372'  => 'Nowohucka', # nowa nazwa # 't3041' => 'Rondo 308. Dywizjonu',
  't715'  => 'Nowosądecka',
# 't2580' => 'Nowy Bieżanów', # nowa nazwa # 't3175' => 'Nowy Bieżanów P+R',
  't3175' => 'Nowy Bieżanów P+R',
@@ -383,10 +383,11 @@
  'b2691' => 'Chmieleniec',
  'b1274' => 'Chobot (nż)',
  'b1288' => 'Chobot Leśniczówka',
  'b254'  => 'Cholerzyn (nż)',
# 'b254'  => 'Cholerzyn (nż)', # nowa nazwa # 'b3298' => 'Cholerzyn Skwer (nż)',
  'b3056' => 'Cholerzyn Granica (nż)',
  'b253'  => 'Cholerzyn Sklep (nż)',
  'b252'  => 'Cholerzyn Skrzyżowanie (nż)',
  'b3298' => 'Cholerzyn Skwer (nż)',
  'b3055' => 'Cholerzyn Zagórze (nż)',
  'b2878' => 'Chopina',
  'b886'  => 'Chorowice',
@@ -430,10 +431,14 @@
  'b920'  => 'Czerwiakowskiego',
  'b1063' => 'Czerwieńskiego',
  'b3038' => 'Czerwone Maki P+R',
  'b878'  => 'Czulice',
  'b496'  => 'Czulice I (nż)',
  'b2881' => 'Czułów (nż)',
  'b2880' => 'Czułów Droga na Czułówek (nż)',
# 'b878'  => 'Czulice', # nowa nazwa # 'b3283' => 'Czulice Kościół',
# 'b496'  => 'Czulice I (nż)', # nowa nazwa # 'b3280' => 'Czulice Przymiarki (nż)',
  'b3283' => 'Czulice Kościół',
  'b3280' => 'Czulice Przymiarki (nż)',
# 'b2881' => 'Czułów (nż)', # nowa nazwa # 'b3295' => 'Czułów Granica (nż)',
# 'b2880' => 'Czułów Droga na Czułówek (nż)', # nowa nazwa # 'b3294' => 'Czułów Sklep (nż)',
  'b3295' => 'Czułów Granica (nż)',
  'b3294' => 'Czułów Sklep (nż)',
  'b2879' => 'Czułów Szkoła',
  'b1215' => 'Czułówek (nż)',
  'b1365' => 'Czułówek Kapliczka',
@@ -471,7 +476,7 @@
  'b600'  => 'Dąbrowa',
  'b1202' => 'Dąbrowa Szlachecka (nż)',
  'b907'  => 'Dąbrowa Szlachecka Figurka (nż)',
  'b1237' => 'Dąbrowa Szlachecka Krzemiennik (nż)',
  'b1237' => 'Dąbrowa Szlachecka Krzemiennik',
  'b910'  => 'Dąbrowa Szlachecka Krzyż (nż)',
  'b3117' => 'Dąbrowskiej',
  'b838'  => 'EC Łęg',
@@ -519,16 +524,18 @@
  'b3146' => 'Golkowice Pętla',
  'b3144' => 'Golkowice Sklep',
  'b22'   => 'Gospodarska',
  'b2760' => 'Goszcza',
# 'b2760' => 'Goszcza', # nowa nazwa # 'b3289' => 'Goszcza Dworek',
  'b2763' => 'Goszcza Cmentarz (nż)',
  'b955'  => 'Goszyce (nż)',
  'b3289' => 'Goszcza Dworek',
# 'b955'  => 'Goszyce (nż)', # nowa nazwa # 'b3291' => 'Goszyce Pod Lasem (nż)',
  'b3291' => 'Goszyce Pod Lasem (nż)',
  'b954'  => 'Goszyce Remiza (nż)',
  'b1090' => 'Gołuchowice',
  'b1091' => 'Gołuchowice Jurczyce',
  'b1092' => 'Gołuchowice Sklep (nż)',
  'b2493' => 'Grabie',
  'b1293' => 'Grabie Dom Kultury (nż)',
  'b1295' => 'Grabie Kościół (nż)',
  'b1295' => 'Grabie Kościół',
  'b2492' => 'Grabie Kuźnia (nż)',
  'b1094' => 'Grabie Polanka (nż)',
  'b1292' => 'Grabie Szczurów (nż)',
@@ -547,8 +554,9 @@
  'b2797' => 'Górka Narodowa Wschód',
  'b2567' => 'Górka Pychowicka (nż)',
  'b170'  => 'Górna Wieś',
  'b876'  => 'Głęboka',
# 'b876'  => 'Głęboka', # nowa nazwa # 'b3281' => 'Głęboka Staw',
  'b2996' => 'Głęboka Kolonia (nż)',
  'b3281' => 'Głęboka Staw',
  'b3046' => 'Głęboka Zakręt (nż)',
  'b552'  => 'Habina (nż)',
  'b2991' => 'Hala Sportowa Piaski Wielkie (nż)',
@@ -557,7 +565,7 @@
  'b741'  => 'Halszki',
  'b2642' => 'Hektary (nż)',
  'b931'  => 'Herberta (nż)',
  'b315'  => 'Hofmana (nż)',
  'b315'  => 'Hofmana',
  'b3157' => 'Husarska (nż)',
  'b510'  => 'Igołomska (nż)',
  'b38'   => 'Imbramowska',
@@ -599,7 +607,8 @@
  'b576'  => 'Kapelanka',
  'b3206' => 'Karniowice Górki (nż)',
  'b3205' => 'Karniowice Pętla',
  'b877'  => 'Karniów',
# 'b877'  => 'Karniów', # nowa nazwa # 'b3282' => 'Karniów Szkoła',
  'b3282' => 'Karniów Szkoła',
  'b546'  => 'Karowa (nż)',
  'b717'  => 'Karpińskiego',
  'b147'  => 'Kasztanowa',
@@ -625,11 +634,12 @@
  'b1065' => 'Kobylany Remiza (nż)',
  'b215'  => 'Kochanów',
  'b214'  => 'Kochanów I (nż)',
  'b3042' => 'Kocmyrzów',
# 'b3042' => 'Kocmyrzów', # nowa nazwa # 'b3292' => 'Kocmyrzów-Luborzyca Urząd Gminy',
  'b3001' => 'Kocmyrzów Biblioteka',
  'b1257' => 'Kocmyrzów Krzyżówka (nż)',
  'b3000' => 'Kocmyrzów Rondo',
  'b3005' => 'Kocmyrzów Sodfiny (nż)',
  'b3292' => 'Kocmyrzów-Luborzyca Urząd Gminy',
  'b1158' => 'Kokotów I (nż)',
  'b1162' => 'Kokotów II (nż)',
  'b457'  => 'Koksochemia (nż)',
@@ -722,7 +732,7 @@
  'b3074' => 'Kłuszyńska',
  'b140'  => 'Lajkonika (nż)',
  'b694'  => 'Landaua',
  'b750'  => 'Las Borkowski (nż)',
  'b750'  => 'Las Borkowski',
  'b2557' => 'Lasek Mogilski',
  'b2790' => 'Lasek Łęgowski (nż)',
  'b337'  => 'Laskowiec (nż)',
@@ -731,7 +741,7 @@
  'b65'   => 'Lekarska',
  'b554'  => 'Lesisko',
  'b2619' => 'Leszka Białego',
  'b157'  => 'Leśmiana (nż)',
  'b157'  => 'Leśmiana',
  'b3071' => 'Libertowska (nż)',
  'b2706' => 'Libertów',
  'b2638' => 'Libertów Dolny (nż)',
@@ -766,7 +776,8 @@
  'b1003' => 'Lusina Dwór',
  'b2637' => 'Lusina Granica',
  'b801'  => 'Lusina Górka (nż)',
  'b3184' => 'Lusina Krakówka (nż)',
  'b3301' => 'Lusina Krakówka (nż)',
# 'b3184' => 'Lusina Krakówkaa (nż)', # błąd # 'b3301' => 'Lusina Krakówka (nż)',
  'b2937' => 'Lusina Kraśnik (nż)',
  'b1000' => 'Lusina Pętla',
  'b1002' => 'Lusina Spacerowa',
@@ -827,11 +838,13 @@
  'b362'  => 'Miodowa',
  'b375'  => 'Mistrzejowice',
  'b2538' => 'Miśnieńska',
  'b2882' => 'Mników Droga do Kaszowa (nż)',
# 'b2882' => 'Mników Droga do Kaszowa (nż)', # nowa nazwa # 'b3297' => 'Mników Sklep (nż)',
  'b3232' => 'Mników Granica (nż)',
  'b2714' => 'Mników Pańska Góra (nż)',
  'b2715' => 'Mników Skały (nż)',
  'b248'  => 'Mników Sklep (nż)',
  'b3296' => 'Mników Remiza (nż)',
  'b2715' => 'Mników Skały',
# 'b248'  => 'Mników Sklep (nż)', # nowa nazwa # 'b3296' => 'Mników Remiza (nż)',
  'b3297' => 'Mników Sklep (nż)',
  'b3104' => 'Mników Zarynnie (nż)',
  'b2516' => 'Mobilis',
  'b2694' => 'Mochnaniec (nż)',
@@ -937,7 +950,7 @@
  'b2951' => 'Ochojno Dąbrówki',
  'b863'  => 'Ochojno Kamieniec',
  'b861'  => 'Ochojno Remiza',
  'b860'  => 'Ochojno Skrzyżowanie (nż)',
  'b860'  => 'Ochojno Skrzyżowanie',
  'b2655' => 'Oczyszczalnia Ścieków \'Kujawy\' (nż)',
  'b553'  => 'Odmętowa',
  'b369'  => 'Ofiar Dąbia',
@@ -994,7 +1007,7 @@
  'b819'  => 'PP',
  'b818'  => 'PW',
  'b2526' => 'Pachońskiego',
  'b963'  => 'Panieńskich Skał (nż)',
  'b963'  => 'Panieńskich Skał',
  'b2560' => 'Park \'Skały Twardowskiego\' (nż)',
  'b143'  => 'Park Decjusza',
  'b1004' => 'Park Wodny',
@@ -1049,7 +1062,8 @@
  'b1310' => 'Podłęże Straż (nż)',
  'b956'  => 'Polana Żywiecka (nż)',
  'b1093' => 'Polanka Hallera Dwór',
  'b1318' => 'Polanowice (nż)',
# 'b1318' => 'Polanowice (nż)', # nowa nazwa # 'b3288' => 'Polanowice Boisko (nż)',
  'b3288' => 'Polanowice Boisko (nż)',
  'b1323' => 'Polanowice Kolonia (nż)',
  'b73'   => 'Politechnika',
  'b380'  => 'Popielidów',
@@ -1064,7 +1078,8 @@
  'b682'  => 'Prokocim Szpital',
  'b684'  => 'Prokocim UJ',
  'b633'  => 'Prosta',
  'b479'  => 'Prusy',
# 'b479'  => 'Prussy', # błąd # 'b3300' => 'Prusy',
  'b3300' => 'Prusy',
  'b478'  => 'Prusy Szkoła (nż)',
  'b477'  => 'Prusy WSR (nż)',
  'b671'  => 'Pruszyńskiego',
@@ -1161,11 +1176,12 @@
  'b653'  => 'Rybitwy Dom Kultury',
  'b652'  => 'Rybitwy Rozjazd (nż)',
  'b654'  => 'Rybitwy Sklep (nż)',
  'b1209' => 'Rybna',
# 'b1209' => 'Rybna', # nowa nazwa # 'b3299' => 'Rybna Kościół',
  'b1367' => 'Rybna Dolna',
  'b3103' => 'Rybna Droga do Sanki (nż)',
  'b3103' => 'Rybna Droga do Sanki (nż)', # powinno być "Sanka Skrzyżowanie"
  'b1213' => 'Rybna Dół (nż)',
  'b1368' => 'Rybna Granica (nż)',
  'b3299' => 'Rybna Kościół',
  'b1208' => 'Rybna Nowy Świat',
  'b2884' => 'Rybna Nowy Świat Góra (nż)',
  'b1212' => 'Rybna Ośrodek Zdrowia (nż)',
@@ -1208,7 +1224,8 @@
  'b306'  => 'Rączna Osiedle (nż)',
  'b1216' => 'Rączna Podlas (nż)',
  'b3044' => 'Rżąka',
  'b2762' => 'Sadowie (nż)',
# 'b2762' => 'Sadowie (nż)', # nowa nazwa # 'b3290' => 'Sadowie Wiadukt (nż)',
  'b3290' => 'Sadowie Wiadukt (nż)',
  'b311'  => 'Salwator',
  'b3152' => 'Sapalskiego (nż)',
  'b559'  => 'Saska',
@@ -1252,7 +1269,7 @@
  'b2476' => 'Skawina Podlipki',
  'b2474' => 'Skawina Popiełuszki',
  'b2472' => 'Skawina Radziszowska (nż)',
  'b2486' => 'Skawina Robotnicza (nż)',
  'b2486' => 'Skawina Robotnicza',
  'b781'  => 'Skawina Rynek',
  'b785'  => 'Skawina Rzepnik',
  'b2480' => 'Skawina Samborek Most',
@@ -1272,7 +1289,8 @@
  'b604'  => 'Skotniki Szkoła',
  'b752'  => 'Skośna',
  'b42'   => 'Skrajna (nż)',
  'b953'  => 'Skrzeszowice',
# 'b953'  => 'Skrzeszowice', # nowa nazwa # 'b3286' => 'Skrzeszowice OSP Boisko',
  'b3286' => 'Skrzeszowice OSP Boisko',
  'b967'  => 'Skrzyżowanie do Podchruścia (nż)',
  'b1153' => 'Smardzowice',
  'b2972' => 'Smardzowice Wołówka (nż)',
@@ -1303,12 +1321,12 @@
  'b618'  => 'Sucha',
  'b666'  => 'Sucharskiego (nż)',
  'b456'  => 'Suchy Jar (nż)',
  'b2602' => 'Sudolska (nż)',
  'b2602' => 'Sudolska',
  'b476'  => 'Sulechów (nż)',
  'b2570' => 'Surzyckiego',
  'b2571' => 'Sułkowskiego',
  'b2497' => 'Sułków (nż)',
  'b739'  => 'Swoszowice Autostrada (nż)',
  'b739'  => 'Swoszowice Autostrada',
  'b732'  => 'Swoszowice Poczta',
  'b3129' => 'Swoszowice Szkoła',
  'b869'  => 'Szafrańska',
@@ -1339,6 +1357,7 @@
  'b2584' => 'Słona Woda',
  'b3138' => 'Słoneckiego',
  'b314'  => 'Słonecznikowa',
  'b3293' => 'Słowiańska', # tymczasowy
  'b2872' => 'TAURON Arena Kraków',
  'b2871' => 'TAURON Arena Kraków Al. Pokoju (nż)',
  'b3040' => 'TAURON Arena Kraków Wieczysta',
@@ -1454,9 +1473,10 @@
  'b1286' => 'Wola Batorska Zamoglice (nż)',
  'b1281' => 'Wola Batorska Żwirownia (nż)',
  'b629'  => 'Wola Duchacka',
  'b949'  => 'Wola Luborzycka (nż)',
# 'b949'  => 'Wola Luborzycka (nż)', # nowa nazwa # 'b3284' => 'Wola Luborzycka Skrzyżowanie (nż)',
  'b1332' => 'Wola Luborzycka Działki (nż)',
  'b950'  => 'Wola Luborzycka Las (nż)',
  'b3284' => 'Wola Luborzycka Skrzyżowanie (nż)',
  'b1128' => 'Wola Radziszowska',
  'b1127' => 'Wola Radziszowska Centrum',
  'b1129' => 'Wola Radziszowska Chorzyny (nż)',
@@ -1477,7 +1497,7 @@
  'b894'  => 'Wołowice (nż)',
  'b3231' => 'Wołowice Grotowa (nż)',
  'b3227' => 'Wołowice Grotowa Skrzyżowanie (nż)',
  'b909'  => 'Wołowice Kapliczka (nż)',
  'b909'  => 'Wołowice Kapliczka',
  'b1207' => 'Wołowice Niwa (nż)',
  'b2907' => 'Wołowice Pichonówka (nż)',
  'b1205' => 'Wołowice Sklep (nż)',
@@ -1595,7 +1615,7 @@
  'b2978' => 'Zielonki Marszowiec Pętla',
  'b177'  => 'Zielonki Rozjazd',
  'b182'  => 'Zielonki Skrzyżowanie',
  'b180'  => 'Zielonki Transformator (nż)',
  'b180'  => 'Zielonki Transformator',
  'b181'  => 'Zielonki UG',
  'b149'  => 'Zielony Dół',
  'b2577' => 'Złocieniowa',
@@ -1604,12 +1624,14 @@
  'b922'  => 'Łagiewniki',
  'b563'  => 'Łanowa',
  'b3069' => 'Łobzów SKA',
  'b951'  => 'Łososkowice',
# 'b951'  => 'Łososkowice', # nowa nazwa # 'b3285' => 'Łososkowice Remiza',
  'b3285' => 'Łososkowice Remiza',
  'b952'  => 'Łososkowice Szkoła (nż)',
  'b480'  => 'Łuczanowice',
  'b482'  => 'Łuczanowice Skrzyżowanie',
  'b3066' => 'Łuczanowicka (nż)',
  'b1121' => 'Łuczyce',
# 'b1121' => 'Łuczyce', # nowa nazwa # 'b3287' => 'Łuczyce Kosynierów',
  'b3287' => 'Łuczyce Kosynierów',
  'b1120' => 'Łuczyce Las (nż)',
  'b1231' => 'Łuczyce Zjawienie (nż)',
  'b2761' => 'Łuczyce Zwierzyniec (nż)',