function openPreview(encryptedPath, id) { const content = document.getElementById('previewContent' + id); const modal = document.getElementById('previewModal' + id); const url = 'filexproxy.php?file=' + encryptedPath; content.innerHTML = ''; document.getElementById('downloadBtn' + id).href = url; modal.style.display = 'flex'; } function closePreview(id) { document.getElementById('previewModal' + id).style.display = 'none'; document.getElementById('previewContent' + id).innerHTML = ''; } document.addEventListener('DOMContentLoaded', function() { // Kalender aus allen Parents raus und direkt ins Body const kalender = document.getElementById('kalender'); if (kalender && kalender.parentElement !== document.body) { document.body.appendChild(kalender); console.log('✅ Kalender in Body verschoben'); } }); function toggleLangMenu() { document.getElementById("langMenu").style.display = document.getElementById("langMenu").style.display === "block" ? "none" : "block"; } function hideshow(container) { if(document.getElementById(container).style.display=='block') { document.getElementById(container).style.display='none'; } else { document.getElementById(container).style.display='block'; } } function setLang(lang) { document.querySelector(".lang-btn").innerHTML = lang + " "; document.getElementById("langMenu").style.display = "none"; // hier kannst du noch redirect oder language-setting einbauen console.log("Sprache gewählt:", lang); } // Klick außerhalb schließt das Menü document.addEventListener("click", function(e) { const menu = document.getElementById("langMenu"); const btn = document.querySelector(".lang-btn"); if (!btn.contains(e.target) && !menu.contains(e.target)) { menu.style.display = "none"; } }); class ZeitraumAuswahl { constructor() { this.zeitraumInput = document.getElementById('zeitraum'); this.kalender = document.getElementById('kalender'); this.monatJahr = document.getElementById('monat-jahr'); this.kalenderGrid = document.getElementById('kalender-grid'); this.kalenderTage = document.getElementById('kalender-tage'); this.datumBereich = document.getElementById('datum-bereich'); this.aktuellerMonat = new Date().getMonth(); this.aktuellesJahr = new Date().getFullYear(); this.vonDatum = null; this.bisDatum = null; this.auswahlModus = null; this.heute = new Date(); // NEU: Heute-Datum speichern this.heute.setHours(0, 0, 0, 0); // Zeit auf Mitternacht setzen this.monate = [ 'Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember' ]; this.initEventListener(); this.erstelleKalender(); } initEventListener() { this.zeitraumInput.addEventListener('click', (e) => { e.stopPropagation(); if (this.kalender.style.display === 'none' || this.kalender.style.display === '') { this.auswahlModus = 'von'; this.zeigeKalender(); } }); const kalenderIcon = document.querySelector('.kalender-icon'); if (kalenderIcon) { kalenderIcon.addEventListener('click', (e) => { e.stopPropagation(); this.toggleKalender(); }); } this.kalender.addEventListener('click', (e) => { e.stopPropagation(); e.preventDefault(); const target = e.target; if (target.id === 'vorheriger-monat') { this.aktuellerMonat--; if (this.aktuellerMonat < 0) { this.aktuellerMonat = 11; this.aktuellesJahr--; } this.erstelleKalender(); return; } if (target.id === 'naechster-monat') { this.aktuellerMonat++; if (this.aktuellerMonat > 11) { this.aktuellerMonat = 0; this.aktuellesJahr++; } this.erstelleKalender(); return; } // Tag-Auswahl - NEU: Prüfung ob Tag nicht deaktiviert ist if (target.dataset && target.dataset.datum && !target.classList.contains('deaktiviert')) { const datumString = target.dataset.datum; const datum = this.parseDatum(datumString); this.waehleTag(datum); } }); document.addEventListener('click', (e) => { if (!this.kalender.contains(e.target) && e.target !== this.zeitraumInput) { this.versteckeKalender(); } }); document.addEventListener('keydown', (e) => { if (e.key === 'Escape') { this.versteckeKalender(); } }); } setupMonthNavigation() { // Diese Methode ist nicht mehr nötig, da Event-Delegation verwendet wird } zeigeKalender() { const kalender = document.getElementById('kalender'); const zeitraumInput = document.getElementById('zeitraum'); // 1. Kalender ins Body verschieben (falls nicht schon dort) if (kalender.parentElement !== document.body) { document.body.appendChild(kalender); console.log('✅ Kalender in Body verschoben'); } // 2. ALLE Styles entfernen kalender.removeAttribute('style'); // Immer zentriert (vertikal & horizontal) kalender.style.cssText = ` display: block !important; position: fixed !important; top: 50% !important; left: 50% !important; transform: translate(-50%, -50%) !important; width: calc(100vw - 40px) !important; max-width: 320px !important; z-index: 99999 !important; background: rgba(255, 255, 255, 0.95) !important; backdrop-filter: blur(20px) !important; border-radius: 12px !important; box-shadow: 0 10px 40px rgba(0,0,0,0.2) !important; `; console.log('✅ Kalender zentriert angezeigt'); this.aktualisiereBereichsanzeige(); } versteckeKalender() { this.kalender.style.display = 'none'; } toggleKalender() { if (this.kalender.style.display === 'none' || this.kalender.style.display === '') { this.auswahlModus = 'von'; this.zeigeKalender(); } else { this.versteckeKalender(); } } aktualisiereBereichsanzeige() { if (this.vonDatum && this.bisDatum) { const vonStr = this.formatiereDatumFuerAnzeige(this.vonDatum); const bisStr = this.formatiereDatumFuerAnzeige(this.bisDatum); this.datumBereich.textContent = `${vonStr} - ${bisStr}`; } else if (this.vonDatum) { this.datumBereich.textContent = `Ab ${this.formatiereDatumFuerAnzeige(this.vonDatum)}`; } else { this.datumBereich.textContent = 'Zeitraum auswählen'; } } erstelleKalender() { this.monatJahr.textContent = `${this.monate[this.aktuellerMonat]} ${this.aktuellesJahr}`; this.kalenderTage.innerHTML = ''; const ersterTag = new Date(this.aktuellesJahr, this.aktuellerMonat, 1); const letzterTag = new Date(this.aktuellesJahr, this.aktuellerMonat + 1, 0); const ersterWochentag = (ersterTag.getDay() + 6) % 7; const vorherigenMonatLetzterTag = new Date(this.aktuellesJahr, this.aktuellerMonat, 0).getDate(); // Vorherige Monatstage for (let i = ersterWochentag - 1; i >= 0; i--) { const tag = vorherigenMonatLetzterTag - i; const tagElement = document.createElement('div'); tagElement.className = 'tag anderer-monat'; tagElement.textContent = tag; this.kalenderTage.appendChild(tagElement); } // Aktuelle Monatstage const heuteVergleich = new Date(); heuteVergleich.setHours(0, 0, 0, 0); for (let tag = 1; tag <= letzterTag.getDate(); tag++) { const datum = new Date(this.aktuellesJahr, this.aktuellerMonat, tag); datum.setHours(0, 0, 0, 0); const datumString = this.formatiereDatum(datum); let klassen = 'tag'; // NEU: Vergangene Tage deaktivieren if (datum < heuteVergleich) { klassen += ' deaktiviert'; } if (datum.toDateString() === heuteVergleich.toDateString()) { klassen += ' heute'; } if (this.vonDatum && this.bisDatum) { if (datum.getTime() === this.vonDatum.getTime()) { klassen += ' von'; } else if (datum.getTime() === this.bisDatum.getTime()) { klassen += ' bis'; } else if (datum > this.vonDatum && datum < this.bisDatum) { klassen += ' zwischen'; } } else if (this.vonDatum && datum.getTime() === this.vonDatum.getTime()) { klassen += ' von'; } const tagElement = document.createElement('div'); tagElement.className = klassen; tagElement.textContent = tag; // NEU: Nur bei nicht-deaktivierten Tagen das data-datum Attribut setzen if (!klassen.includes('deaktiviert')) { tagElement.dataset.datum = datumString; } this.kalenderTage.appendChild(tagElement); } // Nächste Monatstage const gesamtZellen = Math.ceil((ersterWochentag + letzterTag.getDate()) / 7) * 7; const verbleibendeZellen = gesamtZellen - (ersterWochentag + letzterTag.getDate()); for (let tag = 1; tag <= verbleibendeZellen; tag++) { const tagElement = document.createElement('div'); tagElement.className = 'tag anderer-monat'; tagElement.textContent = tag; this.kalenderTage.appendChild(tagElement); } } waehleTag(datum) { if (!this.vonDatum || (this.vonDatum && this.bisDatum)) { this.vonDatum = datum; this.bisDatum = null; this.aktualisiereZeitraumInput(); } else if (this.vonDatum && !this.bisDatum) { if (datum < this.vonDatum) { this.bisDatum = this.vonDatum; this.vonDatum = datum; } else { this.bisDatum = datum; } this.aktualisiereZeitraumInput(); setTimeout(() => { this.versteckeKalender(); }, 200); } this.erstelleKalender(); this.aktualisiereBereichsanzeige(); } aktualisiereZeitraumInput() { if (this.vonDatum && this.bisDatum) { const vonStr = this.formatiereDatumFuerInput(this.vonDatum); const bisStr = this.formatiereDatumFuerInput(this.bisDatum); this.zeitraumInput.value = `${vonStr} - ${bisStr}`; } else if (this.vonDatum) { this.zeitraumInput.value = this.formatiereDatumFuerInput(this.vonDatum); } else { this.zeitraumInput.value = ''; } } formatiereDatum(datum) { return datum.getFullYear() + '-' + (datum.getMonth() + 1).toString().padStart(2, '0') + '-' + datum.getDate().toString().padStart(2, '0'); } formatiereDatumFuerInput(datum) { return datum.getDate().toString().padStart(2, '0') + '.' + (datum.getMonth() + 1).toString().padStart(2, '0') + '.' + datum.getFullYear(); } formatiereDatumFuerAnzeige(datum) { return datum.getDate().toString().padStart(2, '0') + '.' + (datum.getMonth() + 1).toString().padStart(2, '0') + '.' + datum.getFullYear(); } parseDatum(datumString) { const teile = datumString.split('-'); return new Date(parseInt(teile[0]), parseInt(teile[1]) - 1, parseInt(teile[2])); } } document.addEventListener('DOMContentLoaded', () => { new ZeitraumAuswahl(); }); function executeInlScript(action, data, cont) { $.ajax({ url: 'process.php', type: 'POST', data: { action: action, data: data, }, success: function(response) { // Zeige das Ergebnis im Modal an //$('#'+cont).html(response); const sel = (/^[#.]/.test(cont) ? cont : '#'+cont); const $target = $(sel); $target.stop(true, true).empty(); $( $.parseHTML(response) ).hide().appendTo($target).fadeIn(150); }, error: function(xhr, status, error) { // Fehlerbehandlung $('#'+cont).html('Ein Fehler ist aufgetreten: ' + error); } }); } function executeInlScriptError(action, data, cont) { $.ajax({ url: 'process.php', type: 'POST', data: { action: action, data: data, }, success: function(response) { // Zeige das Ergebnis im Modal an $('#'+cont).html(response); }, error: function(xhr, status, error) { // Fehlerbehandlung $('#'+cont).html('Ein Fehler ist aufgetreten: ' + error); } }); } function executeInlScriptErrorSubmit(action, data, cont) { $.ajax({ url: 'process.php', type: 'POST', data: { action: action, data: data, }, success: function(response) { // Zeige das Ergebnis im Modal an $('#'+cont).html(response); }, error: function(xhr, status, error) { // Fehlerbehandlung $('#'+cont).html('Ein Fehler ist aufgetreten: ' + error); } }); } function executeInlScriptAdd(action, data, cont) { $.ajax({ url: 'process.php', type: 'POST', data: { action: action, data: data, }, success: function(response) { // Zeige das Ergebnis im Modal an //$('#'+cont).html(response); const sel = (/^[#.]/.test(cont) ? cont : '#'+cont); const $target = $(sel); $( $.parseHTML(response) ).hide().appendTo($target).fadeIn(150); }, error: function(xhr, status, error) { // Fehlerbehandlung $('#'+cont).html('Ein Fehler ist aufgetreten: ' + error); } }); } function inc(id){ var el = document.getElementById(id); el.value = (parseInt(el.value,10) || 0) + 1; } function ReplaceCharacter(String) { let newstring = String .replace("ά","A") .replace("έ","E") .replace("ή","H") .replace("ί","I") .replace("ό","O") .replace("ύ","U") .replace("ώ","Ω") .replace("ϊ","Ϊ") .replace("ϋ","Ϋ"); // Nur das kleine ß vorher in ẞ wandeln newstring = newstring.replace(/ß/g, "ẞ"); // Jetzt alles in Uppercase newstring = newstring.toUpperCase(); return newstring; } // Popup schließen function schliessePopup() { const overlay = document.getElementById('error-overlayCO'); overlay.classList.remove('show'); springeZuFeld(); } // Popup schließen bei Klick auf Overlay //document.getElementById('error-overlayCO').addEventListener('click', function(e) { // if (e.target === this) { // schliessePopup(); // } //}); // Popup schließen mit ESC document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { schliessePopup(); } }); function springeZuFeld() { var feldId=document.getElementById('FirstError').value; const feld = document.getElementById(feldId); if (feld) { // Smooth scroll zum Feld feld.scrollIntoView({ behavior: 'smooth', block: 'center' }); // Kurze Verzögerung für Scroll, dann Fokus setTimeout(() => { feld.focus(); // Feld visuell hervorheben feld.style.transition = 'all 0.3s'; feld.style.borderColor = '#ff6b6b'; feld.style.boxShadow = '0 0 0 4px rgba(255, 107, 107, 0.2)'; // Hervorhebung nach 2 Sekunden entfernen setTimeout(() => { feld.style.borderColor = ''; feld.style.boxShadow = ''; }, 4000); }, 500); } } // Error Handling /* document.addEventListener('DOMContentLoaded', function() { const form = document.getElementById('SWForm'); // Ihre Form-ID hier const inputs = form.querySelectorAll('input, textarea, select'); inputs.forEach(input => { console.log('Initialisierung für: ', input.name); const errorMessage = input.parentElement.querySelector('.error-message'); if (!errorMessage) return; // STOP hier - Rest wird übersprungen const successMessage = input.parentElement.querySelector('.success-message'); if (!successMessage) return; // STOP hier - Rest wird übersprungen const isRequired = input.dataset.required === '1'; // Entspricht $Properties["pflichtfeld"]==1 //console.log('Required: ', isRequired); // Event listener für das Verlassen des Feldes (blur) input.addEventListener('blur', function() { //console.log('Validierung für: ', input.name); validateField(input, errorMessage, successMessage, isRequired); }); // Event listener für Eingaben (um Fehler zu entfernen) input.addEventListener('input', function() { if (input.classList.contains('error') && input.value.trim() !== '') { clearError(input, errorMessage); if (isValidInput(input)) { showSuccess(input, successMessage); } } }); // Event listener für Focus (um Nachrichten zu verstecken) input.addEventListener('focus', function() { hideMessages(errorMessage, successMessage); input.classList.remove('error', 'success'); }); }); function validateField(input, errorMessage, successMessage, isRequired) { const value = input.value.trim(); // Prüfung nur bei Pflichtfeldern oder wenn Wert eingegeben wurde if (isRequired && value === '') { showError(input, errorMessage); } else if (value !== '' && !isValidInput(input)) { showError(input, errorMessage); } else if (value !== '') { showSuccess(input, successMessage); } } function isValidInput(input) { const value = input.value.trim(); if (input.type === 'email') { const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(value); } return value !== ''; } function showError(input, errorMessage) { input.classList.add('error'); //input.classList.remove('success'); errorMessage.classList.add('show'); // Verstecke Success Message //const successMessage = input.closest('.form-group').querySelector('.success-message'); //if (successMessage) { // successMessage.classList.remove('show'); //} } function showSuccess(input, successMessage) { input.classList.add('success'); input.classList.remove('error'); successMessage.classList.add('show'); // Verstecke Error Message const errorMessage = input.closest('.form-group').querySelector('.error-message'); if (errorMessage) { errorMessage.classList.remove('show'); } } function clearError(input, errorMessage) { input.classList.remove('error'); errorMessage.classList.remove('show'); } function hideMessages(errorMessage, successMessage) { errorMessage.classList.remove('show'); successMessage.classList.remove('show'); } }); */ function initGoogleAddressSearch() { document.querySelectorAll('input[data-address-search="1"]').forEach(function(input) { var ac = new google.maps.places.Autocomplete(input, { types: ['address'], fields: ['address_components'] }); ac.addListener('place_changed', function() { var place = ac.getPlace(); if (!place.address_components) return; var comp = {}; place.address_components.forEach(function(c) { c.types.forEach(function(t) { comp[t] = c; }); }); var route = comp['route'] ? comp['route'].long_name : ''; var streetNr = comp['street_number'] ? comp['street_number'].long_name : ''; input.value = route + (streetNr ? ' ' + streetNr : ''); var zipBez = input.getAttribute('data-zip-bez'); var cityBez = input.getAttribute('data-city-bez'); var zipEl = zipBez ? document.querySelector('[data-bezeichnung="' + zipBez + '"]') : null; var cityEl = cityBez ? document.querySelector('[data-bezeichnung="' + cityBez + '"]') : null; if (zipEl && comp['postal_code']) zipEl.value = comp['postal_code'].long_name; if (cityEl) cityEl.value = (comp['locality'] || comp['postal_town'] || {long_name: ''}).long_name; }); }); } function daten_BlandCheck(land) { var BezEl=document.getElementById('BezBland'); if(BezEl) { var ChangeTitle='YES'; } else { var ChangeTitle='NO'; } skript=document.createElement('SCRIPT'); skript.setAttribute('src','daten_BlandCheck.php?land='+land+'&ChangeTitle='+ChangeTitle+'&SID='); document.getElementsByTagName('BODY')[0].appendChild(skript); }