/** * Hero Video Rotation System * Manages rotating background videos in hero section */ const HeroVideoRotation = { videos: [], currentIndex: 0, rotationInterval: null, isTransitioning: false, /** * Initialize the video rotation system */ init() { // Get all video elements this.videos = document.querySelectorAll('.hero-video'); if (!this.videos.length) return; // Setup event listeners this.setupEventListeners(); // Start rotation this.startRotation(); // Ensure first video is playing this.playVideo(0); }, /** * Setup event listeners for videos */ setupEventListeners() { // Indicators removed - no click handlers needed // Pause rotation on hover (optional) const heroSection = document.querySelector('.hero'); if (heroSection) { heroSection.addEventListener('mouseenter', () => { // Optional: pause rotation on hover // this.stopRotation(); }); heroSection.addEventListener('mouseleave', () => { // Optional: resume rotation // this.startRotation(); }); } // Handle video load errors gracefully this.videos.forEach((video, index) => { video.addEventListener('error', () => { console.warn(`Video ${index} failed to load, skipping...`); // If current video fails, move to next if (index === this.currentIndex) { this.nextVideo(); } }); // Ensure videos are ready to play video.addEventListener('loadeddata', () => { console.log(`Video ${index} loaded successfully`); }); }); }, /** * Start automatic rotation */ startRotation() { // Clear any existing interval this.stopRotation(); // Set new interval this.rotationInterval = setInterval(() => { this.nextVideo(); }, CONFIG.HERO_VIDEOS.ROTATION_INTERVAL); }, /** * Stop automatic rotation */ stopRotation() { if (this.rotationInterval) { clearInterval(this.rotationInterval); this.rotationInterval = null; } }, /** * Switch to next video */ nextVideo() { const nextIndex = (this.currentIndex + 1) % this.videos.length; this.switchToVideo(nextIndex); }, /** * Switch to previous video */ previousVideo() { const prevIndex = (this.currentIndex - 1 + this.videos.length) % this.videos.length; this.switchToVideo(prevIndex); }, /** * Switch to specific video by index * @param {number} index - Video index to switch to */ switchToVideo(index) { if (this.isTransitioning || index === this.currentIndex) return; this.isTransitioning = true; const currentVideo = this.videos[this.currentIndex]; const nextVideo = this.videos[index]; // Indicators removed - no update needed // Prepare next video this.prepareVideo(nextVideo); // Fade out current video currentVideo.classList.add('fading-out'); // After half the fade duration, start fading in the next video setTimeout(() => { nextVideo.classList.add('active'); nextVideo.classList.remove('fading-out'); // Play next video this.playVideo(index); }, CONFIG.HERO_VIDEOS.FADE_DURATION / 2); // Complete transition setTimeout(() => { currentVideo.classList.remove('active', 'fading-out'); this.currentIndex = index; this.isTransitioning = false; }, CONFIG.HERO_VIDEOS.FADE_DURATION); }, /** * Prepare video for playback * @param {HTMLVideoElement} video - Video element to prepare */ prepareVideo(video) { // Reset video to beginning video.currentTime = 0; // Ensure video is ready to play const playPromise = video.play(); if (playPromise !== undefined) { playPromise.catch(error => { console.warn('Video autoplay was prevented:', error); }); } }, /** * Play specific video * @param {number} index - Index of video to play */ playVideo(index) { const video = this.videos[index]; if (video) { const playPromise = video.play(); if (playPromise !== undefined) { playPromise.catch(error => { console.warn(`Could not play video ${index}:`, error); }); } } }, /** * Pause all videos */ pauseAllVideos() { this.videos.forEach(video => { video.pause(); }); }, /** * Handle page visibility change (pause when tab is not visible) */ handleVisibilityChange() { if (document.hidden) { this.stopRotation(); this.pauseAllVideos(); } else { this.playVideo(this.currentIndex); this.startRotation(); } } }; // Initialize when DOM is ready document.addEventListener('DOMContentLoaded', () => { HeroVideoRotation.init(); }); // Handle page visibility API document.addEventListener('visibilitychange', () => { HeroVideoRotation.handleVisibilityChange(); });