// AffLink Main JavaScript // Format date timestamps function formatDateTime(dateString) { if (!dateString) return 'Never'; const date = new Date(dateString); return date.toLocaleString(); } // Format relative time (e.g., "2 hours ago") function formatRelativeTime(dateString) { if (!dateString) return 'Never'; const date = new Date(dateString); const now = new Date(); const diffMs = now - date; const diffSec = Math.floor(diffMs / 1000); const diffMin = Math.floor(diffSec / 60); const diffHour = Math.floor(diffMin / 60); const diffDay = Math.floor(diffHour / 24); if (diffDay > 30) { return formatDateTime(dateString); } else if (diffDay > 0) { return diffDay + (diffDay === 1 ? ' day ago' : ' days ago'); } else if (diffHour > 0) { return diffHour + (diffHour === 1 ? ' hour ago' : ' hours ago'); } else if (diffMin > 0) { return diffMin + (diffMin === 1 ? ' minute ago' : ' minutes ago'); } else { return 'Just now'; } } // Get a status badge HTML based on link status function getStatusBadge(status) { const badges = { 'active': 'Active', 'broken': 'Broken', 'redirected': 'Redirected', 'out_of_stock': 'Out of Stock', 'unknown': 'Unknown' }; return badges[status] || badges['unknown']; } // Initialize tooltips and popovers document.addEventListener('DOMContentLoaded', function() { // Initialize Bootstrap tooltips const tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="tooltip"]')); tooltipTriggerList.map(function (tooltipTriggerEl) { return new bootstrap.Tooltip(tooltipTriggerEl); }); // Initialize Bootstrap popovers const popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]')); popoverTriggerList.map(function (popoverTriggerEl) { return new bootstrap.Popover(popoverTriggerEl); }); // Format all datetime elements const datetimeElements = document.querySelectorAll('.datetime'); datetimeElements.forEach(element => { const timestamp = element.getAttribute('data-timestamp'); if (timestamp) { element.textContent = formatDateTime(timestamp); } }); // Format all relative time elements const relativeTimeElements = document.querySelectorAll('.relative-time'); relativeTimeElements.forEach(element => { const timestamp = element.getAttribute('data-timestamp'); if (timestamp) { element.textContent = formatRelativeTime(timestamp); } }); });