let page = 1; let loading = false; let entryCounter = 0; let lastAdId = null; let adIndex = 0; let ads = []; const LOCATION_KEY = "userLocation"; const LOCATION_INTERVAL = 5 * 60 * 1000; function updateLocation() { if (!navigator.geolocation) { console.warn("Geolocation wird nicht unterstützt."); return; } navigator.geolocation.getCurrentPosition( pos => { const coords = { lat: pos.coords.latitude, lon: pos.coords.longitude, ts: Date.now() }; localStorage.setItem(LOCATION_KEY, JSON.stringify(coords)); console.log("Location aktualisiert:", coords); }, err => { console.warn("Geolocation verweigert oder fehlgeschlagen:", err); } ); } function getStoredLocation() { try { const loc = localStorage.getItem(LOCATION_KEY); return loc ? JSON.parse(loc) : null; } catch (e) { console.warn("Fehler beim Parsen von Location:", e); return null; } } (function initLocation() { const loc = getStoredLocation(); if (!loc || Date.now() - loc.ts > LOCATION_INTERVAL) { updateLocation(); } // danach regelmäßig erneuern setInterval(updateLocation, LOCATION_INTERVAL); })(); // Hilfsfunktion: simples HTML-escape function escapeHtml(str) { if (str === null || str === undefined) return ""; return String(str).replace(/[&<>"']/g, function(m) { return { '&':'&','<':'<','>':'>','"':'"',"'":''' }[m]; }); } function insertAd(placeholderId) { const coords = getStoredLocation(); url = "/js-ajax-ads.php?"; if (coords) { url += `&lat=${coords.lat}&lon=${coords.lon}`; } return fetch(url) .then(res => { if (!res.ok) throw new Error("HTTP " + res.status); return res.json(); }) .then(ad => { if (ad.id === lastAdId) { return insertAd(placeholderId); } const placeholder = document.getElementById(placeholderId); if (placeholder) { placeholder.outerHTML = `
${ad.html}
`; lastAdId = ad.id; } }) .catch(err => { console.error("Fehler beim Laden eines Werbeblocks:", err); }); } function renderEntries(entries) { let html = ""; const container = document.getElementById("content"); if (!Array.isArray(entries)) entries = [entries]; entries.forEach(entry => { const dateStr = entry.timestamp || ""; if(entry.type === "note"){ let timeStr = ""; if(entry.start?.trim() && entry.expire?.trim()){ timeStr = "Von " + entry.start + " – " + entry.expire; }else{ timeStr = "Am " + entry.timestamp; } html = `

${timeStr} gab es aufgrund eingeschränkter Kapazitäten keine Aufzeichnung. Jetzt aktiv werden und dem Dienst zu Finanzieren helfen!

${entry.finbar.string}
`; } if(entry.type === "report"){ const statRecent = (entry.statistics && entry.statistics[1] !== undefined) ? entry.statistics[1] + "%" : "0%"; const statAll = (entry.statistics && entry.statistics[0] !== undefined) ? entry.statistics[0] + "%" : "0%"; const title = escapeHtml(entry.title); const excerpt = escapeHtml(entry.excerpt); const city = escapeHtml(entry.city); const id = encodeURIComponent(entry.id); const uid = encodeURIComponent(entry.uid); const poster = escapeHtml(entry.poster); html = `

${title}

${excerpt}…

${city}, ${dateStr}

`; } container.insertAdjacentHTML("beforeend", html); entryCounter++; if (entryCounter % 3 === 0) { const placeholderId = "ad-" + entryCounter; container.insertAdjacentHTML("beforeend", `
`); insertAd(placeholderId); } }); } function loadMoreContent() { if (loading) return; loading = true; const loadingElement = document.getElementById("loading"); loadingElement.style.display = "block"; const params = new URLSearchParams(window.location.search); const zeig = params.get("zeig"); // z.B. "unterhaltung" var url = `/js-ajax-content.php?seite=${page}`; if(zeig !== null){ url += `&zeig=${zeig}`; } fetch(url) .then(response => { if (!response.ok) throw new Error("HTTP " + response.status); return response.json(); }) .then(data => { console.log("AJAX data:", data); if (!data || (Array.isArray(data) && data.length === 0)) { window.removeEventListener("scroll", onScroll); return; } renderEntries(data); page++; }) .catch(error => { console.error('Fehler beim Laden der Inhalte:', error); }) .finally(() => { loadingElement.style.display = "none"; loading = false; }); } window.onload = function() { loadMoreContent(); };