// Explain: App entry point and core functionality. document.addEventListener('DOMContentLoaded', function () { function formatMoney(amount) { if (window.CurrencySystem && typeof window.CurrencySystem.format === 'function') { return window.CurrencySystem.format(amount); } return String(amount); } function showToast(text) { var existing = document.getElementById('ayToast'); if (existing) { existing.remove(); } var toast = document.createElement('div'); toast.id = 'ayToast'; toast.className = 'fixed bottom-6 left-1/2 z-[60] -translate-x-1/2 rounded-full bg-[var(--primary-color)] px-6 py-3 text-sm font-semibold text-white shadow-lg'; toast.textContent = text; document.body.appendChild(toast); window.setTimeout(function () { toast.remove(); }, 2600); } function initNav() { var toggle = document.getElementById('navToggle'); var panel = document.getElementById('mobileNav'); if (!toggle || !panel) { return; } function setIcon(name) { var icon = toggle.querySelector('i'); if (icon) { icon.className = 'fa-solid ' + name; } } function closeMenu() { panel.classList.add('hidden'); toggle.setAttribute('aria-expanded', 'false'); setIcon('fa-bars'); } function openMenu() { panel.classList.remove('hidden'); toggle.setAttribute('aria-expanded', 'true'); setIcon('fa-xmark'); } toggle.addEventListener('click', function (event) { event.stopPropagation(); if (panel.classList.contains('hidden')) { openMenu(); } else { closeMenu(); } }); panel.querySelectorAll('a').forEach(function (link) { link.addEventListener('click', closeMenu); }); document.addEventListener('keydown', function (event) { if (event.key === 'Escape') { closeMenu(); } }); document.addEventListener('click', function (event) { if (panel.classList.contains('hidden')) { return; } if (!panel.contains(event.target) && !toggle.contains(event.target)) { closeMenu(); } }); } function refreshCartBadge() { if (!window.OrderSystem) { return; } window.OrderSystem.getCart().then(function (res) { if (!res || !res.success) { return; } var count = (res.cart || []).reduce(function (sum, item) { return sum + Number(item.count || 0); }, 0); var badge = document.getElementById('cartBadge'); if (!badge) { return; } if (count > 0) { badge.textContent = String(count); badge.classList.remove('hidden'); } else { badge.classList.add('hidden'); } }).catch(function () {}); } function initBuyButtons() { document.addEventListener('click', function (event) { var btn = event.target.closest('[data-buy-uid]'); if (!btn || !window.OrderSystem) { return; } event.preventDefault(); var uid = btn.getAttribute('data-buy-uid'); var original = btn.innerHTML; btn.disabled = true; btn.innerHTML = ' Adding'; window.OrderSystem.addToCart({ unique_id_txt: uid }, 1).then(function (res) { btn.disabled = false; if (res && res.success) { btn.innerHTML = ' Added'; refreshCartBadge(); showToast('Added to your basket'); window.setTimeout(function () { btn.innerHTML = original; }, 1600); } else { btn.innerHTML = original; showToast((res && res.error) ? res.error : 'Could not add that item'); } }).catch(function () { btn.disabled = false; btn.innerHTML = original; showToast('Could not add that item. Please try again.'); }); }); } function initCartPage() { var itemsWrap = document.getElementById('cartItems'); if (!itemsWrap || !window.OrderSystem) { return; } var emptyEl = document.getElementById('cartEmpty'); var summaryEl = document.getElementById('cartSummary'); var subtotalEl = document.getElementById('cartSubtotal'); function renderEmpty() { itemsWrap.innerHTML = ''; if (emptyEl) { emptyEl.classList.remove('hidden'); } if (summaryEl) { summaryEl.classList.add('hidden'); } } function buildCartRow(item, reload) { var price = Number(item.price || 0); var qty = Number(item.count || 1); var row = document.createElement('div'); row.className = 'flex flex-wrap items-center gap-4 border-b border-[var(--border-color)] py-4'; row.innerHTML = '
' + '' + '
' + '
' + '

' + '

' + '
' + '
' + '' + '' + '' + '
' + '' + ''; var nameEl = row.querySelector('[data-role="name"]'); var unitEl = row.querySelector('[data-role="unit"]'); var qtyEl = row.querySelector('[data-role="qty"]'); var lineEl = row.querySelector('[data-role="line"]'); var imageEl = row.querySelector('[data-role="image"]'); nameEl.textContent = item.name || 'Ayurvedic product'; unitEl.textContent = formatMoney(price) + ' each'; qtyEl.textContent = String(qty); lineEl.textContent = formatMoney(price * qty); imageEl.alt = item.name || 'Ayurvedic product'; imageEl.src = item.productImage || 'https://files.cdn-files-a.com/uploads/12442098/normal_gi-6ac76905a8f93.jpg?format=avif'; function updateQuantity(next) { window.OrderSystem.updateCartItemAmount(item.id, next).then(function (res) { if (res && res.success) { reload(); refreshCartBadge(); } else { showToast('Could not update the quantity'); } }).catch(function () { showToast('Could not update the quantity'); }); } function removeItem() { window.OrderSystem.removeCartItem(item.id).then(function (res) { if (res && res.success) { reload(); refreshCartBadge(); showToast('Item removed'); } else { showToast('Could not remove that item'); } }).catch(function () { showToast('Could not remove that item'); }); } row.querySelector('[data-role="minus"]').addEventListener('click', function () { if (qty <= 1) { removeItem(); return; } updateQuantity(qty - 1); }); row.querySelector('[data-role="plus"]').addEventListener('click', function () { if (qty >= 999) { return; } updateQuantity(qty + 1); }); row.querySelector('[data-role="remove"]').addEventListener('click', removeItem); return row; } function loadCart() { window.OrderSystem.getCart().then(function (res) { if (!res || !res.success) { renderEmpty(); return; } var cart = res.cart || []; if (!cart.length) { renderEmpty(); return; } if (emptyEl) { emptyEl.classList.add('hidden'); } if (summaryEl) { summaryEl.classList.remove('hidden'); } itemsWrap.innerHTML = ''; var subtotal = 0; cart.forEach(function (item) { subtotal += Number(item.price || 0) * Number(item.count || 1); itemsWrap.appendChild(buildCartRow(item, loadCart)); }); if (subtotalEl) { subtotalEl.textContent = formatMoney(subtotal); } }).catch(renderEmpty); } loadCart(); } function initCheckoutForm() { var form = document.getElementById('checkoutForm'); if (!form || !window.OrderSystem) { return; } var messageEl = document.getElementById('checkoutMessage'); function setMessage(text, isError) { if (!messageEl) { return; } messageEl.textContent = text; messageEl.className = isError ? 'text-sm font-medium text-red-600' : 'text-sm font-medium text-[var(--primary-color)]'; } form.addEventListener('submit', function (event) { event.preventDefault(); var email = form.email.value.trim(); var phone = form.phone.value.trim(); if (email.indexOf('@') === -1 || email.length < 5) { setMessage('Please enter a valid email address.', true); return; } if (phone.length < 6) { setMessage('Please enter a phone number so we can confirm your order.', true); return; } var submitBtn = form.querySelector('[type="submit"]'); var original = submitBtn.innerHTML; submitBtn.disabled = true; submitBtn.innerHTML = ' Processing'; var payload = { email: email, firstName: form.firstName.value.trim(), lastName: form.lastName.value.trim(), phone: phone, address: form.address.value.trim(), city: form.city.value.trim(), zip: form.zip.value.trim() }; window.OrderSystem.checkout(payload, form).then(function (res) { submitBtn.disabled = false; submitBtn.innerHTML = original; if (res && res.success) { setMessage('Thank you! Order ' + res.orderID + ' has been created.', false); } else { setMessage((res && res.error) ? res.error : 'We could not complete the order. Please call us.', true); } }).catch(function () { submitBtn.disabled = false; submitBtn.innerHTML = original; setMessage('We could not complete the order. Please try again or call us.', true); }); }); } initNav(); refreshCartBadge(); initBuyButtons(); initCartPage(); initCheckoutForm(); });