Upozornění:
Veškerý zde vystavený kód je mým autorským dílem a je zveřejněn výhradně za účelem ukázky stylu mé práce.
Kód slouží pouze k nahlédnutí – jakékoliv kopírování, šíření, úpravy či jiné využití bez mého výslovného souhlasu nejsou povoleny.
Zůstává mým duševním vlastnictvím ve smyslu autorského zákona.
Děkuji za pochopení.
← Zpět na seznam

App DZSR.cz (JS)


let currentCallback = null;

function aktualizujStavPalivaVHlavicce() {
  const el = document.getElementById("stav_v_nadrzi_l");
  const palivo = parseFloat(localStorage.getItem("stav_v_nadrzi_l"));
  if (el && !isNaN(palivo)) {
    el.textContent = palivo;
    el.classList.toggle("palivo-nizke", palivo < 10);
  }
}

window.addEventListener("DOMContentLoaded", () => {

  function prepocitejStavPaliva() {
    const spotreba = parseFloat(localStorage.getItem("spotreba")) || 0;
    const lastTach = parseInt(localStorage.getItem("lastTach")) || 0;
    const predchoziTach = parseInt(localStorage.getItem("predchoziTach")) || parseInt(localStorage.getItem("startKm")) || 0;
    let puvodniStav = parseFloat(localStorage.getItem("stav_v_nadrzi_l")) || 0;

    if (!spotreba || !lastTach || lastTach < predchoziTach) return;

    const rozdilKm = lastTach - predchoziTach;
    const spaleno = (rozdilKm * spotreba) / 100;
    const zustatek = puvodniStav - spaleno;

    const zaokrouhleno = Math.round(zustatek * 2) / 2;
    localStorage.setItem("stav_v_nadrzi_l", zaokrouhleno);
    localStorage.setItem("predchoziTach", lastTach);
    aktualizujStavPalivaVHlavicce();
  }
  const smena = localStorage.getItem("smena") || "P";
  const datum = localStorage.getItem("datum") || new Date().toLocaleDateString("cs-CZ");
  const jmeno = localStorage.getItem("ridic") || "Neznámý řidič";

  const modal = document.getElementById("modal");
  const modalInput = document.getElementById("modal-input");
  const modalTitle = document.getElementById("modal-title");
  const modalOk = document.getElementById("modal-ok");
  const modalCancel = document.getElementById("modal-cancel");

  function showModal(title, placeholder = "", callback) {
    modalTitle.textContent = title;
    modalInput.value = placeholder;
    modal.classList.remove("hidden");
    modalInput.focus();
    currentCallback = callback;
  }

  function closeModal() {
    modal.classList.add("hidden");
    modalInput.value = "";
    currentCallback = null;
  }

  modalOk.onclick = () => {
    const value = modalInput.value.trim();
    const cb = currentCallback;
    closeModal();
    if (cb) setTimeout(() => cb(value), 0);
  };

  modalCancel.onclick = closeModal;

  function zpracujTankovani(poznamka) {
    const match = poznamka.match(/tank\s*(\d+)/i);
    if (match) {
      const litry = parseFloat(match[1]);
      const plna = 85;
      const nove = prompt(`Detekováno tankování ${litry} l.\nNastavit nádrž na ${plna} l?`, plna);
      if (nove !== null && !isNaN(nove)) {
        const tach = localStorage.getItem("lastTach") || "0";
        localStorage.setItem("stav_v_nadrzi_l", parseFloat(nove));
        localStorage.setItem("natankovano_l", litry);
        localStorage.setItem("tankTach", parseInt(tach));
        aktualizujStavPalivaVHlavicce();
        alert(`Nádrž nastavena na ${nove} l. Tachometr: ${tach}`);
        return true;
      }
    }
    return false;
  }

  function zpracujKodovouPoznamku(poznamka) {
      const cista = poznamka.replace(/\s+/g, '');
      if (isNaN(cista)) return null;
      if (cista.length < 12 || cista.length > 13) return null;
    
      const rc = cista.slice(0, cista.length - 3);
      const pojistovna = cista.slice(-3);
    
      if (rc.length !== 9 && rc.length !== 10) return null;
    
      return {
        rodne_cislo: rc,
        pojistovna: pojistovna
      };
    }


  function zobrazZaznamy() {
    const vypisy = document.getElementById("vypisy");
    if (!vypisy || typeof getVsechnyZaznamy !== 'function') return;

    vypisy.innerHTML = "";
    getVsechnyZaznamy().then(data => {
      const nevylozene = data.filter(z => !z.cas_vylozeni).sort((a, b) => a.id - b.id);
      nevylozene.slice(-5).forEach(z => {
        const div = document.createElement("div");
        div.className = "zaznam";
        div.dataset.id = z.id;
        div.textContent = `${z.mesto_nalozeni} | ${z.poznamka}` +
            (z.rodne_cislo ? ` | RČ: ${z.rodne_cislo} / ${z.pojistovna}` : '');
        div.onclick = () => div.classList.toggle("selected");
        vypisy.appendChild(div);
      });
    });
  }

  function ziskejOznaceneZaznamy(callback) {
    return getVsechnyZaznamy().then(vsechny => {
      const oznaceneDivy = document.querySelectorAll(".zaznam.selected");
      const ids = [...oznaceneDivy].map(div => parseInt(div.dataset.id));
      return vsechny.filter(z => ids.includes(z.id));
    });
  }

  document.getElementById("btn-editovat").onclick = () => {
    ziskejOznaceneZaznamy().then(vybrane => {
      if (vybrane.length !== 1) {
        alert("Vyberte prosím právě jeden záznam pro editaci.");
        return;
      }
      const zaznam = vybrane[0];
      showModal("Upravte poznámku", zaznam.poznamka || "", nova => {
        updateZaznam(zaznam.id, { poznamka: nova }).then(zobrazZaznamy);
      });
    });
  };

  function aktualizujTachometrVHlavicce() {
    const tach = localStorage.getItem("lastTach");
    const el = document.getElementById("tach-info");
    if (el) {
      el.textContent = tach ? `Tachometr: ${tach} km` : `Tachometr: —`;
    }
  }

  function ziskejCas(callback) {
    const now = new Date();
    const hhmm = now.toTimeString().slice(0, 5);
    showModal("Zadejte čas", hhmm, callback);
  }

  function ziskejMesto(callback) {
    if (!navigator.geolocation) {
      showModal("Zadejte město", "", callback);
      return;
    }

    navigator.geolocation.getCurrentPosition(
      pos => {
        const { latitude, longitude } = pos.coords;
        fetch(`https://nominatim.openstreetmap.org/reverse?format=json&lat=${latitude}&lon=${longitude}&accept-language=cs`)
          .then(res => res.json())
          .then(data => {
            const adresa = data.address || {};
            const mesto = adresa.city || adresa.town || adresa.village || "";
            showModal("Potvrďd'te nebo upravte město", mesto, callback);
          })
          .catch(() => showModal("Zadejte město", "", callback));
      },
      () => showModal("Zadejte město", "", callback)
    );
  }

  function ziskejPoznamku(callback) {
    showModal("Zadejte poznámku", "", callback);
  }

  function vytvorZaznam(zaznam) {
    if (typeof addZaznam === 'function') {
      return addZaznam(zaznam);
    } else {
      console.error("Funkce addZaznam není dostupná.");
      return Promise.resolve();
    }
  }

  function procesPrazdny() {
    ziskejPoznamku(poznamka => {
      if (zpracujTankovani(poznamka)) {
        zobrazZaznamy();
        return;
      }

      ziskejMesto(mesto => {
        ziskejCas(cas => {
          vytvorZaznam({
            id: Date.now(),
            typ: 'prazdny',
            kod: null,
            cas_nalozeni: cas,
            mesto_nalozeni: mesto,
            poznamka,
            cas_vylozeni: null,
            mesto_vylozeni: null,
            tachometr: null,
            smena,
            datum,
            ridic: jmeno,
            vozidlo: localStorage.getItem("vozidlo")
          }).then(zobrazZaznamy);
        });
      });
    });
  }

  function procesKodovy(kod) {
    const zaznamy = [];

    function zadatRodneCislo(index) {
      showModal(`Zadejte rodné číslo ${index + 1} z ${kod}`, "", val => {
        const vysledek = zpracujKodovouPoznamku(val);
        const baseTime = Date.now();

        const zaznam = {
          id: baseTime + index,
          typ: "kodovy",
          kod,
          cas_nalozeni: null,
          mesto_nalozeni: null,
          poznamka: "",
          cas_vylozeni: null,
          mesto_vylozeni: null,
          tachometr: null,
          smena,
          datum,
          ridic: jmeno,
          vozidlo: localStorage.getItem("vozidlo")
        };

        if (vysledek) {
          zaznam.rodne_cislo = vysledek.rodne_cislo;
          zaznam.pojistovna = vysledek.pojistovna;
        }

        zaznamy.push(zaznam);

        if (index + 1 < kod) {
          zadatRodneCislo(index + 1);
        } else {
          ziskejMesto(mesto => {
            ziskejCas(cas => {
              zaznamy.forEach(z => {
                z.cas_nalozeni = cas;
                z.mesto_nalozeni = mesto;
              });
              Promise.all(zaznamy.map(z => vytvorZaznam(z))).then(zobrazZaznamy);
            });
          });
        }
      });
    }

    zadatRodneCislo(0);
  }

  function procesVylozeni() {
    const vybrane = document.querySelectorAll(".zaznam.selected");
    if (!vybrane.length) {
      alert("Nejprve vyber záznam.");
      return;
    }

    const ids = [...vybrane].map(div => parseInt(div.dataset.id));

    getVsechnyZaznamy().then(vsechny => {
      const nevylozene = vsechny.filter(z => !z.cas_vylozeni);
      const zbydePoVylozeni = nevylozene.filter(z => !ids.includes(z.id));
      const jePosledni = zbydePoVylozeni.length === 0;

      ziskejMesto(mesto => {
        ziskejCas(cas => {
          const updateZaznam = (id, tach = null) => {
            const update = {
              cas_vylozeni: cas,
              mesto_vylozeni: mesto
            };
            if (tach !== null) update.tachometr = tach;
            return window.updateZaznam(id, update);
          };

          const vyloz = (tach) => {
            Promise.all(ids.map(id => updateZaznam(id, tach && id === ids[ids.length - 1] ? tach : null)))
              .then(zobrazZaznamy);
          };

          if (jePosledni) {
            const posledniTach = localStorage.getItem("lastTach") || "";
            showModal("Zadejte stav tachometru", posledniTach, tach => {
              const tachTrim = tach.trim();
              if (tachTrim) {
                localStorage.setItem("lastTach", tachTrim);
                aktualizujTachometrVHlavicce();
                prepocitejStavPaliva();
              }
              vyloz(tachTrim);
            });
          } else {
            vyloz(null);
          }
        });
      });
    });
  }

  document.getElementById("btn-prazdny").onclick = procesPrazdny;

  document.querySelectorAll(".kod-button").forEach(btn => {
    btn.onclick = () => {
      const kod = parseInt(btn.dataset.count);
      procesKodovy(kod);
    };
  });

  document.getElementById("btn-vylozit").onclick = procesVylozeni;

  zobrazZaznamy();
  aktualizujTachometrVHlavicce();
  prepocitejStavPaliva();
});


← Zpět na seznam