File size: 3,591 Bytes
3577aec |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
// Main JavaScript for NileFlow Express Logistics
// Initialize when DOM is loaded
document.addEventListener('DOMContentLoaded', function() {
initializeAnimations();
initializeTrackingForm();
initializeServiceCards();
});
// Initialize scroll animations
function initializeAnimations() {
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver(function(entries) {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('fade-in-up');
observer.unobserve(entry.target);
}
});
}, observerOptions);
// Observe all sections for animation
document.querySelectorAll('section').forEach(section => {
observer.observe(section);
});
}
// Initialize tracking form functionality
function initializeTrackingForm() {
const trackingForm = document.querySelector('#tracking-form');
if (trackingForm) {
trackingForm.addEventListener('submit', function(e) {
e.preventDefault();
const trackingNumber = this.querySelector('input[type="text"]').value;
if (trackingNumber.trim()) {
window.location.href = `/tracking?number=${encodeURIComponent(trackingNumber)}`;
}
});
}
}
// Initialize service cards interactions
function initializeServiceCards() {
const serviceCards = document.querySelectorAll('.service-card');
serviceCards.forEach(card => {
card.addEventListener('mouseenter', function() {
this.style.transform = 'translateY(-10px)';
this.style.boxShadow = '0 20px 40px rgba(0,0,0,0.1)';
});
card.addEventListener('mouseleave', function() {
this.style.transform = 'translateY(0)';
this.style.boxShadow = '0 10px 30px rgba(0,0,0,0.08)';
});
});
}
// API integration for tracking (placeholder)
async function fetchTrackingInfo(trackingNumber) {
try {
// This would be replaced with actual API endpoint
const response = await fetch(`/api/tracking/${trackingNumber}`);
const data = await response.json();
return data;
} catch (error) {
console.error('Error fetching tracking info:', error);
return null;
}
}
// Smooth scroll to section
function scrollToSection(sectionId) {
const element = document.getElementById(sectionId);
if (element) {
element.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
}
// Mobile menu toggle (for navigation component)
function toggleMobileMenu() {
const mobileMenu = document.querySelector('#mobile-menu');
if (mobileMenu) {
mobileMenu.classList.toggle('hidden');
}
}
// Form validation for contact forms
function validateForm(form) {
const inputs = form.querySelectorAll('input[required], textarea[required]');
let isValid = true;
inputs.forEach(input => {
if (!input.value.trim()) {
input.classList.add('border-red-500');
isValid = false;
} else {
input.classList.remove('border-red-500');
}
});
return isValid;
}
// Debounce function for search inputs
function debounce(func, wait) {
let timeout;
return function executedFunction(...args) {
const later = () => {
clearTimeout(timeout);
func(...args);
};
clearTimeout(timeout);
timeout = setTimeout(later, wait);
};
} |