|
|
1. sor: |
1. sor: |
| /* Quiz.js for vikwikiQuiz project
| |
|
| |
|
| Copyright (C) 2013 Palotás Boldizsár
| |
|
| |
| Permission is hereby granted, free of charge, to any person obtaining a copy
| |
| of this software and associated documentation files (the "Software"), to deal
| |
| in the Software without restriction, including without limitation the rights
| |
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
| |
| copies of the Software, and to permit persons to whom the Software is
| |
| furnished to do so, subject to the following conditions:
| |
|
| |
| The above copyright notice and this permission notice shall be included in
| |
| all copies or substantial portions of the Software.
| |
|
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
| |
| IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
| |
| FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
| |
| AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
| |
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
| |
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
| |
| THE SOFTWARE.
| |
|
| |
| (MIT License)
| |
|
| |
| */
| |
|
| |
| (function (mw, $) {
| |
| /*
| |
| Egy anonim függvényobjektumot hozunk létre, amit rögtön végre is hajtunk.
| |
| Mivel a függvény külön névtérben van, ezért a globális névteret (window)
| |
| nem szennyezzük a lokális változókkal, függvényekkel.
| |
| */
| |
|
| |
| var questions = [],
| |
| shownQuestionIds = [],
| |
| uiContentElement,
| |
| uiControlElements = {},
| |
| config = new ConfObject(true, true),
| |
| stats = new StatObject(),
| |
| defaultScoringMethod = +1,
| |
| currentCodeID = "2013.02.07. v1";
| |
|
| |
| return init();
| |
|
| |
| /*
| |
| Inicializáló függvény. Eldönti, hogy kvízoldalról va szó, és ha igen, akkor
| |
| értelmezi és úgy alakítja át az oldalt, hogy interaktív kvízként működjön.
| |
| */
| |
| function init() {
| |
| if (!shouldLoadQuiz()) {
| |
| return false;
| |
| }
| |
| getDefaultScoringMethod(); // A kérdések parse-olása előtt kell legyen
| |
| parseQuestionsInDocument(); // Kérdések feldolgozása
| |
| parseAnswerGroupsInQuestions(); // Kérdéseken belül a válaszlehetőségek
| |
| uiCreateQuizInterface(); // Interfész (infobox) inicializása
| |
| uiPopulateQuizInterace(); // Interfészelemek létrehozása
| |
| uiReset(); // Reset, hogy rögtön mehessen a kvíz
| |
| return true;
| |
| }
| |
|
| |
| /*
| |
| A kvíz alapbeállított pontozási módszerét tölti be az oldalról.
| |
| */
| |
| function getDefaultScoringMethod() {
| |
| var defScorMethText = $('#vw-quiz-defaultscoringmethod').text();
| |
| if ($.trim(defScorMethText) === "-")
| |
| defaultScoringMethod = -1;
| |
| if ($.trim(defScorMethText) === "+")
| |
| defaultScoringMethod = +1;
| |
| }
| |
|
| |
| /*
| |
| Eldönti, hogy be kell-e tölteni a kódot, kvízzé kell-e alakítani az oldalt.
| |
| */
| |
| function shouldLoadQuiz() {
| |
| if ($('#vw-quiz-canvas').length !== 1)
| |
| return false; // Ha nincs Kvízoldal sablon, vagy több is van -> NEM
| |
| if (mw.config.values.wgAction !== 'view' &&
| |
| mw.config.values.wgAction !== 'submit')
| |
| return false; // Ha nem megtekintjük a kész oldalt, vagy nem
| |
| // előnézetben vagyunk az oldal mentésekor -> NEM
| |
| if ($.cookie('vw-quiz-conf-loadcodeid') &&
| |
| $.cookie('vw-quiz-conf-loadcodeid') != currentCodeID)
| |
| return false; // Ha cookieval le van tiltva a kód -> NEM
| |
| return true; // Minden egyéb esetben IGEN
| |
| }
| |
|
| |
| /*
| |
| Az infoboxban frissíti a statisztikákat.
| |
| */
| |
| function uiUpdateStats() {
| |
| // Átlagteljesítmény, százalékosan
| |
| uiControlElements.uiStatAverageText.text(
| |
| stats.totalAnswers != 0 ?
| |
| Math.round(stats.getRunningAverage() * 100).toString() + '%' :
| |
| ''
| |
| );
| |
| // Kérdések száma
| |
| uiControlElements.uiStatAllQuestionsText.text(
| |
| stats.totalAnswers.toString()
| |
| );
| |
| // Pontok száma két tizedesjegyre
| |
| uiControlElements.uiStatGoodAnswersText.text(
| |
| (Math.round(stats.totalPercentage * 100) / 100).toString()
| |
| );
| |
| }
| |
|
| |
| /*
| |
| Feldolozza a kérdéseket a dokumentumban.
| |
| Egy kérdés az első <H2> tagtől a következőig tart. Egy <HR> (horizontal
| |
| rule) tag a kérdéssor végét jelöli (wikiszintexissal ez négy kötőjel ----),
| |
| így lehet megjegyzéseket beszúrni a kérdéssor elé és mögé.
| |
| */
| |
| function parseQuestionsInDocument() {
| |
| var CQ_UNINITIATED = -1;
| |
| var CQ_EXIT = -2;
| |
|
| |
| // A tartalomrész felsőszintű elemei.
| |
| var uiContentElements = $('#mw-content-text > *');
| |
|
| |
| // Az első <H2>-ig mindent ignorálunk.
| |
| // Onnantól kezdve a megfelelő QuestionObjectbe beletoljuk az összes alá
| |
| // tartozó elemet
| |
| var questionId = CQ_UNINITIATED;
| |
| for (var i = 0; i != uiContentElements.length && questionId != CQ_EXIT; i++) {
| |
| if (uiContentElements[i].nodeName === 'H2') {
| |
| questionId++ ;
| |
| questions.push(new QuestionObject(questionId));
| |
| questions[questionId].uiElements.push( $(uiContentElements[i]).detach()[0] );
| |
| } else if (uiContentElements[i].nodeName === 'HR') {
| |
| // <HR/> -> abort mission
| |
| questionId = CQ_EXIT;
| |
| } else if (questionId > CQ_UNINITIATED) {
| |
| questions[questionId].uiElements.push( $(uiContentElements[i]).detach()[0] );
| |
| }
| |
| }
| |
| }
| |
|
| |
| /*
| |
| A QuestionObject-ekbe betöltött HTML-elemeket végignézve feldolgozza a
| |
| válaszcsoportokat.
| |
| */
| |
| function parseAnswerGroupsInQuestions() {
| |
| for (var i = 0; i != questions.length; i++) {
| |
| questions[i].parseAnswerGroups(defaultScoringMethod, checkAnswer);
| |
| }
| |
| }
| |
|
| |
| /*
| |
| Létrehozza a kvizinterfészt. Bizonyos HTML-elemeket betölti egy-egy
| |
| változóba a gyors elérésé érdekében.
| |
| */
| |
| function uiCreateQuizInterface() {
| |
| uiContentElement = $('#vw-quiz-content');
| |
|
| |
| $('#toc').remove(); // tartalomjegyzék törléseaz oldalról, ha van
| |
|
| |
| // Infobox stílusának beállítása
| |
| var uiInfoboxElement = $('#vw-quiz-infobox');
| |
| uiInfoboxElement.css( {
| |
| position: 'fixed',
| |
| right: $('#content').css('padding-right')
| |
| } );
| |
| $('#vw-quiz-infobox .infobox').css('max-width', '100%');
| |
| $('#mw-content-text').css('margin-right', uiInfoboxElement.width().toString() + 'px');
| |
| $('#mw-content-text').css('min-height', uiInfoboxElement.height().toString() + 'px');
| |
|
| |
| // Infobox pozicionálása (hogy mindig látszódjon, ha görgetünk is)
| |
| var setInfoboxPosition = function() {
| |
| var relTop = $('#vw-quiz-content').offset().top - $(window).scrollTop();
| |
| $('#vw-quiz-infobox .infobox').offset({
| |
| top: (relTop < 10 ? 10 + $(window).scrollTop() : $('#vw-quiz-content').offset().top)
| |
| });
| |
| };
| |
| $(window).scroll(setInfoboxPosition);
| |
| setInfoboxPosition();
| |
| }
| |
|
| |
| /*
| |
| Az infobox (interfész) feltöltése a gombokkal és ezek exportálása egy
| |
| változóba (uiControlElements) a gyors elérés érdekében.
| |
| */
| |
| function uiPopulateQuizInterace() {
| |
| var uiStatAverageText = $('#vw-quiz-stat-average');
| |
| var uiStatAllQuestionsText = $('#vw-quiz-stat-allquestions');
| |
| var uiStatGoodAnswersText = $('#vw-quiz-stat-goodanswers');
| |
|
| |
| var resetButton = $('<input type="button" />').val('Újrakezdés');
| |
| resetButton.appendTo( $('#vw-quiz-stat-reset').text('') );
| |
| resetButton.click(uiReset);
| |
|
| |
| var checkAllButton = $('<input type="button" />').val('Minden válasz ellenőrzése');
| |
| checkAllButton.appendTo( $('#vw-quiz-check-all').text('') );
| |
| checkAllButton.click(uiCheckAll);
| |
|
| |
| var showAllCheckbox = $('<input type="checkbox" />').prop(
| |
| 'checked', config.showAll
| |
| ).prop(
| |
| 'id', 'vw-quiz-show-all-checkbox'
| |
| );
| |
| showAllCheckbox.appendTo( $('#vw-quiz-conf-showall').text('') );
| |
|
| |
| var randomCheckbox = $('<input type="checkbox" />').prop(
| |
| 'checked', config.randomOrder
| |
| ).prop(
| |
| 'id', 'vw-quiz-random-checkbox'
| |
| );
| |
| randomCheckbox.appendTo( $('#vw-quiz-conf-ordering').text('') );
| |
|
| |
| uiControlElements = {
| |
| uiStatAverageText: uiStatAverageText,
| |
| uiStatAllQuestionsText: uiStatAllQuestionsText,
| |
| uiStatGoodAnswersText: uiStatGoodAnswersText,
| |
| resetButton: resetButton,
| |
| checkAllButton: checkAllButton,
| |
| randomCheckbox: randomCheckbox,
| |
| showAllCheckbox: showAllCheckbox
| |
| };
| |
| }
| |
|
| |
| /*
| |
| Randomizálja a megjelenített kérdések sorrendjét
| |
| */
| |
| function randomizeDisplayOrder() {
| |
| var ArrayShuffle = function(a) {
| |
| var d,
| |
| c,
| |
| b = a.length;
| |
| while (b) {
| |
| c = Math.floor(Math.random() * b);
| |
| d = a[--b];
| |
| a[b] = a[c];
| |
| a[c] = d;
| |
| }
| |
| return a;
| |
| };
| |
|
| |
| shownQuestionIds = ArrayShuffle(shownQuestionIds);
| |
| }
| |
|
| |
| /*
| |
| A [Minden válasz ellenőrzése]/[Minden kérdés mutatása] gomb eseménykezelője
| |
| */
| |
| function uiCheckAll() {
| |
| if (config.showAll) {
| |
| // Ha minden látszik, akkor mindent ellenőrzünk
| |
| $(':button.vw-quiz-check-btn').click();
| |
| } else {
| |
| // Ha nem minden kérdés látszik, akkor beállítjuk, hogy látszódjon,
| |
| // és resetelünk
| |
| uiControlElements.showAllCheckbox.prop('checked', true);
| |
| uiReset();
| |
| }
| |
| }
| |
|
| |
| /*
| |
| A beállítások betöltése az infoboxból.
| |
| */
| |
| function configSet() {
| |
| config.setRandomOrder(uiControlElements.randomCheckbox.prop('checked'));
| |
| config.setShowAll(uiControlElements.showAllCheckbox.prop('checked'))
| |
| }
| |
|
| |
| /*
| |
| Újrakezdés. Az [Újrakezdés] gomb eseménykezelője is.
| |
| */
| |
| function uiReset() {
| |
| configSet();
| |
| reset();
| |
| uiShowQuestions();
| |
| uiUpdateStats();
| |
| }
| |
|
| |
| /*
| |
| Újrakezdéskor visszaállítja a válaszadások közben megváltoztatott dolgokat.
| |
| */
| |
| function reset() {
| |
| // Megjelenített kérdések listáját töröljük
| |
| shownQuestionIds = [];
| |
| // Hogy érkezett-e válasz a kérdésre, azt is alaphelyzetbe állítjuk,
| |
| // majd a kérdést újra hozzáadjuk a megjelenített kérdések listájához.
| |
| for (var i = 0; i != questions.length; i++) {
| |
| questions[i].submitted = false;
| |
| questions[i].uiResetAnswers();
| |
| shownQuestionIds.push(i);
| |
| }
| |
| // Ha kell, randomizáljuk a sorrendet.
| |
| if (config.randomOrder) {
| |
| randomizeDisplayOrder();
| |
| }
| |
| // Mást csinál a gomb, ha minden kérdés látszik, és mást, ha csak 1.
| |
| if (!config.showAll) {
| |
| uiControlElements.checkAllButton.val('Minden kérdés mutatása');
| |
| } else {
| |
| uiControlElements.checkAllButton.val('Minden válasz ellenőrzése');
| |
| }
| |
| // Statisztikák visszaállítása.
| |
| stats.reset();
| |
| }
| |
|
| |
| /*
| |
| Újrakezdéskor megjeleníti a kérdéseket a megfelelő sorrendben az oldalon.
| |
| */
| |
| function uiShowQuestions() {
| |
| uiContentElement.children().detach();
| |
| for (var i = 0; i != shownQuestionIds.length; i++) {
| |
| questions[ shownQuestionIds[i] ].uiParentElement.appendTo(uiContentElement);
| |
| // Ha nem minden kell látszódjon, akkor elrejtjük a többi kérdést.
| |
| if (!config.showAll && i != 0) {
| |
| questions[ shownQuestionIds[i] ].uiParentElement.css('display', 'none');
| |
| } else {
| |
| // config.showAll || i == 0
| |
| questions[ shownQuestionIds[i] ].uiParentElement.css('display', 'block');
| |
| }
| |
| }
| |
| }
| |
|
| |
| /*
| |
| Egy adott kérdés bejelölt válaszainak ellenőrzése, eredmény mutatása stb.
| |
| */
| |
| function checkAnswer(question) {
| |
| // Amit már ellenőriztünk, azt nem ellenőrizzük újra.
| |
| if (question.submitted) {
| |
| return false;
| |
| }
| |
| question.submitted = true;
| |
|
| |
| // Válaszellenőrzés
| |
| var result = question.checkAnswer();
| |
| stats.totalAnswers += result.totalAnswers;
| |
| stats.totalPercentage += result.totalPercentage;
| |
| uiUpdateStats();
| |
|
| |
| // Következő kérdés mutatása, ha nem mind látszik
| |
| if (!config.showAll) {
| |
| uiHidePreviousQuestion(question);
| |
| uiShowNextQuestion(question);
| |
| }
| |
| }
| |
|
| |
| /*
| |
| Egy kérdés válaszainak ellenőrzése után az előző kérdést elrejti.
| |
| */
| |
| function uiHidePreviousQuestion(question) {
| |
| var prevQuestion = getPreviousQuestion(question);
| |
| if (prevQuestion == null)
| |
| return false;
| |
| if (prevQuestion.uiParentElement.css('display') == 'none')
| |
| return true;
| |
| prevQuestion.uiParentElement.slideUp();
| |
| return true;
| |
| }
| |
|
| |
| /*
| |
| Egy kérdés válaszainak ellenőrzése után a következő kérdést megjeleníti.
| |
| */
| |
| function uiShowNextQuestion(question) {
| |
| var nextQuestion = getNextQuestion(question);
| |
| if (nextQuestion == null) {
| |
| // Ha nincs több kérdés, akkor ezt külön üzenettel jelzi.
| |
| var uiEndOfQuizMessage = $('<p></p>').text('A kvíz véget ért.');
| |
| uiEndOfQuizMessage.css({
| |
| 'padding': '1em',
| |
| 'border': '1px solid #aaa',
| |
| 'margin': '1em 0',
| |
| 'text-align': 'center',
| |
| 'font-size': '1.1em',
| |
| 'display': 'none'
| |
| });
| |
| uiContentElement.append(uiEndOfQuizMessage);
| |
| uiEndOfQuizMessage.slideDown();
| |
| return false;
| |
| }
| |
| if (nextQuestion.uiParentElement.css('display') == 'block')
| |
| return true;
| |
| nextQuestion.uiParentElement.slideDown();
| |
| return true;
| |
| }
| |
|
| |
| /*
| |
| Visszatér a megjelenítési sorrend szerint az előző kérdéssel.
| |
| */
| |
| function getPreviousQuestion(question) {
| |
| for (var i = 0; i != shownQuestionIds.length; i++) {
| |
| if (question.id == shownQuestionIds[i] && i > 0) {
| |
| return questions[ shownQuestionIds[i - 1] ];
| |
| }
| |
| }
| |
| return null;
| |
| }
| |
|
| |
| /*
| |
| Visszatér a megjelenítési sorrend szerint a következő kérdéssel.
| |
| */
| |
| function getNextQuestion(question) {
| |
| for (var i = 0; i != shownQuestionIds.length; i++) {
| |
| if (question.id == shownQuestionIds[i] && i < shownQuestionIds.length - 1) {
| |
| return questions[ shownQuestionIds[i + 1] ];
| |
| }
| |
| }
| |
| return null;
| |
| }
| |
|
| |
| /* ------------------------------------------------------- */
| |
|
| |
| /*
| |
| Egy kérdés adatai tartalmazó objektum.
| |
| Kezdetnek csak egy azonosítót kell megadni.
| |
| */
| |
| function QuestionObject(id) {
| |
| this.id = id;
| |
| this.uiElements = [];
| |
| this.uiParentElement = null;
| |
| this.answers = [];
| |
| this.submitted = false;
| |
|
| |
| /*
| |
| A kérdésben a betöltött HTML-elemeket nézve kiolvassa a kérdésre a különböző
| |
| válaszcsoportokban adható válaszokat.
| |
| */
| |
| this.parseAnswerGroups = function(defaultScoringMethod, answerCheckingFunction) {
| |
| for (var j = 1; j < this.uiElements.length; j++) {
| |
| var currentElement = this.uiElements[j];
| |
| var previousElement = this.uiElements[j - 1];
| |
|
| |
| /*
| |
| Egy válaszcsoport mindig egy <OL> rendezett listában van (#
| |
| szintaxis), ha az előző elemben megtalálható a "vw-quiz-meta"
| |
| osztályú elemet tartalmazó sablon, amely a helyes válaszok listáját,
| |
| a kérdés és a pontozás típusát tartalmazza.
| |
| */
| |
| if (currentElement.nodeName === "OL"
| |
| && $('.vw-quiz-meta', previousElement).length !== 0
| |
| ) {
| |
| this.answers.push(new AnswerGroupObject(
| |
| $('.vw-quiz-type', previousElement).text(),
| |
| $('.vw-quiz-answer', previousElement).text(),
| |
| $('.vw-quiz-scoringmethod', previousElement).text(),
| |
| $(currentElement).children().length,
| |
| currentElement,
| |
| this.id,
| |
| this.answers.length,
| |
| defaultScoringMethod
| |
| ));
| |
| $(previousElement).css('display', 'none'); // Meta elrejtése
| |
| }
| |
| }
| |
| // Válaszgomb hozzáadása
| |
| this.uiAddAnswerButton(answerCheckingFunction);
| |
| // Egy darab tartalmazó <div> hozzáadása
| |
| this.uiAddParentElement();
| |
| };
| |
|
| |
| /*
| |
| Egy darab a teljes kvízkérdést tartalmazó <div> létrehozása.
| |
| */
| |
| this.uiAddParentElement = function() {
| |
| this.uiParentElement = $('<div></div>').addClass('vw-quiz-container').append(this.uiElements);
| |
| this.uiParentElement.css({
| |
| 'padding': '.3em 1em 1em 1em',
| |
| 'border': '1px solid #aaa',
| |
| 'margin': '1em 0'
| |
| });
| |
| };
| |
|
| |
| /*
| |
| Válaszgomb hozzáadása a kérdés legvégéhez. Az answerCheckingFunction a
| |
| függvény, amit a gomb megnyomásakor meg kell hívni a válasz ellenőrzéséhez
| |
| (a teljes kvízhez tartozik egy ilyen függvény, amit paraméterként átadunk).
| |
| */
| |
| this.uiAddAnswerButton = function(answerCheckingFunction) {
| |
| var button = $('<input type="button" />').val('Ellenőrzés').addClass("vw-quiz-check-btn");
| |
| button.css({
| |
| 'display': 'block',
| |
| 'margin-top': '1em',
| |
| 'font-size': '1.1em'
| |
| });
| |
| var self = this;
| |
| button.click(function(eventObject) {
| |
| answerCheckingFunction(self);
| |
| });
| |
| this.uiElements.push(button[0]);
| |
| };
| |
|
| |
| /*
| |
| Válaszok visszaállítása alaphelyzetbe (kitöltetlen és jelöletlen).
| |
| */
| |
| this.uiResetAnswers = function () {
| |
| var answerElements = $('.vw-quiz-question > li', this.uiParentElement);
| |
| answerElements.css({
| |
| 'margin': '.1em',
| |
| 'cursor': 'pointer',
| |
| 'background-color': 'transparent',
| |
| 'opacity': '1',
| |
| 'border': '1px solid transparent'
| |
| });
| |
| $(':radio, :checkbox', this.uiParentElement).prop('checked', false);
| |
| $(':button, :checkbox, :radio', this.uiParentElement).css('cursor', 'pointer').prop('disabled', false);
| |
| };
| |
|
| |
| /*
| |
| A válaszok ellenőrzése egy adott kérdés esetén. Visszatér a kérdés
| |
| pontértékével és az elért pontokkal.
| |
| */
| |
| this.checkAnswer = function() {
| |
| // A pontszámok, amiket a felhasználó kap.
| |
| var result = {
| |
| totalAnswers: 0,
| |
| totalPercentage: 0
| |
| };
| |
| for (var i = 0; i != this.answers.length; i++) {
| |
| // interfész: válaszadás letiltása az ellenőrzéssel.
| |
| $('input', this.uiParentElement).prop('disabled', true);
| |
| $('input, .vw-quiz-question > li', this.uiParentElement).css('cursor', 'default')
| |
|
| |
| var points = 0;
| |
| var ans = this.answers[i];
| |
| if (ans.type === 1) {
| |
| // Egyválaszos (radio button) kérdéstípus
| |
| result.totalAnswers++;
| |
| // A jó válasz kivételével az összes elhalványítása
| |
| $('li:not(:nth-of-type(' + (ans.answer + 1).toString() + '))', ans.uiElement).not("li li").css({
| |
| 'opacity': '0.5'
| |
| });
| |
| var userSelectedAnswer = $(':radio:checked', ans.uiElement).data('answer-id');
| |
| if (!isNaN(userSelectedAnswer) && userSelectedAnswer !== ans.answer) {
| |
| // Hibás választ adott
| |
| result.totalPercentage += (ans.scoringMethod === -1 ? -1 : 0);
| |
| // Helyes választ sárgával jelöljük
| |
| $('li:nth-of-type(' + (ans.answer + 1).toString() + ')', ans.uiElement).not("li li").css({
| |
| 'background-color': '#fff8d0',
| |
| 'border-color': '#aa2'
| |
| });
| |
| // Megjelölt választ pirossal jelöljük
| |
| $('li:nth-of-type(' + (userSelectedAnswer + 1).toString() + ')', ans.uiElement).not("li li").css({
| |
| 'background-color': '#ffe0e0',
| |
| 'border-color': '#a00'
| |
| });
| |
| } else if (!isNaN(userSelectedAnswer)) {
| |
| // Jót jelölt, zölddel jelöljük
| |
| result.totalPercentage += 1;
| |
| $('li:nth-of-type(' + (userSelectedAnswer + 1).toString() + ')', ans.uiElement).not("li li").css({
| |
| 'background-color': '#d8f8d0',
| |
| 'border-color': '#0a0',
| |
| 'opacity': '1'
| |
| });
| |
| } else {
| |
| // Nem jelölt semmit
| |
| // Helyes választ sárgával jelöljük
| |
| $('li:nth-of-type(' + (ans.answer + 1).toString() + ')', ans.uiElement).not("li li").css({
| |
| 'background-color': '#fff8d0',
| |
| 'border-color': '#aa2'
| |
| });
| |
| }
| |
| } else if (ans.type === 2) {
| |
| // Többválaszos (checkbox) kérdéstípus
| |
| result.totalAnswers++;
| |
| var uiAnswerElements = $('li', ans.uiElement).not('li li');
| |
| var partialPoints = 0;
| |
|
| |
| // Végigmegyünk az összes válaszlehetőségen
| |
| for (var j = 0; j != uiAnswerElements.length; j++) {
| |
| var currentAnswerElement = $(uiAnswerElements[j]);
| |
| var checkbox = $(':checkbox', currentAnswerElement);
| |
|
| |
| if (ans.answer.indexOf(j) !== -1) {
| |
| // Be kéne legyen jelölve
| |
| if (checkbox.prop('checked')) {
| |
| // Be is van
| |
| currentAnswerElement.css({
| |
| 'border-color': '#0a0',
| |
| 'background-color': '#d8f8d0'
| |
| });
| |
| partialPoints++;
| |
| } else {
| |
| // Nincs, hibás válasz
| |
| currentAnswerElement.css({
| |
| 'border-color': '#aa2',
| |
| 'background-color': '#fff8d0'
| |
| });
| |
| if (ans.scoringMethod === -1)
| |
| partialPoints--;
| |
| }
| |
| } else {
| |
| // Nem kéne bejelölve legyen
| |
| if (checkbox.prop('checked')) {
| |
| // De mégis be van, hibás válasz
| |
| currentAnswerElement.css({
| |
| 'border-color': '#a00',
| |
| 'background-color': '#ffe0e0',
| |
| 'opacity': '0.5'
| |
| });
| |
| if (ans.scoringMethod === -1)
| |
| partialPoints--;
| |
| } else {
| |
| // És nincs is, ezzel látszólag nem foglalkozunk,
| |
| // mert csak zavaró, de pontot adunk rá.
| |
| currentAnswerElement.css({
| |
| 'opacity': '0.5'
| |
| });
| |
| partialPoints++;
| |
| }
| |
| }
| |
| }
| |
| result.totalPercentage += (partialPoints / ans.numberOfOptions);
| |
| }
| |
| }
| |
| return result;
| |
| }
| |
| }
| |
|
| |
|
| |
| /* ------------------------------------------------------- */
| |
|
| |
| /*
| |
| Egy válaszcsoportot szimbolizáló objektum.
| |
| */
| |
| function AnswerGroupObject(
| |
| typeText, // A válaszcsoport típusát leíró szöveg a wikioldalról
| |
| correctAnswerText, // A jó választ leíró szöveg a wikioldalról
| |
| scoringMethodText, // A pontozást leíró szöveg a wikioldalról
| |
| numberOfOptions, // A válaszlehetőségek száma
| |
| uiElement, // A válaszcsoporthoz tartozó HTML <OL> listaelem
| |
| questionId, // Kérdésazonosító
| |
| answerId, // Válaszcsoportazonosító
| |
| defaultScoringMethod // Alap pontozási módszer
| |
| ) {
| |
| // Inicializálás
| |
|
| |
| // Választípus megállapítása
| |
| this.type = 1; // A default az egyválaszos (radio)
| |
| if ($.trim(typeText) === "egy")
| |
| this.type = 1;
| |
| if ($.trim(typeText) === "több")
| |
| this.type = 2;
| |
|
| |
| this.answer = null;
| |
|
| |
| // Pontozás megállapítása
| |
| this.scoringMethod = defaultScoringMethod;
| |
| if ($.trim(scoringMethodText) === "-")
| |
| this.scoringMethod = -1;
| |
| if ($.trim(scoringMethodText) === "+")
| |
| this.scoringMethod = +1;
| |
|
| |
| // Egyebek
| |
| this.numberOfOptions = numberOfOptions;
| |
| this.uiElement = $(uiElement);
| |
| this.questionId = questionId;
| |
| this.answerId = answerId;
| |
|
| |
| init.call(this);
| |
| addAnswerControls.call(this);
| |
|
| |
| // Válasz megállapítása és stílus beállítása
| |
| function init() {
| |
| if (this.type === 1) {
| |
| this.answer = parseInt(correctAnswerText) - 1;
| |
| } else if (this.type === 2) {
| |
| this.answer = [];
| |
| var answer_list = correctAnswerText.split(",");
| |
| for (var ans_i = 0; ans_i != answer_list.length; ans_i++) {
| |
| this.answer.push(parseInt(answer_list[ans_i]) - 1);
| |
| }
| |
| }
| |
|
| |
| this.uiElement.css({
| |
| 'border': '1px solid #aaa',
| |
| 'list-style-type': 'none',
| |
| 'list-style-image': 'none',
| |
| 'padding': '.25em',
| |
| 'margin': '.5em 0 0 0'
| |
| });
| |
| }
| |
|
| |
| // Válaszadásra lehetőséget adó ineraktív elemek (radio button, checkbox)
| |
| // hozzáadása a válaszlehetőségekhez
| |
| function addAnswerControls() {
| |
| this.uiElement.addClass('vw-quiz-question');
| |
| var answerOptionElements = $('li', this.uiElement).not('li li');
| |
| if (this.type === 1) {
| |
| for (var i = 0; i != answerOptionElements.length; i++) {
| |
| var idString = 'vw-qa-' + this.questionId.toString() + '-' + this.answerId.toString();
| |
| var uiRadiobutton = $('<input type="radio" />')
| |
| .prop('id', idString + '-' + i.toString())
| |
| .prop('name', idString)
| |
| .data('answer-id', i);
| |
| // A listaelemre kattintás olyan, mintha rákattintanék a gombra
| |
| $(answerOptionElements[i]).prepend(uiRadiobutton).click(uiRadiobutton, function(eventObject) {
| |
| if (eventObject.target.nodeName == "INPUT") {
| |
| return true;
| |
| }
| |
| eventObject.data.click();
| |
| });
| |
| }
| |
| } else if (this.type === 2) {
| |
| for (var i = 0; i !== answerOptionElements.length; i++) {
| |
| var idString = 'vw-qa-' + this.questionId.toString() + '-' + this.answerId.toString() + '-' + i.toString();
| |
| var uiCheckbox = $('<input type="checkbox" />')
| |
| .prop('id', idString)
| |
| .prop('name', idString)
| |
| .data('answer-id', i);
| |
| // A listaelemre kattintás olyan, mintha rákattintanék a pipára
| |
| $(answerOptionElements[i]).prepend(uiCheckbox).click(uiCheckbox, function(eventObject) {
| |
| if (eventObject.target.nodeName == "INPUT") {
| |
| return true;
| |
| }
| |
| eventObject.data.click();
| |
| });
| |
| }
| |
| }
| |
| }
| |
|
| |
|
| |
| }
| |
|
| |
|
| |
| /* ------------------------------------------------------- */
| |
|
| |
| /*
| |
| Statisztikát számon tartó objektum.
| |
| */
| |
| function StatObject() {
| |
| this.totalAnswers = 0;
| |
| this.totalPercentage = 0;
| |
| this.getRunningAverage = function() { return this.totalPercentage / this.totalAnswers; };
| |
| this.reset = function() { this.totalAnswers = 0; this.totalPercentage = 0; };
| |
| }
| |
|
| |
|
| |
| /* ------------------------------------------------------- */
| |
|
| |
| /*
| |
| Felhasználói beállításokat számon tartó objektum.
| |
| */
| |
| function ConfObject(showAllDefault, randomOrderDefault) {
| |
| this.showAll = showAllDefault;
| |
| if ($.cookie('vw-quiz-conf-showall') == 'showall') {
| |
| this.showAll = true;
| |
| }
| |
| if ($.cookie('vw-quiz-conf-showall') == 'showone') {
| |
| this.showAll = false;
| |
| }
| |
| this.randomOrder = randomOrderDefault;
| |
| if ($.cookie('vw-quiz-conf-ordering') == 'random') {
| |
| this.randomOrder = true;
| |
| }
| |
| if ($.cookie('vw-quiz-conf-ordering') == 'inorder') {
| |
| this.randomOrder = false;
| |
| }
| |
|
| |
| // Véletlenszerú sorrend mentése cookie-ba
| |
| this.setRandomOrder = function(value) {
| |
| this.randomOrder = value;
| |
| $.cookie('vw-quiz-conf-ordering', value ? 'random' : 'inorder');
| |
| };
| |
|
| |
| // "Minden kérdés látszik" mentése cookie-ba
| |
| this.setShowAll = function(value) {
| |
| this.showAll = value;
| |
| $.cookie('vw-quiz-conf-showall', value ? 'showall' : 'showone');
| |
| };
| |
| }
| |
|
| |
|
| |
| })( mediaWiki, jQuery );
| |
|
| |
| /*
| |
|
| |
| -----------------------------------------------
| |
| --------------- END OF Quiz.js ----------------
| |
| -----------------------------------------------
| |
|
| |
| */
| |