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