// Utility Functions // Show Toast Notification function showToast(message, type = 'info', title = '') { const container = document.getElementById('toastContainer'); const toast = document.createElement('div'); toast.className = `toast ${type}`; const icons = { success: 'fa-check-circle', error: 'fa-exclamation-circle', warning: 'fa-exclamation-triangle', info: 'fa-info-circle' }; toast.innerHTML = `
${title ? `
${title}
` : ''}
${message}
`; container.appendChild(toast); setTimeout(() => { toast.remove(); }, 5000); } // Show Loading Overlay function showLoading() { document.getElementById('loadingOverlay').classList.add('active'); } // Hide Loading Overlay function hideLoading() { document.getElementById('loadingOverlay').classList.remove('active'); } // Format Currency function formatCurrency(amount) { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(amount); } // Format Date function formatDate(date) { return new Intl.DateTimeFormat('en-US', { year: 'numeric', month: 'short', day: 'numeric' }).format(new Date(date)); } // Format Relative Time function formatRelativeTime(date) { const now = new Date(); const diff = now - new Date(date); const seconds = Math.floor(diff / 1000); const minutes = Math.floor(seconds / 60); const hours = Math.floor(minutes / 60); const days = Math.floor(hours / 24); if (days > 0) return `${days} day${days > 1 ? 's' : ''} ago`; if (hours > 0) return `${hours} hour${hours > 1 ? 's' : ''} ago`; if (minutes > 0) return `${minutes} minute${minutes > 1 ? 's' : ''} ago`; return 'Just now'; } // Debounce Function function debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } // Export to CSV function exportToCSV(data, filename) { const csv = convertToCSV(data); const blob = new Blob([csv], {type: 'text/csv'}); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; a.click(); window.URL.revokeObjectURL(url); } function convertToCSV(data) { if (!data || data.length === 0) return ''; const headers = Object.keys(data[0]); const csvRows = []; csvRows.push(headers.join(',')); for (const row of data) { const values = headers.map(header => { const value = row[header]; return `"${value}"`; }); csvRows.push(values.join(',')); } return csvRows.join('\n'); } // Local Storage Helper const storage = { set: (key, value) => { try { localStorage.setItem(key, JSON.stringify(value)); } catch (e) { console.error('Error saving to localStorage', e); } }, get: (key) => { try { const item = localStorage.getItem(key); return item ? JSON.parse(item) : null; } catch (e) { console.error('Error reading from localStorage', e); return null; } }, remove: (key) => { try { localStorage.removeItem(key); } catch (e) { console.error('Error removing from localStorage', e); } } }; // Generate Random ID function generateId() { return Date.now().toString(36) + Math.random().toString(36).substr(2); } // Validate Email function isValidEmail(email) { const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return re.test(email); } // Validate Form function validateForm(formElement) { const inputs = formElement.querySelectorAll('input[required], select[required], textarea[required]'); let isValid = true; inputs.forEach(input => { if (!input.value.trim()) { isValid = false; input.classList.add('error'); } else { input.classList.remove('error'); } if (input.type === 'email' && input.value && !isValidEmail(input.value)) { isValid = false; input.classList.add('error'); } }); return isValid; }