let currentStep = 1; let audioFiles = {}; let selectedAvatars = []; function nextStep() { if (validateCurrentStep()) { if (currentStep < 4) { document.querySelector(`.step[data-step="${currentStep}"]`).classList.remove('active'); document.getElementById(`step${currentStep}`).classList.remove('active'); currentStep++; document.querySelector(`.step[data-step="${currentStep}"]`).classList.add('active'); document.getElementById(`step${currentStep}`).classList.add('active'); if (currentStep === 4) { updateGenerationSummary(); } } } } function prevStep() { if (currentStep > 1) { document.querySelector(`.step[data-step="${currentStep}"]`).classList.remove('active'); document.getElementById(`step${currentStep}`).classList.remove('active'); currentStep--; document.querySelector(`.step[data-step="${currentStep}"]`).classList.add('active'); document.getElementById(`step${currentStep}`).classList.add('active'); } } function validateCurrentStep() { if (currentStep === 1) { const title = document.getElementById('videoTitle').value; if (!title) { showToast('Please enter a video title', 'error'); return false; } } else if (currentStep === 2) { const numSpeakers = parseInt(document.getElementById('numSpeakers').value); for (let i = 1; i <= numSpeakers; i++) { if (!audioFiles[i]) { showToast(`Please upload audio for Speaker ${i}`, 'error'); return false; } } } else if (currentStep === 3) { const numSpeakers = parseInt(document.getElementById('numSpeakers').value); const selectedOptions = document.querySelectorAll('.avatar-option.selected'); if (selectedOptions.length !== numSpeakers) { showToast(`Please select ${numSpeakers} avatars`, 'error'); return false; } } return true; } function updateSpeakerCount() { const numSpeakers = parseInt(document.getElementById('numSpeakers').value); const container = document.getElementById('audioUploadContainer'); if (currentStep === 1 || currentStep === 2) { container.innerHTML = ''; for (let i = 1; i <= numSpeakers; i++) { const audioItem = document.createElement('div'); audioItem.className = 'audio-upload-item'; audioItem.setAttribute('data-speaker', i); audioItem.innerHTML = `
Click to upload or drag & drop MP3, WAV, M4A (Max 120MB)
`; container.appendChild(audioItem); } } } function handleAudioUpload(input, speakerId) { const file = input.files[0]; if (file) { audioFiles[speakerId] = file; const preview = input.parentElement.querySelector('.audio-preview'); const uploadZone = input.parentElement.querySelector('.upload-zone'); const audioInfo = preview.querySelector('.audio-info'); preview.style.display = 'block'; uploadZone.style.display = 'none'; audioInfo.innerHTML = ` ${file.name}
Size: ${(file.size / 1024 / 1024).toFixed(2)} MB
Type: ${file.type} `; showToast(`Audio for Speaker ${speakerId} uploaded successfully`, 'success'); } } // Avatar selection document.addEventListener('DOMContentLoaded', function() { const avatarOptions = document.querySelectorAll('.avatar-option'); avatarOptions.forEach(option => { option.addEventListener('click', function() { const numSpeakers = parseInt(document.getElementById('numSpeakers').value); const selectedOptions = document.querySelectorAll('.avatar-option.selected'); if (selectedOptions.length >= numSpeakers && !this.classList.contains('selected')) { showToast(`You can only select ${numSpeakers} avatars`, 'info'); return; } this.classList.toggle('selected'); updateSelectedAvatars(); }); }); // Update speaker count on change document.getElementById('numSpeakers').addEventListener('change', updateSpeakerCount); // Initialize drag and drop initDragAndDrop(); }); function updateSelectedAvatars() { selectedAvatars = []; document.querySelectorAll('.avatar-option.selected').forEach(option => { selectedAvatars.push(option.dataset.avatar); }); } function updateGenerationSummary() { const duration = document.getElementById('duration').options[document.getElementById('duration').selectedIndex].text; const numSpeakers = document.getElementById('numSpeakers').value; const background = document.getElementById('background').options[document.getElementById('background').selectedIndex].text; document.getElementById('summaryDuration').textContent = duration; document.getElementById('summarySpeakers').textContent = numSpeakers; document.getElementById('summaryBackground').textContent = background; } function startGeneration() { const btn = event.target; const btnText = btn.querySelector('.btn-text'); const btnLoader = btn.querySelector('.btn-loader'); btnText.style.display = 'none'; btnLoader.style.display = 'inline-block'; btn.disabled = true; // Simulate generation process setTimeout(() => { btnText.style.display = 'inline'; btnLoader.style.display = 'none'; btn.disabled = false; // Show preview section document.querySelector('.generator-section').style.display = 'none'; document.getElementById('previewSection').style.display = 'block'; // Simulate video URL const video = document.getElementById('generatedVideo'); video.src = 'https://www.w3schools.com/html/mov_bbb.mp4'; showToast('Video generated successfully!', 'success'); // Scroll to preview document.getElementById('previewSection').scrollIntoView({ behavior: 'smooth' }); }, 3000); } function downloadVideo() { showToast('Preparing download...', 'info'); setTimeout(() => { showToast('Download started!', 'success'); }, 1500); } function shareVideo() { if (navigator.share) { navigator.share({ title: 'Generated Conversational Video', text: 'Check out this AI-generated conversational video!', url: window.location.href }); } else { showToast('Share link copied to clipboard!', 'success'); } } function resetGenerator() { currentStep = 1; audioFiles = {}; selectedAvatars = []; // Reset form document.getElementById('videoTitle').value = ''; document.getElementById('duration').selectedIndex = 0; document.getElementById('numSpeakers').selectedIndex = 0; document.getElementById('background').selectedIndex = 0; // Reset steps document.querySelectorAll('.step').forEach(step => step.classList.remove('active')); document.querySelectorAll('.step-panel').forEach(panel => panel.classList.remove('active')); document.querySelector('.step[data-step="1"]').classList.add('active'); document.getElementById('step1').classList.add('active'); // Reset avatar selection document.querySelectorAll('.avatar-option').forEach(option => option.classList.remove('selected')); // Hide preview, show generator document.getElementById('previewSection').style.display = 'none'; document.querySelector('.generator-section').style.display = 'block'; // Scroll to generator document.getElementById('generator').scrollIntoView({ behavior: 'smooth' }); } function scrollToGenerator() { document.getElementById('generator').scrollIntoView({ behavior: 'smooth' }); } function showToast(message, type = 'info') { const toast = document.createElement('div'); toast.className = `toast ${type}`; toast.textContent = message; document.body.appendChild(toast); setTimeout(() => toast.classList.add('show'), 100); setTimeout(() => { toast.classList.remove('show'); setTimeout(() => toast.remove(), 300); }, 3000); } function initDragAndDrop() { document.addEventListener('dragover', (e) => { if (e.target.classList.contains('upload-zone')) { e.preventDefault(); e.target.style.borderColor = 'var(--primary)'; e.target.style.background = 'var(--bg)'; } }); document.addEventListener('dragleave', (e) => { if (e.target.classList.contains('upload-zone')) { e.target.style.borderColor = 'var(--border)'; e.target.style.background = 'transparent'; } }); document.addEventListener('drop', (e) => { if (e.target.classList.contains('upload-zone')) { e.preventDefault(); e.target.style.borderColor = 'var(--border)'; e.target.style.background = 'transparent'; const files = e.dataTransfer.files; if (files.length > 0) { const speakerId = e.target.parentElement.dataset.speaker; const input = e.target.parentElement.querySelector('input[type="file"]'); input.files = files; handleAudioUpload(input, speakerId); } } }); } // Smooth scroll for navigation document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); } }); }); // Header scroll effect window.addEventListener('scroll', () => { const header = document.querySelector('.header'); if (window.scrollY > 100) { header.style.boxShadow = '0 2px 20px rgba(0,0,0,0.1)'; } else { header.style.boxShadow = 'none'; } });