BODY MIND SOUL BALANCING – COOKIE BANNER
/* ==========================================================
BODY MIND SOUL BALANCING
Cookie Consent JavaScript
========================================================== */
document.addEventListener(„DOMContentLoaded“, function () {
const STORAGE_KEY = „bms_cookie_consent_v1“;
const banner = document.getElementById(„bms-cookie-banner“);
const settings = document.getElementById(„bms-cookie-settings“);
const acceptAllButton = document.getElementById(„bms-accept-all“);
const rejectAllButton = document.getElementById(„bms-reject-all“);
const settingsButton = document.getElementById(„bms-open-settings“);
const saveButton = document.getElementById(„bms-save-settings“);
if (!banner) {
return;
}
/* ——————————————————
Grundeinstellungen
—————————————————— */
const defaultConsent = {
necessary: true,
maps: false,
youtube: false,
fonts: false,
timestamp: null
};
/* ——————————————————
Schalter automatisch in Einstellungen einfügen
—————————————————— */
function createSwitch(categoryElement, categoryName) {
if (!categoryElement) {
return;
}
const title = categoryElement.querySelector(
„.bms-cookie-category-title“
);
if (!title) {
return;
}
/* notwendige Cookies bekommen keinen Schalter */
if (categoryName === „necessary“) {
return;
}
const wrapper = document.createElement(„label“);
wrapper.style.display = „flex“;
wrapper.style.alignItems = „center“;
wrapper.style.gap = „10px“;
wrapper.style.marginTop = „12px“;
wrapper.style.cursor = „pointer“;
const checkbox = document.createElement(„input“);
checkbox.type = „checkbox“;
checkbox.id = „bms-consent-“ + categoryName;
checkbox.dataset.category = categoryName;
checkbox.style.width = „18px“;
checkbox.style.height = „18px“;
checkbox.style.cursor = „pointer“;
const text = document.createElement(„span“);
text.textContent = „Zulassen“;
text.style.fontSize = „13px“;
wrapper.appendChild(checkbox);
wrapper.appendChild(text);
categoryElement.appendChild(wrapper);
}
/* Kategorien des bestehenden HTML-Banners erkennen */
const categories = document.querySelectorAll(
„.bms-cookie-category“
);
categories.forEach(function (category) {
const title = category
.querySelector(„.bms-cookie-category-title“);
if (!title) {
return;
}
const name = title.textContent.toLowerCase();
if (name.includes(„google maps“)) {
createSwitch(category, „maps“);
}
if (name.includes(„youtube“)) {
createSwitch(category, „youtube“);
}
if (name.includes(„google fonts“)) {
createSwitch(category, „fonts“);
}
});
/* ——————————————————
Zustimmung laden
—————————————————— */
function getConsent() {
try {
const saved =
localStorage.getItem(STORAGE_KEY);
if (!saved) {
return null;
}
return JSON.parse(saved);
} catch (error) {
console.warn(
„Cookie-Einstellungen konnten nicht gelesen werden.“,
error
);
return null;
}
}
/* ——————————————————
Zustimmung speichern
—————————————————— */
function saveConsent(consent) {
consent.necessary = true;
consent.timestamp =
new Date().toISOString();
try {
localStorage.setItem(
STORAGE_KEY,
JSON.stringify(consent)
);
} catch (error) {
console.warn(
„Cookie-Einstellungen konnten nicht gespeichert werden.“,
error
);
}
applyConsent(consent);
banner.style.display = „none“;
/*
Eigenes Event.
Andere Skripte können darauf reagieren.
*/
document.dispatchEvent(
new CustomEvent(
„bmsConsentChanged“,
{
detail: consent
}
)
);
}
/* ——————————————————
Alle akzeptieren
—————————————————— */
function acceptAll() {
saveConsent({
necessary: true,
maps: true,
youtube: true,
fonts: true
});
}
/* ——————————————————
Alle ablehnen
—————————————————— */
function rejectAll() {
saveConsent({
necessary: true,
maps: false,
youtube: false,
fonts: false
});
}
/* ——————————————————
Individuelle Auswahl speichern
—————————————————— */
function saveSelection() {
const maps =
document.getElementById(
„bms-consent-maps“
);
const youtube =
document.getElementById(
„bms-consent-youtube“
);
const fonts =
document.getElementById(
„bms-consent-fonts“
);
saveConsent({
necessary: true,
maps:
maps ?
maps.checked :
false,
youtube:
youtube ?
youtube.checked :
false,
fonts:
fonts ?
fonts.checked :
false
});
}
/* ——————————————————
Schalter mit gespeicherten Werten befüllen
—————————————————— */
function updateSwitches(consent) {
const maps =
document.getElementById(
„bms-consent-maps“
);
const youtube =
document.getElementById(
„bms-consent-youtube“
);
const fonts =
document.getElementById(
„bms-consent-fonts“
);
if (maps) {
maps.checked =
!!consent.maps;
}
if (youtube) {
youtube.checked =
!!consent.youtube;
}
if (fonts) {
fonts.checked =
!!consent.fonts;
}
}
/* ——————————————————
Zustimmung anwenden
—————————————————— */
function applyConsent(consent) {
if (!consent) {
return;
}
updateSwitches(consent);
/*
Google Maps aktivieren
*/
if (consent.maps) {
activateDeferredElements(„maps“);
}
/*
YouTube aktivieren
*/
if (consent.youtube) {
activateDeferredElements(„youtube“);
}
/*
Google Fonts aktivieren
*/
if (consent.fonts) {
activateDeferredElements(„fonts“);
}
}
/* ——————————————————
Blockierte Inhalte aktivieren
Erwartet Elemente wie:
data-bms-category=“youtube“
data-src=“…“
—————————————————— */
function activateDeferredElements(category) {
/*
IFAMES:
YouTube / Google Maps
*/
const frames =
document.querySelectorAll(
‚iframe[data-bms-category=“‚ +
category +
‚“][data-src]‘
);
frames.forEach(function (frame) {
if (!frame.src) {
frame.src =
frame.dataset.src;
}
});
/*
Google Fonts Stylesheets
*/
const links =
document.querySelectorAll(
‚link[data-bms-category=“‚ +
category +
‚“][data-href]‘
);
links.forEach(function (link) {
if (!link.href) {
link.href =
link.dataset.href;
}
});
/*
Blockierte externe Skripte
*/
const scripts =
document.querySelectorAll(
’script[type=“text/plain“]‘ +
‚[data-bms-category=“‚ +
category +
‚“]‘
);
scripts.forEach(function (oldScript) {
if (
oldScript.dataset.bmsActivated ===
„true“
) {
return;
}
const newScript =
document.createElement(„script“);
if (oldScript.dataset.src) {
newScript.src =
oldScript.dataset.src;
} else {
newScript.textContent =
oldScript.textContent;
}
oldScript.dataset.bmsActivated =
„true“;
document.head.appendChild(
newScript
);
});
}
/* ——————————————————
Einstellungen öffnen
—————————————————— */
function openSettings() {
banner.style.display = „block“;
if (settings) {
settings.style.display = „block“;
}
const saved = getConsent();
if (saved) {
updateSwitches(saved);
}
}
/* ——————————————————
Beim ersten Seitenaufruf
—————————————————— */
const savedConsent = getConsent();
if (savedConsent) {
banner.style.display = „none“;
applyConsent(savedConsent);
} else {
banner.style.display = „block“;
/*
Einstellungen am Anfang einklappen
*/
if (settings) {
settings.style.display = „none“;
}
}
/* ——————————————————
Buttons
—————————————————— */
if (acceptAllButton) {
acceptAllButton.addEventListener(
„click“,
acceptAll
);
}
if (rejectAllButton) {
rejectAllButton.addEventListener(
„click“,
rejectAll
);
}
if (settingsButton) {
settingsButton.addEventListener(
„click“,
function () {
if (!settings) {
return;
}
if (
settings.style.display ===
„block“
) {
settings.style.display =
„none“;
} else {
settings.style.display =
„block“;
}
}
);
}
if (saveButton) {
saveButton.addEventListener(
„click“,
saveSelection
);
}
/* ——————————————————
Öffentliche Funktionen
Damit kannst du später z.B. im Footer einen
Link „Cookie-Einstellungen“ einbauen.
—————————————————— */
window.BMSCookieConsent = {
open: openSettings,
acceptAll: acceptAll,
rejectAll: rejectAll,
getConsent: getConsent,
reset: function () {
localStorage.removeItem(
STORAGE_KEY
);
location.reload();
}
};
});
