'use strict'; var Quiz = { state: null, render: function(params) { var el = document.getElementById('content'); if (params[0] === 'play') { this.play(el, params[1] || ''); return; } el.textContent = 'Lade...'; var self = this; Promise.all([API.get('/decks'), API.get('/quiz/history')]).then(function(results) { self.renderStart(el, results[0].decks, results[1].results); }).catch(function(e) { el.textContent = e.message; }); }, renderStart: function(el, decks, history) { var h = ''; h += '

Deck waehlen

'; h += '
Alle Decks
Querbeet aus allen Themen
'; decks.forEach(function(d) { h += '
' + Markdown.esc(d.name) + '
' + d.card_count + ' Karten
'; }); h += '
'; if (history.length > 0) { h += '

Letzte Ergebnisse

'; history.forEach(function(r) { h += ''; }); h += '
DatumDeckScoreRichtig
' + new Date(r.created_at).toLocaleDateString('de-DE') + '' + (r.deck_slug || 'Alle') + '' + r.score_percent + '%' + r.correct_answers + '/' + r.total_questions + '
'; } el.innerHTML = h; el.querySelectorAll('.deck-card').forEach(function(card) { card.addEventListener('click', function() { location.hash = '#/quiz/play/' + card.dataset.slug; }); }); }, play: function(el, deck) { el.textContent = 'Generiere Quiz...'; var self = this; var slug = deck === 'all' ? '' : deck; API.get('/quiz/generate?deck=' + slug + '&count=10').then(function(data) { self.state = { questions: data.questions, index: 0, correct: 0, selected: -1, answered: false, deck: deck }; self.renderQuestion(el); }).catch(function(e) { el.textContent = e.message; }); }, renderQuestion: function(el) { var s = this.state; if (s.index >= s.questions.length) { this.renderResult(el); return; } var q = s.questions[s.index]; var h = '← Abbrechen'; h += '
' + Markdown.esc(q.deck_name || 'Quiz') + ''; h += 'Frage ' + (s.index + 1) + ' / ' + s.questions.length + '
'; h += '
'; h += '
' + Markdown.render(q.question) + '
'; q.options.forEach(function(opt, i) { var cls = 'quiz-option'; if (s.answered) { if (i === q.correct_index) cls += ' correct'; else if (i === s.selected) cls += ' wrong'; } else if (i === s.selected) cls += ' selected'; h += ''; }); h += '
'; if (s.answered) { h += '
Erklaerung
' + Markdown.render(q.full_answer) + '
'; h += '
'; } h += '
'; el.innerHTML = h; var self = this; if (!s.answered) { el.querySelectorAll('.quiz-option').forEach(function(btn) { btn.addEventListener('click', function() { self.selectOption(parseInt(btn.dataset.idx)); }); }); } else { document.getElementById('quiz-next').addEventListener('click', function() { self.next(); }); } }, selectOption: function(index) { var s = this.state; if (s.answered) return; s.selected = index; if (index === s.questions[s.index].correct_index) s.correct++; s.answered = true; this.renderQuestion(document.getElementById('content')); }, next: function() { this.state.index++; this.state.selected = -1; this.state.answered = false; this.renderQuestion(document.getElementById('content')); }, renderResult: function(el) { var s = this.state; var total = s.questions.length; var pct = Math.round((s.correct / total) * 100); API.post('/quiz/submit', { deck: s.deck, total: total, correct: s.correct }).catch(function() {}); var color = pct >= 70 ? 'var(--green)' : pct >= 40 ? 'var(--orange)' : 'var(--red)'; var h = '

Quiz abgeschlossen!


'; h += '

' + pct + '%

'; h += '

' + s.correct + ' von ' + total + ' richtig


'; h += 'Neues Quiz
'; el.innerHTML = h; } };