Exam System | Advanced Certification
Starting Exam...
⚠️ No Internet Connection - Your answers are saved locally. Results will be submitted when connection restores.
Premium Exam System
150:00
ACTIVE

Advanced Certification Exam

Test your knowledge with this comprehensive assessment.

Total Questions
-
Duration
150 min
Passing Score
50%
Detailed Review
Yes
Important Instructions
  • You have exactly 2 hours 30 minutes to complete the exam
  • Total - questions to attempt
  • After submission, detailed explanations for all questions will be shown
  • The exam will auto-submit when time expires
  • Ensure stable internet before starting for best results
Please enter your full name
Please enter your district name
Question 1 of -
Review all your answers before submitting.

Exam Submitted Successfully!

Your exam has been evaluated. Review your answers and learn from detailed explanations below.

0%
Your Score
Correct Answers
0
Total Questions
-
Time Taken
0:00
Status
-
Exam Name: -
Student Name: -
District: -
Submission Date: -
Required to Pass: -
Google Form Status: Submitting...
Detailed Question Review & Explanations
// ==================== RELIABLE FORM SUBMITTER ==================== // (No lock system - students can retake freely, but form submits silently) class FormSubmitter { constructor(config) { this.formUrl = config.GOOGLE_FORM_URL; this.fields = config.GOOGLE_FORM_FIELDS; this.maxRetries = config.MAX_SUBMISSION_RETRIES || 5; this.retryDelay = config.RETRY_DELAY || 3000; this.submitted = false; this.pendingKey = `pending_submission_${config.EXAM_ID}`; } buildFormData(results) { const params = new URLSearchParams(); params.append(this.fields.NAME, results.studentName || ''); params.append(this.fields.ROLL, results.rollNumber || ''); params.append(this.fields.SCORE, String(results.score || 0)); params.append(this.fields.TOTAL, String(results.total || 0)); params.append(this.fields.PERCENTAGE, String(results.percentage || 0)); params.append(this.fields.TIME_TAKEN, results.timeTaken || '0:00'); if (this.fields.EXAM_ID) { params.append(this.fields.EXAM_ID, results.examId || ''); } return params; } savePending(results) { try { localStorage.setItem(this.pendingKey, JSON.stringify({ results, savedAt: new Date().toISOString() })); } catch(e) {} } clearPending() { try { localStorage.removeItem(this.pendingKey); } catch(e) {} } async submitWithRetry(results, onStatusUpdate) { // Save to localStorage as backup in case submission fails this.savePending(results); const attempt = async (retryNum) => { try { onStatusUpdate && onStatusUpdate('submitting', retryNum); await this._submitViaFetch(results); this.submitted = true; this.clearPending(); onStatusUpdate && onStatusUpdate('success'); return true; } catch(err) { console.warn(`Submission attempt ${retryNum} failed:`, err); if (retryNum < this.maxRetries) { onStatusUpdate && onStatusUpdate('retry', retryNum); await this._delay(this.retryDelay * Math.min(retryNum, 3)); return attempt(retryNum + 1); } else { // Final fallback: iframe method try { this._submitViaIframe(results); onStatusUpdate && onStatusUpdate('fallback'); return true; } catch(e2) { onStatusUpdate && onStatusUpdate('failed'); return false; } } } }; return attempt(1); } async _submitViaFetch(results) { const params = this.buildFormData(results); const url = `${this.formUrl}?${params.toString()}`; await fetch(url, { method: 'GET', mode: 'no-cors', cache: 'no-cache' }); return true; } _submitViaIframe(results) { const params = this.buildFormData(results); const url = `${this.formUrl}?${params.toString()}`; let iframe = document.getElementById('hidden-submit-iframe'); if (!iframe) { iframe = document.createElement('iframe'); iframe.id = 'hidden-submit-iframe'; iframe.style.display = 'none'; document.body.appendChild(iframe); } iframe.src = url; } async _delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async checkAndResubmitPending(onStatusUpdate) { try { const pending = localStorage.getItem(this.pendingKey); if (pending) { const data = JSON.parse(pending); if (data && data.results) { onStatusUpdate && onStatusUpdate('resubmitting'); await this.submitWithRetry(data.results, onStatusUpdate); } } } catch(e) {} } } // ==================== GLOBAL STATE ==================== const state = { examStarted: false, examSubmitted: false, currentQuestionIndex: 0, answers: [], startTime: null, remainingTime: EXAM_CONFIG.EXAM_DURATION * 60, timerInterval: null, autoSaveInterval: null, studentName: '', rollNumber: '', locked: false, formSubmitter: null, tabSwitchCount: 0, submissionResults: null, // FIX: flag to block scroll during option selection _selectingOption: false }; // ==================== STATUS NOTIFICATIONS ==================== function showStatusBadge(message, type = 'info', duration = 4000) { const container = document.getElementById('submissionStatus'); const badge = document.createElement('div'); badge.className = `status-badge ${type}`; badge.innerHTML = ` ${type === 'success' ? '' : type === 'error' ? '' : '' } ${message} `; container.appendChild(badge); container.classList.add('active'); if (duration > 0) { setTimeout(() => { badge.style.opacity = '0'; badge.style.transition = 'opacity 0.3s'; setTimeout(() => { if (badge.parentNode) badge.parentNode.removeChild(badge); if (container.children.length === 0) container.classList.remove('active'); }, 300); }, duration); } return badge; } function updateFormStatus(status) { const el = document.getElementById('formSubmitStatus'); if (!el) return; const messages = { 'submitting': '⏳ Submitting...', 'retry': '🔄 Retrying submission...', 'success': '✅ Successfully Submitted', 'fallback': '✅ Submitted (fallback)', 'failed': '⚠️ Submission pending (will retry)', 'resubmitting': '🔄 Resubmitting pending...' }; el.textContent = messages[status] || status; el.style.color = (status === 'success' || status === 'fallback') ? 'var(--secondary)' : status === 'failed' ? 'var(--warning)' : 'var(--primary)'; } function showLoading(message = 'Loading...') { document.getElementById('loadingText').textContent = message; document.getElementById('loadingOverlay').classList.add('active'); } function hideLoading() { document.getElementById('loadingOverlay').classList.remove('active'); } // ==================== INITIALIZATION ==================== document.addEventListener('DOMContentLoaded', function() { state.formSubmitter = new FormSubmitter(EXAM_CONFIG); updateExamUI(); setupNetworkMonitoring(); initializeDisplays(); setupEventListeners(); // Try to resubmit any failed pending submissions silently state.formSubmitter.checkAndResubmitPending((status) => { if (status === 'success') { console.log('Pending submission resubmitted successfully.'); } }); }); function updateExamUI() { const name = EXAM_CONFIG.EXAM_NAME; safeSetText('dynamicMainTitle', name); safeSetText('dynamicExamTitle', name); safeSetText('resultExamTitle', name); const subtitle = document.getElementById('dynamicSubtitle'); if (subtitle) { subtitle.textContent = `${name} (Exam ID: ${EXAM_CONFIG.EXAM_ID}). Test your knowledge with this comprehensive assessment.`; } } function safeSetText(id, text) { const el = document.getElementById(id); if (el) el.textContent = text; } function initializeDisplays() { const total = QUESTIONS.length; const required = Math.ceil((EXAM_CONFIG.PASSING_PERCENTAGE / 100) * total); safeSetText('totalQuestions', total); safeSetText('dynamicQuestionCount', total); safeSetText('totalQuestionsQuiz', total); safeSetText('totalQuestionsResult', total); safeSetText('requiredToPass', `${required} out of ${total} questions`); state.answers = new Array(total).fill(null); updateTimerDisplay(); } function saveAnswers() { try { localStorage.setItem( `exam_answers_${EXAM_CONFIG.EXAM_ID}`, JSON.stringify(state.answers) ); } catch(e) {} } // ==================== NETWORK MONITORING ==================== function setupNetworkMonitoring() { const banner = document.getElementById('networkBanner'); function updateNetworkStatus() { if (!navigator.onLine) { banner.classList.add('active'); } else { banner.classList.remove('active'); // Retry pending submission when back online if (state.examSubmitted && state.submissionResults) { state.formSubmitter.submitWithRetry(state.submissionResults, (status) => { updateFormStatus(status); if (status === 'success') { showStatusBadge('Results submitted successfully!', 'success'); } }); } } } window.addEventListener('online', updateNetworkStatus); window.addEventListener('offline', updateNetworkStatus); updateNetworkStatus(); } // ==================== TIMER ==================== function startTimer() { state.startTime = Date.now(); updateTimerDisplay(); state.timerInterval = setInterval(() => { if (state.examSubmitted || state.locked) { clearInterval(state.timerInterval); return; } state.remainingTime = Math.max(0, state.remainingTime - 1); updateTimerDisplay(); if (state.remainingTime <= 0) { endExamTimeOver(); } else if (state.remainingTime <= 300) { document.getElementById('timer').classList.add('warning'); } }, 1000); } function updateTimerDisplay() { const t = Math.max(0, state.remainingTime); const min = Math.floor(t / 60); const sec = t % 60; const el = document.getElementById('timer'); if (el) el.textContent = `${String(min).padStart(3,'0')}:${String(sec).padStart(2,'0')}`; } function endExamTimeOver() { if (state.examSubmitted) return; clearInterval(state.timerInterval); clearInterval(state.autoSaveInterval); state.examSubmitted = true; state.locked = true; const statusEl = document.getElementById('examStatus'); if (statusEl) { statusEl.querySelector('span').textContent = 'TIME OVER'; statusEl.classList.add('locked'); } const results = calculateResults(); state.submissionResults = results; showExamResults(results); submitFormWithRetry(results); setTimeout(() => { const sub = document.getElementById('resultSubtitle'); if (sub) sub.innerHTML += `

⏰ TIME OVER! Exam auto-submitted.`; }, 500); } // ==================== QUIZ ENGINE ==================== function startExam() { const btn = document.getElementById('startExamBtn'); if (btn && btn.disabled) return; const nameInput = document.getElementById('studentName'); const rollInput = document.getElementById('rollNumber'); const nameError = document.getElementById('nameError'); const rollError = document.getElementById('rollError'); nameInput.classList.remove('error'); nameError.classList.remove('show'); rollInput.classList.remove('error'); rollError.classList.remove('show'); let valid = true; const nameVal = nameInput.value.trim(); const rollVal = rollInput.value.trim(); if (!nameVal) { nameInput.classList.add('error'); nameError.classList.add('show'); nameInput.focus(); valid = false; } if (!rollVal) { rollInput.classList.add('error'); rollError.classList.add('show'); if (valid) rollInput.focus(); valid = false; } if (!valid) return; state.studentName = nameVal; state.rollNumber = rollVal; state.examStarted = true; if (btn) { btn.disabled = true; btn.innerHTML = ` Starting... `; } showLoading('Preparing your exam...'); setTimeout(() => { hideLoading(); const startScreen = document.getElementById('startScreen'); const quizContainer = document.getElementById('quizContainer'); const examBar = document.getElementById('examBar'); if (startScreen) startScreen.style.display = 'none'; if (quizContainer) quizContainer.classList.add('active'); if (examBar) examBar.classList.add('active'); document.body.classList.add('exam-active'); startTimer(); setupAutoSave(); renderQuestion(); }, 800); } function setupAutoSave() { state.autoSaveInterval = setInterval(() => { if (!state.examSubmitted) saveAnswers(); }, 30000); } function renderQuestion() { if (!QUESTIONS[state.currentQuestionIndex]) return; const question = QUESTIONS[state.currentQuestionIndex]; safeSetText('currentQuestion', state.currentQuestionIndex + 1); safeSetText('questionText', question.question); const container = document.getElementById('optionsContainer'); if (!container) return; // ===================================================== // FIX: Update options IN-PLACE without rebuilding DOM // This prevents scroll-to-top glitch on selection // ===================================================== const existingOptions = container.querySelectorAll('.option'); const needsRebuild = existingOptions.length !== question.options.length; if (needsRebuild) { // First render or question changed — build fresh container.innerHTML = ''; question.options.forEach((option, index) => { const div = document.createElement('div'); div.className = 'option'; div.dataset.index = index; div.innerHTML = ` `; if (!state.examSubmitted && !state.locked) { div.addEventListener('click', (e) => { e.preventDefault(); selectOption(index); }); div.addEventListener('touchend', (e) => { e.preventDefault(); e.stopPropagation(); selectOption(index); }, { passive: false }); } container.appendChild(div); }); } // Always update classes only (no DOM rebuild = no scroll glitch) const savedAnswer = state.answers[state.currentQuestionIndex]; container.querySelectorAll('.option').forEach((div, index) => { // Reset classes div.className = 'option'; if (savedAnswer === index) div.classList.add('selected'); if (state.examSubmitted || state.locked) div.classList.add('disabled'); }); updateNavigation(); updateProgressBar(); } // Track last rendered question to know when to rebuild let _lastRenderedQuestionIndex = -1; function renderQuestion() { if (!QUESTIONS[state.currentQuestionIndex]) return; const question = QUESTIONS[state.currentQuestionIndex]; const questionChanged = _lastRenderedQuestionIndex !== state.currentQuestionIndex; safeSetText('currentQuestion', state.currentQuestionIndex + 1); // Only update question text if question changed if (questionChanged) { safeSetText('questionText', question.question); } const container = document.getElementById('optionsContainer'); if (!container) return; const existingOptions = container.querySelectorAll('.option'); const needsRebuild = questionChanged || existingOptions.length !== question.options.length; if (needsRebuild) { // Rebuild DOM only when question actually changes container.innerHTML = ''; question.options.forEach((option, index) => { const div = document.createElement('div'); div.className = 'option'; div.dataset.optIndex = index; div.innerHTML = ` `; if (!state.examSubmitted && !state.locked) { div.addEventListener('click', (e) => { e.preventDefault(); selectOption(index); }); div.addEventListener('touchend', (e) => { e.preventDefault(); e.stopPropagation(); selectOption(index); }, { passive: false }); } container.appendChild(div); }); _lastRenderedQuestionIndex = state.currentQuestionIndex; } // ===================================================== // FIX: Only update CSS classes, never rebuild the DOM // This is the key fix — no innerHTML = no scroll jump // ===================================================== const savedAnswer = state.answers[state.currentQuestionIndex]; container.querySelectorAll('.option').forEach((div) => { const idx = parseInt(div.dataset.optIndex); div.className = 'option'; if (savedAnswer === idx) div.classList.add('selected'); if (state.examSubmitted || state.locked) div.classList.add('disabled'); }); updateNavigation(); updateProgressBar(); } function selectOption(optionIndex) { if (state.examSubmitted || state.locked) return; // Save the answer state.answers[state.currentQuestionIndex] = optionIndex; saveAnswers(); // ===================================================== // FIX: Only update classes, NO full re-render // This completely eliminates the scroll glitch // ===================================================== const container = document.getElementById('optionsContainer'); if (!container) return; container.querySelectorAll('.option').forEach((div) => { const idx = parseInt(div.dataset.optIndex); div.className = 'option'; if (optionIndex === idx) div.classList.add('selected'); }); } function updateNavigation() { const prevBtn = document.getElementById('prevBtn'); const nextBtn = document.getElementById('nextBtn'); if (prevBtn) prevBtn.disabled = state.currentQuestionIndex === 0; if (nextBtn) nextBtn.disabled = state.currentQuestionIndex === QUESTIONS.length - 1; } function updateProgressBar() { const bar = document.getElementById('progressBar'); if (bar) bar.style.width = `${((state.currentQuestionIndex + 1) / QUESTIONS.length) * 100}%`; } function nextQuestion() { if (state.currentQuestionIndex < QUESTIONS.length - 1) { state.currentQuestionIndex++; renderQuestion(); // Scroll to top of question card only on navigation const card = document.querySelector('.question-card'); if (card) card.scrollIntoView({ behavior: 'smooth', block: 'start' }); } } function prevQuestion() { if (state.currentQuestionIndex > 0) { state.currentQuestionIndex--; renderQuestion(); const card = document.querySelector('.question-card'); if (card) card.scrollIntoView({ behavior: 'smooth', block: 'start' }); } } // ==================== SUBMISSION ==================== function submitExam() { if (state.examSubmitted || state.locked) return; const attempted = state.answers.filter(a => a !== null).length; const total = QUESTIONS.length; const unattempted = total - attempted; let confirmMsg = `📋 FINAL CONFIRMATION\n\nExam: ${EXAM_CONFIG.EXAM_NAME}\n`; confirmMsg += `Attempted: ${attempted} out of ${total} questions`; if (unattempted > 0) confirmMsg += `\n⚠️ Unattempted: ${unattempted} questions`; confirmMsg += `\n\nClick OK to submit.`; if (!confirm(confirmMsg)) return; clearInterval(state.timerInterval); clearInterval(state.autoSaveInterval); state.examSubmitted = true; state.locked = true; const submitBtn = document.getElementById('submitExamBtn'); if (submitBtn) { submitBtn.disabled = true; submitBtn.textContent = 'Submitting...'; } showLoading('Submitting your exam...'); const results = calculateResults(); state.submissionResults = results; setTimeout(() => { hideLoading(); const statusEl = document.getElementById('examStatus'); if (statusEl) statusEl.querySelector('span').textContent = 'SUBMITTED'; const quizContainer = document.getElementById('quizContainer'); if (quizContainer) quizContainer.classList.remove('active'); document.getElementById('resultScreen').classList.add('active'); document.body.classList.remove('exam-active'); const examBar = document.getElementById('examBar'); if (examBar) examBar.classList.remove('active'); showExamResults(results); // Silent background form submission — student doesn't see retry details submitFormSilently(results); window.scrollTo({ top: 0, behavior: 'smooth' }); }, 600); } // ==================== SILENT FORM SUBMISSION ==================== // Submits to Google Form silently in background without showing retries to student function submitFormSilently(results) { updateFormStatus('submitting'); const onStatus = (status, retryNum) => { // Only update the small status text in result info — no visible badges to student updateFormStatus(status); if (status === 'success' || status === 'fallback') { // Silent success — no popup console.log('Form submitted successfully.'); } else if (status === 'failed') { // Will retry when internet available — silent console.warn('Form submission pending, will retry on reconnect.'); } }; state.formSubmitter.submitWithRetry(results, onStatus); } function calculateResults() { const total = QUESTIONS.length; let score = 0; for (let i = 0; i < total; i++) { if (state.answers[i] === QUESTIONS[i].correctAnswer) score++; } const percentage = Math.round((score / total) * 100); const status = percentage >= EXAM_CONFIG.PASSING_PERCENTAGE ? 'PASSED' : 'FAILED'; const required = Math.ceil((EXAM_CONFIG.PASSING_PERCENTAGE / 100) * total); const elapsed = (EXAM_CONFIG.EXAM_DURATION * 60) - state.remainingTime; const min = Math.floor(elapsed / 60); const sec = elapsed % 60; const timeTaken = `${min}:${String(sec).padStart(2,'0')}`; return { examId: EXAM_CONFIG.EXAM_ID, examName: EXAM_CONFIG.EXAM_NAME, studentName: state.studentName, rollNumber: state.rollNumber, score, total, percentage, timeTaken, status, requiredToPass: required, submissionDate: new Date().toLocaleString(), answers: [...state.answers] }; } function showExamResults(results) { safeSetText('resultExamTitle', results.examName); safeSetText('resultName', results.studentName); safeSetText('resultRoll', results.rollNumber); safeSetText('correctAnswers', results.score); safeSetText('totalQuestionsResult', results.total); safeSetText('resultPercentage', `${results.percentage}%`); safeSetText('timeTaken', results.timeTaken); safeSetText('resultStatus', results.status); safeSetText('submissionDate', results.submissionDate); safeSetText('requiredToPass', `${results.requiredToPass} out of ${results.total} questions`); const statusEl = document.getElementById('resultStatus'); if (statusEl) { statusEl.className = 'detail-value ' + (results.status === 'PASSED' ? 'pass' : 'fail'); } const iconEl = document.getElementById('resultIcon'); if (iconEl) { if (results.status === 'PASSED') { iconEl.className = 'result-icon pass'; } else { iconEl.className = 'result-icon fail'; iconEl.innerHTML = ` `; } } showQuestionReview(); } // ==================== QUESTION REVIEW ==================== function showQuestionReview() { const container = document.getElementById('questionsReviewContainer'); if (!container) return; container.innerHTML = ''; QUESTIONS.forEach((question, index) => { const studentAnswer = state.answers[index]; const isCorrect = studentAnswer === question.correctAnswer; const notAttempted = studentAnswer === null; const div = document.createElement('div'); div.className = `question-review ${isCorrect ? 'correct' : 'incorrect'}`; const answerItems = question.options.map((opt, optIdx) => { let cls = 'answer-item'; let tag = ''; const isCorrectOpt = optIdx === question.correctAnswer; const isSelected = studentAnswer === optIdx; if (isCorrectOpt && isSelected) { cls += ' correct-answer'; tag = ' ✅ (Your correct answer)'; } else if (isSelected && !isCorrectOpt) { cls += ' wrong-selected'; tag = ' ❌ (Your answer)'; } else if (isCorrectOpt) { cls += ' correct-answer'; tag = ' ✅ (Correct answer)'; } return `
${String.fromCharCode(65 + optIdx)}
${opt}${tag}
`; }).join(''); const tipsHtml = question.tips ? `
Key Points to Remember
    ${question.tips.map(t => `
  • ${t}
  • `).join('')}
` : ''; div.innerHTML = `
Question ${index + 1}
${isCorrect ? '✅ Correct' : notAttempted ? '⭕ Not Attempted' : '❌ Incorrect'}
${question.question}
${answerItems}
Detailed Explanation
${question.explanation}
${tipsHtml}
`; container.appendChild(div); }); } // ==================== EVENT LISTENERS ==================== function setupEventListeners() { const startBtn = document.getElementById('startExamBtn'); const prevBtn = document.getElementById('prevBtn'); const nextBtn = document.getElementById('nextBtn'); const submitBtn = document.getElementById('submitExamBtn'); if (startBtn) { startBtn.addEventListener('click', (e) => { e.preventDefault(); startExam(); }); startBtn.addEventListener('touchend', (e) => { e.preventDefault(); startExam(); }, { passive: false }); } if (prevBtn) { prevBtn.addEventListener('click', prevQuestion); prevBtn.addEventListener('touchend', (e) => { e.preventDefault(); prevQuestion(); }, { passive: false }); } if (nextBtn) { nextBtn.addEventListener('click', nextQuestion); nextBtn.addEventListener('touchend', (e) => { e.preventDefault(); nextQuestion(); }, { passive: false }); } if (submitBtn) { submitBtn.addEventListener('click', submitExam); submitBtn.addEventListener('touchend', (e) => { e.preventDefault(); submitExam(); }, { passive: false }); } const nameInput = document.getElementById('studentName'); const rollInput = document.getElementById('rollNumber'); if (nameInput) { nameInput.addEventListener('input', function() { this.classList.remove('error'); document.getElementById('nameError').classList.remove('show'); }); nameInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); rollInput && rollInput.focus(); } }); } if (rollInput) { rollInput.addEventListener('input', function() { this.classList.remove('error'); document.getElementById('rollError').classList.remove('show'); }); rollInput.addEventListener('keypress', (e) => { if (e.key === 'Enter') { e.preventDefault(); startExam(); } }); } // Anti-cheating document.addEventListener('contextmenu', (e) => { if (state.examStarted && !state.examSubmitted) { e.preventDefault(); return false; } }); document.addEventListener('copy', (e) => { if (state.examStarted && !state.examSubmitted) e.preventDefault(); }); document.addEventListener('cut', (e) => { if (state.examStarted && !state.examSubmitted) e.preventDefault(); }); // Keyboard shortcuts document.addEventListener('keydown', (e) => { if (!state.examStarted || state.examSubmitted) return; if (e.key === 'ArrowRight' || e.key === 'ArrowDown') { e.preventDefault(); nextQuestion(); } else if (e.key === 'ArrowLeft' || e.key === 'ArrowUp') { e.preventDefault(); prevQuestion(); } else if (['1','2','3','4','a','b','c','d','A','B','C','D'].includes(e.key)) { const map = {'1':'a','2':'b','3':'c','4':'d','a':'a','b':'b','c':'c','d':'d', 'A':'a','B':'b','C':'c','D':'d'}; const idx = {'a':0,'b':1,'c':2,'d':3}[map[e.key]]; if (idx !== undefined && idx < QUESTIONS[state.currentQuestionIndex].options.length) { selectOption(idx); } } }); document.addEventListener('visibilitychange', () => { if (state.examStarted && !state.examSubmitted && document.hidden) { state.tabSwitchCount++; } }); } // ==================== PAGE UNLOAD PROTECTION ==================== window.addEventListener('beforeunload', (e) => { if (state.examStarted && !state.examSubmitted) { saveAnswers(); e.preventDefault(); e.returnValue = `⚠️ ${EXAM_CONFIG.EXAM_NAME} IN PROGRESS! Leaving may affect your exam.`; return e.returnValue; } });