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

RoSaaRi (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");
  const flagSedacka = document.getElementById("flag-sedacka");
  const flagVleze = document.getElementById("flag-vleze");
  
  if (flagSedacka && flagVleze) {
    flagSedacka.addEventListener("change", () => {
      if (flagSedacka.checked) flagVleze.checked = false;
    });
  
    flagVleze.addEventListener("change", () => {
      if (flagVleze.checked) flagSedacka.checked = false;
    });
  }
  function nastavFlagyModalu(zobrazit) {
    const box = document.getElementById("modal-flags");
    const doprovod = document.getElementById("flag-doprovod");
    const sedacka = document.getElementById("flag-sedacka");
    const vleze = document.getElementById("flag-vleze");

    if (!box) return;

    box.style.display = zobrazit ? "block" : "none";

    if (doprovod) doprovod.checked = false;
    if (sedacka) sedacka.checked = false;
    if (vleze) vleze.checked = false;
  }

  function showModal(title, placeholder = "", callback, zobrazitFlagy = false) {
    modalTitle.textContent = title;
    modalInput.value = placeholder;
    
    nastavFlagyModalu(zobrazitFlagy);

    modal.classList.remove("hidden");
    modalInput.focus();
    currentCallback = callback;
  }

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

  function ziskejFlagyPoznamky() {
    const flagy = [];

    if (document.getElementById("flag-doprovod")?.checked) {
      flagy.push("DOPROVOD");
    }

    if (document.getElementById("flag-sedacka")?.checked) {
      flagy.push("SEDAČKA");
    }

    if (document.getElementById("flag-vleze")?.checked) {
      flagy.push("V LEŽE");
    }

    return flagy.join(" | ");
  }

  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 = String(poznamka || "").replace(/\D/g, "");

    if (cista.length < 12 || cista.length > 13) {
      alert(
        `Rodné číslo nebylo rozpoznáno.\n\n` +
        `Zadáno: ${poznamka}\n` +
        `Rozpoznané číslice: ${cista}\n` +
        `Počet číslic: ${cista.length}\n\n` +
        `Zadejte rodné číslo znovu.`
      );
      return null;
    }

    const rc = cista.slice(0, -3);
    const pojistovna = cista.slice(-3);

    if (rc.length !== 9 && rc.length !== 10) {
      alert(
        `Rodné číslo má špatnou délku.\n\n` +
        `RČ: ${rc}\n` +
        `Pojišťovna: ${pojistovna}`
      );
      return null;
    }

    return {
      personal_id: rc,
      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.personal_id
            ? ` | RČ: ${z.personal_id} / ${z.pojistovna}`
            : ` | ⚠️ RČ CHYBÍ`);
        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.onLine || !navigator.geolocation) {
      showModal("Zadejte město", "", callback);
      return;
    }

    navigator.geolocation.getCurrentPosition(
      pos => {
        const { latitude, longitude } = pos.coords;

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

        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 ||
              adresa.municipality ||
              "";

            showModal("Potvrďte nebo upravte město", mesto, callback);
          })
          .catch(() => {
            showModal("Zadejte město", "", callback);
          });
      },
      () => {
        showModal("Zadejte město", "", callback);
      },
      {
        enableHighAccuracy: false,
        timeout: 2500,
        maximumAge: 300000
      }
    );
  }

  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 => {
        if (!val.trim() || val.trim() === "?") {
        
          const baseTime = Date.now();
        
          const zaznam = {
            id: baseTime + index,
            typ: "kodovy",
            kod,
            cas_nalozeni: null,
            mesto_nalozeni: null,
            poznamka: ["⚠️ RČ doplnit později", ziskejFlagyPoznamky()]
              .filter(Boolean)
              .join(" | "),
            cas_vylozeni: null,
            mesto_vylozeni: null,
            tachometr: null,
            smena,
            datum,
            ridic: jmeno,
            vozidlo: localStorage.getItem("vozidlo"),
            personal_id: null,
            pojistovna: null,
            rc_doplneno: false
          };
        
          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);
              });
            });
          }
        
          return;
        }
        const vysledek = zpracujKodovouPoznamku(val);
            
        if (!vysledek) {
          zadatRodneCislo(index);
          return;
        }
      
        const baseTime = Date.now();
      
        const zaznam = {
          id: baseTime + index,
          typ: "kodovy",
          kod,
          cas_nalozeni: null,
          mesto_nalozeni: null,
          poznamka: ziskejFlagyPoznamky(),
          cas_vylozeni: null,
          mesto_vylozeni: null,
          tachometr: null,
          smena,
          datum,
          ridic: jmeno,
          vozidlo: localStorage.getItem("vozidlo"),
          personal_id: vysledek.personal_id,
          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);
            });
          });
        }
      }, true);
    }

    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