(function(){
// cookie helpers
function setCookie(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days*24*60*60*1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + (value || "") + expires + "; path=/; SameSite=Lax";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
}
return null;
}
// Build modal markup
function buildModal() {
var overlay = document.createElement('div');
overlay.className = 'cf-overlay';
overlay.id = 'cfOverlay';
overlay.setAttribute('aria-hidden','false');
var modal = document.createElement('div');
modal.className = 'cf-modal';
modal.setAttribute('role','dialog');
modal.setAttribute('aria-modal','true');
modal.setAttribute('aria-label','Cookie consent');
modal.innerHTML = '\
\
\
We use cookies to improve your browsing experience.\
\
This website uses cookies to enhance site navigation, analyse site usage, \
and provide personalised content. By clicking "ACCEPT", you agree to our cookie policy.\
';
overlay.appendChild(modal);
return overlay;
}
// Utility: get all focusable elements inside container
function getFocusable(el) {
return el.querySelectorAll('a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex="-1"])');
}
// Show modal (blocking)
function showModal() {
if (document.getElementById('cfOverlay')) return;
var overlay = buildModal();
document.body.appendChild(overlay);
// block scroll and remember previous focus
var previousActive = document.activeElement;
document.body.style.overflow = 'hidden';
// show
setTimeout(function(){ overlay.classList.add('show'); }, 20);
// focus management: trap focus inside modal
var modal = overlay.querySelector('.cf-modal');
var focusable = Array.prototype.slice.call(getFocusable(modal));
var firstFocusable = focusable[0];
var lastFocusable = focusable[focusable.length-1];
// focus first interactive element (ACCEPT)
var acceptBtn = document.getElementById('cfAccept');
if (acceptBtn) acceptBtn.focus();
// keydown handler to trap Tab and disable Escape
function onKeyDown(e) {
if (e.key === 'Escape' || e.key === 'Esc') {
// prevent ESC from closing modal
e.preventDefault();
e.stopPropagation();
return;
}
if (e.key === 'Tab') {
if (focusable.length === 0) {
e.preventDefault();
return;
}
// forward tab
if (!e.shiftKey && document.activeElement === lastFocusable) {
e.preventDefault();
firstFocusable.focus();
}
// backward tab
else if (e.shiftKey && document.activeElement === firstFocusable) {
e.preventDefault();
lastFocusable.focus();
}
}
}
document.addEventListener('keydown', onKeyDown, true);
// Event handlers
document.getElementById('cfAccept').addEventListener('click', function(){
setCookie('cookie_consent','1',365);
cleanup();
});
document.getElementById('cfClose').addEventListener('click', function(){
// Close without consent (does NOT set cookie)
cleanup();
});
document.getElementById('cfCloseX').addEventListener('click', function(){
cleanup();
});
// IMPORTANT: DO NOT close when clicking overlay background — user must click Accept or Close
// overlay.addEventListener('click', function(e){
// if (e.target === overlay) cleanup(); // disabled on purpose
// });
// cleanup function
function cleanup() {
overlay.classList.remove('show');
setTimeout(function(){
if (overlay && overlay.parentNode) overlay.parentNode.removeChild(overlay);
document.body.style.overflow = '';
document.removeEventListener('keydown', onKeyDown, true);
try { if (previousActive) previousActive.focus(); } catch (e) {}
}, 150);
}
}
// init: show modal if cookie not set
// dan HANYA di homepage
var path = window.location.pathname.replace(/\/+$/, '');
var isHome = (path === ''); // "/" akan jadi "" setelah replace di atas
if (isHome && !getCookie('cookie_consent')) {
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', showModal);
} else {
showModal();
}
}
})();