document.addEventListener('DOMContentLoaded', function() {
// File upload handling
const dropArea = document.getElementById('drop-area');
const fileInput = document.getElementById('file-input');
const filePreview = document.getElementById('file-preview');
const uploadForm = document.getElementById('upload-form');
// Only initialize if elements exist
if (!dropArea || !fileInput || !filePreview || !uploadForm) {
console.warn('Some upload elements not found, skipping initialization');
return;
}
// Prevent default drag behaviors
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
dropArea.addEventListener(eventName, preventDefaults, false);
document.body.addEventListener(eventName, preventDefaults, false);
});
// Highlight drop area when item is dragged over it
['dragenter', 'dragover'].forEach(eventName => {
dropArea.addEventListener(eventName, highlight, false);
});
['dragleave', 'drop'].forEach(eventName => {
dropArea.addEventListener(eventName, unhighlight, false);
});
// Handle dropped files
dropArea.addEventListener('drop', handleDrop, false);
// Click to upload functionality
dropArea.addEventListener('click', function(e) {
// Prevent triggering if clicking the button itself
if (e.target.tagName !== 'BUTTON' && e.target.tagName !== 'I') {
fileInput.click();
}
});
// Handle file input change
fileInput.addEventListener('change', function(e) {
handleFiles(e.target.files);
});
function preventDefaults(e) {
e.preventDefault();
e.stopPropagation();
}
function highlight() {
dropArea.style.borderColor = 'var(--primary-color)';
dropArea.style.backgroundColor = 'rgba(139, 92, 246, 0.05)';
dropArea.classList.add('dragover');
}
function unhighlight() {
dropArea.style.borderColor = 'var(--border-color)';
dropArea.style.backgroundColor = 'var(--background-light)';
dropArea.classList.remove('dragover');
}
function handleDrop(e) {
const dt = e.dataTransfer;
const files = dt.files;
handleFiles(files);
}
function handleFiles(files) {
if (files.length > 0) {
const file = files[0];
// Validate file type
const allowedTypes = ['application/pdf', 'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-powerpoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation',
'text/plain'];
const allowedExtensions = ['.pdf', '.doc', '.docx', '.ppt', '.pptx', '.txt'];
const fileExtension = '.' + file.name.split('.').pop().toLowerCase();
if (!allowedTypes.includes(file.type) && !allowedExtensions.includes(fileExtension)) {
alert('Please select a valid file type (PDF, Word, PowerPoint, or Text)');
return;
}
// Check file size (50MB limit)
if (file.size > 50 * 1024 * 1024) {
alert('File size must be less than 50MB');
return;
}
showFilePreview(file);
// Auto-fill title if empty
const titleInput = document.getElementById('title');
if (titleInput && !titleInput.value) {
titleInput.value = file.name.replace(/\.[^/.]+$/, "");
}
}
}
function showFilePreview(file) {
const fileIcon = document.getElementById('file-icon');
const fileName = document.getElementById('file-name');
const fileSize = document.getElementById('file-size');
if (!fileIcon || !fileName || !fileSize) {
console.warn('File preview elements not found');
return;
}
// Get file extension
const extension = file.name.split('.').pop().toLowerCase();
// Set icon and color based on file type
let iconClass = 'fas fa-file';
let iconColor = '#6b7280';
switch(extension) {
case 'pdf':
iconClass = 'fas fa-file-pdf';
iconColor = '#ef4444';
break;
case 'doc':
case 'docx':
iconClass = 'fas fa-file-word';
iconColor = '#3b82f6';
break;
case 'ppt':
case 'pptx':
iconClass = 'fas fa-file-powerpoint';
iconColor = '#f59e0b';
break;
case 'txt':
iconClass = 'fas fa-file-alt';
iconColor = 'var(--primary-color)';
break;
}
fileIcon.innerHTML = ``;
fileIcon.style.background = iconColor;
fileName.textContent = file.name;
fileSize.textContent = formatFileSize(file.size);
filePreview.style.display = 'block';
}
// Make removeFile global so it can be called from onclick
window.removeFile = function() {
fileInput.value = '';
filePreview.style.display = 'none';
// Clear the title if it was auto-filled
const titleInput = document.getElementById('title');
if (titleInput) {
titleInput.value = '';
}
};
function formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
// Form submission handling
uploadForm.addEventListener('submit', function(e) {
const uploadBtn = document.getElementById('upload-btn');
const fileInputValue = fileInput.value;
// Check if file is selected
if (!fileInputValue) {
e.preventDefault();
alert('Please select a file to upload');
return false;
}
// Show loading state
const originalText = uploadBtn.innerHTML;
uploadBtn.innerHTML = 'Processing...';
uploadBtn.disabled = true;
// Re-enable after timeout (failsafe)
setTimeout(() => {
uploadBtn.innerHTML = originalText;
uploadBtn.disabled = false;
}, 30000);
// Form will submit normally (not via AJAX)
});
// Initialize any existing file in the input
if (fileInput.files && fileInput.files.length > 0) {
handleFiles(fileInput.files);
}
});
// Processing mode selection functionality
function selectProcessingMode(mode) {
// Remove active class from all options
document.querySelectorAll('.processing-option').forEach(option => {
option.style.border = '2px solid var(--border-color)';
option.style.transform = 'none';
option.style.boxShadow = 'none';
});
// Select the radio button
const radioButton = document.getElementById(mode + '_mode');
if (radioButton) {
radioButton.checked = true;
// Add active styling to selected option
const selectedOption = radioButton.closest('.processing-option');
if (mode === 'fast') {
selectedOption.style.border = '2px solid #28a745';
selectedOption.style.boxShadow = '0 4px 15px rgba(40, 167, 69, 0.2)';
} else {
selectedOption.style.border = '2px solid #6f42c1';
selectedOption.style.boxShadow = '0 4px 15px rgba(111, 66, 193, 0.2)';
}
selectedOption.style.transform = 'translateY(-2px)';
// Update submit button text
updateSubmitButtonText(mode);
}
}
function updateSubmitButtonText(mode) {
const uploadBtn = document.getElementById('upload-btn');
if (uploadBtn) {
if (mode === 'fast') {
uploadBtn.innerHTML = 'Upload & Process (Fast)';
} else {
uploadBtn.innerHTML = 'Upload & Process (Advanced OCR)';
}
}
}
// Initialize processing mode styling on page load
document.addEventListener('DOMContentLoaded', function() {
// Set initial styling for fast mode (default)
selectProcessingMode('fast');
// Add click handlers for processing options
document.querySelectorAll('.processing-option').forEach(option => {
option.addEventListener('click', function() {
const radioButton = this.querySelector('input[type="radio"]');
if (radioButton) {
selectProcessingMode(radioButton.value);
}
});
});
});