// EduCat: AI Study Buddy - Main Application Logic
class EduCatApp {
constructor() {
this.uploadedFiles = [];
this.studySessions = 0;
this.quizzesCompleted = 0;
this.generatedContent = [];
this.currentTab = 'dashboard';
this.init();
}
init() {
this.setupEventListeners();
this.updateStats();
this.updateFileSelects();
this.showTab('dashboard');
}
setupEventListeners() {
// Tab navigation
document.querySelectorAll('.nav__item').forEach(button => {
button.addEventListener('click', (e) => {
const tab = e.target.dataset.tab || 'dashboard';
this.showTab(tab);
});
});
// File upload - Fixed implementation
const uploadArea = document.getElementById('upload-area');
const fileInput = document.getElementById('file-input');
if (uploadArea && fileInput) {
uploadArea.addEventListener('click', (e) => {
e.preventDefault();
fileInput.click();
});
uploadArea.addEventListener('dragover', (e) => {
e.preventDefault();
uploadArea.classList.add('drag-over');
});
uploadArea.addEventListener('dragleave', (e) => {
e.preventDefault();
uploadArea.classList.remove('drag-over');
});
uploadArea.addEventListener('drop', (e) => {
e.preventDefault();
uploadArea.classList.remove('drag-over');
const files = Array.from(e.dataTransfer.files);
this.processFiles(files);
});
fileInput.addEventListener('change', (e) => {
const files = Array.from(e.target.files);
this.processFiles(files);
});
}
// AI feature buttons
document.querySelectorAll('.feature-card').forEach(card => {
const button = card.querySelector('.btn');
if (button) {
button.addEventListener('click', (e) => {
e.preventDefault();
const feature = card.dataset.feature;
this.generateContent(feature);
});
}
});
// Quiz generation
const generateQuizBtn = document.getElementById('generate-quiz');
if (generateQuizBtn) {
generateQuizBtn.addEventListener('click', (e) => {
e.preventDefault();
this.generateQuiz();
});
}
// Study planner interactions - Fixed implementation
this.setupPlannerEvents();
}
showTab(tabName) {
// Update navigation
document.querySelectorAll('.nav__item').forEach(item => {
item.classList.remove('active');
if (item.dataset.tab === tabName || (tabName === 'dashboard' && !item.dataset.tab)) {
item.classList.add('active');
}
});
// Update content
document.querySelectorAll('.tab-content').forEach(content => {
content.classList.remove('active');
});
const targetTab = tabName === 'dashboard' ? 'dashboard' : tabName;
const targetContent = document.getElementById(targetTab);
if (targetContent) {
targetContent.classList.add('active');
}
this.currentTab = tabName;
// Special handling for library tab
if (tabName === 'library') {
this.updateLibraryContent();
}
}
processFiles(files) {
if (!files || files.length === 0) {
alert('No files selected.');
return;
}
const validFiles = files.filter(file => this.isValidFile(file));
if (validFiles.length === 0) {
alert('Please select valid file types: PDF, DOCX, PPTX, TXT, or XLSX');
return;
}
if (validFiles.length !== files.length) {
alert('Some files were skipped due to invalid file types.');
}
this.uploadFiles(validFiles);
}
isValidFile(file) {
const validExtensions = ['pdf', 'docx', 'pptx', 'txt', 'xlsx'];
const fileName = file.name.toLowerCase();
return validExtensions.some(ext => fileName.endsWith('.' + ext));
}
uploadFiles(files) {
const progressBar = document.getElementById('upload-progress');
const progressFill = document.getElementById('progress-fill');
const progressText = document.getElementById('progress-text');
if (progressBar) {
progressBar.classList.remove('hidden');
}
let progress = 0;
const progressInterval = setInterval(() => {
progress += Math.random() * 20 + 5;
if (progressFill) {
progressFill.style.width = `${Math.min(progress, 100)}%`;
}
if (progressText) {
progressText.textContent = `Uploading... ${Math.round(Math.min(progress, 100))}%`;
}
if (progress >= 100) {
clearInterval(progressInterval);
this.completeUpload(files);
}
}, 300);
}
completeUpload(files) {
setTimeout(() => {
files.forEach(file => {
const fileData = {
id: Date.now() + Math.random(),
name: file.name,
size: this.formatFileSize(file.size || 50000), // Default size for demo
type: this.getFileType(file.name),
uploadDate: new Date().toLocaleDateString(),
content: this.generateMockContent(file.name)
};
this.uploadedFiles.push(fileData);
});
const progressBar = document.getElementById('upload-progress');
if (progressBar) {
progressBar.classList.add('hidden');
}
this.updateFileDisplay();
this.updateStats();
this.updateFileSelects();
this.addActivity(`Uploaded ${files.length} file(s)`);
// Show success message
alert(`Successfully uploaded ${files.length} file(s)!`);
// Clear file input
const fileInput = document.getElementById('file-input');
if (fileInput) {
fileInput.value = '';
}
}, 500);
}
getFileType(filename) {
const extension = filename.split('.').pop().toUpperCase();
return extension;
}
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];
}
generateMockContent(filename) {
const topics = ['Mathematics', 'Science', 'History', 'Literature', 'Computer Science'];
const randomTopic = topics[Math.floor(Math.random() * topics.length)];
return {
topic: randomTopic,
keyPoints: [
`Key concept from ${filename}`,
`Important theorem or principle`,
`Practical application example`,
`Historical context or background`
]
};
}
updateFileDisplay() {
const container = document.getElementById('files-container');
if (!container) return;
if (this.uploadedFiles.length === 0) {
container.innerHTML = '
No files uploaded yet. Upload your first file to get started!
';
return;
}
container.innerHTML = this.uploadedFiles.map(file => `
${file.type}
${file.name}
${file.size} • ${file.uploadDate}
`).join('');
}
updateStats() {
const filesCount = document.getElementById('files-count');
const sessionsCount = document.getElementById('sessions-count');
const quizzesCount = document.getElementById('quizzes-count');
if (filesCount) filesCount.textContent = this.uploadedFiles.length;
if (sessionsCount) sessionsCount.textContent = this.studySessions;
if (quizzesCount) quizzesCount.textContent = this.quizzesCompleted;
}
updateFileSelects() {
const select = document.getElementById('quiz-file-select');
if (!select) return;
select.innerHTML = '';
this.uploadedFiles.forEach(file => {
const option = document.createElement('option');
option.value = file.id;
option.textContent = file.name;
select.appendChild(option);
});
}
addActivity(activity) {
const activityList = document.getElementById('activity-list');
if (!activityList) return;
const timestamp = new Date().toLocaleTimeString();
// Remove empty state if it exists
const emptyState = activityList.querySelector('.empty-state');
if (emptyState) {
emptyState.remove();
}
const activityItem = document.createElement('div');
activityItem.className = 'activity-item';
activityItem.innerHTML = `
📝
${activity}
${timestamp}
`;
activityList.insertBefore(activityItem, activityList.firstChild);
// Keep only last 5 activities
const items = activityList.querySelectorAll('.activity-item');
if (items.length > 5) {
items[items.length - 1].remove();
}
}
generateContent(feature) {
if (this.uploadedFiles.length === 0) {
alert('Please upload some files first before generating content.');
return;
}
this.showLoadingModal(`Generating ${feature.replace('-', ' ')}...`);
setTimeout(() => {
const content = this.createMockContent(feature);
this.generatedContent.push(content);
this.hideLoadingModal();
this.updateLibraryContent();
this.addActivity(`Generated ${feature.replace('-', ' ')}`);
// Switch to library tab to show the generated content
this.showTab('library');
}, 2000 + Math.random() * 2000);
}
createMockContent(feature) {
const randomFile = this.uploadedFiles[Math.floor(Math.random() * this.uploadedFiles.length)];
const timestamp = new Date().toLocaleString();
const contentMap = {
'study-guide': {
title: `Study Guide: ${randomFile.content.topic}`,
type: 'Study Guide',
content: `
Chapter Overview
This study guide covers the key concepts from ${randomFile.name}.
Key Topics
${randomFile.content.keyPoints.map(point => `- ${point}
`).join('')}
Study Tips
- Review each section multiple times
- Create flashcards for key terms
- Practice with sample problems
- Form study groups for discussion
`
},
'quiz': {
title: `Practice Quiz: ${randomFile.content.topic}`,
type: 'Quiz',
content: `
`
},
'summary': {
title: `Summary: ${randomFile.content.topic}`,
type: 'Summary',
content: `
Document: ${randomFile.name}
Topic: ${randomFile.content.topic}
Key Points Summary
The main concepts covered include:
${randomFile.content.keyPoints.map(point => `- ${point}
`).join('')}
This material provides a comprehensive overview of ${randomFile.content.topic} with practical applications and theoretical foundations.
`
},
'flashcards': {
title: `Flashcards: ${randomFile.content.topic}`,
type: 'Flashcards',
content: `
${randomFile.content.keyPoints.map((point, index) => `
Card ${index + 1}: What is ${point.toLowerCase()}?
Answer: ${point}
`).join('')}
`
}
};
return {
id: Date.now() + Math.random(),
...contentMap[feature],
sourceFile: randomFile.name,
createdAt: timestamp
};
}
updateLibraryContent() {
const container = document.getElementById('generated-content');
if (!container) return;
if (this.generatedContent.length === 0) {
container.style.display = 'none';
return;
}
container.style.display = 'block';
container.innerHTML = `
Generated Study Materials
${this.generatedContent.map(content => `
Generated from: ${content.sourceFile} • ${content.createdAt}
${content.content}
`).join('')}
`;
}
generateQuiz() {
const fileSelect = document.getElementById('quiz-file-select');
const questionsSelect = document.getElementById('quiz-questions');
if (!fileSelect || !fileSelect.value) {
alert('Please select a file to generate quiz from.');
return;
}
const selectedFile = this.uploadedFiles.find(file => file.id == fileSelect.value);
const numQuestions = parseInt(questionsSelect.value) || 10;
this.showLoadingModal('Generating quiz questions...');
setTimeout(() => {
const quiz = this.createQuizQuestions(selectedFile, numQuestions);
this.displayQuiz(quiz);
this.hideLoadingModal();
this.addActivity(`Generated ${numQuestions}-question quiz`);
}, 1500 + Math.random() * 1500);
}
createQuizQuestions(file, numQuestions) {
const questions = [];
const questionTypes = [
'What is the main concept of',
'Which of the following best describes',
'What is the key principle behind',
'How does this concept apply to',
'What is the relationship between'
];
for (let i = 0; i < numQuestions; i++) {
const questionType = questionTypes[Math.floor(Math.random() * questionTypes.length)];
const keyPoint = file.content.keyPoints[i % file.content.keyPoints.length];
questions.push({
id: i + 1,
question: `${questionType} ${keyPoint.toLowerCase()}?`,
options: [
keyPoint,
'Alternative option A',
'Alternative option B',
'Alternative option C'
].sort(() => Math.random() - 0.5),
correct: keyPoint
});
}
return {
title: `Quiz: ${file.content.topic}`,
source: file.name,
questions: questions
};
}
displayQuiz(quiz) {
const container = document.getElementById('quiz-container');
if (!container) return;
container.classList.remove('hidden');
container.innerHTML = `
${quiz.questions.map(q => `
`).join('')}
`;
}
submitQuiz() {
const questions = document.querySelectorAll('.quiz-question');
let score = 0;
let total = questions.length;
questions.forEach((question, index) => {
const selected = question.querySelector('input[type="radio"]:checked');
if (selected) {
// For demo purposes, we'll give a random score
if (Math.random() > 0.3) score++;
}
});
this.quizzesCompleted++;
this.updateStats();
this.addActivity(`Completed quiz - Score: ${score}/${total}`);
alert(`Quiz completed! Your score: ${score}/${total} (${Math.round((score/total) * 100)}%)`);
}
setupPlannerEvents() {
// Wait for DOM to be ready and then attach events
setTimeout(() => {
const plannerButtons = document.querySelectorAll('.planner-card .btn--secondary');
plannerButtons.forEach((btn, index) => {
// Remove existing listeners to prevent duplication
btn.replaceWith(btn.cloneNode(true));
const newBtn = document.querySelectorAll('.planner-card .btn--secondary')[index];
newBtn.addEventListener('click', (e) => {
e.preventDefault();
e.stopPropagation();
if (index === 0) {
this.addStudySession();
} else if (index === 1) {
this.addStudyGoal();
} else if (index === 2) {
this.setReminder();
}
});
});
// Goal checkboxes
const goalCheckboxes = document.querySelectorAll('.goal-item input[type="checkbox"]');
goalCheckboxes.forEach(checkbox => {
checkbox.addEventListener('change', () => {
if (checkbox.checked) {
this.studySessions++;
this.updateStats();
this.addActivity('Completed study goal');
}
});
});
}, 100);
}
addStudySession() {
const time = prompt('Enter study time (e.g., 3:00 PM):');
const subject = prompt('Enter subject:');
if (time && subject) {
this.studySessions++;
this.updateStats();
this.addActivity(`Scheduled: ${subject} at ${time}`);
alert('Study session added to your schedule!');
}
}
addStudyGoal() {
const goal = prompt('Enter your study goal:');
if (goal) {
this.addActivity(`New goal: ${goal}`);
alert('Study goal added!');
}
}
setReminder() {
const reminder = prompt('Enter reminder text:');
if (reminder) {
this.addActivity(`Set reminder: ${reminder}`);
alert('Reminder set!');
}
}
showLoadingModal(title, text = 'Please wait while we analyze your content and generate study materials.') {
const modal = document.getElementById('loading-modal');
const titleEl = document.getElementById('loading-title');
const textEl = document.getElementById('loading-text');
if (modal) modal.classList.remove('hidden');
if (titleEl) titleEl.textContent = title;
if (textEl) textEl.textContent = text;
}
hideLoadingModal() {
const modal = document.getElementById('loading-modal');
if (modal) modal.classList.add('hidden');
}
}
// Initialize the application
let app;
document.addEventListener('DOMContentLoaded', () => {
app = new EduCatApp();
// Add some sample activity for demo
setTimeout(() => {
app.addActivity('Welcome to EduCat!');
}, 1000);
});
// Handle modal click to close
document.addEventListener('click', (e) => {
if (e.target.id === 'loading-modal') {
if (app) app.hideLoadingModal();
}
});