MediaWiki:Gadget-zmquiz.js

Материал из Абсурдопедии
Перейти к навигацииПерейти к поиску

Замечание. Возможно, после сохранения вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl-F5 или Ctrl-R (⌘-R на Mac)
  • Google Chrome: Нажмите Ctrl-Shift-R (⌘-Shift-R на Mac)
  • Internet Explorer: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl-F5
  • Opera: Перейдите в Menu → Настройки (Opera → Настройки на Mac), а затем Безопасность → Очистить историю посещений → Кэшированные изображения и файлы
( function ( mw, $ ) {

/**
* Script for quizzes and tests
* see [[Template:ZmQuiz]] (ru) for details
* author: Źmicier Dzikański 
* date: 7 / 10 / 2017
* version: 2.4.1
*/ 


if($('.zmQuizBody')[0]) {
  var type; 
  var results;
  var step;
  var questionsCollection;
  var amIFine;

  var questionsArray = $('.zmQuizBacklogBlock').children();
  var messages = loadMessages();

  var quizSettings = {};

  quizSettings['points'] = {
     setInitialValues : function() {
        results = 0;
        step = 0;
        questionsCollection = loadQuestionsCollectionAsList();
     },

     getQuestion : function() {
        return questionsCollection[step];
     },

     processAnswerMarker : function(answerMarker) {
        results += parseFloat(answerMarker);
        step++;
     },

     buildResults : function(resultsArray) {
       resultBlock = "";
       for(i = 0; i < resultsArray.length; i++ ) {
          interval = $(resultsArray[i]).attr('data-marker');
          beginOfInterval = parseFloat(interval.split(',')[0]);
          endOfInterval = parseFloat(interval.split(',')[1]);
          if(beginOfInterval <= results && results < endOfInterval) {
             resultBlock = $(resultsArray[i]).html();
             break;
          }
       }

       if(!resultBlock || 0 === resultBlock.length) {
          showError(getParagraphMessage("zmQuiz-error", getMessage("zmQuiz-error-results")));
       } else {  
          return getParagraphMessage("zmQuiz-tpoints-result", results) + "<p>" + resultBlock + "</p>";
       }
     }
  }

  quizSettings['character'] = {
     setInitialValues : function() {
        results = {};
        step = 0;
        questionsCollection = loadQuestionsCollectionAsList();
     },

     getQuestion : function() {
        return questionsCollection[step];
     },

     processAnswerMarker : function(answerMarker) {
        if(results[answerMarker]) {
           results[answerMarker] += 1;
        } else {
           results[answerMarker] = 1;
        }

        step++;
     },

     buildResults : function(resultsArray) {
        resultBlock = "";
        var max = -1;
        var arrayOfPopulars = [];
        for(i = 0; i < resultsArray.length; i++ ) {
           marker = $(resultsArray[i]).attr('data-marker');
           if(!(marker in results)) {
              continue;
           }
           if(results[marker] == max) {
              arrayOfPopulars.push($(resultsArray[i]).html());
           } else if(results[marker] > max) {
              max = results[marker];
              arrayOfPopulars = [$(resultsArray[i]).html()];
           }
        }

        if(arrayOfPopulars.length == 0) {
           showError(getParagraphMessage("zmQuiz-error", getMessage("zmQuiz-error-results")));
           return;
        } else if(arrayOfPopulars.length == 1) {
           resultBlock="";
        } else if(arrayOfPopulars.length > 1) {
           resultBlock=getParagraphMessage("zmQuiz-tcharacteristics-several");
        }
    
        for(i = 0; i < arrayOfPopulars.length; i++ ) {
           resultBlock += "<p>" + arrayOfPopulars[i] + "</p>";
        }    

        return resultBlock;
     }
  }

  quizSettings['quest'] = {
     setInitialValues : function() {
        step = $(questionsArray[0]).attr('data-marker');
        questionsCollection = loadQuestionsCollectionAsMap();
     },

     getQuestion : function() {
        questions = questionsCollection[step];
        if(questions) {
           return questions[0];
        }
     },

     processAnswerMarker : function(answerMarker) {
        step = answerMarker;
     },

     buildResults : function(resultsArray) {
        for(i = 0; i < resultsArray.length; i++ ) {
           marker = $(resultsArray[i]).attr('data-marker');
           if(marker == step) {
              return "<p>" + $(resultsArray[i]).html() + "</p>";
           }
        }
        showError(getParagraphMessage("zmQuiz-error", getMessage("zmQuiz-error-results")));
     }
  }

  /* init processes */
  type = $('.zmQuizBody').attr('data-type');
  thisQuizSettings = quizSettings[type];
  init();

  /* main logic */
  function init() {
     amIFine = true;

     $(".zmQuizBody").html(getParagraphMessage("zmQuiz-quiz-description") + "<p><a class=\"zmQuizStartButton\" style=\"cursor: pointer\">" + getMessage("zmQuiz-begin") + "</a></p>");

     $(".zmQuizStartButton" ).click(function() {
        if(thisQuizSettings == null) {
           showError(getParagraphMessage("zmQuiz-error", getMessage("zmQuiz-error-type", type)));
           return;
        } else {
           thisQuizSettings.setInitialValues();
        }
        showQuestion();
     });
  }

  function showQuestion() {
     question = thisQuizSettings.getQuestion();
     if(question) {
        $(".zmQuizBody").html($(question).find( ".zmQuizQuestionText" ).html());
        $(".zmQuizBody").append("<ul></ul>\n");
        answers = $(question).find( ".zmQuizAnswer" );
        for(i = 0; i < answers.length; i++ ) {
           $(".zmQuizBody ul").append("<li><a id=\"zmQuizAnswer_"+step+"_"+i+"\" style=\"cursor: pointer\">" + $(answers[i]).html() + "</a></li>\n");
           $("#zmQuizAnswer_"+step+"_"+i).click({marker: $(answers[i]).attr('data-points')}, processClick);
        }
     } else {
        showResult();
     }
  }

  function showResult() {
     resultsArray = $('.zmQuizResultsBlock').children();
     resultBlock = thisQuizSettings.buildResults(resultsArray);
     if(amIFine) { 
        $(".zmQuizBody").html("<p style='font-weight: bold;'>" + getMessage("zmQuiz-quiz-passed") +"</p>" + resultBlock + "<p><a class=\"zmQuizRepeatButton\" style=\"cursor: pointer\">" + getMessage("zmQuiz-repeat") + "</a></p>");
        $(".zmQuizRepeatButton" ).click(init);
     }
  }

  function showError(erMessage) {
     amIFine = false;
     $(".zmQuizBody").html(erMessage);
  }  

  function processClick(event) {
    answerMarker = event.data.marker;
    thisQuizSettings.processAnswerMarker(answerMarker);
    showQuestion();
  }

  function loadQuestionsCollectionAsMap() {
    questionsMap = {};
    for(var i = 0; i < questionsArray.length; i++) {
      marker = $(questionsArray[i]).attr('data-marker');   
      if(marker == null) {
         marker = i.toString(); 
      }
      if(questionsMap[marker]) {
         questionsMap[marker].push($(questionsArray[i]));
      } else {
         questionsMap[marker] = [$(questionsArray[i])];
      }
    }
    return questionsMap;
  }

  function loadQuestionsCollectionAsList() {
     return questionsArray.slice();
  }

  function loadMessages() {
     messages = {};
     messagesHTML = $('.zmQuizMessages').children();
     for(i = 0; i < messagesHTML.length; i++ ) {
        messages[$(messagesHTML[i]).attr('id')] = $(messagesHTML[i]).html();
     }
     return messages;
  }

  function getMessage() {
     key = arguments[0];
     message = messages[key];
     for (var i = 1; i < arguments.length; i++) {
        message = message.replace(new RegExp("#\\("+i+"\\)", 'g'), arguments[i]);
     }
     return message;
  }

  function getParagraphMessage() {
     return "<p>" + getMessage.apply(this, arguments) + "</p>";
  }  
}


}( mediaWiki, jQuery ) );