const Utils = { formatPrice(amount) { return amount.toLocaleString(CONFIG.LOCALE, { style: 'currency', currency: CONFIG.CURRENCY }); }, generateId() { return Date.now().toString(36) + Math.random().toString(36).substr(2); }, debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; }, showLoading() { State.isLoading = true; document.getElementById('loadingSpinner').style.display = 'flex'; }, hideLoading() { State.isLoading = false; document.getElementById('loadingSpinner').style.display = 'none'; }, validatePhone(phone) { return /^[0-9]{10}$/.test(phone); }, validateEmail(email) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); }, sanitizeHTML(str) { const div = document.createElement('div'); div.textContent = str; return div.innerHTML; }, getFormData(formElement) { const formData = new FormData(formElement); const data = {}; for (let [key, value] of formData.entries()) { data[key] = value; } return data; }, scrollTo(element, offset = 0) { const elementPosition = element.getBoundingClientRect().top; const offsetPosition = elementPosition + window.pageYOffset - offset; window.scrollTo({ top: offsetPosition, behavior: 'smooth' }); } }; // Storage Helper const Storage = { save(key, data) { try { localStorage.setItem(key, JSON.stringify(data)); return true; } catch (error) { console.error('Storage save error:', error); return false; } }, load(key) { try { const data = localStorage.getItem(key); return data ? JSON.parse(data) : null; } catch (error) { console.error('Storage load error:', error); return null; } }, remove(key) { try { localStorage.removeItem(key); return true; } catch (error) { console.error('Storage remove error:', error); return false; } }, clear() { try { localStorage.clear(); return true; } catch (error) { console.error('Storage clear error:', error); return false; } } };