<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/navigationBar.css" type="text/css">
    <link rel="stylesheet" href="css/configurator.css" type="text/css">
    <script src="https://kit.fontawesome.com/e0ade2e31e.js" crossorigin="anonymous"></script>
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.2/dist/leaflet.css" integrity="sha256-sA+zWATbFveLLNqWO2gtiw3HL/lh1giY/Inf1BJ0z14=" crossorigin="" />
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
    <title>Konfigurátor topologie</title>
</head>
<body>
  <ul>
    <li><a href="index.php">Mapa</a></li>
    <li><a class="active" href="#">Konfigurátor topologie</a></li>
    <li><a href="condition.php"><i class="fa-solid fa-screwdriver-wrench"></i></a></li>
    <li><a href="update.php"><i class="fa-solid fa-rotate"></i></a></li>
    <li><a href="backup.php"><i class="fa-solid fa-cloud-arrow-up"></i></a></li>
    <li onclick="napoveda()"><a href="#"><i class="fa-solid fa-question"></i></a></li>
  </ul>

  <div class="text"></div>

  <div id="map"></div>
  
  <div class="tabulka"></div>
    
  <div class="tlacitka"></div>
  <div id="hlaska"></div>
  <div class="options"></div>
  <div class="formular"></div>

<?php
include "php/_CONSTANTS.php";
include "php/mySQLSetup.php";
include "php/loadAllFromSQL.php";

?>

<script>
    function napoveda() {
      Swal.fire({
        title: '<strong>Nápověda</strong>',
        icon: 'info',
        width: '75%',
        html:
          '<div class="swal2-html-container">' +
          '<strong><u>Ovládání: </u></strong>' +
          '<ol>' +
          '<li class="swal2-li">Tlačítky <i><b>\"Topologie"</i></b>, <i><b>\"Spoje\"</i></b> a <i><b>\"Stanice\"</i></b> lze pracovat s objekty těchto typů.</li>' +
          '<li class="swal2-li">Pro interakce s tlačítky <i><b>\"Spoje\"</i></b> a <i><b>\"Stanice\"</i></b> je nejprve nutné <b style=\"color:red\"><u>vybrat</b></u> topologii, ve které se mají nacházet.</li>' +
          '<li class="swal2-li"><b style=\"color:red\"><u>Výběr topologie:</b></u> tlačítko <i><b>\"Topologie\"</i></b> ->  tlačítko <i><b>\"Vybrat\"</i></b></li>' +
          '</ol>' +
          '</div>' + 
          '<div class="swal2-html-container">' +
          '<strong><u>Interakce s mapou: </u></strong>' +
          '<ol>' +
          '<li class="swal2-li">Podklad mapy lze měnit pomocí rozbalovací nabídky v pravém horním rohu mapy.</li>' +
          '<li class="swal2-li">Při kliknutí na vykreslený objekt dojde k rozbalení okna, jenž zobrazuje informace o konkrétním objektu.</li>' +
          '<li class="swal2-li">Klikáním do tabulky na stránce <i><b>\"Spoje"</i></b> lze z mapy skrývat <i><b>jednotlivé spoje</i></b> v rámci dané topologie.</li>' +
          '<li class="swal2-li">Klikáním do tabulky na stránce <i><b>\"Stanice"</i></b> lze z mapy skrývat <i><b>jednotlivé stanice</i></b> v rámci dané topologie.</li>' +
          '<li class="swal2-li">Kliknutím do <b>hlavičky</b> tabulky lze z mapy objekty skrývat <b>hromadně</b>.</li>' +
          '</ol>' +
          '</div>',
        showCloseButton: true,
        focusConfirm: false,
        confirmButtonColor: '#3085d6',
        confirmButtonText: 'Díky, už to chápu!',
        customClass: {
          title: 'swal-title',
          popup: 'swal-popup',
          closeButton: 'swal-close-button',
          confirmButton: 'swal-button'
        }
      })
    }
  </script>


</body>
</html>


<script type="module">
var aktivniStrankaButton = null; var aktivniOptionButton = null;
var poleTlacitekStranek = []; var poleTlacitekOptions = [];
var poleNazvu = ["Topologie", "Spoje", "Stanice"];
var vybranaTopologie = null;
var errorHlaskaStranka = false;

import * as Objekty from "./js/object.js";
const Constants = <?php echo json_encode($all_vars); ?>;
import {ajaxStaniceUpload, ajaxSpojeUpload, ajaxTopologieUpload, ajaxCreateBackup} from './js/ajax.js';
import {Tabulka, pridatRadek} from './js/tabulka.js';
import {Formular, odstranitFormular, formularUpdateLabel, formularUpdateInput, upravitProgressBar, odstranitVsechnyFormulare} from './js/formular.js';
import {nacistMapu, vykreslitMarker, vykreslitCestu, zobrazitBod, skrytBod, vykreslitStanice, vykreslitSpoje, skrytSpoj} from './js/mapa.js';
import {zobrazitHlasku, createButton, zvyrazneniStisknutehoTlacitka, removeAllButtons, errorHlaska, hlaska, getTypTopologieIndex, shodnySpoj, formularSetDataForSpoj, formularSpojUpdateInput} from './js/configurator.js';

// Proměnné pro marker
let sirkaMarkeru = window.innerWidth * 0.0075;
let pomerStranMarkeru = Constants.POMER_STRAN_MARKERU;
if (sirkaMarkeru < 10) sirkaMarkeru = 10;
if (sirkaMarkeru > 18) sirkaMarkeru = 18;

Constants.markerIconBlack = L.icon({                                   // Černý marker
    iconUrl: 'markerIcon.png',
    iconSize: [sirkaMarkeru, sirkaMarkeru*pomerStranMarkeru],
    iconAnchor: [sirkaMarkeru/2, sirkaMarkeru*pomerStranMarkeru]       // Nastavení "souřadnic" špičky markeru vzhledem k levému hornímu rohu
});


// Načtení dat z mySQL databáze. Pokud je zapnut anonymní režim, data načtena nebudou.
if (!Constants.ANONYMOUS_MODE){
    var vysledekSQLTopologie = <?php echo json_encode($navratovaHodnotaTopologie); ?>;
    var vysledekSQLSpoje = <?php echo json_encode($navratovaHodnotaSpoje); ?>;
    var vysledekSQLStanice = <?php echo json_encode($navratovaHodnotaStanice); ?>;



    var poleTopologii = <?php echo json_encode($poleTopologii); ?>;
    var poleSpoju = <?php echo json_encode($poleSpoju); ?>;
    var poleStanic = <?php echo json_encode($poleStanic); ?>;



    Objekty.Topologie.vytvoritTopologieSQL(poleTopologii);
    Objekty.Stanice.vytvoritStaniceSQL(poleStanic);
    Objekty.Spoj.vytvoritSpojeSQL(poleSpoju);


    Objekty.poleTopologii.forEach(topologie => {
        Objekty.poleStanic.forEach(stanice => {
            if (stanice.nazevTopologie == topologie.nazev)topologie.poleStanic.push(stanice);
        })

        Objekty.poleSpoju.forEach(spoj => {
            
            if (spoj.topologie == topologie.nazev){
                topologie.poleSpoju.push(spoj);
            }
        })
    })

    if(Constants.LOGOVANI){

        console.log(vysledekSQLTopologie);
        console.log(vysledekSQLSpoje);
        console.log(vysledekSQLStanice);
        console.log("\n");

        console.log("Načtená data z mySQL:");
        console.log("Topologie");
        console.log(poleTopologii);
        console.log("Spoje");
        console.log(poleSpoju);
        console.log("Stanice");
        console.log(poleStanic);
        console.log("\nVytvořené objekty:");
        console.log(Objekty.poleTopologii);
    }


    Objekty.poleTopologii.forEach(topologie => {
        topologie.poleStanic.sort(function(a, b) {
            return a.poradi - b.poradi;
        });
        for (let i = 0; i < topologie.poleStanic.length; i++){
            topologie.poleStanic[i].poradi = i+1;
        }
    })
} 

// Hláška o anonymním módu a o blokovaném nahrávání do mySQL
    var text = "";
    if (Constants.ANONYMOUS_MODE)text = "Anonymní mód aktivní. "
    if (!Constants.MYSQL_UPLOAD)text = text + "Nahrávání do mySQL blokováno."
    if (text.length > 0){
        const textContainer = document.querySelector(".text");
        textContainer.style.marginBottom = '0.5vh';
        textContainer.innerHTML = "<b><i style=\"color:darkred\">" + text + "</i></b>";
    }
    

// Pokud je anonymní mód blokován, nahrávání do mySQL je povoleno, a pokud je nastavené automatické vytváření záloh, tak dojde k vytvoření zálohy
if (!Constants.ANONYMOUS_MODE && Constants.MYSQL_UPLOAD && Constants.AUTO_BACKUP){
    let d = new Date();
    let rok = d.getFullYear(); if (rok < 10) rok = "0" + rok;
    let mesic = d.getMonth() + 1; if (mesic < 10) mesic = "0" + mesic;
    let den = d.getDate(); if (den < 10) den = "0" + den;
    let hodina = d.getHours(); if (hodina < 10) hodina = "0" + hodina;
    let minuta = d.getMinutes(); if (minuta < 10) minuta = "0" + minuta;
    let sekunda = d.getSeconds(); if (sekunda < 10) sekunda = "0" + sekunda;

    let nazev = "Auto_" + rok + "_" + mesic + "_" + den + "_" + hodina + "_" + minuta + "_" + sekunda;
    ajaxCreateBackup(Constants, nazev);
}


const tabulkaContainer = document.querySelector(".tabulka");
const formularContainer = document.querySelector(".formular");
const map = nacistMapu(49.195061, 16.606836, 16);
// ===========================================================================================================

//Vytvoří základní tlačíka pro přepínání stránek
vytvoritTlacitkaStranek(Constants);

var aktivniTabulka = undefined;             // Představuje aktivní tabulku, která je zrovna zobrazována

//Funkce pro obsluhu stisknutí tlačítka pro přepínání stránek
function strankaButtonPressed(button, nazev, aktivniButton){
    // Pokud se na stránce nachází nějaké tlačítka volby, smažu je.
    if (poleTlacitekOptions.length != 0){
        removeAllButtons("options", poleTlacitekOptions);
    }

    // Existují-li formuláře, budou odstraněny
    if (aktivniFormular != undefined){
        odstranitFormular(aktivniFormular.form, "formular");
        aktivniFormular = undefined;
    }

    if (formularSpojeTechnologie != undefined){
        odstranitFormular(formularSpojeTechnologie.form, "formular");
        formularSpojeTechnologie = undefined;
    }


    poleTlacitekOptions = [];                   // Odstraní všechny původní prvky pole
    let poleNazvuOptions = [];
    
    // Pokud byla pro danou stránku vykreslena i tabulka, dojde k jejímu smazání
    if (aktivniTabulka != undefined){
        tabulkaContainer.removeChild(aktivniTabulka.tabulka);
        aktivniTabulka = undefined;
    }
    
    // Konkrétní kód pro jednotlivá tlačíka (stránky)
    switch(nazev){
        case "Topologie":
            // Pokud byla na původní stránce error hláška, smažeme ji
            if (errorHlaskaStranka) errorHlaskaStranka = errorHlaska("", "options", false);

            // Názvy tlačítek volby, které se budou vytvářet
            poleNazvuOptions = ["Vybrat", "Vytvořit", "Editovat", "Odstranit"];

            // Pokud uživatel (někdy) vybral topologii, vykreslíme informační tabulku o této topologii
            if (vybranaTopologie != null){
                tabulkaTopologie = new Tabulka(Constants, "topologie", vybranaTopologie, poleTopologii, map)
                tabulkaContainer.appendChild(tabulkaTopologie.tabulka);
                aktivniTabulka = tabulkaTopologie;
            }

            // Tvorba tlačítek volby
            for (let i = 0; i < poleNazvuOptions.length; i++){
                poleTlacitekOptions[i] = createButton(Constants, "options", poleNazvuOptions[i], poleNazvuOptions[i]);
                // Event-Listener on.click
                poleTlacitekOptions[i].onclick = function() {
                    // Pokud bylo stisknuté jiné tlačítko volby, než minule, tlačítko se zvýrazní a spustí se obslužná metoda optionButtonPressed
                    if (aktivniOptionButton != poleTlacitekOptions[i]){
                        zvyrazneniStisknutehoTlacitka(poleTlacitekOptions[i], aktivniOptionButton);
                        optionButtonPressed(nazev, poleTlacitekOptions[i], poleNazvuOptions[i], aktivniOptionButton);
                        aktivniOptionButton = poleTlacitekOptions[i];
                    }
                };
            }
        break;

        case "Spoje":
            // Pokud uživatel nemá vybranou žádnou topologii, zobrazí se mu error hláška a nemůže na stránce provádět žádné akce.
            if (vybranaTopologie == null){
                if (!errorHlaskaStranka) errorHlaskaStranka = errorHlaska(Constants.VYBRANA_TOPOLOGIE_ERROR, "options", true);
            } else {
                // Pokud se ve vybrané topologii nenachází žádné stanice, tak není z čeho dělat spoje
                if (vybranaTopologie.poleStanic.length == 0){
                    if (!errorHlaskaStranka) errorHlaskaStranka = errorHlaska(Constants.NO_STATION_ERROR, "options", true);
                    break;
                }

                // Pokud má uživatel vybranou topologii a na stránce byla error hláška, smažeme ji
                if (errorHlaskaStranka) errorHlaskaStranka = errorHlaska("", "options", false);

                // Pokud (vybraná) topologie obsahuje nějaké spoje, vykreslíme informační tabulku
                if (vybranaTopologie.poleSpoju.length != 0){
                    tabulkaSpoju = new Tabulka(Constants, "spoje", vybranaTopologie, poleTopologii, map)
                    tabulkaContainer.appendChild(tabulkaSpoju.tabulka);
                    aktivniTabulka = tabulkaSpoju;
                }

                // Názvy tlačítek volby, které se budou vytvářet
                poleNazvuOptions = ["Vytvořit", "Editovat", "Odstranit"];
                // Tvorba tlačítek volby
                for (let i = 0; i < poleNazvuOptions.length; i++){
                    poleTlacitekOptions[i] = createButton(Constants, "options", poleNazvuOptions[i], poleNazvuOptions[i]);
                    // Event-Listener on.click
                    poleTlacitekOptions[i].onclick = function() {
                        // Pokud bylo stisknuté jiné tlačítko volby, než minule, tlačítko se zvýrazní a spustí se obslužná metoda optionButtonPressed
                        if (aktivniOptionButton != poleTlacitekOptions[i]){
                            zvyrazneniStisknutehoTlacitka(poleTlacitekOptions[i], aktivniOptionButton);
                            optionButtonPressed(nazev, poleTlacitekOptions[i], poleNazvuOptions[i], aktivniOptionButton);
                            aktivniOptionButton = poleTlacitekOptions[i];
                        }
                    };
                }
            }
        break;

        case "Stanice":
            // Pokud uživatel nemá vybranou žádnou topologii, zobrazí se mu error hláška a nemůže na stránce provádět žádné akce.
            if (vybranaTopologie == null){
                if (!errorHlaskaStranka) errorHlaskaStranka = errorHlaska(Constants.VYBRANA_TOPOLOGIE_ERROR, "options", true);
            } else {
                // Pokud má uživatel vybranou topologii a na stránce byla error hláška, smažeme ji
                if (errorHlaskaStranka) errorHlaskaStranka = errorHlaska("", "options", false);

                // Pokud (vybraná) topologie obsahuje nějaké stanice, vykreslíme informační tabulku
                if (vybranaTopologie.poleStanic.length != 0){
                    tabulkaStanic = new Tabulka(Constants, "stanice", vybranaTopologie, poleTopologii, map)
                    tabulkaContainer.appendChild(tabulkaStanic.tabulka);
                    aktivniTabulka = tabulkaStanic;
                }
                
                // Názvy tlačítek volby, které se budou vytvářet
                poleNazvuOptions = ["Vytvořit", "Editovat", "Odstranit"];
                // Tvorba tlačítek volby
                for (let i = 0; i < poleNazvuOptions.length; i++){
                    poleTlacitekOptions[i] = createButton(Constants, "options", poleNazvuOptions[i], poleNazvuOptions[i]);
                    // Event-Listener on.click
                    poleTlacitekOptions[i].onclick = function() {
                        // Pokud bylo stisknuté jiné tlačítko volby, než minule, tlačítko se zvýrazní a spustí se obslužná metoda optionButtonPressed
                        if (aktivniOptionButton != poleTlacitekOptions[i]){
                            zvyrazneniStisknutehoTlacitka(poleTlacitekOptions[i], aktivniOptionButton);
                            optionButtonPressed(nazev, poleTlacitekOptions[i], poleNazvuOptions[i], aktivniOptionButton);
                            aktivniOptionButton = poleTlacitekOptions[i];
                        }
                    };
                }
            }
        break;
    }
}


// Proměnné ukazující na jednotlivé formuláře
var formularTopologieVybrat = undefined; var formularTopologieVytvorit = undefined; var formularTopologieEditovat = undefined; var formularTopologieOdstranit = undefined;
var formularStaniceVytvorit = undefined; var formularStaniceEditovat = undefined; var formularStaniceOdstranit = undefined;
var formularSpojeVytvorit = undefined; var formularSpojeEditovat = undefined; var formularSpojeOdstranit = undefined; var formularSpojeTechnologie = undefined;
var aktivniFormular = undefined;

// Proměnné ukazující na jednotlivé tabulky
var tabulkaStanic = undefined; var tabulkaTopologie = undefined; var tabulkaSpoju = undefined;

//Funkce pro obsluhu stisknutí tlačítka pro přepínání volby - obsahují obsluhu formulářů
function optionButtonPressed(stranka, tlacitko, option, aktivniOption){

    // Dojde k odstranění formulářů (pokud byly vykresleny)
    if (aktivniFormular != undefined){
        odstranitFormular(aktivniFormular.form, "formular");
        aktivniFormular = undefined;
    }
    if (formularSpojeTechnologie != undefined){
        odstranitFormular(formularSpojeTechnologie.form, "formular");
        formularSpojeTechnologie = undefined;
    }

    // Podle tlačítka stránky jsou zpracovány konkrétní stisknutá tlačítka volby
    switch (stranka){
        case "Topologie":
            switch (option){
                // Topologie -> Vybrat
                case "Vybrat":
                    // Pokud neexistuje žádná topologie, dojde o okamžitému ukončení. Na stránce nejsou dostupné žádné akce.
                    if (Objekty.poleTopologii.length == 0)break;

                    // Vykreslení formuláře pro výběr topologie
                    formularTopologieVybrat = new Formular(Constants, stranka, option, Objekty.poleTopologii);
                    formularContainer.appendChild(formularTopologieVybrat.form);
                    aktivniFormular = formularTopologieVybrat;

                    let predchoziTopologie;                                             // Lokální proměnná pro uložení předchozí vybrané topologie

                    aktivniFormular.form.addEventListener("submit", function(event) {
                        event.preventDefault();                                         // Zabraňuje defaultnímu chování formuláře (webového prohlížeče)
                        let volba = 0;                                                  // Pomocná proměnná

                        // V následujícím bloku dojde ke spárování názvu topologie z formuláře s jejím objektem. Pokud v minulosti nebyla vybrána žádná topologie
                        // nebo se tato v minulosti vybraná topologie neshoduje s nově vybranou, pomocná proměnná (signalizující pokračování) se nastaví na 1
                        if (vybranaTopologie == undefined){
                            Objekty.poleTopologii.forEach(topologie => {
                                if (aktivniFormular.topologieSelect.value == topologie.nazev){
                                    vybranaTopologie = topologie;
                                    volba = 1;
                                }
                            })
                        } else {
                            if (vybranaTopologie.nazev != aktivniFormular.topologieSelect.value){
                                Objekty.poleTopologii.forEach(topologie => {
                                    if (aktivniFormular.topologieSelect.value == topologie.nazev){
                                        predchoziTopologie = vybranaTopologie;
                                        vybranaTopologie = topologie;
                                        volba = 1;
                                    }
                                })
                            }
                        }

                        // Pokud je povoleno pokračování
                        if (volba == 1){
                            if (Constants.LOGOVANI){
                                console.log("Vybraná topologie: ");
                                console.log(vybranaTopologie);
                            }

                            // Nechám skrýt všechny stanice, spoje a tabulku předchozí topologie (pokud nějaká byla)
                            if (predchoziTopologie != undefined){
                                predchoziTopologie.poleStanic.forEach(stanice => {
                                    skrytBod(stanice, null, null, false, map);
                                })

                                predchoziTopologie.poleSpoju.forEach(spoj => {
                                    skrytSpoj(spoj, null, null, false, map);
                                })
                                if (tabulkaTopologie != undefined)tabulkaContainer.removeChild(tabulkaTopologie.tabulka);
                            }

                            // Nechám vykreslit tabulku s informacemi o vybrané topologii
                            tabulkaTopologie = new Tabulka(Constants, "topologie", vybranaTopologie, poleTopologii, map)
                            tabulkaContainer.appendChild(tabulkaTopologie.tabulka);
                            aktivniTabulka = tabulkaTopologie;
                
                            
                            // Nechám vykreslit všechny stanice a spoje nové topologie
                            if (vybranaTopologie.poleStanic.length != 0){
                                vykreslitStanice(Constants, vybranaTopologie.poleStanic, map, Constants.markerIconBlack);
                                vykreslitSpoje(Constants, vybranaTopologie.poleSpoju, map);
                            }
                            
                            // Hláška o vybrání topologie
                            zobrazitHlasku(Constants, Constants.TOPOLOGIE_VYBRANA, null, "success", false, Constants.HLASKADURATION)

                            // Pokud topologie obsahuje n stanic, mapa se vycentruje na stanici s n/2
                            if (vybranaTopologie.poleStanic.length > 0)map.setView([vybranaTopologie.poleStanic[(vybranaTopologie.poleStanic.length/2).toFixed(0)].lat, vybranaTopologie.poleStanic[(vybranaTopologie.poleStanic.length/2).toFixed(0)].long], 13);
          
                        }
                    });

                    break;

                // Topologie -> Vytvořit
                case "Vytvořit":
                    // Pokud ještě nebyl nadefinován formulář pro tvorbu topologie, tak ho vytvoříme. Následně je formulář přidán na stránku.
                    if (formularTopologieVytvorit == undefined)formularTopologieVytvorit = new Formular(Constants, stranka, option, Objekty.poleTopologii);
                    formularContainer.appendChild(formularTopologieVytvorit.form);
                    aktivniFormular = formularTopologieVytvorit;

                    // Pokud dojde ke změně vstupu v políčku pro název topologie
                    aktivniFormular.nazevInput.addEventListener("input", function(event) {
                        event.preventDefault();
                        let shoda = false;                                          // Pomocná proměnná signalizující shodu názvu topologie s jinou topologí
                        // Testování shody zadaného názvu s názvem existujících topologií
                        Objekty.poleTopologii.forEach(topologie => {
                            if (topologie.nazev.toLowerCase() == aktivniFormular.nazevInput.value.toLowerCase()){
                                shoda = true;
                            }
                        })
                        // Pokud se název shoduje, je na to uživatel upozorněn barevně i změnou popisku políčka pro zadávání názvu, zablokuje se možnost vytvořit topologii
                        // Pokud se název neshoduje, vše se vrátí do původního stavu
                        if (shoda){
                            formularUpdateLabel(aktivniFormular.nazevLabel, "Název topologie [již existuje]", "darkRed");
                            formularUpdateInput(aktivniFormular.nazevInput, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "gray", "");
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "not-allowed";
                        } else {
                            let text = aktivniFormular.nazevLabel.innerHTML.split("[");
                            formularUpdateLabel(aktivniFormular.nazevLabel, text[0], "");                       // Nastaví na hodnoty definované v css
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");                // Nastaví na hodnoty definované v css
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";
                        }
                        
                    });

                    // Reakce na odeslání formuláře
                    aktivniFormular.form.addEventListener("submit", function(event) {
                        event.preventDefault();
                        // Pokud je vstupní pole názvu prázdné, je akce ukončena
                        if (aktivniFormular.nazevInput.value == "")return;

                        // Vytvoření objektu nové topologie
                        let novaTopologie = new Objekty.Topologie(aktivniFormular.nazevInput.value, aktivniFormular.typTopologieSelect.value, aktivniFormular.poznamkaInput.value);
                        
                        if (Constants.LOGOVANI){
                            console.log("");
                            console.log("Nová topologie: ");
                            console.log(novaTopologie);
                            console.log("Pole topologií");
                            console.log(Objekty.poleTopologii);
                            console.log("Odesílám na server")
                        }

                        // "Vyresetuji formulář"
                        aktivniFormular.nazevInput.value = "";
                        aktivniFormular.poznamkaInput.value = "";
                        aktivniFormular.typTopologieSelect.selectedIndex = 0;

                        // Odeslání do mySQL i s požadavkem na výpis hlášky
                        ajaxTopologieUpload(Constants, novaTopologie, true, Constants.TOPOLOGIE_VYTVORIT);
            

                            
                    });   
                    break;

                // Topologie -> Editovat
                case "Editovat":
                    // Pokud neexistuje žádná topologie, dojde o okamžitému ukončení. Na stránce nejsou dostupné žádné akce.
                    if (Objekty.poleTopologii.length == 0)break;

                    // Vykreslení formuláře pro editaci topologie
                    formularTopologieEditovat = new Formular(Constants, stranka, option, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularTopologieEditovat.form);
                    aktivniFormular = formularTopologieEditovat;

                    // Reakce na stisknutí tlačítka "Výchozí hodnoty"
                    aktivniFormular.default.addEventListener("click", function(event) {
                        event.preventDefault();
                        // Dojde k nalezení objektu topologie podle vybraného názvu. Následně dojde k vyplnění políček formuláře tak, aby odpovídali
                        // parametrům topologie.
                        Objekty.poleTopologii.forEach(topologie => {
                            if (topologie.nazev == aktivniFormular.topologieSelect.value){
                                aktivniFormular.nazevInput.value = topologie.nazev;
                                aktivniFormular.typTopologieSelect.selectedIndex = getTypTopologieIndex(Constants, topologie.typ);
                                aktivniFormular.poznamkaInput.value = topologie.poznamka;
                            }   
                        }) 
                    });

                    // Reakce na změnu výběru topologie k editaci
                    aktivniFormular.topologieSelect.addEventListener("change", function(event) {
                        event.preventDefault();
                        // Dojde k nalezení objektu topologie podle vybraného názvu. Následně dojde k vyplnění políček formuláře tak, aby odpovídali
                        // parametrům nově vybrané topologie.
                        Objekty.poleTopologii.forEach(topologie => {
                            if (topologie.nazev == aktivniFormular.topologieSelect.value){
                                aktivniFormular.nazevInput.value = topologie.nazev;
                                aktivniFormular.typTopologieSelect.selectedIndex = getTypTopologieIndex(Constants, topologie.typ);
                                aktivniFormular.poznamkaInput.value = topologie.poznamka;
                            }   
                        }) 
                    });

                    // Pokud dojde ke změně vstupu v políčku pro název topologie
                    aktivniFormular.nazevInput.addEventListener("input", function(event) {
                        event.preventDefault();
                        let shoda = false;                                          // Pomocná proměnná signalizující shodu názvu topologie s jinou topologí
                        // Testování shody zadaného názvu s názvem existujících topologií
                        Objekty.poleTopologii.forEach(topologie => {
                            if (topologie.nazev == aktivniFormular.nazevInput.value){
                                shoda = true;
                            }
                        })
                        // Pokud se název shoduje, je na to uživatel upozorněn barevně i změnou popisku políčka pro zadávání názvu, zablokuje se možnost vytvořit topologii
                        // Pokud se název neshoduje, vše se vrátí do původního stavu
                        if (shoda){
                            formularUpdateLabel(aktivniFormular.nazevLabel, "Název topologie [již existuje]", "darkRed");
                            formularUpdateInput(aktivniFormular.nazevInput, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "gray", "");
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "not-allowed";
                        } else {
                            let text = aktivniFormular.nazevLabel.innerHTML.split("[");
                            formularUpdateLabel(aktivniFormular.nazevLabel, text[0], "");                       // Nastaví na hodnoty definované v css
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");                // Nastaví na hodnoty definované v css
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";
                        }
                        
                    });

                    // Reakce na odeslání formuláře
                    aktivniFormular.form.addEventListener("submit", function(event) {
                        event.preventDefault();
                        Objekty.poleTopologii.forEach(topologie => {
                            // Dojde k nalezení objektu topologie podle vybraného názvu.
                            if (topologie.nazev == aktivniFormular.topologieSelect.value){
                                // Následně se zkoumá, zda-li skutečno došlo k nějaké změně
                                if (topologie.nazev != aktivniFormular.nazevInput.value || topologie.typ != aktivniFormular.typTopologieSelect.value || topologie.poznamka != aktivniFormular.poznamkaInput.value){
                                    topologie.nazev = aktivniFormular.nazevInput.value;
                                    topologie.typ = aktivniFormular.typTopologieSelect.value;
                                    topologie.poznamka = aktivniFormular.poznamkaInput.value;

                                    //Pokud se změnil název topologie, je nutné aktualizovat spoje a stanice + formulář
                                    if (topologie.staryNazev != topologie.nazev){
                                        topologie.poleStanic.forEach(stanice => {
                                            stanice.nazevTopologie = topologie.nazev;
                                        })
                                        topologie.poleSpoju.forEach(spoj => {
                                            spoj.topologie = topologie.nazev;
                                        })

                                        for (let i = 0; i < aktivniFormular.topologieSelect.options.length; i++) {
                                            if (aktivniFormular.topologieSelect.options[i].value == aktivniFormular.topologieSelect.value) {
                                                aktivniFormular.topologieSelect.options[i].value = topologie.nazev;
                                                aktivniFormular.topologieSelect.options[i].innerHTML = topologie.nazev;
                                                break;
                                            }
                                        }
                                    }

                                    if (Constants.LOGOVANI){
                                        console.log("");
                                        console.log("Topologie upravena: ");
                                        console.log(topologie);
                                        console.log("Pole topologií");
                                        console.log(Objekty.poleTopologii);
                                        console.log("Odesílám na server");
                                    }

                                    // Odeslání do mySQL i s požadavkem na výpis hlášky
                                    ajaxTopologieUpload(Constants, topologie, true, Constants.TOPOLOGIE_EDIT);
                 
                                    // Pokud se jednalo o vybranou topologii, je nutné aktualizovat informační tabulku (je jednodušší ji znovu vykreslit)
                                    if (vybranaTopologie != undefined){
                                        if (topologie.staryNazev == vybranaTopologie.nazev){
                                            vybranaTopologie = topologie;
                                            if (tabulkaTopologie != undefined)tabulkaContainer.removeChild(tabulkaTopologie.tabulka);
                                            // Nechám vykreslit tabulku s informacemi o vybrané topologii
                                            tabulkaTopologie = new Tabulka(Constants, "topologie", vybranaTopologie, poleTopologii, map)
                                            tabulkaContainer.appendChild(tabulkaTopologie.tabulka);
                                            aktivniTabulka = tabulkaTopologie;
                                        }
                                    }
                                    
                                    
                                    // Aktualizace starého názvu na nový název (starý název existoval pro možnost dohledání v mySQL)
                                    topologie.staryNazev = topologie.nazev;

                                }
                            }
                        })    
                    });    

                    break;

                // Topologie -> Odstranit
                case "Odstranit":
                    // Pokud neexistuje žádná topologie, dojde o okamžitému ukončení. Na stránce nejsou dostupné žádné akce.
                    if (Objekty.poleTopologii.length == 0)break;

                    // Vykreslení formuláře pro odstranění topologie
                    formularTopologieOdstranit = new Formular(Constants, stranka, option, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularTopologieOdstranit.form);
                    aktivniFormular = formularTopologieOdstranit;

                    // Reakce na změnu názvu 
                    aktivniFormular.nazevInput.addEventListener("input", function(event) {
                        event.preventDefault();
                        let shoda = false;
 
                        // Pokud se vybraná topologie shoduje s názvem zadaným uživatelem, nastaví se pomocná proměnná signalizující shodu na true
                        if (aktivniFormular.topologieSelect.value == aktivniFormular.nazevInput.value){
                            shoda = true;
                        }
                        
                        // Pokud je shoda, tak je povoleno odstranění topologie. Tento stav signalizuje uživateli i zeleně zbarvené tlačítko a vstupní
                        // pole pro zadávání názvu. Pokud shoda není, vstupní pole je červené, tlačítko šedé a topologie odstranit nelze.
                        if (shoda){
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "lightgreen", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "green", "");
                            
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";

                        } else {
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "";
                        }
                        
                    });

                    // Reakce na změnu výběru topologie k odstranění
                    aktivniFormular.topologieSelect.addEventListener("change", function(event) {
                        event.preventDefault();
                        let shoda = false;
 
                        // Podle vybraného názvu je nalezen odpovídající objekt topologie. K nové topologii je rovněž vypsána informace o počtu
                        // spojů a stanic, které tato topologie obsahuje
                        Objekty.poleTopologii.forEach(topologie => {
                            if (topologie.nazev == aktivniFormular.topologieSelect.value){
                                let pocetStanic = 0;
                                let pocetSpoju = 0;
                                if (topologie.poleSpoju != undefined)pocetSpoju = topologie.poleSpoju.length;
                                if (topologie.poleStanic != undefined)pocetStanic = topologie.poleStanic.length;
                                aktivniFormular.pocetSpojuLabel.innerHTML = "Obsahuje Spojů: " + pocetSpoju + ", Stanic: " + pocetStanic;
                            }
                        });
                        
                        // Pokud se vybraná topologie shoduje s názvem zadaným uživatelem, nastaví se pomocná proměnná signalizující shodu na true
                        if (aktivniFormular.topologieSelect.value == aktivniFormular.nazevInput.value){
                            shoda = true;
                        }
                        
                        // Pokud je shoda, tak je povoleno odstranění topologie. Tento stav signalizuje uživateli i zeleně zbarvené tlačítko a vstupní
                        // pole pro zadávání názvu. Pokud shoda není, vstupní pole je červené, tlačítko šedé a topologie odstranit nelze.
                        if (shoda){
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "lightgreen", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "green", "");
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";
                        } else {
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "";
                        }
                        
                    });

                    // Reakce na odeslání formuláře
                    aktivniFormular.form.addEventListener("submit", function(event) {
                        event.preventDefault();
                        // Podle vybraného názvu je nalezen odpovídající objekt topologie.
                        Objekty.poleTopologii.forEach(topologie => {
                            if (topologie.nazev == aktivniFormular.topologieSelect.value){
                                // Topologie je odstraněna z pole topologií
                                for (let i = 0; i < Objekty.poleTopologii.length; i++){
                                    if (Objekty.poleTopologii[i] == topologie){
                                        Objekty.poleTopologii.splice(i, 1);
                                        break;
                                    }
                                }

                                // Je nastavena vlastnost odstranit (slouží pro odstranění z mySQL)
                                topologie.odstranit = true;

                                if (Constants.LOGOVANI){
                                    console.log("");
                                    console.log("Odstranena topologie: ");
                                    console.log(topologie);
                                    console.log("Pole topologií");
                                    console.log(Objekty.poleTopologii);
                                }

                                // Odeslání do mySQL i s požadavkem na výpis hlášky
                                ajaxTopologieUpload(Constants, topologie, true, Constants.TOPOLOGIE_ODSTRANIT);
                 

                                // Pokud se jednalo o vybranou topologii, musí být odstraněna tabulka
                                if (topologie == vybranaTopologie){
                                        vybranaTopologie = undefined;
                                        if (tabulkaTopologie != undefined)tabulkaContainer.removeChild(tabulkaTopologie.tabulka);
                                        tabulkaTopologie = undefined;
                                        // Všechny stanice a spoje dané topologie budou skryty
                                        topologie.poleStanic.forEach(stanice => {
                                            skrytBod(stanice, null, null, false, map);
                                        })
                                        topologie.poleSpoju.forEach(spoj => {
                                            skrytSpoj(spoj, null, null, false, map);
                                        })  
                                }

                                // Vygenerování nového formuláře
                                optionButtonPressed(stranka, tlacitko, option, aktivniOption);

                            }   
                        })
                    });    

                    break;
            }
        break;
        case "Spoje":
            let koeficient;
            switch(option){
                // U spojů je možné se setkat se 2 formuláři. Jeden, označovaný jako aktivniFormular nebo formularHorni slouží pro obecné parametry spoje.
                // Druhý, označovaný jako formularSpojeTechnologie nebo formularSpodni, slouží pro specifické parametry dané přenosové technologie.
                // Z implementačních důvodů obsahuje druhý formulář minimálně tlačíka pro obsluhu formuláře.
                // Spoje -> Vytvořit
                case "Vytvořit":
                    // Vykreslení formuláře pro tvorbu spoje
                    formularSpojeVytvorit = new Formular(Constants, stranka, option, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularSpojeVytvorit.form);
                    aktivniFormular = formularSpojeVytvorit;
                    
                    // Reakce na změnu přenosové technologie
                    aktivniFormular.technologieSelect.addEventListener("change", function(event) {
                        event.preventDefault();

                        // Pokud byl na stránce formulář pro jinou technologii, bude odstraněn
                        if (formularSpojeTechnologie != undefined)odstranitFormular(formularSpojeTechnologie.form, "formular");
                        // Vykreslení formuláře pro technologii
                        formularSpojeTechnologie = new Formular(Constants, stranka, option + " " + aktivniFormular.technologieSelect.value, Objekty.poleTopologii, vybranaTopologie);
                        formularContainer.appendChild(formularSpojeTechnologie.form);

                        // Následující část kódu zkoumá, zda-li zadaný spoj pro vytvoření náhodou neexistuje
                        // Pokud existuje (nebo nejsou zadány obě stanice), uživatel je upozorněn zbarvením polí pro zadání stanic a možnost vytvoření je zablokována
                        let shoda;
                        if (aktivniFormular.ASelect.value.length < 1 || aktivniFormular.BSelect.value.length < 1)shoda = true;
                        else shoda = shodnySpoj(aktivniFormular.ASelect.value, aktivniFormular.BSelect.value, vybranaTopologie.poleSpoju);
                        if (shoda){
                            formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "", "");
                            formularSpojeTechnologie.submit.disabled = true;
                            formularSpojeTechnologie.submit.style.cursor = "not-allowed";
                        }
                        else{
                            formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "green", "");
                            formularSpojeTechnologie.submit.disabled = false;
                            formularSpojeTechnologie.submit.style.cursor = "pointer";
                        }
                    
                        // Implementace obsluhy specifických událostí pro formuláře konkrétních topologií
                        switch (aktivniFormular.technologieSelect.value){
                            // Formulář technologie BPL. Při prvotním vytvoření/změně ve formuláři technologie/změně vzdálenosti/změně downloadu je v metodě upravitProgressBar
                            // vypočten koeficient a tou samou metodou je pak upraven progressBar ilustrující "kvalitu" koeficientu.
                            case "BPL":
                                upravitProgressBar(Constants, aktivniFormular, formularSpojeTechnologie);
                                formularSpojeTechnologie.form.addEventListener("change", function(event) {
                                    event.preventDefault();
                                    upravitProgressBar(Constants, aktivniFormular, formularSpojeTechnologie);
                                });
                                aktivniFormular.downloadInput.addEventListener("change", function(event) {
                                    event.preventDefault();
                                    if (aktivniFormular.technologieSelect.value == "BPL")upravitProgressBar(Constants, aktivniFormular, formularSpojeTechnologie); 
                                });
                                aktivniFormular.vzdalenostInput.addEventListener("change", function(event) {
                                    event.preventDefault();
                                    if (aktivniFormular.technologieSelect.value == "BPL")upravitProgressBar(Constants, aktivniFormular, formularSpojeTechnologie); 
                                });
                                break;
                            // PŘIDÁNÍ OBSLUHY SPECIFICKÝCH UDÁLOSTÍ PRO NOVOU TECHNOLOGII PŘI VYTVÁŘENÍ SPOJE
                        }

                        // Reakce na odeslání formuláře
                        formularSpojeTechnologie.form.addEventListener("submit", function(event) {
                            event.preventDefault();
                            // Dojde k otestování, zda-li se zadaný spoj v topologii nenachází
                            let shoda = shodnySpoj(aktivniFormular.ASelect.value, aktivniFormular.BSelect.value, vybranaTopologie.poleSpoju);
                            // Pokud se v topologii nachází, dojde k ukončení události
                            if (shoda)return;

                            // Získání objektů stanic, které tvoří daný spoj
                            var A = undefined; var B = undefined;
                            for (let i = 0; i < vybranaTopologie.poleStanic.length; i++){
                                if (A != undefined && B != undefined)i = vybranaTopologie.poleStanic.length;
                                else {
                                    if (vybranaTopologie.poleStanic[i].nazev == aktivniFormular.ASelect.value)A = vybranaTopologie.poleStanic[i];
                                    if (vybranaTopologie.poleStanic[i].nazev == aktivniFormular.BSelect.value)B = vybranaTopologie.poleStanic[i];
                                }
                            }

                            // Vytvoření nového spoje
                            let novySpoj = new Objekty.Spoj(A, B, aktivniFormular.technologieSelect.value, vybranaTopologie.nazev);
                            if (Constants.LOGOVANI){
                                console.log("Vytvořen nový spoj");
                                console.log(novySpoj);
                            }
                            
                            // Spoj je vložen do pole spojů dané topologie
                            vybranaTopologie.poleSpoju.push(novySpoj);

                            

                    
                            // Tato metoda vyčítá data z obou formulářů a přiřadí je odpovídajícím parametrům spoje
                            formularSetDataForSpoj(Constants, novySpoj, aktivniFormular, formularSpojeTechnologie);
                            if (Constants.LOGOVANI){
                                console.log("Spoj naplněn daty");
                                console.log(novySpoj);
                            }
                            
                            // Vykreslení spoje na mapu, vycentrování mapy doprostřed spoje a otevření popUp okna vytvořeného spoje
                            let poleSpoju = [novySpoj];
                            vykreslitSpoje(Constants, poleSpoju, map);
                            let lat = parseFloat(novySpoj.A.lat) + parseFloat(novySpoj.B.lat);
                            let long = parseFloat(novySpoj.A.long) + parseFloat(novySpoj.B.long);

                            map.setView([lat/2, long/2], 15);
                            novySpoj.polyline.openPopup();

                            // Pokud se jedná o první spoj v rámci topologie, vykreslit tabulku
                            if (vybranaTopologie.poleSpoju.length <= 1){
                                if (aktivniTabulka != undefined)tabulkaContainer.removeChild(aktivniTabulka.tabulka);
                                tabulkaSpoju = new Tabulka(Constants, "spoje", vybranaTopologie, poleTopologii, map)
                                tabulkaContainer.appendChild(tabulkaSpoju.tabulka);
                                aktivniTabulka = tabulkaSpoju;
                            } else {
                                // V topologii se již nachází více prvků
                                let data = [novySpoj.nazev];
                                pridatRadek(Constants, "spoje", tabulkaSpoju.tabulka, data, novySpoj, map)
                            }
                           
                            // Odeslání do mySQL i s požadavkem na výpis hlášky
                            ajaxSpojeUpload(Constants, novySpoj, true, Constants.SPOJE_VYTVORIT);
                 
                            //Vyresetování formuláře
                            odstranitFormular(formularSpojeTechnologie.form, "formular");
                            formularSpojeTechnologie = undefined;
                            aktivniFormular.form.reset();
                            aktivniFormular.technologieSelect.selectedIndex = -1;
                            aktivniFormular.ASelect.selectedIndex = -1;
                            aktivniFormular.BSelect.selectedIndex = -1;

                        });
                    });


                    // Následující část kódu zkoumá, zda-li zadaný spoj pro vytvoření náhodou neexistuje
                    // Pokud existuje, uživatel je upozorněn zbarvením polí pro zadání stanic a možnost vytvoření je zablokována
                    aktivniFormular.ASelect.addEventListener("change", function(event){
                        event.preventDefault();
                        let shoda = shodnySpoj(aktivniFormular.ASelect.value, aktivniFormular.BSelect.value, vybranaTopologie.poleSpoju);

                        if (shoda){
                            formularUpdateInput(aktivniFormular.ASelect, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(aktivniFormular.BSelect, "darkRed", "2px", "solid", "", "");
                        }
                        else{
                            formularUpdateInput(aktivniFormular.ASelect, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.BSelect, "", "", "", "", "");

                        } 

                        if (aktivniFormular.technologieSelect.value.length > 0 && aktivniFormular.BSelect.value.length > 0 && !shoda){
                            if (formularSpojeTechnologie != undefined){
                                formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "green", "");
                                formularSpojeTechnologie.submit.disabled = false;
                                formularSpojeTechnologie.submit.style.cursor = "pointer";
                            }
                        } else {
                            if (formularSpojeTechnologie != undefined){
                                formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "", "");
                                formularSpojeTechnologie.submit.disabled = true;
                                formularSpojeTechnologie.submit.style.cursor = "not-allowed";
                            }
                        }
                    });

                    // Následující část kódu zkoumá, zda-li zadaný spoj pro vytvoření náhodou neexistuje
                    // Pokud existuje, uživatel je upozorněn zbarvením polí pro zadání stanic a možnost vytvoření je zablokována
                    aktivniFormular.BSelect.addEventListener("change", function(event){
                        event.preventDefault();
                        let shoda = shodnySpoj(aktivniFormular.ASelect.value, aktivniFormular.BSelect.value, vybranaTopologie.poleSpoju);

                        if (shoda){
                            formularUpdateInput(aktivniFormular.ASelect, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(aktivniFormular.BSelect, "darkRed", "2px", "solid", "", "");
                        }
                        else{
                            formularUpdateInput(aktivniFormular.ASelect, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.BSelect, "", "", "", "", "");
                        }



                        if (aktivniFormular.technologieSelect.value.length > 0 && aktivniFormular.ASelect.value.length > 0 && !shoda){
                            if (formularSpojeTechnologie != undefined){
                                formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "green", "");
                                formularSpojeTechnologie.submit.disabled = false;
                                formularSpojeTechnologie.submit.style.cursor = "pointer";
                            }
                        } else {
                            if (formularSpojeTechnologie != undefined){
                                formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "", "");
                                formularSpojeTechnologie.submit.disabled = true;
                                formularSpojeTechnologie.submit.style.cursor = "not-allowed";
                            }
                        }
                    });

                    break;
                
                // Spoje -> Editovat
                case "Editovat":
                    // Z důvodu co nejkomplexnější implementace jsou v této volbě event-listenery vyřešeny velmi složitě.
                    // Pokud neexistují žádné spoje, dojde o okamžitému ukončení. Na stránce nejsou dostupné žádné akce.
                    if (vybranaTopologie.poleSpoju.length == 0)break;

                    // Vykreslení formuláře pro editaci spoje
                    formularSpojeEditovat = new Formular(Constants, stranka, option, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularSpojeEditovat.form);
                    aktivniFormular = formularSpojeEditovat;

                    // Pokud byl na stránce formulář pro jinou technologii, bude odstraněn
                    if (formularSpojeTechnologie != undefined)odstranitFormular(formularSpojeTechnologie.form, "formular");
                    // Vykreslení formuláře pro přenosovou technologii konkrétního spoje
                    formularSpojeTechnologie = new Formular(Constants, stranka, option + " " + aktivniFormular.aktualniSpoj.typ, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularSpojeTechnologie.form);

                    // Formulář je naplněn hodnotami parametrů spoje
                    formularSpojUpdateInput(Constants, aktivniFormular.aktualniSpoj, aktivniFormular, formularSpojeTechnologie);

                    // Funkce, které obsahují některé event-listenery
                    buttonEventListenery(aktivniFormular, formularSpojeTechnologie);
                    bplEventListenery(aktivniFormular, formularSpojeTechnologie);

                    // Reakce na změnu spoje pro editaci
                    aktivniFormular.spojSelect.addEventListener("change", function(event) {
                        event.preventDefault();
                        // Získáme ukazatel na konkrétní objekt
                        for (let i = 0; i < vybranaTopologie.poleSpoju.length; i++){
                            if (vybranaTopologie.poleSpoju[i].nazev == aktivniFormular.spojSelect.value){
                                aktivniFormular.aktualniSpoj = vybranaTopologie.poleSpoju[i];
                                break;
                            }
                        }
                        
                        // Pokud je technologie spoje jiná, než předchozího, musí dojít k vykreslení nového formuláře pro tuto technologii
                        if (aktivniFormular.aktualniSpoj.typ != aktivniFormular.technologieSelect.value){
                            odstranitFormular(formularSpojeTechnologie.form, "formular");
                            formularSpojeTechnologie = new Formular(Constants, stranka, option + " " + aktivniFormular.aktualniSpoj.typ, Objekty.poleTopologii, vybranaTopologie);
                            formularContainer.appendChild(formularSpojeTechnologie.form);

                            // Byl vykreslen nový formulář pro technologii, je potřeba připojit event-listenery na tento formulář
                            buttonEventListenery(aktivniFormular, formularSpojeTechnologie);
                            // Jedná-li se o formulář pro BPL, jsou připojeny ještě specifické event-listenery pro BPL
                            if (aktivniFormular.aktualniSpoj.typ == "BPL")bplEventListenery(aktivniFormular, formularSpojeTechnologie);
                        }

                        // Formulář je naplněn hodnotami parametrů spoje
                        formularSpojUpdateInput(Constants, aktivniFormular.aktualniSpoj, aktivniFormular, formularSpojeTechnologie);     
                    });

                    // Reakce na změnu přenosové technologie
                    aktivniFormular.technologieSelect.addEventListener("change", function(event) {
                        event.preventDefault();

                        // Pokud byl na stránce formulář pro jinou technologii, bude odstraněn
                        if (formularSpojeTechnologie != undefined)odstranitFormular(formularSpojeTechnologie.form, "formular");
                        // Vykreslení formuláře pro přenosovou technologii konkrétního spoje
                        formularSpojeTechnologie = new Formular(Constants, stranka, option + " " + aktivniFormular.technologieSelect.value, Objekty.poleTopologii, vybranaTopologie);
                        formularContainer.appendChild(formularSpojeTechnologie.form);

                        // Byl vykreslen nový formulář pro technologii, je potřeba připojit event-listenery na tento formulář
                        buttonEventListenery(aktivniFormular, formularSpojeTechnologie);

                        // Shoduje-li se technologie s technologí spoje, jsou do formuláře doplněny odpovídající parametry spoje
                        if (aktivniFormular.aktualniSpoj.typ == aktivniFormular.technologieSelect.value)formularSpojUpdateInput(Constants, aktivniFormular.aktualniSpoj, aktivniFormular, formularSpojeTechnologie);
                    
                        // Jedná-li se o formulář pro BPL, jsou připojeny ještě specifické event-listenery pro BPL a vykreslen koeficient s progressBarem
                        if (aktivniFormular.technologieSelect.value == "BPL"){
                            upravitProgressBar(Constants, aktivniFormular, formularSpojeTechnologie);
                            bplEventListenery(aktivniFormular, formularSpojeTechnologie);
                        }

                        // PŘIDÁNÍ FUNKCE PRO OBSLUHU SPECIFICKÝCH UDÁLOSTÍ PRO NOVOU TECHNOLOGII PŘI EDITACI SPOJE

                    });

                    // Následující část kódu zkoumá, zda-li zadaný spoj pro vytvoření náhodou neexistuje
                    // Pokud existuje, uživatel je upozorněn zbarvením polí pro zadání stanic a možnost vytvoření je zablokována
                    aktivniFormular.ASelect.addEventListener("change", function(event){
                        event.preventDefault();
                        let shoda = shodnySpoj(aktivniFormular.ASelect.value, aktivniFormular.BSelect.value, vybranaTopologie.poleSpoju);

                        if (shoda){
                            if (aktivniFormular.ASelect.value != aktivniFormular.BSelect.value && (aktivniFormular.aktualniSpoj.A.nazev == aktivniFormular.ASelect.value || aktivniFormular.aktualniSpoj.A.nazev == aktivniFormular.BSelect.value || aktivniFormular.aktualniSpoj.B.nazev == aktivniFormular.BSelect.value || aktivniFormular.aktualniSpoj.B.nazev == aktivniFormular.BSelect.value))shoda = false;
                        }

                        if (shoda){
                            formularUpdateInput(aktivniFormular.ASelect, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(aktivniFormular.BSelect, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "gray", "");
                            formularSpojeTechnologie.submit.disabled = true;
                            formularSpojeTechnologie.submit.style.cursor = "not-allowed";
                        }
                        else{
                            formularUpdateInput(aktivniFormular.ASelect, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.BSelect, "", "", "", "", "");
                            formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "", "");
                            formularSpojeTechnologie.submit.disabled = false;
                            formularSpojeTechnologie.submit.style.cursor = "pointer";

                        } 
                    });

                    // Následující část kódu zkoumá, zda-li zadaný spoj pro vytvoření náhodou neexistuje
                    // Pokud existuje, uživatel je upozorněn zbarvením polí pro zadání stanic a možnost vytvoření je zablokována
                    aktivniFormular.BSelect.addEventListener("change", function(event){
                        event.preventDefault();
                        let shoda = shodnySpoj(aktivniFormular.ASelect.value, aktivniFormular.BSelect.value, vybranaTopologie.poleSpoju);

                        if (shoda){
                            if (aktivniFormular.ASelect.value != aktivniFormular.BSelect.value && (aktivniFormular.aktualniSpoj.A.nazev == aktivniFormular.ASelect.value || aktivniFormular.aktualniSpoj.A.nazev == aktivniFormular.BSelect.value || aktivniFormular.aktualniSpoj.B.nazev == aktivniFormular.BSelect.value || aktivniFormular.aktualniSpoj.B.nazev == aktivniFormular.BSelect.value))shoda = false;
                        }

                        if (shoda){
                            formularUpdateInput(aktivniFormular.ASelect, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(aktivniFormular.BSelect, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "gray", "");
                            formularSpojeTechnologie.submit.disabled = true;
                            formularSpojeTechnologie.submit.style.cursor = "not-allowed";
                        }
                        else{
                            formularUpdateInput(aktivniFormular.ASelect, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.BSelect, "", "", "", "", "");
                            formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "", "");
                            formularSpojeTechnologie.submit.disabled = false;
                            formularSpojeTechnologie.submit.style.cursor = "pointer";

                        }

                        if (aktivniFormular.technologieSelect.value.length > 0 && aktivniFormular.ASelect.value.length > 0 && !shoda){
                            if (formularSpojeTechnologie != undefined){
                                formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "green", "");
                                formularSpojeTechnologie.submit.disabled = false;
                                formularSpojeTechnologie.submit.style.cursor = "pointer";
                            }
                        } else {
                            if (formularSpojeTechnologie != undefined){
                                formularUpdateInput(formularSpojeTechnologie.submit, "", "", "", "", "");
                                formularSpojeTechnologie.submit.disabled = true;
                                formularSpojeTechnologie.submit.style.cursor = "not-allowed";
                            }
                        }
                    });

                    // Reakce na změnu hodnoty download. V případě, je je zvolena technologie BPL, dojde k přepočítání koeficientu a upravení progress baru.
                    aktivniFormular.downloadInput.addEventListener("change", function(event) {
                        event.preventDefault();
                        if (aktivniFormular.technologieSelect.value == "BPL")upravitProgressBar(Constants, aktivniFormular, formularSpojeTechnologie);
                        
                    });
                    // Reakce na změnu hodnoty vzdálenost. V případě, je je zvolena technologie BPL, dojde k přepočítání koeficientu a upravení progress baru.
                    aktivniFormular.vzdalenostInput.addEventListener("change", function(event) {
                        event.preventDefault();
                        if (aktivniFormular.technologieSelect.value == "BPL")upravitProgressBar(Constants, aktivniFormular, formularSpojeTechnologie);
                    });

                    // Event-listenery pro tlačítka (umístěná na formuláři pro technologii)
                    function buttonEventListenery(aktivniFormular, formularSpojeTechnologieLocal){

                        // Reakce na resetování formuláře (prostřednictvím tlačítka reset)
                        formularSpojeTechnologieLocal.form.addEventListener("reset", function(event){
                            event.preventDefault();
                            
                            // Pokud byl na stránce formulář pro technologii, bude odstraněn
                            if (formularSpojeTechnologieLocal != undefined)odstranitFormular(formularSpojeTechnologieLocal.form, "formular");
                            // Vykreslení formuláře pro přenosovou technologii konkrétního spoje
                            formularSpojeTechnologieLocal = new Formular(Constants, stranka, option + " " + aktivniFormular.aktualniSpoj.typ, Objekty.poleTopologii, vybranaTopologie);
                            formularContainer.appendChild(formularSpojeTechnologieLocal.form);

                            // Nastavení proměnné ukazující na spodní formulář
                            formularSpojeTechnologie = formularSpojeTechnologieLocal;

                            // Nastavení parametru reset aktivního formuláře pouze pro potřeby naplnění některých hodnot formuláře (stanice a technologie)
                            aktivniFormular.reset = true;
                            formularSpojUpdateInput(Constants, aktivniFormular.aktualniSpoj, aktivniFormular, formularSpojeTechnologieLocal);
                            // Nastavení výchozích hodnot formuláře
                            aktivniFormular.reset = undefined;
                            aktivniFormular.downloadInput.value = 0;
                            aktivniFormular.uploadInput.value = 0;
                            aktivniFormular.poznamkaInput.value = "";
                            aktivniFormular.vzdalenostInput.value = 0;
                            aktivniFormular.oznaceniInput.value = "";

                            // Byl vykreslen nový formulář pro technologii, je potřeba připojit event-listenery na tento formulář
                            buttonEventListenery(aktivniFormular, formularSpojeTechnologieLocal);

                            // Jedná-li se o formulář pro BPL, jsou připojeny ještě specifické event-listenery pro BPL
                            if (aktivniFormular.aktualniSpoj.typ == "BPL")bplEventListenery(aktivniFormular, formularSpojeTechnologie);

                            // PŘIDÁNÍ FUNKCE PRO OBSLUHU SPECIFICKÝCH UDÁLOSTÍ PRO NOVOU TECHNOLOGII PŘI EDITACI SPOJE

                        });

                        // Reakce odeslání formuláře
                        formularSpojeTechnologieLocal.form.addEventListener("submit", function(event) {
                            event.preventDefault();
                             // Dojde k otestování, zda-li se zadaný spoj v topologii nenachází
                            let shoda = shodnySpoj(aktivniFormular.ASelect.value, aktivniFormular.BSelect.value, vybranaTopologie.poleSpoju);
                            if (shoda){
                                // Pokud se daný spoj nachází, ale jedná se o spoj, který editujeme, shoda je přepsána na false
                                if (aktivniFormular.ASelect.value != aktivniFormular.BSelect.value && (aktivniFormular.aktualniSpoj.A.nazev == aktivniFormular.ASelect.value || aktivniFormular.aktualniSpoj.A.nazev == aktivniFormular.BSelect.value || aktivniFormular.aktualniSpoj.B.nazev == aktivniFormular.BSelect.value || aktivniFormular.aktualniSpoj.B.nazev == aktivniFormular.BSelect.value))shoda = false;
                            }
                            // Jedná-li se o shodu, dojde k ukončení události
                            if (shoda)return;

                            let zmena = false;                                              // Pomocná proměnná signalizující shodu
                            var A = undefined; var B = undefined;
                            for (let i = 0; i < vybranaTopologie.poleStanic.length; i++){
                                if (A != undefined && B != undefined)i = vybranaTopologie.poleStanic.length;
                                else {
                                    if (vybranaTopologie.poleStanic[i].nazev == aktivniFormular.ASelect.value)A = vybranaTopologie.poleStanic[i];
                                    if (vybranaTopologie.poleStanic[i].nazev == aktivniFormular.BSelect.value)B = vybranaTopologie.poleStanic[i];
                                }
                            }

                            // Pokud se změnily stanice nebo technologie spoje, proměnná změna je nastavena na true
                            if (aktivniFormular.aktualniSpoj.A != A || aktivniFormular.aktualniSpoj.B != B || aktivniFormular.aktualniSpoj.typ != aktivniFormular.technologieSelect.value)zmena = true;
                            
                            // Aktualizování stanic a technologie
                            aktivniFormular.aktualniSpoj.A = A;
                            aktivniFormular.aktualniSpoj.B = B;
                            aktivniFormular.aktualniSpoj.typ = aktivniFormular.technologieSelect.value;

                            // Metoda formularSetDataForSpoj naplní spoj hodnotami z formuláře. Návratovou hodnotou této funkce je informace, zda-li
                            // došlo ke změně, čehož je zde využito k detekci změny
                            if (!zmena)zmena = formularSetDataForSpoj(Constants, aktivniFormular.aktualniSpoj, aktivniFormular, formularSpojeTechnologieLocal);
                            else formularSetDataForSpoj(Constants, aktivniFormular.aktualniSpoj, aktivniFormular, formularSpojeTechnologieLocal);
                            
                            if (Constants.LOGOVANI){
                                console.log("Byla detekována nějaká změna ve spoji: " + zmena);
                            }

                            // Pokud byla detekována změna
                            if (zmena){
                                // Aktualizace názvu spoje
                                aktivniFormular.aktualniSpoj.rename();
                                // Spoj je odebrán z mapy
                                skrytSpoj(aktivniFormular.aktualniSpoj, null, null, false, map)

                                // Spoj (s aktualizovanými daty) je vykreslen na mapu, mapa je na něj vycentrována a otevře se jeho popUp
                                let poleSpoju = [aktivniFormular.aktualniSpoj];
                                vykreslitSpoje(Constants, poleSpoju, map);
                                let lat = parseFloat(aktivniFormular.aktualniSpoj.A.lat) + parseFloat(aktivniFormular.aktualniSpoj.B.lat);
                                let long = parseFloat(aktivniFormular.aktualniSpoj.A.long) + parseFloat(aktivniFormular.aktualniSpoj.B.long);
                                map.setView([lat/2, long/2], 15);

                                aktivniFormular.aktualniSpoj.polyline.openPopup();

                                // Odeslání do mySQL i s požadavkem na výpis hlášky
                                ajaxSpojeUpload(Constants, aktivniFormular.aktualniSpoj, true, Constants.SPOJE_EDIT);
                 

                                // Pokud došlo ke změně názvu, je upraven název v klikací tabulce i v rozbalovací nabídce pro výběr spoje
                                if (aktivniFormular.aktualniSpoj.nazev != aktivniFormular.aktualniSpoj.staryNazev){
                                    for (let i = 0; i < aktivniFormular.spojSelect.options.length; i++) {
                                        if (aktivniFormular.spojSelect.options[i].value == aktivniFormular.spojSelect.value) {
                                            aktivniFormular.spojSelect.options[i].value = aktivniFormular.aktualniSpoj.nazev;
                                            aktivniFormular.spojSelect.options[i].innerHTML = aktivniFormular.aktualniSpoj.nazev;
                                            break;
                                        }
                                    }
                                    aktivniFormular.aktualniSpoj.radek.cells[0].innerText = aktivniFormular.aktualniSpoj.nazev;
                                }
                                aktivniFormular.aktualniSpoj.staryNazev = aktivniFormular.aktualniSpoj.nazev;

                            }
                        });

                        // Reakce na stisknutí tlačítka "Výchozí hodnoty"
                        formularSpojeTechnologieLocal.default.addEventListener("click", function(event){
                            // Pokud aktuálně zvolená technologie není technologie spoje, dojde k vykreslení nového formuláře technologie
                            if (aktivniFormular.technologieSelect.value != aktivniFormular.aktualniSpoj.typ){
                                odstranitFormular(formularSpojeTechnologieLocal.form, "formular");
                                formularSpojeTechnologieLocal = new Formular(Constants, stranka, option + " " + aktivniFormular.aktualniSpoj.typ, Objekty.poleTopologii, vybranaTopologie);
                                formularContainer.appendChild(formularSpojeTechnologieLocal.form);
                                formularSpojeTechnologie = formularSpojeTechnologieLocal;

                                // Byl vykreslen nový formulář pro technologii, je potřeba připojit event-listenery na tento formulář
                                buttonEventListenery(aktivniFormular, formularSpojeTechnologieLocal);

                                // Jedná-li se o formulář pro BPL, jsou připojeny ještě specifické event-listenery pro BPL
                                if (aktivniFormular.aktualniSpoj.typ == "BPL")bplEventListenery(aktivniFormular, formularSpojeTechnologie);

                                // PŘIDÁNÍ FUNKCE PRO OBSLUHU SPECIFICKÝCH UDÁLOSTÍ PRO NOVOU TECHNOLOGII PŘI EDITACI SPOJE
                            }

                            // Formulář je naplněn (původními) hodnotami parametrů spoje
                            formularSpojUpdateInput(Constants, aktivniFormular.aktualniSpoj, aktivniFormular, formularSpojeTechnologieLocal);
                        });
                    }

                    // Event-listenery specifické pro BPL
                    function bplEventListenery(aktivniFormularLocal, formularSpojeTechnologieLocal){
                        // Při změně ve formuláři technologie je v metodě upravitProgressBar
                        // vypočten koeficient a tou samou metodou je pak upraven progressBar ilustrující "kvalitu" koeficientu.
                        formularSpojeTechnologieLocal.form.addEventListener("change", function(event) {
                            event.preventDefault();
                            upravitProgressBar(Constants, aktivniFormularLocal, formularSpojeTechnologieLocal);
                        });
                    }

    
                    break;
                // Spoje -> Odstranit
                case "Odstranit":
                    // Pokud neexistují žádné spoje, dojde o okamžitému ukončení. Na stránce nejsou dostupné žádné akce.
                    if (vybranaTopologie.poleSpoju.length == 0)break;

                    // Vykreslení formuláře pro odstranění spoje
                    formularSpojeOdstranit = new Formular(Constants, stranka, option, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularSpojeOdstranit.form);
                    aktivniFormular = formularSpojeOdstranit;


                    aktivniFormular.nazevInput.addEventListener("input", function(event) {
                        event.preventDefault();
                        let shoda = false;
 
                        // Pokud se vybraný spoj shoduje s názvem zadaným uživatelem, nastaví se pomocná proměnná signalizující shodu na true
                        if (aktivniFormular.spojSelect.value == aktivniFormular.nazevInput.value){
                            shoda = true;
                        }

                        // Pokud je shoda, tak je povoleno odstranění topologie. Tento stav signalizuje uživateli i zeleně zbarvené tlačítko a vstupní
                        // pole pro zadávání názvu. Pokud shoda není, vstupní pole je červené, tlačítko šedé a spoj odstranit nelze.
                        if (shoda){
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "lightgreen", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "green", "");
                            
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";

                        } else {
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "";
                        }
                        
                    });

                    aktivniFormular.spojSelect.addEventListener("change", function(event) {
                        event.preventDefault();
                        let shoda = false;
 
                        // Podle vybraného názvu je nalezen odpovídající objekt spoje
                        for (let i = 0; i < vybranaTopologie.poleSpoju.length; i++){
                            if (vybranaTopologie.poleSpoju[i].nazev == aktivniFormular.spojSelect.value){
                                aktivniFormular.aktualniSpoj = vybranaTopologie.poleSpoju[i];
                                break;
                            }
                        }
                        
                        // Pokud se vybraný spoj shoduje s názvem zadaným uživatelem, nastaví se pomocná proměnná signalizující shodu na true
                        if (aktivniFormular.spojSelect.value == aktivniFormular.nazevInput.value){
                            shoda = true;
                        }
                        
                        // Pokud je shoda, tak je povoleno odstranění topologie. Tento stav signalizuje uživateli i zeleně zbarvené tlačítko a vstupní
                        // pole pro zadávání názvu. Pokud shoda není, vstupní pole je červené, tlačítko šedé a spoj odstranit nelze.
                        if (shoda){
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "lightgreen", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "green", "");
                            
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";

                        } else {
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "";
                        }
                        
                    });

                    // Reakce na odeslání formuláře
                    aktivniFormular.form.addEventListener("submit", function(event) {
                        event.preventDefault();

                        // Nastavení parametru odstranit spoje na true (pro mySQL)
                        aktivniFormular.aktualniSpoj.odstranit = true;


                        // Prochází se pole spojů dané topologie, jakmile je detekována shoda, tak spoj z pole odstraněn a cyklus končí.
                        for (let i = 0; i < vybranaTopologie.poleSpoju.length; i++){
                            if (vybranaTopologie.poleSpoju[i] == aktivniFormular.aktualniSpoj){
                                vybranaTopologie.poleSpoju.splice(i, 1);
                                break;
                            }
                        }

                        // Odeslání do mySQL i s požadavkem na výpis hlášky
                        ajaxSpojeUpload(Constants, aktivniFormular.aktualniSpoj, true, Constants.SPOJE_ODSTRANIT);

                        // Odstranění spoje z mapy
                        skrytSpoj(aktivniFormular.aktualniSpoj, null, null, false, map); 

                        // Vygenerování nové tabulky a formuláře
                        tabulkaContainer.removeChild(tabulkaSpoju.tabulka);
                        aktivniTabulka = undefined;
                        if (vybranaTopologie.poleSpoju.length > 0){
                            tabulkaSpoju = new Tabulka(Constants, "spoje", vybranaTopologie, poleTopologii, map)
                            tabulkaContainer.appendChild(tabulkaSpoju.tabulka);
                            aktivniTabulka = tabulkaSpoju;
                        }
                        optionButtonPressed(stranka, tlacitko, option, aktivniOption);
  
                    });
                    break;

            }
        break;
        case "Stanice":
            switch (option){
                // Stanice -> Vytvořit
                case "Vytvořit":
                    // Vykreslení formuláře na tvorbu stanic
                    formularStaniceVytvorit = new Formular(Constants, stranka, option, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularStaniceVytvorit.form);
                    aktivniFormular = formularStaniceVytvorit;

                    // Reakce na změnu názvu stanice
                    aktivniFormular.nazevInput.addEventListener("input", function(event) {
                        event.preventDefault();
                        let shoda = false;

                        // Testování shody zadaného názvu s názvem existujících stanic v rámci topologie
                        vybranaTopologie.poleStanic.forEach(stanice => {
                            if (stanice.nazev.toLowerCase() == aktivniFormular.nazevInput.value.toLowerCase()){
                                shoda = true;
                            }
                        })
                        // Pokud se název shoduje, je na to uživatel upozorněn barevně i změnou popisku políčka pro zadávání názvu, zablokuje se možnost vytvořit topologii
                        // Pokud se název neshoduje, vše se vrátí do původního stavu
                        if (shoda){
                            formularUpdateLabel(aktivniFormular.nazevLabel, "Název stanice [již existuje]", "darkRed");
                            formularUpdateInput(aktivniFormular.nazevInput, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "gray", "");
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "not-allowed";
                        } else {
                            let text = aktivniFormular.nazevLabel.innerHTML.split("[");
                            formularUpdateLabel(aktivniFormular.nazevLabel, text[0], "");                       // Nastaví na hodnoty definované v css
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");                // Nastaví na hodnoty definované v css
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";
                        }
                    });

                    // Reakce na odeslání formuláře
                    aktivniFormular.form.addEventListener("submit", function(event) {
                        event.preventDefault();
                        // Pokud není zadán název, dojde k přerušení
                        if (aktivniFormular.nazevInput.value == "")return;

                            // Načtení zadaného pořadí stanice
                            let poradi = parseInt(aktivniFormular.idInput.value);
                            // Inicializace pole, ve kterém budou všechny stanice, které bude třeba kvůli vytvoření této stanice editovat (změna jejich pořadí)
                            var stanicekEditaci = [];

                            // Pokud není stanice vložena "na konec", ale n-té místo, tak stanici, které je na n-tém místě je pořadí navýšeno o 0.5
                            if (poradi != (vybranaTopologie.poleStanic.length+1)){
                                vybranaTopologie.poleStanic[poradi-1].poradi = poradi+0.5;
                            }

                            // Vytvoření nové stanic
                            let novaStanice = new Objekty.Stanice(aktivniFormular.nazevInput.value, aktivniFormular.latitudeInput.value, aktivniFormular.longitudeInput.value, aktivniFormular.poznamkaInput.value, poradi, vybranaTopologie.nazev);
                            vybranaTopologie.poleStanic.push(novaStanice);
                            
                            
                            
                            // Pokud není prvek vložen na konec, tak je nutné provést setřídění prvků
                            if (poradi != (vybranaTopologie.poleStanic.length+1)){
                                // Prvky jsou setříděny podle pořadí
                                vybranaTopologie.poleStanic.sort(function(a, b) {
                                    return a.poradi - b.poradi;
                                });

                                //Indexy jsou upraveny tak, aby odpovídaly pořadí (nastaveny na celá čísla)
                                for (let i = 0; i < vybranaTopologie.poleStanic.length; i++){
                                    if (vybranaTopologie.poleStanic[i].poradi != i+1){
                                        vybranaTopologie.poleStanic[i].poradi = i+1;
                                        stanicekEditaci.push(vybranaTopologie.poleStanic[i]);
                                    }  
                                }
                            }

                            // Stanice je vykreslena do mapy
                            let pole = [novaStanice];
                            vykreslitStanice(Constants, pole, map, Constants.markerIconBlack);

                            // Dotčené stanice jsou odeslány do mySQL
                            stanicekEditaci.forEach(stanice => {
                                ajaxStaniceUpload(Constants, stanice);
                            })

                            // Nová stanice odeslána do mySQL i s požadavkem na výpis hlášky
                            ajaxStaniceUpload(Constants, novaStanice, true, Constants.STANICE_VYTVORIT, Constants.DEPENDENCIES);

                            // Pokud nebyl prvek vložen na konec nebo se jedná o první prvek v rámci topologie (= nebyla vykreslena tabulka), vykreslí se nová tabulka
                            if (poradi != (vybranaTopologie.poleStanic.length+1) || tabulkaStanic == undefined){
                                if (aktivniTabulka != undefined)tabulkaContainer.removeChild(aktivniTabulka.tabulka);
                                tabulkaStanic = new Tabulka(Constants, "stanice", vybranaTopologie, poleTopologii, map)
                                tabulkaContainer.appendChild(tabulkaStanic.tabulka);
                                aktivniTabulka = tabulkaStanic;
                                
                            // Prvek byl vložen na konec a tabulka existuje = do existující tabulky je přidán řádek
                            } else {
                                let data = [novaStanice.poradi + ": " + novaStanice.nazev];
                                pridatRadek(Constants, "stanice", tabulkaStanic.tabulka, data, novaStanice, map)
                            }

                            // Mapa je vycentrována na polohu stanice a je zobrazen i její popUp
                            map.setView([novaStanice.lat, novaStanice.long], 15);
                            novaStanice.marker.openPopup();
                                  
                            // Vyresetování formuláře
                            aktivniFormular.form.reset();
                            aktivniFormular.idInput.value = vybranaTopologie.poleStanic.length+1;
                            aktivniFormular.idInput.max = vybranaTopologie.poleStanic.length+1;
                            
                            if (Constants.LOGOVANI){
                                console.log("");
                                console.log("Nová stanice: ");
                                console.log(vybranaTopologie);
                            }
                    });    
                    break;
                // Stanice -> Editovat
                case "Editovat":
                    // Pokud se v topologii nenachází žádné stanice, dojde o okamžitému ukončení. Na stránce nejsou dostupné žádné akce.
                    if (vybranaTopologie.poleStanic.length == 0)break;
                        
                    // Vykreslení formuláře pro editaci stanic
                    formularStaniceEditovat = new Formular(Constants, stranka, option, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularStaniceEditovat.form);
                    aktivniFormular = formularStaniceEditovat;

                    // Reakce na změnu stanice k editaci
                    aktivniFormular.staniceSelect.addEventListener("change", function(event) {
                        // Pokud je vybrána jiná stanice z rozbalovacího menu, upraví se hodnoty ostatních vstupů na hodnoty parametrů vybrané stanice
                        event.preventDefault();
                        vybranaTopologie.poleStanic.forEach(stanice => {
                                if (stanice.nazev == aktivniFormular.staniceSelect.value){
                                    aktivniFormular.nazevInput.value = stanice.nazev;
                                    aktivniFormular.latitudeInput.value = stanice.lat;
                                    aktivniFormular.longitudeInput.value = stanice.long;
                                    aktivniFormular.poznamkaInput.value = stanice.poznamka;
                                    aktivniFormular.idInput.value = stanice.poradi;
                                }
                            })  
                    });

                    // Reakce na stisknutí tlačítka "Výchozí hodnoty"
                    aktivniFormular.default.addEventListener("click", function(event) {
                        event.preventDefault();
                        // Prvky formuláře jsou naplněny parametry stanice
                        vybranaTopologie.poleStanic.forEach(stanice => {
                            if (stanice.nazev == aktivniFormular.staniceSelect.value){
                                aktivniFormular.nazevInput.value = stanice.nazev;
                                aktivniFormular.latitudeInput.value = stanice.lat;
                                aktivniFormular.longitudeInput.value = stanice.long;
                                aktivniFormular.poznamkaInput.value = stanice.poznamka;
                                aktivniFormular.idInput.value = stanice.poradi;

                                let text = aktivniFormular.nazevLabel.innerHTML.split("[");
                                formularUpdateLabel(aktivniFormular.nazevLabel, text[0], "");                       // Nastaví na hodnoty definované v css
                                formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");                // Nastaví na hodnoty definované v css
                                formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                                aktivniFormular.submit.disabled = false;
                                aktivniFormular.submit.style.cursor = "pointer";
                            }   
                        }) 
                    });

                    // Reaguje na změnu názvu stanice. Pokud daný název stanice v topologii již existuje, tak na duplicitu upozorní a zablokuje možnost editace
                    aktivniFormular.nazevInput.addEventListener("input", function(event) { 
                        event.preventDefault();
                        let shoda = false;
                        vybranaTopologie.poleStanic.forEach(stanice => {
                            if (stanice.nazev.toLowerCase() == aktivniFormular.nazevInput.value.toLowerCase() && stanice.nazev != aktivniFormular.staniceSelect.value){
                                shoda = true;
                            }
                        })
                        if (shoda){
                            formularUpdateLabel(aktivniFormular.nazevLabel, "Název stanice [již existuje]", "darkRed");
                            formularUpdateInput(aktivniFormular.nazevInput, "darkRed", "2px", "solid", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "gray", "");
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "not-allowed";
                        } else {
                            let text = aktivniFormular.nazevLabel.innerHTML.split("[");
                            formularUpdateLabel(aktivniFormular.nazevLabel, text[0], "");                       // Nastaví na hodnoty definované v css
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");                // Nastaví na hodnoty definované v css
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";
                        }
                    });

                    

                    // Reakce na odeslání formuláře
                    aktivniFormular.form.addEventListener("submit", function(event) {
                        event.preventDefault();
                        // Akce se provádí pouze, pokud došlo ke změně
                        vybranaTopologie.poleStanic.forEach(stanice => {
                            if (stanice.nazev == aktivniFormular.staniceSelect.value){
                                if (stanice.nazev != aktivniFormular.nazevInput.value || stanice.lat != aktivniFormular.latitudeInput.value || stanice.long != aktivniFormular.longitudeInput.value || stanice.poznamka != aktivniFormular.poznamkaInput.value || stanice.poradi != aktivniFormular.idInput.value){
                                    
                                    // Aktualizace parametrů stanice dle formuláře
                                    var oldLat = stanice.lat;
                                    var oldLong = stanice.long;
                                    var oldPoradi = stanice.poradi

                                    stanice.nazev = aktivniFormular.nazevInput.value;
                                    stanice.lat = aktivniFormular.latitudeInput.value;
                                    stanice.long = aktivniFormular.longitudeInput.value;
                                    stanice.poznamka = aktivniFormular.poznamkaInput.value;

                                    // Aktualizace názvu stanice v rozbalovací nabídce, ve které se volí stanice. Pouze pokud došlo ke změně názvu stanice.
                                    // Aktualizace názvu stanice v klikací tabulce. Pouze pokud došlo ke změně názvu stanice.
                                    if (stanice.nazev != stanice.staryNazev){
                                        for (let i = 0; i < aktivniFormular.staniceSelect.options.length; i++) {
                                            if (aktivniFormular.staniceSelect.options[i].value == aktivniFormular.staniceSelect.value) {
                                                aktivniFormular.staniceSelect.options[i].value = stanice.nazev;
                                                aktivniFormular.staniceSelect.options[i].innerHTML = stanice.nazev;
                                                break;
                                            }
                                        }
                                        stanice.radek.cells[0].innerText = aktivniFormular.idInput.value + ": " + stanice.nazev;
                                    }

                                    // Pokud došlo ke změně pořadí:
                                    // Je-li pořadí duplicitní s nějakou jinou stanicí, tak je pořadí jiné stanice změněno
                                    // Setřídí se pole stanic v rámci topologie dle jejich ID, aktualizuje se klikací tabulka (smaže se a znovu vykreslí)
                                    // Přidání dotčených stanic do pole pro update v mySQL
                                    var stanicekEditaci = [];
                                    if (aktivniFormular.idInput.value != stanice.oldPoradi){
                                            let poradi = parseInt(aktivniFormular.idInput.value);
                                            stanice.poradi = poradi;

                                            // Úprava pořadí jiné stanice
                                            if (poradi > oldPoradi)vybranaTopologie.poleStanic[poradi-1].poradi = poradi-0.5;
                                            else vybranaTopologie.poleStanic[poradi-1].poradi = poradi+0.5;
                                            
                                            // Prvky jsou setříděny dle pořadí
                                            vybranaTopologie.poleStanic.sort(function(a, b) {
                                            return a.poradi - b.poradi;
                                            });

                                            // Indexy jsou upraveny tak, aby odpovídaly pořadí
                                            for (let i = 0; i < vybranaTopologie.poleStanic.length; i++){
                                                if (vybranaTopologie.poleStanic[i].poradi != i+1){
                                                    vybranaTopologie.poleStanic[i].poradi = i+1;
                                                    stanicekEditaci.push(vybranaTopologie.poleStanic[i]);
                                                }
                                                
                                            }
                                        // Odstranění a vykreslení tabulky stanic
                                        tabulkaContainer.removeChild(tabulkaStanic.tabulka);
                                        tabulkaStanic = new Tabulka(Constants, "stanice", vybranaTopologie, poleTopologii, map)
                                        tabulkaContainer.appendChild(tabulkaStanic.tabulka);
                                    }

                                    // Stanice je z mapy nejprve skryta a poté aktualizovaná znovu vykreslena
                                    skrytBod(stanice, "", "", false, map);
                                    let pole = [stanice];
                                    vykreslitStanice(Constants, pole, map, Constants.markerIconBlack);


                                    // Dojde vyhledání spojů, kterých se může dotknout změna parametrů stanice. Jedná se o parametry názvu a souřadnic stanice.
                                    // Pokud se změnil název stanice nebo souřadnice, dojde k vygenerování nového názvu spoje + dojde k jeho odstranění z mapy, aby mohl
                                    // mohl být v dalším kroku vykreslen s aktualizovanými parametry
                                    var spojekEditaci = [];
                                    for (let i = 0; i < vybranaTopologie.poleSpoju.length; i++){
                                        let shoda = false;
                                        if (vybranaTopologie.poleSpoju[i].A == stanice){
                                            shoda = true;
                                        } 
                                        else if (vybranaTopologie.poleSpoju[i].B == stanice){
                                            shoda = true;
                                        }
                                        if (shoda){
                                            if (stanice.nazev != stanice.staryNazev || oldLat != stanice.lat || oldLong != stanice.long){
                                                vybranaTopologie.poleSpoju[i].rename();
                                                spojekEditaci.push(vybranaTopologie.poleSpoju[i]);
                                            
                                                skrytSpoj(vybranaTopologie.poleSpoju[i], null, null, false, map); 
                                                let poleStanic = [vybranaTopologie.poleSpoju[i]];
                                                vykreslitSpoje(Constants, poleStanic, map);
                                            }
                                        }
                                    }

                                    // Odeslaní do mySQL
                                    stanicekEditaci.forEach(stanice => {
                                        ajaxStaniceUpload(Constants, stanice);
                                    })
                                    
                                    // Pokud se úprava dotkla i spojů, jsou odeslány do mySQL
                                    if (spojekEditaci.length != 0){
                                        spojekEditaci.forEach(spoj => {
                                            ajaxSpojeUpload(Constants, spoj);   
                                        })
                                    }
                                    // Upravená stanice odeslána do mySQL i s požadavkem na výpis hlášky
                                    ajaxStaniceUpload(Constants, stanice, true, Constants.STANICE_EDIT, Constants.DEPENDENCIES);

                                    stanice.staryNazev = stanice.nazev;

                                    if (Constants.LOGOVANI){
                                        console.log("");
                                        console.log("Upravená stanice: ");
                                        console.log(stanice);
                                    }
                                 
                                }
                            }
                        })
                    });

                    break;
                
                // Stanice -> Odstranit
                case "Odstranit":
                    // Pokud se v topologii nenachází žádné stanice, dojde o okamžitému ukončení. Na stránce nejsou dostupné žádné akce.
                    if (vybranaTopologie.poleStanic.length == 0)break;

                    // Vykreslení formuláře pro odstranění stanice
                    formularStaniceOdstranit = new Formular(Constants, stranka, option, Objekty.poleTopologii, vybranaTopologie);
                    formularContainer.appendChild(formularStaniceOdstranit.form);
                    aktivniFormular = formularStaniceOdstranit;

                    // Reakce na změnu výběru stanice k odstranění
                    aktivniFormular.staniceSelect.addEventListener("change", function(event) {
                        // Reaguje na změnu výběru stanice k odstranění a dopočítá, kolika spojů se odstranění stanice dotkne
                        event.preventDefault();
                        vybranaTopologie.poleStanic.forEach(stanice => {
                            if (stanice.nazev == aktivniFormular.staniceSelect.value){
                                let count = 0;
                                for (let i = 0; i < vybranaTopologie.poleSpoju.length; i++){
                                    if (vybranaTopologie.poleSpoju[i].A == stanice){
                                        count++;
                                    } 
                                    else if (vybranaTopologie.poleSpoju[i].B == stanice){
                                        count++;;
                                    }
                                }
                                if (count == 1)aktivniFormular.pocetSpojuSelectLabel.innerHTML = "Stanice je součástí " + count + " spoje.";
                                else aktivniFormular.pocetSpojuSelectLabel.innerHTML = "Stanice je součástí " + count + " spojů.";



                                // Pokud se zadaný název shoduje s vybranou stanicí, povolí odstranění stanice.
                                if (aktivniFormular.staniceSelect.value == aktivniFormular.nazevInput.value){
                                    formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "lightgreen", "");
                                    formularUpdateInput(aktivniFormular.submit, "", "", "", "green", "");
                                    aktivniFormular.submit.disabled = false;
                                    aktivniFormular.submit.style.cursor = "pointer";
                                }else{
                                    formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");
                                    formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                                    aktivniFormular.submit.disabled = true;
                                    aktivniFormular.submit.style.cursor = "";
                                }
                            }
                        })
                           
                    });

                    // Reaguje na změnu názvu stanice, který má uživatel opsat. 
                    aktivniFormular.nazevInput.addEventListener("input", function(event) {
                        // Pokud se zadaný název shoduje s vybranou stanicí, povolí odstranění stanice.
                        event.preventDefault();
                        let shoda = false;

                        if (aktivniFormular.staniceSelect.value == aktivniFormular.nazevInput.value){
                            shoda = true;
                        }
    
                        if (shoda){
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "lightgreen", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "green", "");
                            aktivniFormular.submit.disabled = false;
                            aktivniFormular.submit.style.cursor = "pointer";

                        } else {
                            formularUpdateInput(aktivniFormular.nazevInput, "", "", "", "", "");
                            formularUpdateInput(aktivniFormular.submit, "", "", "", "", "");
                            aktivniFormular.submit.disabled = true;
                            aktivniFormular.submit.style.cursor = "";
                        }
                        
                    });

                    // Reaguje na odeslání formuláře
                    aktivniFormular.form.addEventListener("submit", function(event) {
                        event.preventDefault();
                        vybranaTopologie.poleStanic.forEach(stanice => {
                            if (stanice.nazev == aktivniFormular.staniceSelect.value){
                                if (Constants.LOGOVANI){
                                    console.log("Odstranění stanice");
                                    console.log(vybranaTopologie);
                                }

                                // Nalezení spojů, jejichž byla stanice součástí
                                // Nejprve projde pole spojů dané topologie a hledá se, zda-li se A nebo B shoduje se stanicí. Pokud ano, uloží se index spoje
                                // do pole indexySpojukOdstraneni a samotný spoj je uložen do pole spojekOdstraneni + je skryta čára na mapě
                                // Následně je pole indexů čteno od zadu a mažou se jednotlivé spoje z pole spojů dané topologie.
                                var spojekOdstraneni = [];
                                var indexySpojukOdstraneni = [];

                                for (let i = 0; i < vybranaTopologie.poleSpoju.length; i++){
                                    let shoda = false;
                                    if (vybranaTopologie.poleSpoju[i].A == stanice){
                                        shoda = true;
                                        vybranaTopologie.poleSpoju[i].odstranit = true;
                                    } 
                                    else if (vybranaTopologie.poleSpoju[i].B == stanice){
                                        shoda = true;
                                        vybranaTopologie.poleSpoju[i].odstranit = true;
                                    }
                                    if (shoda){
                                        spojekOdstraneni.push(vybranaTopologie.poleSpoju[i]);
                                        skrytSpoj(vybranaTopologie.poleSpoju[i], null, null, false, map)
                                        indexySpojukOdstraneni.push(i);
                                    }
                                }

                                for (let i = (indexySpojukOdstraneni.length -1); i > -1; i--){
                                    vybranaTopologie.poleSpoju.splice(i, 1);
                                }


                                // Prochází se pole stanic dané topologie, jakmile je detekována shoda, tak je stanice odstraněna a cyklus končí
                                for (let i = 0; i < vybranaTopologie.poleStanic.length; i++){
                                    if (vybranaTopologie.poleStanic[i] == stanice){
                                        vybranaTopologie.poleStanic.splice(i, 1);
                                        break;
                                    }
                                }

                                // Úprava pořadí stanic
                                var stanicekEditaci = [];
                                // Stanice jsou setříděny podle pořadí
                                vybranaTopologie.poleStanic.sort(function(a, b) {
                                return a.poradi - b.poradi;
                                });

                                // Indexy jsou upraveny tak, aby odpovídaly pořadí
                                for (let i = 0; i < vybranaTopologie.poleStanic.length; i++){
                                    if (vybranaTopologie.poleStanic[i].poradi != i+1){
                                        vybranaTopologie.poleStanic[i].poradi = i+1;
                                        stanicekEditaci.push(vybranaTopologie.poleStanic[i]);
                                    }
                                    
                                }
                                
                                // Vygenerování nové tabulky a formuláře
                                tabulkaContainer.removeChild(tabulkaStanic.tabulka);
                                tabulkaStanic = new Tabulka(Constants, "stanice", vybranaTopologie, poleTopologii, map)
                                tabulkaContainer.appendChild(tabulkaStanic.tabulka);
                                aktivniTabulka = tabulkaStanic;

                                optionButtonPressed(stranka, tlacitko, option, aktivniOption);

                                stanice.odstranit = true;

                                // Odeslání do mySQL
                                // Spoje k odstranění - spojekOdstraneni
                                // Stanice k editaci - stanicekEditaci

                                spojekOdstraneni.forEach(spoj => {
                                    ajaxSpojeUpload(Constants, spoj);
                                });

                                
                                stanicekEditaci.forEach(stanice => {
                                    ajaxStaniceUpload(Constants, stanice);
                                })

                                // Stanice k odstranění odeslána do mySQL i s požadavkem na výpis hlášky
                                ajaxStaniceUpload(Constants, stanice, true, Constants.STANICE_ODSTRANIT, Constants.DEPENDENCIES);

                            }
                        })
                    });
                    break;
            }
        break;
    }
}

var aktivniStranka = poleNazvu[0];
// Funkce pro tvorbu tlačítek pro přepínání stránek
function vytvoritTlacitkaStranek(Constants){
    for (let i = 0; i < poleNazvu.length; i++){
            poleTlacitekStranek[i] = createButton(Constants, "tlacitka", poleNazvu[i], poleNazvu[i]);
            // Obsluha stisknutí tlačítka
            poleTlacitekStranek[i].onclick = function() {
                if (aktivniStrankaButton != poleTlacitekStranek[i]){
                    // Pokud existuje aktivní tabulka, tak jí raději nastaví na tabulku, která byla na předchozí stránce očekávána
                    if (aktivniTabulka != undefined){
                        switch (aktivniStranka){
                            case poleNazvu[0]:
                                aktivniTabulka = tabulkaTopologie;
                                break;
                            case poleNazvu[1]:
                                aktivniTabulka = tabulkaSpoju;
                                break;
                            case poleNazvu[2]:
                                aktivniTabulka = tabulkaStanic;
                                break;
                        }
                    }
                    // Stisknuté tlačítko je zvýrazněno
                    zvyrazneniStisknutehoTlacitka(poleTlacitekStranek[i], aktivniStrankaButton);
                    // Obsluha stisknutí konkrétního tlačítka
                    strankaButtonPressed(poleTlacitekStranek[i], poleNazvu[i], aktivniStrankaButton);
                    aktivniStrankaButton = poleTlacitekStranek[i];
                    aktivniStranka = poleNazvu[i];
                }
            };
    }
}
</script>
<script src="https://unpkg.com/leaflet@1.9.2/dist/leaflet.js" integrity="sha256-o9N1jGDZrf5tS+Ft4gbIK7mYMipq9lqpVJ91xHSyKhg=" crossorigin=""></script>