(function () {
function formatISO(date) {
var year = date.getFullYear();
var month = String(date.getMonth() + 1).padStart(2, '0');
var day = String(date.getDate()).padStart(2, '0');
return year + '-' + month + '-' + day;
}
function addDays(date, days) {
var result = new Date(
date.getFullYear(),
date.getMonth(),
date.getDate()
);
result.setDate(result.getDate() + days);
return result;
}
function getDateFromInput(input) {
if (!input || !input.value) {
return null;
}
var parts = input.value.split('-');
if (parts.length !== 3) {
return null;
}
return new Date(
Number(parts[0]),
Number(parts[1]) - 1,
Number(parts[2])
);
}
/* Ostersonntag berechnen */
function getEasterSunday(year) {
var a = year % 19;
var b = Math.floor(year / 100);
var c = year % 100;
var d = Math.floor(b / 4);
var e = b % 4;
var f = Math.floor((b + 8) / 25);
var g = Math.floor((b - f + 1) / 3);
var h = (19 * a + b - d - g + 15) % 30;
var i = Math.floor(c / 4);
var k = c % 4;
var l = (32 + 2 * e + 2 * i - h - k) % 7;
var m = Math.floor((a + 11 * h + 22 * l) / 451);
var month = Math.floor((h + l - 7 * m + 114) / 31);
var day = ((h + l - 7 * m + 114) % 31) + 1;
return new Date(year, month - 1, day);
}
/* bundesweit geltende Feiertage */
function getGermanNationalHolidays(year) {
var easter = getEasterSunday(year);
return [
new Date(year, 0, 1), /* Neujahr */
addDays(easter, -2), /* Karfreitag */
addDays(easter, 1), /* Ostermontag */
new Date(year, 4, 1), /* Tag der Arbeit */
addDays(easter, 39), /* Christi Himmelfahrt */
addDays(easter, 50), /* Pfingstmontag */
new Date(year, 9, 3), /* Tag der Deutschen Einheit */
new Date(year, 11, 25), /* 1. Weihnachtstag */
new Date(year, 11, 26) /* 2. Weihnachtstag */
];
}
function isNationalHoliday(date) {
var holidays = getGermanNationalHolidays(date.getFullYear());
var iso = formatISO(date);
return holidays.some(function (holiday) {
return formatISO(holiday) === iso;
});
}
function isWeekend(date) {
var day = date.getDay();
return day === 0 || day === 6;
}
function isAllowedDate(date) {
return !isWeekend(date) && !isNationalHoliday(date);
}
function getNextAllowedDate(date) {
var result = new Date(date);
while (!isAllowedDate(result)) {
result = addDays(result, 1);
}
return result;
}
function getPreviousAllowedDate(date) {
var result = new Date(date);
while (!isAllowedDate(result)) {
result = addDays(result, -1);
}
return result;
}
function initDateFields() {
var abholung =
document.querySelector('#form-field-datum_abholung') ||
document.querySelector('[name="form_fields[datum_abholung]"]');
var rueckgabe =
document.querySelector('#form-field-datum_rueckgabe') ||
document.querySelector('[name="form_fields[datum_rueckgabe]"]');
var mietart =
document.querySelector('#form-field-mietart') ||
document.querySelector('[name="form_fields[mietart]"]');
if (!abholung || !rueckgabe || !mietart) {
return false;
}
if (abholung.dataset.dateSetup === '1') {
return true;
}
abholung.dataset.dateSetup = '1';
function isKurzzeitmiete() {
return mietart.value.toLowerCase().includes('kurzzeitmiete');
}
function isLangzeitmiete() {
return mietart.value.toLowerCase().includes('langzeitmiete');
}
function triggerChange(input) {
input.dispatchEvent(
new Event('input', { bubbles: true })
);
input.dispatchEvent(
new Event('change', { bubbles: true })
);
}
function updateRueckgabeGrenzen() {
var abholDatum = getDateFromInput(abholung);
if (!abholDatum) {
return;
}
/* falls ungültiger Abholtag gewählt wurde */
if (!isAllowedDate(abholDatum)) {
abholDatum = getNextAllowedDate(abholDatum);
abholung.value = formatISO(abholDatum);
triggerChange(abholung);
return;
}
/* KURZZEITMIETE: 1 bis 29 Tage */
if (isKurzzeitmiete()) {
var minKurz = getNextAllowedDate(
addDays(abholDatum, 1)
);
var absolutMaxKurz = addDays(abholDatum, 29);
var maxKurz = getPreviousAllowedDate(
absolutMaxKurz
);
var minKurzISO = formatISO(minKurz);
var maxKurzISO = formatISO(maxKurz);
rueckgabe.min = minKurzISO;
rueckgabe.max = maxKurzISO;
var rueckDatum = getDateFromInput(rueckgabe);
if (
!rueckDatum ||
rueckDatum maxKurz) {
rueckgabe.value = maxKurzISO;
triggerChange(rueckgabe);
return;
}
return;
}
/* LANGZEITMIETE: mindestens 30 Tage */
if (isLangzeitmiete()) {
var minLang = getNextAllowedDate(
addDays(abholDatum, 30)
);
var minLangISO = formatISO(minLang);
rueckgabe.min = minLangISO;
rueckgabe.removeAttribute('max');
var rueckLang = getDateFromInput(rueckgabe);
if (
!rueckLang ||
rueckLang < minLang ||
!isAllowedDate(rueckLang)
) {
rueckgabe.value = minLangISO;
triggerChange(rueckgabe);
}
return;
}
}
function validateAbholung() {
var date = getDateFromInput(abholung);
if (!date) {
return;
}
var heute = new Date();
heute.setHours(0, 0, 0, 0);
var fruehesteAbholung = getNextAllowedDate(
addDays(heute, 1)
);
if (
date < fruehesteAbholung ||
!isAllowedDate(date)
) {
abholung.value = formatISO(
date max) {
corrected = getPreviousAllowedDate(max);
}
}
rueckgabe.value = formatISO(corrected);
triggerChange(rueckgabe);
return;
}
updateRueckgabeGrenzen();
}
/* STARTWERTE */
var heute = new Date();
heute.setHours(0, 0, 0, 0);
/* Abholung = morgen bzw. nächster erlaubter Tag */
var ersteAbholung = getNextAllowedDate(
addDays(heute, 1)
);
abholung.min = formatISO(ersteAbholung);
abholung.value = formatISO(ersteAbholung);
/* Rückgabe passend zur Mietart */
if (isLangzeitmiete()) {
rueckgabe.value = formatISO(
getNextAllowedDate(
addDays(ersteAbholung, 30)
)
);
} else {
rueckgabe.value = formatISO(
getNextAllowedDate(
addDays(ersteAbholung, 1)
)
);
}
updateRueckgabeGrenzen();
/* EVENTS */
abholung.addEventListener(
'input',
validateAbholung
);
abholung.addEventListener(
'change',
validateAbholung
);
rueckgabe.addEventListener(
'input',
validateRueckgabe
);
rueckgabe.addEventListener(
'change',
validateRueckgabe
);
mietart.addEventListener(
'input',
updateRueckgabeGrenzen
);
mietart.addEventListener(
'change',
function () {
var pickup =
getDateFromInput(abholung);
if (!pickup) {
return;
}
if (isLangzeitmiete()) {
rueckgabe.value = formatISO(
getNextAllowedDate(
addDays(pickup, 30)
)
);
} else {
rueckgabe.value = formatISO(
getNextAllowedDate(
addDays(pickup, 1)
)
);
}
updateRueckgabeGrenzen();
}
);
return true;
}
if (initDateFields()) {
return;
}
var versuche = 0;
var timer = setInterval(function () {
versuche++;
if (
initDateFields() ||
versuche >= 50
) {
clearInterval(timer);
}
}, 200);
})();