// ===================================================== // Quiz — multiple choice with explanations // ===================================================== let quizData = null; let quizState = { filter: 'all', questions: [], current: 0, selected: null, answered: false, correct: 0, wrong: 0, finished: false }; async function quizLoad() { if (quizData) return quizData; try { const res = await fetch('data/quiz.json'); quizData = await res.json(); } catch (e) { console.error('Klarte ikke laste quiz:', e); quizData = []; } return quizData; } function quizFilterQuestions(filter) { if (filter === 'all') return [...quizData]; return quizData.filter(q => q.category === filter); } function quizShuffle(arr) { for (let i = arr.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); [arr[i], arr[j]] = [arr[j], arr[i]]; } return arr; } function quizRenderStart() { const stage = document.getElementById('quizStage'); const counts = { all: quizData.length, etikk: quizData.filter(q => q.category === 'etikk').length, baerekraft: quizData.filter(q => q.category === 'baerekraft').length, samfunn: quizData.filter(q => q.category === 'samfunn').length, verktoy: quizData.filter(q => q.category === 'verktoy').length }; stage.innerHTML = `
Studiemodus

Selvtest

Velg kategori — flervalg med forklaringer
`; stage.querySelectorAll('[data-cat]').forEach(btn => { btn.addEventListener('click', () => { quizStart(btn.dataset.cat); }); }); } function quizStart(category) { quizState.filter = category; quizState.questions = quizShuffle(quizFilterQuestions(category)); quizState.current = 0; quizState.selected = null; quizState.answered = false; quizState.correct = 0; quizState.wrong = 0; quizState.finished = false; quizRenderCurrent(); } function quizRenderCurrent() { const stage = document.getElementById('quizStage'); if (quizState.finished) return quizRenderResult(); const total = quizState.questions.length; const q = quizState.questions[quizState.current]; if (!q) return; const progress = ((quizState.current) / total) * 100; const letters = ['A', 'B', 'C', 'D', 'E']; stage.innerHTML = `
${quizState.current + 1} / ${total} ${categoryLabelQuiz(q.category)} Riktig: ${quizState.correct}

${q.question}

${q.options.map((opt, i) => ` `).join('')}
`; stage.querySelectorAll('.quiz-option').forEach(opt => { opt.addEventListener('click', () => { if (quizState.answered) return; const i = parseInt(opt.dataset.i, 10); quizSelect(i); }); }); document.getElementById('quizNext').addEventListener('click', quizAdvance); document.getElementById('quizCancel').addEventListener('click', () => { if (confirm('Avslutte testen?')) quizRenderStart(); }); } function quizSelect(i) { const q = quizState.questions[quizState.current]; quizState.selected = i; quizState.answered = true; const opts = document.querySelectorAll('.quiz-option'); opts.forEach((opt, idx) => { opt.classList.add('quiz-option--disabled'); if (idx === q.correct) opt.classList.add('quiz-option--correct'); if (idx === i && i !== q.correct) opt.classList.add('quiz-option--wrong'); if (idx === i) opt.classList.add('quiz-option--selected'); }); if (i === q.correct) quizState.correct++; else quizState.wrong++; const exp = document.getElementById('quizExplanation'); exp.innerHTML = `
${i === q.correct ? 'Riktig — ' : 'Forklaring — '}
${q.explanation}
`; document.getElementById('quizNext').disabled = false; } function quizAdvance() { quizState.current++; quizState.selected = null; quizState.answered = false; if (quizState.current >= quizState.questions.length) { quizState.finished = true; } quizRenderCurrent(); } function quizRenderResult() { const stage = document.getElementById('quizStage'); const total = quizState.questions.length; const pct = total ? Math.round((quizState.correct / total) * 100) : 0; let verdict, vColor; if (pct >= 90) { verdict = 'Fremragende.'; vColor = 'var(--theme-baerekraft)'; } else if (pct >= 80) { verdict = 'Meget god.'; vColor = 'var(--theme-baerekraft)'; } else if (pct >= 65) { verdict = 'Solid forståelse.'; vColor = 'var(--theme-samfunn)'; } else if (pct >= 50) { verdict = 'Greit, men trener videre.'; vColor = 'var(--theme-samfunn)'; } else { verdict = 'Repeter mer av dette temaet.'; vColor = 'var(--theme-etikk)'; } stage.innerHTML = `
${quizState.correct}/${total}
${pct} % riktig
${verdict}
`; document.getElementById('quizRestart').addEventListener('click', () => quizStart(quizState.filter)); document.getElementById('quizMore').addEventListener('click', () => quizRenderStart()); } function categoryLabelQuiz(cat) { return { etikk: 'Etikk', baerekraft: 'Bærekraft', samfunn: 'Samfunnsansvar', verktoy: 'Verktøy & implementering' }[cat] || cat; } async function quizInit() { await quizLoad(); quizRenderStart(); } SMF.quizInit = quizInit;