Your cart
Adjust seats and finalize your enrollment.
| Course |
Format |
Price |
Qty |
Subtotal |
Action |
Checkout confirmation
Thank you. We’ll email enrollment instructions after payment. For PO-based purchases, our team will reach out within one business day.
`;
document.getElementById('site-header').innerHTML = headerHTML;
document.getElementById('site-footer').innerHTML = footerHTML;
// Theme toggle
function toggleTheme() {
if (document.documentElement.classList.contains('dark')) {
document.documentElement.classList.remove('dark');
localStorage.setItem('gms-theme', 'light');
} else {
document.documentElement.classList.add('dark');
localStorage.setItem('gms-theme', 'dark');
}
}
document.getElementById('btn-theme').addEventListener('click', function(e) {
e.preventDefault();
toggleTheme();
});
document.getElementById('btn-theme-mobile').addEventListener('click', function(e) {
e.preventDefault();
toggleTheme();
});
// Mobile menu
const toggle = document.getElementById('mobile-menu-toggle');
const mobile = document.getElementById('mobile-menu');
toggle.addEventListener('click', () => {
mobile.classList.toggle('hidden');
});
// Cookie banner
const banner = document.getElementById('cookie-banner');
const acceptBtn = document.getElementById('cookie-accept');
const COOKIE_KEY = 'gm_cookie_consent';
function showBanner() {
if (!localStorage.getItem(COOKIE_KEY)) {
banner.classList.remove('hidden');
banner.classList.add('flex');
}
}
function hideBanner() {
banner.classList.add('hidden');
banner.classList.remove('flex');
}
if (acceptBtn) {
acceptBtn.addEventListener('click', function() {
localStorage.setItem(COOKIE_KEY, 'accepted');
hideBanner();
});
}
setTimeout(showBanner, 1200);
// Cart functionality
function loadCart() {
return JSON.parse(localStorage.getItem('gms-cart') || '[]');
}
function saveCart(items) {
localStorage.setItem('gms-cart', JSON.stringify(items));
}
async function renderCart() {
const items = loadCart();
const empty = document.getElementById('empty-cart');
const section = document.getElementById('cart-section');
const body = document.getElementById('cart-body');
const countEl = document.getElementById('cart-count');
const totalEl = document.getElementById('cart-total');
if (!items.length) {
empty.classList.remove('hidden');
section.classList.add('hidden');
return;
}
try {
const res = await fetch('./catalog.json');
const data = await res.json();
let total = 0;
body.innerHTML = '';
items.forEach((it, idx) => {
const c = data.find(d => d.id === it.id);
if (!c) return;
const subtotal = c.price * it.qty;
total += subtotal;
const tr = document.createElement('tr');
tr.innerHTML = `
${c.title}
${c.category} • ${c.level}
|
${c.format} |
USD $${c.price} |
|
USD $${subtotal} |
Remove
|
`;
const qtyInput = tr.querySelector('input');
qtyInput.addEventListener('change', (e) => {
const v = Math.max(1, parseInt(e.target.value, 10) || 1);
items[idx].qty = v;
saveCart(items);
renderCart();
});
const rm = tr.querySelector('a');
rm.addEventListener('click', (e) => {
e.preventDefault();
items.splice(idx, 1);
saveCart(items);
renderCart();
});
body.appendChild(tr);
});
countEl.textContent = items.reduce((s, i) => s + i.qty, 0);
totalEl.textContent = total.toFixed(2);
empty.classList.add('hidden');
section.classList.remove('hidden');
document.getElementById('checkout-btn').addEventListener('click', (e) => {
e.preventDefault();
const m = document.getElementById('checkout-modal');
m.classList.remove('hidden');
m.classList.add('flex');
});
document.querySelectorAll('[data-close="checkout-modal"]').forEach(n => {
n.addEventListener('click', () => {
const m = document.getElementById('checkout-modal');
m.classList.add('hidden');
m.classList.remove('flex');
});
});
} catch (err) {
console.error('Failed to load catalog');
}
}
document.addEventListener('DOMContentLoaded', renderCart);
})();