// 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();
});