Plugin Directory

Changeset 1717342


Ignore:
Timestamp:
08/22/2017 03:07:02 AM (9 years ago)
Author:
goldhat
Message:

Release v0.7.0

Location:
quizmaster
Files:
166 added
35 edited

Legend:

Unmodified
Added
Removed
  • quizmaster/trunk/css/quizmaster.css

    r1712912 r1717342  
    66/* Start Quiz Box */
    77.qm-quiz-start-box {
     8    display: none;
     9}
     10
     11.qm-button.qm-back-button,
     12.qm-button.qm-skip-button {
    813    display: none;
    914}
     
    7984}
    8085
    81 .quizMaster_list, .quizMaster_listItem, .quizMaster_questionList, .quizMaster_sortStringList, .quizMaster_sortStringList, .quizMaster_maxtrixSortCriterion, .qm-results-boxList, .quizMaster_catOverview ol {
     86.quizMaster_list, .qm-question-list-item, .quizMaster_listItem, .quizMaster_questionList, .quizMaster_sortStringList, .quizMaster_sortStringList, .quizMaster_maxtrixSortCriterion, .qm-results-boxList, .quizMaster_catOverview ol {
    8287    list-style: none;
    8388    padding: 0;
     
    128133}
    129134
    130 .quizMaster_sortable, .quizMaster_sortStringItem {
     135.qm-sortable, .quizMaster_sortStringItem {
    131136    padding: 5px;
    132137    border: 1px solid lightGrey;
  • quizmaster/trunk/fields/exports/acf-export-2017-05-07.json

    r1671450 r1717342  
    349349                    "free_answer": "Free Choice",
    350350                    "sort_answer": "Sorting",
    351                     "cloze_answer": "Fill in the Blank"
     351                    "fill_blank": "Fill in the Blank"
    352352                },
    353353                "default_value": "",
     
    646646                "key": "field_588a8e01fbde9",
    647647                "label": "Fill in the Blank Answer",
    648                 "name": "qmqe_cloze_answers",
     648                "name": "qmqe_fill_blanks",
    649649                "type": "textarea",
    650650                "instructions": "Enclose the searched words with { } e.g. \"I {play} soccer\". Capital and small letters will be ignored.\r\nYou can specify multiple options for a search word. Enclose the word with [ ] e.g. \"I {[play][love][hate]} soccer\" . In this case answers play, love OR hate are correct.\r\nIf mode \"Different points for every answer\" is activated, you can assign points with |POINTS. Otherwise 1 point will be awarded for every answer.\r\ne.g. \"I {play} soccer, with a {ball|3}\" - \"play\" gives 1 point and \"ball\" 3 points.",
     
    655655                            "field": "field_5885e9f669c6f",
    656656                            "operator": "==",
    657                             "value": "cloze_answer"
     657                            "value": "fill_blank"
    658658                        }
    659659                    ]
  • quizmaster/trunk/fields/fieldgroups/question.php

    r1671450 r1717342  
    2828                'free_answer' => 'Free Choice',
    2929                'sort_answer' => 'Sorting',
    30                 'cloze_answer' => 'Fill in the Blank',
     30                'fill_blank' => 'Fill in the Blank',
    3131            ),
    3232            'default_value' => '',
     
    261261        array (
    262262            'sub_fields' => array (
     263                array(
     264                    'key' => 'field_590eafc31392k',
     265                    'label' => 'Answer ID',
     266                    'name' => 'qmqe_sorting_choice_answer_id',
     267                    'type' => 'text',
     268                ),
    263269                array (
    264270                    'tabs' => 'all',
     
    342348            'key' => 'field_588a8e01fbde9',
    343349            'label' => 'Fill in the Blank Answer',
    344             'name' => 'qmqe_cloze_answers',
     350            'name' => 'qmqe_fill_blanks',
    345351            'type' => 'textarea',
    346352            'instructions' => 'Enclose the searched words with { } e.g. "I {play} soccer". Capital and small letters will be ignored.
     
    354360                        'field' => 'field_5885e9f669c6f',
    355361                        'operator' => '==',
    356                         'value' => 'cloze_answer',
     362                        'value' => 'fill_blank',
    357363                    ),
    358364                ),
  • quizmaster/trunk/fields/fieldgroups/quiz.php

    r1671450 r1717342  
    1616            'choices' => array (
    1717                0 => 'Standard Flow',
    18                 1 => 'Standard Flow with Back Button',
    19                 2 => 'Check & Continue',
    20                 3 => 'Questions Stacked',
     18                1 => 'Check & Continue',
     19                2 => 'Questions Stacked',
    2120            ),
    2221            'return_format' => 'value',
     
    471470            'type' => 'true_false',
    472471            'instructions' => 'Show skip button to allow quiz takers to skip the question.',
     472        ),
     473        array (
     474            'default_value' => 0,
     475            'key' => 'field_588c5e56c59p7',
     476            'label' => 'Show Back Button',
     477            'name' => 'qmqu_show_back_button',
     478            'type' => 'true_false',
     479            'instructions' => 'Show back button to allow quiz takers to review previous questions.',
    473480        ),
    474481        array (
  • quizmaster/trunk/js/quizMaster_admin.js

    r1671450 r1717342  
    262262//                      formListener.displayMatrixSortAnswer();
    263263//                      break;
    264 //                  case 'cloze_answer':
     264//                  case 'fill_blank':
    265265//                      formListener.displayClozeAnswer();
    266266//                      break;
     
    352352//
    353353//          displayClozeAnswer: function() {
    354 //              $('.cloze_answer').show();
     354//              $('.fill_blank').show();
    355355//          },
    356356//
     
    525525//                  return false;
    526526//              }
    527 //          } else if(type.val() == 'cloze_answer') {
     527//          } else if(type.val() == 'fill_blank') {
    528528//              var clozeText = '';
    529529//
     
    10201020            });
    10211021
    1022             $('input[name="showMaxQuestion"]').change(function () {
    1023                 if (this.checked) {
    1024 //                  $('input[name="statisticsOn"]').removeAttr('checked').attr('disabled', 'disabled').change();
    1025                     $('#quizMaster_showMaxBox').show();
    1026                 } else {
    1027 //                  $('input[name="statisticsOn"]').removeAttr('disabled');
    1028                     $('#quizMaster_showMaxBox').hide();
    1029                 }
    1030             });
    1031 
    10321022            $('#btnPrerequisiteAdd').click(function () {
    10331023                $('select[name="quizList"] option:selected').removeAttr('selected').appendTo('select[name="prerequisiteList[]"]');
     
    10741064            $('input[name="quizRunOnce"]').change();
    10751065            $('input[name="quizRunOnceType"]:checked').change();
    1076             $('input[name="showMaxQuestion"]').change();
    10771066
    10781067            $('#form_add').click(function () {
     
    22562245                    },
    22572246
    2258                     cloze_answer: function () {
     2247                    fill_blank: function () {
    22592248                        if (global.isEmpty(global.getMceContent('cloze'))) {
    22602249                            alert(quizMasterLocalize.no_answer_msg);
  • quizmaster/trunk/js/quizMaster_admin.min.js

    r1671450 r1717342  
    1 jQuery(document).ready(function(e){function t(){var t=this;t={displayChecked:function(e,t,i,a){var n=i?!e.checked:e.checked;a?n?t.attr("disabled","disabled"):t.removeAttr("disabled"):n?t.show():t.hide()},isEmpty:function(t){return t=e.trim(t),!t||0===t.length},isNumber:function(i){return i=e.trim(i),!t.isEmpty(i)&&!isNaN(i)},getMceContent:function(t){var i=tinymce.editors[t];return void 0==i||i.isHidden()?e("#"+t).val():i.getContent()},ajaxPost:function(t,i,a){var n={action:"quizmaster_admin_ajax",func:t,data:i};e.post(ajaxurl,n,a,"json")}};var a=function(){e(".quizMaster_tab_wrapper a").click(function(){var t=e(this),i=t.data("tab"),a=t.siblings(".button-primary").removeClass("button-primary").addClass("button-secondary");return t.removeClass("button-secondary").addClass("button-primary"),e(a.data("tab")).hide("fast"),e(i).show("fast"),e(document).trigger({type:"changeTab",tabId:i}),!1})},n={gobalSettings:function(){var i={categoryDelete:function(i,a){var n={categoryId:i};t.ajaxPost("categoryDelete",n,function(t){t.err||(e('select[name="category'+a+'"] option[value="'+i+'"]').remove(),e('select[name="category'+a+'"]').change())})},categoryEdit:function(i,a,n){var o={categoryId:i,categoryName:e.trim(a)};return t.isEmpty(a)?void alert(quizMasterLocalize.category_no_name):void t.ajaxPost("categoryEdit",o,function(t){t.err||(e('select[name="category'+n+'"] option[value="'+i+'"]').text(o.categoryName),e('select[name="category'+n+'"]').change())})},changeTimeFormat:function(t,i){"0"!=i.val()&&e('input[name="'+t+'"]').val(i.val())},templateDelete:function(i,a){var n={templateId:i,type:a};t.ajaxPost("templateDelete",n,function(t){t.err||(a?(e('select[name="templateQuestion"] option[value="'+i+'"]').remove(),e('select[name="templateQuestion"]').change()):(e('select[name="templateQuiz"] option[value="'+i+'"]').remove(),e('select[name="templateQuiz"]').change()))})},templateEdit:function(i,a,n){if(t.isEmpty(a))return void alert(quizMasterLocalize.category_no_name);var o={templateId:i,name:e.trim(a),type:n};t.ajaxPost("templateEdit",o,function(t){t.err||(n?(e('select[name="templateQuestion"] option[value="'+i+'"]').text(o.name),e('select[name="templateQuestion"]').change()):(e('select[name="templateQuiz"] option[value="'+i+'"]').text(o.name),e('select[name="templateQuiz"]').change()))})}},a=function(){e('select[name="category"]').change(function(){e('input[name="categoryEditText"]').val(e(this).find(":selected").text())}).change(),e('input[name="categoryDelete"]').click(function(){var t=e('select[name="category"] option:selected').val();i.categoryDelete(t,"")}),e('input[name="categoryEdit"]').click(function(){var t=e('select[name="category"] option:selected').val(),a=e('input[name="categoryEditText"]').val();i.categoryEdit(t,a,"")}),e('select[name="categoryQuiz"]').change(function(){e('input[name="categoryQuizEditText"]').val(e(this).find(":selected").text())}).change(),e('input[name="categoryQuizDelete"]').click(function(){var t=e('select[name="categoryQuiz"] option:selected').val();i.categoryDelete(t,"Quiz")}),e('input[name="categoryQuizEdit"]').click(function(){var t=e('select[name="categoryQuiz"] option:selected').val(),a=e('input[name="categoryQuizEditText"]').val();i.categoryEdit(t,a,"Quiz")}),e("#statistic_time_format_select").change(function(){i.changeTimeFormat("statisticTimeFormat",e(this))}),e(document).bind("changeTab",function(t){switch(e("#problemInfo").hide("fast"),t.tabId){case"#problemContent":e("#problemInfo").show("fast");break;case"#emailSettingsTab":}}),e('input[name="email[html]"]').change(function(){return void 0==switchEditors?!1:void(this.checked?switchEditors.go("adminEmailEditor","tmce"):switchEditors.go("adminEmailEditor","html"))}).change(),e('input[name="userEmail[html]"]').change(function(){return void 0==switchEditors?!1:void(this.checked?switchEditors.go("userEmailEditor","tmce"):switchEditors.go("userEmailEditor","html"))}).change(),e('select[name="templateQuiz"]').change(function(){e('input[name="templateQuizEditText"]').val(e(this).find(":selected").text())}).change(),e('select[name="templateQuestion"]').change(function(){e('input[name="templateQuestionEditText"]').val(e(this).find(":selected").text())}).change(),e('input[name="templateQuizDelete"]').click(function(){var t=e('select[name="templateQuiz"] option:selected').val();i.templateDelete(t,0)}),e('input[name="templateQuestionDelete"]').click(function(){var t=e('select[name="templateQuestion"] option:selected').val();i.templateDelete(t,1)}),e('input[name="templateQuizEdit"]').click(function(){var t=e('select[name="templateQuiz"] option:selected').val(),a=e('input[name="templateQuizEditText"]').val();i.templateEdit(t,a,0)}),e('input[name="templateQuestionEdit"]').click(function(){var t=e('select[name="templateQuestion"] option:selected').val(),a=e('input[name="templateQuestionEditText"]').val();i.templateEdit(t,a,1)})};a()},questionEdit:function(){var i=this,a=e.noop(),n={answerChildren:e(".answer_felder > div"),pointsModus:e('input[name="answerPointsActivated"]'),gPoints:e('input[name="points"]')};i={generateArrayIndex:function(){var t=e('input[name="answerType"]:checked').val();t="single"==t||"multiple"==t?"classic_answer":t,e(".answerList").each(function(){var i=e(this).parent().attr("class");e(this).children().each(function(a,n){e(this).find('[name^="answerData"]').each(function(){var e=this.name,n=e.search(/\](\[\w+\])+$/),o=t==i?a:"none";n>0&&(this.name="answerData["+o+e.substring(n,e.length))})})})},globalValidate:function(){if(t.isEmpty(t.getMceContent("question")))return alert(quizMasterLocalize.no_question_msg),!1;if(n.pointsModus.is(":checked")){if("free_answer"==e('input[name="answerType"]:checked').val())return alert(quizMasterLocalize.dif_points),!1}else{var i=n.gPoints.val();if(!t.isNumber(i)||1>i)return alert(quizMasterLocalize.no_nummber_points),!1}return a()===!1?!1:!0},answerRemove:function(){var t=e(this).parent();return t.parent().children().length<2?!1:(t.remove(),!1)},addCategory:function(){var i=e.trim(e('input[name="categoryAdd"]').val());if(!t.isEmpty(i)){var a={categoryName:i};t.ajaxPost("categoryAdd",a,function(t){if(t.err)return void e("#categoryMsgBox").text(t.err).show("fast").delay(2e3).hide("fast");var i=e(document.createElement("option")).val(t.categoryId).text(t.categoryName).attr("selected","selected");e('select[name="category"]').append(i).change()})}},addMediaClick:function(){if("function"!=typeof tb_show)return!1;var t=e(this).closest("li"),i=t.find('input[name="answerData[][html]"]:eq(0)'),a=t.find(".qm-start-box:eq(0)");window.org_send_to_editor=window.send_to_editor;var n=tb_remove;window.send_to_editor=function(t){var n=e("img",t)[0].outerHTML;a.val(a.val()+n),i.attr("checked",!0),tb_remove(),window.send_to_editor=window.org_send_to_editor},window.tb_remove=function(){window.send_to_editor=window.org_send_to_editor,tb_remove=n,tb_remove()},tb_show("","media-upload.php?type=image&TB_iframe=true")}};var o={classic_answer:function(){var i=0,a=0,o=0;return e(".classic_answer .answerList").children().each(function(){var n=e(this);if(!t.isEmpty(n.find('textarea[name="answerData[][answer]"]').val())){i++,n.find('input[name="answerData[][correct]"]:checked').length&&a++;var r=n.find('input[name="answerData[][points]"]').val();t.isNumber(r)&&r>=0&&o++}}),i?a||e('input[name="disableCorrect"]').is(":checked")&&e('input[name="answerPointsDiffModusActivated"]').is(":checked")&&e('input[name="answerPointsActivated"]').is(":checked")&&"single"==e('input[name="answerType"]:checked').val()?o!=i&&n.pointsModus.is(":checked")?(alert(quizMasterLocalize.no_nummber_points_new),!1):!0:(alert(quizMasterLocalize.no_correct_msg),!1):(alert(quizMasterLocalize.no_answer_msg),!1)},free_answer:function(){return t.isEmpty(e('.free_answer textarea[name="answerData[][answer]"]').val())?(alert(quizMasterLocalize.no_answer_msg),!1):!0},cloze_answer:function(){return t.isEmpty(t.getMceContent("cloze"))?(alert(quizMasterLocalize.no_answer_msg),!1):!0},sort_answer:function(){var i=0,a=0;return e(".sort_answer .answerList").children().each(function(){var n=e(this);if(!t.isEmpty(n.find('textarea[name="answerData[][answer]"]').val())){i++;var o=n.find('input[name="answerData[][points]"]').val();t.isNumber(o)&&o>=0&&a++}}),i?a!=i&&n.pointsModus.is(":checked")?(alert(quizMasterLocalize.no_nummber_points_new),!1):!0:(alert(quizMasterLocalize.no_answer_msg),!1)},matrix_sort_answer:function(){var i=0,a=0,o=!0,r=0;return e(".matrix_sort_answer .answerList").children().each(function(){var n=e(this),c=n.find('input[name="answerData[][points]"]').val();t.isEmpty(n.find('textarea[name="answerData[][answer]"]').val())?t.isEmpty(n.find('textarea[name="answerData[][sort_string]"]').val())||(r++,t.isNumber(c)&&c>=0&&a++):(i++,r++,t.isEmpty(n.find('textarea[name="answerData[][sort_string]"]').val())&&(o=!1),t.isNumber(c)&&c>=0&&a++)}),i?o?a!=r&&n.pointsModus.is(":checked")?(alert(quizMasterLocalize.no_nummber_points_new),!1):!0:(alert(quizMasterLocalize.no_sort_element_criterion),!1):(alert(quizMasterLocalize.no_answer_msg),!1)},assessment_answer:function(){return t.isEmpty(t.getMceContent("assessment"))?(alert(quizMasterLocalize.no_answer_msg),!1):!0}},r=function(){e("#quizMaster_tip").change(function(){t.displayChecked(this,e("#quizMaster_tipBox"))}).change(),e("#quizMaster_correctSameText").change(function(){t.displayChecked(this,e("#quizMaster_incorrectMassageBox"),!0)}).change(),e('input[name="answerType"]').click(function(){n.answerChildren.hide();var t=this.value;if("single"==t?(e("#singleChoiceOptions").show(),e('input[name="disableCorrect"]').change()):(e("#singleChoiceOptions").hide(),e(".classic_answer .quizMaster_classCorrect").parent().parent().show()),"single"==t||"multiple"==t){var i="single"==t?"radio":"checkbox";t="classic_answer",e(".quizMaster_classCorrect").each(function(){e("<input type="+i+" />").attr({name:this.name,value:this.value,checked:this.checked}).addClass("quizMaster_classCorrect quizMaster_checkbox").insertBefore(this)}).remove()}a=void 0!=o[t]?o[t]:e.noop(),e("."+t).show()}),e('input[name="answerType"]:checked').click(),e(".deleteAnswer").click(i.answerRemove),e(".addAnswer").click(function(){var t=e(this).siblings("ul"),a=t.find("li:eq(0)").clone();return a.find(".quizMaster_checkbox").removeAttr("checked"),a.find(".qm-start-box").val(""),a.find(".quizMaster_points").val(1),a.find(".deleteAnswer").click(i.answerRemove),a.find(".addMedia").click(i.addMediaClick),a.appendTo(t),!1}),e(".sort_answer ul, .classic_answer ul, .matrix_sort_answer ul").sortable({handle:".quizMaster_move"}),e("#saveQuestion").click(function(){return i.globalValidate()?(i.generateArrayIndex(),!0):!1}),e(n.pointsModus).change(function(){t.displayChecked(this,e(".quizMaster_answerPoints")),t.displayChecked(this,e("#quizMaster_showPointsBox")),t.displayChecked(this,n.gPoints,!1,!0),t.displayChecked(this,e('input[name="answerPointsDiffModusActivated"]'),!0,!0),this.checked?(e('input[name="answerPointsDiffModusActivated"]').change(),e('input[name="disableCorrect"]').change()):(e(".classic_answer .quizMaster_classCorrect").parent().parent().show(),e('input[name="disableCorrect"]').attr("disabled","disabled"))}).change(),e('select[name="category"]').change(function(){var t=e(this),i=e("#categoryAddBox").hide();"-1"==t.val()&&i.show()}).change(),e("#categoryAddBtn").click(function(){i.addCategory()}),e(".addMedia").click(i.addMediaClick),e('input[name="answerPointsDiffModusActivated"]').change(function(){t.displayChecked(this,e('input[name="disableCorrect"]'),!0,!0),this.checked?e('input[name="disableCorrect"]').change():e(".classic_answer .quizMaster_classCorrect").parent().parent().show()}).change(),e('input[name="disableCorrect"]').change(function(){t.displayChecked(this,e(".classic_answer .quizMaster_classCorrect").parent().parent(),!0)}).change(),e("#clickPointDia").click(function(){return e(".pointDia").toggle("fast"),!1}),e('input[name="template"]').click(function(a){return"0"==e('select[name="templateSaveList"]').val()&&t.isEmpty(e('input[name="templateName"]').val())?(alert(quizMasterLocalize.temploate_no_name),a.preventDefault(),!1):void i.generateArrayIndex()}),e('select[name="templateSaveList"]').change(function(){var t=e('input[name="templateName"]');"0"==e(this).val()?t.show():t.hide()}).change()},c=function(){n.answerChildren.hide(),r()};c()},statistic:function(){var i=this,a=e("#quizId").val(),n="users",o={currentPage:e("#quizMaster_currentPage"),pageLeft:e("#quizMaster_pageLeft"),pageRight:e("#quizMaster_pageRight"),testSelect:e("#testSelect")};i={loadStatistic:function(e,i){var a={userId:e};t.ajaxPost("statisticLoad",a,function(e){})},loadUsersStatistic:function(){},loadUsersStatistic_:function(n,o){var r={userId:n,quizId:a,testId:o};i.toggleLoadBox(!1),t.ajaxPost("statisticLoad",r,function(t){e.each(t.question,function(){var t=e("#quizMaster_tr_"+this.questionId);i.setStatisticData(t,this)}),e.each(t.category,function(t,a){var n=e("#quizMaster_ctr_"+t);i.setStatisticData(n,a)}),e("#testSelect option:gt(0)").remove();var a=e("#testSelect");e.each(t.tests,function(){var i=e(document.createElement("option"));i.val(this.id),i.text(this.date),t.testId==this.id&&i.attr("selected",!0),a.append(i)}),i.parseFormData(t.formData),e("#userSelect").val(n),e("#testSelect").val(o),i.toggleLoadBox(!0)})},parseFormData:function(t){var i=e("#quizMaster_form_box");return null==t?void i.hide():(e.each(t,function(t,i){e("#form_id_"+t).text(i)}),void i.show())},setStatisticData:function(e,t){e.find(".quizMaster_cCorrect").text(t.correct),e.find(".quizMaster_cIncorrect").text(t.incorrect),e.find(".quizMaster_cTip").text(t.hint),e.find(".quizMaster_cPoints").text(t.points),e.find(".quizMaster_cResult").text(t.result),e.find(".quizMaster_cTime").text(t.questionTime),e.find(".quizMaster_cCreateTime").text(t.date)},toggleLoadBox:function(t){var i=e("#quizMaster_loadData"),a=e("#qm-quiz-content");t?(i.hide(),a.show()):(a.hide(),i.show())},reset:function(n){var r=e("#userSelect").val();if(confirm(quizMasterLocalize.reset_statistics_msg)){var c={quizId:a,userId:r,testId:o.testSelect.val(),type:n};i.toggleLoadBox(!1),t.ajaxPost("statisticReset",c,function(){i.loadUsersStatistic()})}},loadStatisticOverview:function(n){var r={quizId:a,pageLimit:e("#quizMaster_pageLimit").val(),onlyCompleted:Number(e("#quizMaster_onlyCompleted").is(":checked")),page:o.currentPage.val(),nav:Number(n)};i.toggleLoadBox(!1),t.ajaxPost("statisticLoadOverview",r,function(t){var a=e("#quizMaster_statistics_overview_data"),n=a.children(),o=n.first().clone();n.slice(1).remove(),e.each(t.items,function(){var t=o.clone();i.setStatisticData(t,this),t.find("a").text(this.userName).data("userId",this.userId).click(function(){return e("#userSelect").val(e(this).data("userId")),e("#quizMaster_typeUser").click(),!1}),t.show().appendTo(a)}),o.remove(),i.toggleLoadBox(!0),void 0!=t.page&&i.handleNav(t.page)})},handleNav:function(t){for(var a=e("#quizMaster_currentPage").empty(),n=1;t>=n;n++)e(document.createElement("option")).val(n).text(n).appendTo(a);i.checkNavBar()},checkNavBar:function(){var e=o.currentPage.val();1==e?o.pageLeft.hide():o.pageLeft.show(),e==o.currentPage.children().length?o.pageRight.hide():o.pageRight.show()},refresh:function(){"users"==n?i.loadUsersStatistic():"formOverview"==n?i.loadFormsOverview(!0):i.loadStatisticOverview(!0)},loadFormsOverview:function(n){var o={quizId:a,pageLimit:e("#quizMaster_fromPageLimit").val(),onlyUser:e("#quizMaster_formUser").val(),page:e("#quizMaster_formCurrentPage").val(),nav:Number(n)};i.toggleLoadBox(!1),t.ajaxPost("statisticLoadFormOverview",o,function(t){var a=e("#quizMaster_statistics_form_data"),n=a.children(),o=n.first().clone();n.slice(1).remove(),e.each(t.items,function(){var t=o.clone();i.setStatisticData(t,this),t.find("a").text(this.userName).data("userId",this.userId).data("testId",this.testId).click(function(){return i.switchTabOnLoad("users"),i.loadUsersStatistic_(e(this).data("userId"),e(this).data("testId")),!1}),t.show().appendTo(a)}),o.remove(),i.toggleLoadBox(!0),void 0!=t.page&&i.handleFormNav(t.page)})},handleFormNav:function(t){for(var a=e("#quizMaster_formCurrentPage").empty(),n=1;t>=n;n++)e(document.createElement("option")).val(n).text(n).appendTo(a);i.checkFormNavBar()},checkFormNavBar:function(){var t=e("#quizMaster_formCurrentPage").val();1==t?e("#quizMaster_formPageLeft").hide():e("#quizMaster_formPageLeft").show(),t==e("#quizMaster_formCurrentPage").children().length?e("#quizMaster_formPageRight").hide():e("#quizMaster_formPageRight").show()},switchTabOnLoad:function(t){e(".quizMaster_tab").removeClass("button-primary").addClass("button-secondary"),e(".quizMaster_tabContent").hide();var i=e("#quizMaster_typeOverview");"users"==t?(n="users",e("#quizMaster_tabUsers").show(),i=e("#quizMaster_typeUser")):"formOverview"==t?(n="formOverview",e("#quizMaster_tabFormOverview").show(),i=e("#quizMaster_typeForm")):(n="overview",e("#quizMaster_tabOverview").show()),i.removeClass("button-secondary").addClass("button-primary")}};var r=function(){e("#userSelect, #testSelect").change(function(){i.loadUsersStatistic()}),e(".quizMaster_update").click(function(){i.refresh()}),e("#quizMaster_reset").click(function(){i.reset(0)}),e("#quizMaster_resetUser").click(function(){i.reset(1)}),e(".quizMaster_resetComplete").click(function(){i.reset(2)}),e(".quizMaster_tab").click(function(){var t=e(this);return e(".quizMaster_tab").removeClass("button-primary").addClass("button-secondary"),t.removeClass("button-secondary").addClass("button-primary"),e(".quizMaster_tabContent").hide(),"quizMaster_typeUser"==t.attr("id")?(n="users",e("#quizMaster_tabUsers").show(),i.loadUsersStatistic()):"quizMaster_typeForm"==t.attr("id")?(n="formOverview",e("#quizMaster_tabFormOverview").show(),i.loadFormsOverview(!0)):(n="overview",e("#quizMaster_tabOverview").show(),i.loadStatisticOverview(!0)),!1}),e("#quizMaster_onlyCompleted").change(function(){o.currentPage.val(1),i.loadStatisticOverview(!0)}),e("#quizMaster_pageLimit").change(function(){o.currentPage.val(1),i.loadStatisticOverview(!0)}),o.pageLeft.click(function(){o.currentPage.val(Number(o.currentPage.val())-1),i.loadStatisticOverview(!1),i.checkNavBar()}),o.pageRight.click(function(){o.currentPage.val(Number(o.currentPage.val())+1),i.loadStatisticOverview(!1),i.checkNavBar()}),o.currentPage.change(function(){i.loadStatisticOverview(!1),i.checkNavBar()}),e("#quizMaster_formUser, #quizMaster_fromPageLimit").change(function(){e("#quizMaster_formCurrentPage").val(1),i.loadFormsOverview(!0)}),e("#quizMaster_formPageLeft").click(function(){e("#quizMaster_formCurrentPage").val(Number(o.currentPage.val())-1),i.loadFormsOverview(!1),i.checkFormNavBar()}),e("#quizMaster_formPageRight").click(function(){e("#quizMaster_formCurrentPage").val(Number(o.currentPage.val())+1),i.loadFormsOverview(!1),i.checkFormNavBar()}),e("#quizMaster_formCurrentPage").change(function(){i.loadFormsOverview(!1),i.checkFormNavBar()}),i.loadUsersStatistic()};r()},statisticNew:function(){var a=e("#quizId").val(),n=null,o=null,r={data:{quizId:a,users:-1,pageLimit:100,dateFrom:0,dateTo:0,generateNav:0},changeFilter:function(){var t=function(e){var t=e.datepicker("getDate");return null===t?0:t.getTime()/1e3};return e.extend(this.data,{users:e("#quizMaster_historyUser").val(),pageLimit:e("#quizMaster_historyPageLimit").val(),dateFrom:t(e("#datepickerFrom")),dateTo:t(e("#datepickerTo")),generateNav:1}),this.data}},c={data:{pageLimit:100,onlyCompleted:0,generateNav:0,quizId:a},changeFilter:function(){e.extend(this.data,{pageLimit:e("#quizMaster_overviewPageLimit").val(),onlyCompleted:Number(e("#quizMaster_overviewOnlyCompleted").is(":checked")),generateNav:1})}},s={deleteUserStatistic:function(i,n){if(!confirm(quizMasterLocalize.reset_statistics_msg))return!1;var o={refId:i,userId:n,quizId:a,type:0};t.ajaxPost("statisticResetNew",o,function(){e("#quizMaster_user_overlay").hide(),r.changeFilter(),u.loadHistoryAjax(),c.changeFilter(),u.loadOverviewAjax()})},deleteAll:function(){if(!confirm(quizMasterLocalize.reset_statistics_msg))return!1;var e={quizId:a,type:1};t.ajaxPost("statisticResetNew",e,function(){r.changeFilter(),u.loadHistoryAjax(),c.changeFilter(),u.loadOverviewAjax()})}},u={loadHistoryAjax:function(){var i=e.extend({page:r.data.generateNav?1:n.getCurrentPage()},r.data);u.loadBox(!0);var a=e("#quizMaster_historyLoadContext").hide();t.ajaxPost("statisticLoadHistory",i,function(t){a.html(t.html).show(),t.navi&&n.setNumPage(t.navi),r.data.generateNav=0,a.find(".user_statistic").click(function(){return u.loadUserAjax(0,e(this).data("ref_id"),!1),!1}),a.find(".quizMaster_delete").click(function(){return s.deleteUserStatistic(e(this).parents("tr").find(".user_statistic").data("ref_id"),0),!1}),u.loadBox(!1)})},loadUserAjax:function(i,n,o){e("#quizMaster_user_overlay, #quizMaster_loadUserData").show();var r=e("#quizMaster_user_content").hide(),c={quizId:a,userId:i,refId:n,avg:Number(o)};t.ajaxPost("statisticLoadUser",c,function(t){r.html(t.html),r.find(".quizMaster_update").click(function(){return u.loadUserAjax(i,n,o),!1}),r.find("#quizMaster_resetUserStatistic").click(function(){s.deleteUserStatistic(n,i)}),r.find(".statistic_data").click(function(){return e(this).parents("tr").next().toggle("fast"),!1}),e("#quizMaster_loadUserData").hide(),r.show()})},loadBox:function(t,i){t?e("#quizMaster_loadDataHistory").show():e("#quizMaster_loadDataHistory").hide()},loadOverviewAjax:function(){var i=e.extend({page:c.data.generateNav?1:o.getCurrentPage()},c.data);e("#quizMaster_loadDataOverview").show();var a=e("#quizMaster_overviewLoadContext").hide();t.ajaxPost("statisticLoadOverviewNew",i,function(t){a.html(t.html).show(),t.navi&&o.setNumPage(t.navi),c.data.generateNav=0,a.find(".user_statistic").click(function(){return u.loadUserAjax(e(this).data("user_id"),0,!0),!1}),a.find(".quizMaster_delete").click(function(){return s.deleteUserStatistic(0,e(this).parents("tr").find(".user_statistic").data("user_id")),!1}),e("#quizMaster_loadDataOverview").hide()})}},l=function(){n=new i(e("#historyNavigation"),{onChange:function(){u.loadHistoryAjax()}}),o=new i(e("#overviewNavigation"),{onChange:function(){u.loadOverviewAjax()}}),e("#datepickerFrom").datepicker({closeText:quizMasterLocalize.closeText,currentText:quizMasterLocalize.currentText,monthNames:quizMasterLocalize.monthNames,monthNamesShort:quizMasterLocalize.monthNamesShort,dayNames:quizMasterLocalize.dayNames,dayNamesShort:quizMasterLocalize.dayNamesShort,dayNamesMin:quizMasterLocalize.dayNamesMin,dateFormat:quizMasterLocalize.dateFormat,firstDay:quizMasterLocalize.firstDay,changeMonth:!0,onClose:function(t){e("#datepickerTo").datepicker("option","minDate",t)}}),e("#datepickerTo").datepicker({closeText:quizMasterLocalize.closeText,currentText:quizMasterLocalize.currentText,monthNames:quizMasterLocalize.monthNames,monthNamesShort:quizMasterLocalize.monthNamesShort,dayNames:quizMasterLocalize.dayNames,dayNamesShort:quizMasterLocalize.dayNamesShort,dayNamesMin:quizMasterLocalize.dayNamesMin,dateFormat:quizMasterLocalize.dateFormat,firstDay:quizMasterLocalize.firstDay,changeMonth:!0,onClose:function(t){e("#datepickerFrom").datepicker("option","maxDate",t)}}),e("#filter").click(function(){r.changeFilter(),u.loadHistoryAjax()}),e("#quizMaster_overlay_close").click(function(){e("#quizMaster_user_overlay").hide()}),e("#quizMaster_tabHistory .quizMaster_update").click(function(){return r.changeFilter(),u.loadHistoryAjax(),!1}),e("#quizMaster_tabOverview .quizMaster_update").click(function(){return c.changeFilter(),u.loadOverviewAjax(),!1}),e(".quizMaster_resetComplete").click(function(){return s.deleteAll(),!1}),e("#overviewFilter").click(function(){c.changeFilter(),u.loadOverviewAjax()}),r.changeFilter(),u.loadHistoryAjax(),c.changeFilter(),u.loadOverviewAjax()};l()}},o=function(){a();var t=e.noop;e(".quizMaster_questionEdit").length?t=n.questionEdit:e(".quizMaster_globalSettings").length?t=n.gobalSettings:e(".quizMaster_statistics").length?t=n.statistic:e(".quizMaster_statisticsNew").length&&(t=n.statisticNew),t(),e(".quizMaster_demoImgBox a").mouseover(function(t){var i=e(this),a=e(document).width(),n=i.siblings().outerWidth(!0);if(t.pageX+n>a){var o=a-(t.pageX+n+30);e(this).next().css("left",o+"px")}e(this).next().show()}).mouseout(function(){e(this).next().hide()}).click(function(){return!1})};o()}function i(t,i){var a={onChange:null},n={contain:null,pageLeft:null,pageRight:null,currentPage:null},o=function(){var e=n.currentPage.children().length,t=Number(n.currentPage.val());n.pageLeft.hide(),n.pageRight.hide(),t>1&&n.pageLeft.show(),e>=t+1&&n.pageRight.show()},r=function(){e.extend(n,{contain:t,pageLeft:t.find(".navigationLeft"),pageRight:t.find(".navigationRight"),currentPage:t.find(".navigationCurrentPage")}),e.extend(a,i),n.pageLeft.click(function(){n.currentPage.val(Number(n.currentPage.val())-1),o(),a.onChange&&a.onChange(n.currentPage.val())}),n.pageRight.click(function(){n.currentPage.val(Number(n.currentPage.val())+1),o(),a.onChange&&a.onChange(n.currentPage.val())}),n.currentPage.change(function(){o(),a.onChange&&a.onChange(n.currentPage.val())})};this.getCurrentPage=function(){return n.currentPage.val()},this.setNumPage=function(t){n.currentPage.empty();for(var i=1;t>=i;i++)e(document.createElement("option")).val(i).text(i).appendTo(n.currentPage);o()},r()}e.fn.quizMaster_preview=function(){var t={openPreview:function(t){window.open(e(t).attr("href"),"quizMasterPreview","width=900,height=900")}},i=function(){e(".quizMaster_prview").click(function(e){t.openPreview(this),e.preventDefault()})};i()},e.fn.quizMaster_quizOverall=function(){},e.fn.quizMaster_quizEdit=function(){function t(t,i,a){var n={action:"quizmaster_admin_ajax",func:t,data:i};e.post(ajaxurl,n,a,"json")}var i={addCategory:function(){var i=e.trim(e('input[name="categoryAdd"]').val());if(!a(i)){var n={categoryName:i,type:"quiz"};t("categoryAdd",n,function(t){if(t.err)return void e("#categoryMsgBox").text(t.err).show("fast").delay(2e3).hide("fast");var i=e(document.createElement("option")).val(t.categoryId).text(t.categoryName).attr("selected","selected");e('select[name="category"]').append(i).change()})}},addResult:function(){e("#resultList").children().each(function(){if("none"==e(this).css("display")){var t=e(this),i=t.find('textarea[name="resultTextGrade[text][]"]'),a=i.attr("id"),n=!0;return t.find('input[name="resultTextGrade[prozent][]"]').val("0"),t.find('input[name="resultTextGrade[activ][]"]').val("1").keyup(),void 0==tinymce.editors[a]||tinymce.editors[a].isHidden()||(n=!1),void 0==switchEditors||n||(switchEditors.go(a,"toggle"),switchEditors.go(a,"toggle")),void 0!=tinymce.editors[a]?tinymce.editors[a].setContent(""):i.val(""),void 0==tinymce.editors[a]||n||tinyMCE.execCommand("mceRemoveControl",!1,a),t.parent().children(":visible").last().after(t),void 0==tinymce.editors[a]||n||tinyMCE.execCommand("mceAddControl",!1,a),e(this).show(),void 0==switchEditors||n||switchEditors.go(a,"toggle"),!1}})},deleteResult:function(t){e(t).parent().parent().hide(),e(t).siblings('input[name="resultTextGrade[activ][]"]').val("0")},changeResult:function(t){var a=e(t);return i.validResultInput(a.val())?(a.siblings(".resultProzent").text(a.val()),a.removeAttr("style"),!0):(a.css("background-color","#FF9696"),!1)},validResultInput:function(e){return a(e)?!1:(e=e.replace(/\,/,"."),!isNaN(e)&&Number(e)<=100&&Number(e)>=0?null!=e.match(/\./)?e.split(".")[1].length<3:!0:!1)},validInput:function(){if(a(e("#quizMaster_title").val()))return alert(quizMasterLocalize.no_title_msg),!1;var t="";if(t=void 0==tinymce.editors.text||tinymce.editors.text.isHidden()?e('textarea[name="text"]').val():tinymce.editors.text.getContent(),a(t))return alert(quizMasterLocalize.no_quiz_start_msg),!1;if(e("#quizMaster_resultGradeEnabled:checked").length){var n=!0;if(e("#resultList").children().each(function(){return e(this).is(":visible")&&!i.validResultInput(e(this).find('input[name="resultTextGrade[prozent][]"]').val())?(n=!1,!1):void 0}),!n)return alert(quizMasterLocalize.fail_grade_result),!1}return!0},resetLock:function(){t("resetLock",{quizId:e('input[name="ajax_quiz_id"]').val()},function(){e("#resetLockMsg").show("fast").delay(2e3).hide("fast")})},generateFormIds:function(){var t=0;e("#form_table tbody > tr").each(function(){e(this).find('[name^="form[]"]').each(function(){var i=e(this).attr("name").substr(6);e(this).attr("name","form["+t+"]"+i)}),++t})},updateFormIds:function(){var t=-1,i=e(".emailFormVariables option:selected").val(),n=e(".formVariables").empty(),o=e(".emailFormVariables").empty().append('<option value="-1"></option>');e(".emailFormVariables").data("default")>-1&&(i=e(".emailFormVariables").data("default"),e(".emailFormVariables").data("default",-1)),e("#form_table tbody > tr").each(function(){e(this).children().first().text(t);var i=e(this).find(".formFieldName").val(),r=e(this).find('[name="form[][type]"] option:selected'),c=e(this).find('[name="form[][fieldname]"]').val();1!=e(this).find('input[name="form[][form_delete]"]').val()&&(t>=0&&!a(i)&&n.append(e("<li><span>$form{"+t+"}</span> - "+i+"</li>")),4==r.val()&&o.append(e('<option value="'+t+'">'+c+"</option>")),t++)}),e('.emailFormVariables option[value="'+i+'"]').prop("selected",!0)}},a=function(t){return t=e.trim(t),!t||0===t.length},n=function(){e("#statistics_on").change(function(){this.checked?e("#statistics_ip_lock_tr").show():e("#statistics_ip_lock_tr").hide()}),e(".addResult").click(function(){i.addResult()}),e(".deleteResult").click(function(e){i.deleteResult(this)}),e('input[name="resultTextGrade[prozent][]"]').keyup(function(e){i.changeResult(this)}).keydown(function(e){13==e.which&&e.preventDefault()}),e("#quizMaster_resultGradeEnabled").change(function(){this.checked?(e("#resultGrade").show(),e("#resultNormal").hide()):(e("#resultGrade").hide(),e("#resultNormal").show())}),e("#quizMaster_save").click(function(t){i.validInput()?i.generateFormIds():t.preventDefault(),e('select[name="prerequisiteList[]"] option').attr("selected","selected")}),e('input[name="template"]').click(function(t){return"0"==e('select[name="templateSaveList"]').val()&&a(e('input[name="templateName"]').val())?(alert(quizMasterLocalize.temploate_no_name),t.preventDefault(),!1):(i.generateFormIds(),void e('select[name="prerequisiteList[]"] option').attr("selected","selected"))}),e('select[name="templateSaveList"]').change(function(){var t=e('input[name="templateName"]');"0"==e(this).val()?t.show():t.hide()}).change(),e('input[name="quizRunOnce"]').change(function(t){this.checked?(e("#quizMaster_quiz_run_once_type").show(),e('input[name="quizRunOnceType"]:checked').change()):e("#quizMaster_quiz_run_once_type").hide()}),e('input[name="quizRunOnceType"]').change(function(t){!this.checked||"1"!=this.value&&"3"!=this.value?e("#quizMaster_quiz_run_once_cookie").hide():e("#quizMaster_quiz_run_once_cookie").show()}),e('input[name="resetQuizLock"]').click(function(e){return i.resetLock(),!1}),e(".quizMaster_demoBox a").mouseover(function(t){var i=e(this),a=e("#poststuff").width(),n=i.siblings().outerWidth(!0);if(t.pageX+n>a){var o=jQuery(document).width()-i.parent().offset().left-n-30;e(this).next().css("left",o+"px")}e(this).next().show()}).mouseout(function(){e(this).next().hide()}).click(function(){return!1}),e('input[name="showMaxQuestion"]').change(function(){this.checked?e("#quizMaster_showMaxBox").show():e("#quizMaster_showMaxBox").hide()}),e("#btnPrerequisiteAdd").click(function(){e('select[name="quizList"] option:selected').removeAttr("selected").appendTo('select[name="prerequisiteList[]"]')}),e("#btnPrerequisiteDelete").click(function(){e('select[name="prerequisiteList[]"] option:selected').removeAttr("selected").appendTo('select[name="quizList"]')}),e('input[name="prerequisite"]').change(function(){this.checked?e("#prerequisiteBox").show():e("#prerequisiteBox").hide()}).change(),e('input[name="toplistDataAddMultiple"]').change(function(){this.checked?e("#toplistDataAddBlockBox").show():e("#toplistDataAddBlockBox").hide()}).change(),e('input[name="toplistActivated"]').change(function(){this.checked?e("#toplistBox > tr:gt(0)").show():e("#toplistBox > tr:gt(0)").hide();
     1jQuery(document).ready(function(e){function t(){var t=this;t={displayChecked:function(e,t,i,a){var n=i?!e.checked:e.checked;a?n?t.attr("disabled","disabled"):t.removeAttr("disabled"):n?t.show():t.hide()},isEmpty:function(t){return t=e.trim(t),!t||0===t.length},isNumber:function(i){return i=e.trim(i),!t.isEmpty(i)&&!isNaN(i)},getMceContent:function(t){var i=tinymce.editors[t];return void 0==i||i.isHidden()?e("#"+t).val():i.getContent()},ajaxPost:function(t,i,a){var n={action:"quizmaster_admin_ajax",func:t,data:i};e.post(ajaxurl,n,a,"json")}};var a=function(){e(".quizMaster_tab_wrapper a").click(function(){var t=e(this),i=t.data("tab"),a=t.siblings(".button-primary").removeClass("button-primary").addClass("button-secondary");return t.removeClass("button-secondary").addClass("button-primary"),e(a.data("tab")).hide("fast"),e(i).show("fast"),e(document).trigger({type:"changeTab",tabId:i}),!1})},n={gobalSettings:function(){var i={categoryDelete:function(i,a){var n={categoryId:i};t.ajaxPost("categoryDelete",n,function(t){t.err||(e('select[name="category'+a+'"] option[value="'+i+'"]').remove(),e('select[name="category'+a+'"]').change())})},categoryEdit:function(i,a,n){var o={categoryId:i,categoryName:e.trim(a)};return t.isEmpty(a)?void alert(quizMasterLocalize.category_no_name):void t.ajaxPost("categoryEdit",o,function(t){t.err||(e('select[name="category'+n+'"] option[value="'+i+'"]').text(o.categoryName),e('select[name="category'+n+'"]').change())})},changeTimeFormat:function(t,i){"0"!=i.val()&&e('input[name="'+t+'"]').val(i.val())},templateDelete:function(i,a){var n={templateId:i,type:a};t.ajaxPost("templateDelete",n,function(t){t.err||(a?(e('select[name="templateQuestion"] option[value="'+i+'"]').remove(),e('select[name="templateQuestion"]').change()):(e('select[name="templateQuiz"] option[value="'+i+'"]').remove(),e('select[name="templateQuiz"]').change()))})},templateEdit:function(i,a,n){if(t.isEmpty(a))return void alert(quizMasterLocalize.category_no_name);var o={templateId:i,name:e.trim(a),type:n};t.ajaxPost("templateEdit",o,function(t){t.err||(n?(e('select[name="templateQuestion"] option[value="'+i+'"]').text(o.name),e('select[name="templateQuestion"]').change()):(e('select[name="templateQuiz"] option[value="'+i+'"]').text(o.name),e('select[name="templateQuiz"]').change()))})}},a=function(){e('select[name="category"]').change(function(){e('input[name="categoryEditText"]').val(e(this).find(":selected").text())}).change(),e('input[name="categoryDelete"]').click(function(){var t=e('select[name="category"] option:selected').val();i.categoryDelete(t,"")}),e('input[name="categoryEdit"]').click(function(){var t=e('select[name="category"] option:selected').val(),a=e('input[name="categoryEditText"]').val();i.categoryEdit(t,a,"")}),e('select[name="categoryQuiz"]').change(function(){e('input[name="categoryQuizEditText"]').val(e(this).find(":selected").text())}).change(),e('input[name="categoryQuizDelete"]').click(function(){var t=e('select[name="categoryQuiz"] option:selected').val();i.categoryDelete(t,"Quiz")}),e('input[name="categoryQuizEdit"]').click(function(){var t=e('select[name="categoryQuiz"] option:selected').val(),a=e('input[name="categoryQuizEditText"]').val();i.categoryEdit(t,a,"Quiz")}),e("#statistic_time_format_select").change(function(){i.changeTimeFormat("statisticTimeFormat",e(this))}),e(document).bind("changeTab",function(t){switch(e("#problemInfo").hide("fast"),t.tabId){case"#problemContent":e("#problemInfo").show("fast");break;case"#emailSettingsTab":}}),e('input[name="email[html]"]').change(function(){return void 0==switchEditors?!1:void(this.checked?switchEditors.go("adminEmailEditor","tmce"):switchEditors.go("adminEmailEditor","html"))}).change(),e('input[name="userEmail[html]"]').change(function(){return void 0==switchEditors?!1:void(this.checked?switchEditors.go("userEmailEditor","tmce"):switchEditors.go("userEmailEditor","html"))}).change(),e('select[name="templateQuiz"]').change(function(){e('input[name="templateQuizEditText"]').val(e(this).find(":selected").text())}).change(),e('select[name="templateQuestion"]').change(function(){e('input[name="templateQuestionEditText"]').val(e(this).find(":selected").text())}).change(),e('input[name="templateQuizDelete"]').click(function(){var t=e('select[name="templateQuiz"] option:selected').val();i.templateDelete(t,0)}),e('input[name="templateQuestionDelete"]').click(function(){var t=e('select[name="templateQuestion"] option:selected').val();i.templateDelete(t,1)}),e('input[name="templateQuizEdit"]').click(function(){var t=e('select[name="templateQuiz"] option:selected').val(),a=e('input[name="templateQuizEditText"]').val();i.templateEdit(t,a,0)}),e('input[name="templateQuestionEdit"]').click(function(){var t=e('select[name="templateQuestion"] option:selected').val(),a=e('input[name="templateQuestionEditText"]').val();i.templateEdit(t,a,1)})};a()},questionEdit:function(){var i=this,a=e.noop(),n={answerChildren:e(".answer_felder > div"),pointsModus:e('input[name="answerPointsActivated"]'),gPoints:e('input[name="points"]')};i={generateArrayIndex:function(){var t=e('input[name="answerType"]:checked').val();t="single"==t||"multiple"==t?"classic_answer":t,e(".answerList").each(function(){var i=e(this).parent().attr("class");e(this).children().each(function(a,n){e(this).find('[name^="answerData"]').each(function(){var e=this.name,n=e.search(/\](\[\w+\])+$/),o=t==i?a:"none";n>0&&(this.name="answerData["+o+e.substring(n,e.length))})})})},globalValidate:function(){if(t.isEmpty(t.getMceContent("question")))return alert(quizMasterLocalize.no_question_msg),!1;if(n.pointsModus.is(":checked")){if("free_answer"==e('input[name="answerType"]:checked').val())return alert(quizMasterLocalize.dif_points),!1}else{var i=n.gPoints.val();if(!t.isNumber(i)||1>i)return alert(quizMasterLocalize.no_nummber_points),!1}return a()===!1?!1:!0},answerRemove:function(){var t=e(this).parent();return t.parent().children().length<2?!1:(t.remove(),!1)},addCategory:function(){var i=e.trim(e('input[name="categoryAdd"]').val());if(!t.isEmpty(i)){var a={categoryName:i};t.ajaxPost("categoryAdd",a,function(t){if(t.err)return void e("#categoryMsgBox").text(t.err).show("fast").delay(2e3).hide("fast");var i=e(document.createElement("option")).val(t.categoryId).text(t.categoryName).attr("selected","selected");e('select[name="category"]').append(i).change()})}},addMediaClick:function(){if("function"!=typeof tb_show)return!1;var t=e(this).closest("li"),i=t.find('input[name="answerData[][html]"]:eq(0)'),a=t.find(".qm-start-box:eq(0)");window.org_send_to_editor=window.send_to_editor;var n=tb_remove;window.send_to_editor=function(t){var n=e("img",t)[0].outerHTML;a.val(a.val()+n),i.attr("checked",!0),tb_remove(),window.send_to_editor=window.org_send_to_editor},window.tb_remove=function(){window.send_to_editor=window.org_send_to_editor,tb_remove=n,tb_remove()},tb_show("","media-upload.php?type=image&TB_iframe=true")}};var o={classic_answer:function(){var i=0,a=0,o=0;return e(".classic_answer .answerList").children().each(function(){var n=e(this);if(!t.isEmpty(n.find('textarea[name="answerData[][answer]"]').val())){i++,n.find('input[name="answerData[][correct]"]:checked').length&&a++;var r=n.find('input[name="answerData[][points]"]').val();t.isNumber(r)&&r>=0&&o++}}),i?a||e('input[name="disableCorrect"]').is(":checked")&&e('input[name="answerPointsDiffModusActivated"]').is(":checked")&&e('input[name="answerPointsActivated"]').is(":checked")&&"single"==e('input[name="answerType"]:checked').val()?o!=i&&n.pointsModus.is(":checked")?(alert(quizMasterLocalize.no_nummber_points_new),!1):!0:(alert(quizMasterLocalize.no_correct_msg),!1):(alert(quizMasterLocalize.no_answer_msg),!1)},free_answer:function(){return t.isEmpty(e('.free_answer textarea[name="answerData[][answer]"]').val())?(alert(quizMasterLocalize.no_answer_msg),!1):!0},fill_blank:function(){return t.isEmpty(t.getMceContent("cloze"))?(alert(quizMasterLocalize.no_answer_msg),!1):!0},sort_answer:function(){var i=0,a=0;return e(".sort_answer .answerList").children().each(function(){var n=e(this);if(!t.isEmpty(n.find('textarea[name="answerData[][answer]"]').val())){i++;var o=n.find('input[name="answerData[][points]"]').val();t.isNumber(o)&&o>=0&&a++}}),i?a!=i&&n.pointsModus.is(":checked")?(alert(quizMasterLocalize.no_nummber_points_new),!1):!0:(alert(quizMasterLocalize.no_answer_msg),!1)},matrix_sort_answer:function(){var i=0,a=0,o=!0,r=0;return e(".matrix_sort_answer .answerList").children().each(function(){var n=e(this),c=n.find('input[name="answerData[][points]"]').val();t.isEmpty(n.find('textarea[name="answerData[][answer]"]').val())?t.isEmpty(n.find('textarea[name="answerData[][sort_string]"]').val())||(r++,t.isNumber(c)&&c>=0&&a++):(i++,r++,t.isEmpty(n.find('textarea[name="answerData[][sort_string]"]').val())&&(o=!1),t.isNumber(c)&&c>=0&&a++)}),i?o?a!=r&&n.pointsModus.is(":checked")?(alert(quizMasterLocalize.no_nummber_points_new),!1):!0:(alert(quizMasterLocalize.no_sort_element_criterion),!1):(alert(quizMasterLocalize.no_answer_msg),!1)},assessment_answer:function(){return t.isEmpty(t.getMceContent("assessment"))?(alert(quizMasterLocalize.no_answer_msg),!1):!0}},r=function(){e("#quizMaster_tip").change(function(){t.displayChecked(this,e("#quizMaster_tipBox"))}).change(),e("#quizMaster_correctSameText").change(function(){t.displayChecked(this,e("#quizMaster_incorrectMassageBox"),!0)}).change(),e('input[name="answerType"]').click(function(){n.answerChildren.hide();var t=this.value;if("single"==t?(e("#singleChoiceOptions").show(),e('input[name="disableCorrect"]').change()):(e("#singleChoiceOptions").hide(),e(".classic_answer .quizMaster_classCorrect").parent().parent().show()),"single"==t||"multiple"==t){var i="single"==t?"radio":"checkbox";t="classic_answer",e(".quizMaster_classCorrect").each(function(){e("<input type="+i+" />").attr({name:this.name,value:this.value,checked:this.checked}).addClass("quizMaster_classCorrect quizMaster_checkbox").insertBefore(this)}).remove()}a=void 0!=o[t]?o[t]:e.noop(),e("."+t).show()}),e('input[name="answerType"]:checked').click(),e(".deleteAnswer").click(i.answerRemove),e(".addAnswer").click(function(){var t=e(this).siblings("ul"),a=t.find("li:eq(0)").clone();return a.find(".quizMaster_checkbox").removeAttr("checked"),a.find(".qm-start-box").val(""),a.find(".quizMaster_points").val(1),a.find(".deleteAnswer").click(i.answerRemove),a.find(".addMedia").click(i.addMediaClick),a.appendTo(t),!1}),e(".sort_answer ul, .classic_answer ul, .matrix_sort_answer ul").sortable({handle:".quizMaster_move"}),e("#saveQuestion").click(function(){return i.globalValidate()?(i.generateArrayIndex(),!0):!1}),e(n.pointsModus).change(function(){t.displayChecked(this,e(".quizMaster_answerPoints")),t.displayChecked(this,e("#quizMaster_showPointsBox")),t.displayChecked(this,n.gPoints,!1,!0),t.displayChecked(this,e('input[name="answerPointsDiffModusActivated"]'),!0,!0),this.checked?(e('input[name="answerPointsDiffModusActivated"]').change(),e('input[name="disableCorrect"]').change()):(e(".classic_answer .quizMaster_classCorrect").parent().parent().show(),e('input[name="disableCorrect"]').attr("disabled","disabled"))}).change(),e('select[name="category"]').change(function(){var t=e(this),i=e("#categoryAddBox").hide();"-1"==t.val()&&i.show()}).change(),e("#categoryAddBtn").click(function(){i.addCategory()}),e(".addMedia").click(i.addMediaClick),e('input[name="answerPointsDiffModusActivated"]').change(function(){t.displayChecked(this,e('input[name="disableCorrect"]'),!0,!0),this.checked?e('input[name="disableCorrect"]').change():e(".classic_answer .quizMaster_classCorrect").parent().parent().show()}).change(),e('input[name="disableCorrect"]').change(function(){t.displayChecked(this,e(".classic_answer .quizMaster_classCorrect").parent().parent(),!0)}).change(),e("#clickPointDia").click(function(){return e(".pointDia").toggle("fast"),!1}),e('input[name="template"]').click(function(a){return"0"==e('select[name="templateSaveList"]').val()&&t.isEmpty(e('input[name="templateName"]').val())?(alert(quizMasterLocalize.temploate_no_name),a.preventDefault(),!1):void i.generateArrayIndex()}),e('select[name="templateSaveList"]').change(function(){var t=e('input[name="templateName"]');"0"==e(this).val()?t.show():t.hide()}).change()},c=function(){n.answerChildren.hide(),r()};c()},statistic:function(){var i=this,a=e("#quizId").val(),n="users",o={currentPage:e("#quizMaster_currentPage"),pageLeft:e("#quizMaster_pageLeft"),pageRight:e("#quizMaster_pageRight"),testSelect:e("#testSelect")};i={loadStatistic:function(e,i){var a={userId:e};t.ajaxPost("statisticLoad",a,function(e){})},loadUsersStatistic:function(){},loadUsersStatistic_:function(n,o){var r={userId:n,quizId:a,testId:o};i.toggleLoadBox(!1),t.ajaxPost("statisticLoad",r,function(t){e.each(t.question,function(){var t=e("#quizMaster_tr_"+this.questionId);i.setStatisticData(t,this)}),e.each(t.category,function(t,a){var n=e("#quizMaster_ctr_"+t);i.setStatisticData(n,a)}),e("#testSelect option:gt(0)").remove();var a=e("#testSelect");e.each(t.tests,function(){var i=e(document.createElement("option"));i.val(this.id),i.text(this.date),t.testId==this.id&&i.attr("selected",!0),a.append(i)}),i.parseFormData(t.formData),e("#userSelect").val(n),e("#testSelect").val(o),i.toggleLoadBox(!0)})},parseFormData:function(t){var i=e("#quizMaster_form_box");return null==t?void i.hide():(e.each(t,function(t,i){e("#form_id_"+t).text(i)}),void i.show())},setStatisticData:function(e,t){e.find(".quizMaster_cCorrect").text(t.correct),e.find(".quizMaster_cIncorrect").text(t.incorrect),e.find(".quizMaster_cTip").text(t.hint),e.find(".quizMaster_cPoints").text(t.points),e.find(".quizMaster_cResult").text(t.result),e.find(".quizMaster_cTime").text(t.questionTime),e.find(".quizMaster_cCreateTime").text(t.date)},toggleLoadBox:function(t){var i=e("#quizMaster_loadData"),a=e("#qm-quiz-content");t?(i.hide(),a.show()):(a.hide(),i.show())},reset:function(n){var r=e("#userSelect").val();if(confirm(quizMasterLocalize.reset_statistics_msg)){var c={quizId:a,userId:r,testId:o.testSelect.val(),type:n};i.toggleLoadBox(!1),t.ajaxPost("statisticReset",c,function(){i.loadUsersStatistic()})}},loadStatisticOverview:function(n){var r={quizId:a,pageLimit:e("#quizMaster_pageLimit").val(),onlyCompleted:Number(e("#quizMaster_onlyCompleted").is(":checked")),page:o.currentPage.val(),nav:Number(n)};i.toggleLoadBox(!1),t.ajaxPost("statisticLoadOverview",r,function(t){var a=e("#quizMaster_statistics_overview_data"),n=a.children(),o=n.first().clone();n.slice(1).remove(),e.each(t.items,function(){var t=o.clone();i.setStatisticData(t,this),t.find("a").text(this.userName).data("userId",this.userId).click(function(){return e("#userSelect").val(e(this).data("userId")),e("#quizMaster_typeUser").click(),!1}),t.show().appendTo(a)}),o.remove(),i.toggleLoadBox(!0),void 0!=t.page&&i.handleNav(t.page)})},handleNav:function(t){for(var a=e("#quizMaster_currentPage").empty(),n=1;t>=n;n++)e(document.createElement("option")).val(n).text(n).appendTo(a);i.checkNavBar()},checkNavBar:function(){var e=o.currentPage.val();1==e?o.pageLeft.hide():o.pageLeft.show(),e==o.currentPage.children().length?o.pageRight.hide():o.pageRight.show()},refresh:function(){"users"==n?i.loadUsersStatistic():"formOverview"==n?i.loadFormsOverview(!0):i.loadStatisticOverview(!0)},loadFormsOverview:function(n){var o={quizId:a,pageLimit:e("#quizMaster_fromPageLimit").val(),onlyUser:e("#quizMaster_formUser").val(),page:e("#quizMaster_formCurrentPage").val(),nav:Number(n)};i.toggleLoadBox(!1),t.ajaxPost("statisticLoadFormOverview",o,function(t){var a=e("#quizMaster_statistics_form_data"),n=a.children(),o=n.first().clone();n.slice(1).remove(),e.each(t.items,function(){var t=o.clone();i.setStatisticData(t,this),t.find("a").text(this.userName).data("userId",this.userId).data("testId",this.testId).click(function(){return i.switchTabOnLoad("users"),i.loadUsersStatistic_(e(this).data("userId"),e(this).data("testId")),!1}),t.show().appendTo(a)}),o.remove(),i.toggleLoadBox(!0),void 0!=t.page&&i.handleFormNav(t.page)})},handleFormNav:function(t){for(var a=e("#quizMaster_formCurrentPage").empty(),n=1;t>=n;n++)e(document.createElement("option")).val(n).text(n).appendTo(a);i.checkFormNavBar()},checkFormNavBar:function(){var t=e("#quizMaster_formCurrentPage").val();1==t?e("#quizMaster_formPageLeft").hide():e("#quizMaster_formPageLeft").show(),t==e("#quizMaster_formCurrentPage").children().length?e("#quizMaster_formPageRight").hide():e("#quizMaster_formPageRight").show()},switchTabOnLoad:function(t){e(".quizMaster_tab").removeClass("button-primary").addClass("button-secondary"),e(".quizMaster_tabContent").hide();var i=e("#quizMaster_typeOverview");"users"==t?(n="users",e("#quizMaster_tabUsers").show(),i=e("#quizMaster_typeUser")):"formOverview"==t?(n="formOverview",e("#quizMaster_tabFormOverview").show(),i=e("#quizMaster_typeForm")):(n="overview",e("#quizMaster_tabOverview").show()),i.removeClass("button-secondary").addClass("button-primary")}};var r=function(){e("#userSelect, #testSelect").change(function(){i.loadUsersStatistic()}),e(".quizMaster_update").click(function(){i.refresh()}),e("#quizMaster_reset").click(function(){i.reset(0)}),e("#quizMaster_resetUser").click(function(){i.reset(1)}),e(".quizMaster_resetComplete").click(function(){i.reset(2)}),e(".quizMaster_tab").click(function(){var t=e(this);return e(".quizMaster_tab").removeClass("button-primary").addClass("button-secondary"),t.removeClass("button-secondary").addClass("button-primary"),e(".quizMaster_tabContent").hide(),"quizMaster_typeUser"==t.attr("id")?(n="users",e("#quizMaster_tabUsers").show(),i.loadUsersStatistic()):"quizMaster_typeForm"==t.attr("id")?(n="formOverview",e("#quizMaster_tabFormOverview").show(),i.loadFormsOverview(!0)):(n="overview",e("#quizMaster_tabOverview").show(),i.loadStatisticOverview(!0)),!1}),e("#quizMaster_onlyCompleted").change(function(){o.currentPage.val(1),i.loadStatisticOverview(!0)}),e("#quizMaster_pageLimit").change(function(){o.currentPage.val(1),i.loadStatisticOverview(!0)}),o.pageLeft.click(function(){o.currentPage.val(Number(o.currentPage.val())-1),i.loadStatisticOverview(!1),i.checkNavBar()}),o.pageRight.click(function(){o.currentPage.val(Number(o.currentPage.val())+1),i.loadStatisticOverview(!1),i.checkNavBar()}),o.currentPage.change(function(){i.loadStatisticOverview(!1),i.checkNavBar()}),e("#quizMaster_formUser, #quizMaster_fromPageLimit").change(function(){e("#quizMaster_formCurrentPage").val(1),i.loadFormsOverview(!0)}),e("#quizMaster_formPageLeft").click(function(){e("#quizMaster_formCurrentPage").val(Number(o.currentPage.val())-1),i.loadFormsOverview(!1),i.checkFormNavBar()}),e("#quizMaster_formPageRight").click(function(){e("#quizMaster_formCurrentPage").val(Number(o.currentPage.val())+1),i.loadFormsOverview(!1),i.checkFormNavBar()}),e("#quizMaster_formCurrentPage").change(function(){i.loadFormsOverview(!1),i.checkFormNavBar()}),i.loadUsersStatistic()};r()},statisticNew:function(){var a=e("#quizId").val(),n=null,o=null,r={data:{quizId:a,users:-1,pageLimit:100,dateFrom:0,dateTo:0,generateNav:0},changeFilter:function(){var t=function(e){var t=e.datepicker("getDate");return null===t?0:t.getTime()/1e3};return e.extend(this.data,{users:e("#quizMaster_historyUser").val(),pageLimit:e("#quizMaster_historyPageLimit").val(),dateFrom:t(e("#datepickerFrom")),dateTo:t(e("#datepickerTo")),generateNav:1}),this.data}},c={data:{pageLimit:100,onlyCompleted:0,generateNav:0,quizId:a},changeFilter:function(){e.extend(this.data,{pageLimit:e("#quizMaster_overviewPageLimit").val(),onlyCompleted:Number(e("#quizMaster_overviewOnlyCompleted").is(":checked")),generateNav:1})}},s={deleteUserStatistic:function(i,n){if(!confirm(quizMasterLocalize.reset_statistics_msg))return!1;var o={refId:i,userId:n,quizId:a,type:0};t.ajaxPost("statisticResetNew",o,function(){e("#quizMaster_user_overlay").hide(),r.changeFilter(),u.loadHistoryAjax(),c.changeFilter(),u.loadOverviewAjax()})},deleteAll:function(){if(!confirm(quizMasterLocalize.reset_statistics_msg))return!1;var e={quizId:a,type:1};t.ajaxPost("statisticResetNew",e,function(){r.changeFilter(),u.loadHistoryAjax(),c.changeFilter(),u.loadOverviewAjax()})}},u={loadHistoryAjax:function(){var i=e.extend({page:r.data.generateNav?1:n.getCurrentPage()},r.data);u.loadBox(!0);var a=e("#quizMaster_historyLoadContext").hide();t.ajaxPost("statisticLoadHistory",i,function(t){a.html(t.html).show(),t.navi&&n.setNumPage(t.navi),r.data.generateNav=0,a.find(".user_statistic").click(function(){return u.loadUserAjax(0,e(this).data("ref_id"),!1),!1}),a.find(".quizMaster_delete").click(function(){return s.deleteUserStatistic(e(this).parents("tr").find(".user_statistic").data("ref_id"),0),!1}),u.loadBox(!1)})},loadUserAjax:function(i,n,o){e("#quizMaster_user_overlay, #quizMaster_loadUserData").show();var r=e("#quizMaster_user_content").hide(),c={quizId:a,userId:i,refId:n,avg:Number(o)};t.ajaxPost("statisticLoadUser",c,function(t){r.html(t.html),r.find(".quizMaster_update").click(function(){return u.loadUserAjax(i,n,o),!1}),r.find("#quizMaster_resetUserStatistic").click(function(){s.deleteUserStatistic(n,i)}),r.find(".statistic_data").click(function(){return e(this).parents("tr").next().toggle("fast"),!1}),e("#quizMaster_loadUserData").hide(),r.show()})},loadBox:function(t,i){t?e("#quizMaster_loadDataHistory").show():e("#quizMaster_loadDataHistory").hide()},loadOverviewAjax:function(){var i=e.extend({page:c.data.generateNav?1:o.getCurrentPage()},c.data);e("#quizMaster_loadDataOverview").show();var a=e("#quizMaster_overviewLoadContext").hide();t.ajaxPost("statisticLoadOverviewNew",i,function(t){a.html(t.html).show(),t.navi&&o.setNumPage(t.navi),c.data.generateNav=0,a.find(".user_statistic").click(function(){return u.loadUserAjax(e(this).data("user_id"),0,!0),!1}),a.find(".quizMaster_delete").click(function(){return s.deleteUserStatistic(0,e(this).parents("tr").find(".user_statistic").data("user_id")),!1}),e("#quizMaster_loadDataOverview").hide()})}},l=function(){n=new i(e("#historyNavigation"),{onChange:function(){u.loadHistoryAjax()}}),o=new i(e("#overviewNavigation"),{onChange:function(){u.loadOverviewAjax()}}),e("#datepickerFrom").datepicker({closeText:quizMasterLocalize.closeText,currentText:quizMasterLocalize.currentText,monthNames:quizMasterLocalize.monthNames,monthNamesShort:quizMasterLocalize.monthNamesShort,dayNames:quizMasterLocalize.dayNames,dayNamesShort:quizMasterLocalize.dayNamesShort,dayNamesMin:quizMasterLocalize.dayNamesMin,dateFormat:quizMasterLocalize.dateFormat,firstDay:quizMasterLocalize.firstDay,changeMonth:!0,onClose:function(t){e("#datepickerTo").datepicker("option","minDate",t)}}),e("#datepickerTo").datepicker({closeText:quizMasterLocalize.closeText,currentText:quizMasterLocalize.currentText,monthNames:quizMasterLocalize.monthNames,monthNamesShort:quizMasterLocalize.monthNamesShort,dayNames:quizMasterLocalize.dayNames,dayNamesShort:quizMasterLocalize.dayNamesShort,dayNamesMin:quizMasterLocalize.dayNamesMin,dateFormat:quizMasterLocalize.dateFormat,firstDay:quizMasterLocalize.firstDay,changeMonth:!0,onClose:function(t){e("#datepickerFrom").datepicker("option","maxDate",t)}}),e("#filter").click(function(){r.changeFilter(),u.loadHistoryAjax()}),e("#quizMaster_overlay_close").click(function(){e("#quizMaster_user_overlay").hide()}),e("#quizMaster_tabHistory .quizMaster_update").click(function(){return r.changeFilter(),u.loadHistoryAjax(),!1}),e("#quizMaster_tabOverview .quizMaster_update").click(function(){return c.changeFilter(),u.loadOverviewAjax(),!1}),e(".quizMaster_resetComplete").click(function(){return s.deleteAll(),!1}),e("#overviewFilter").click(function(){c.changeFilter(),u.loadOverviewAjax()}),r.changeFilter(),u.loadHistoryAjax(),c.changeFilter(),u.loadOverviewAjax()};l()}},o=function(){a();var t=e.noop;e(".quizMaster_questionEdit").length?t=n.questionEdit:e(".quizMaster_globalSettings").length?t=n.gobalSettings:e(".quizMaster_statistics").length?t=n.statistic:e(".quizMaster_statisticsNew").length&&(t=n.statisticNew),t(),e(".quizMaster_demoImgBox a").mouseover(function(t){var i=e(this),a=e(document).width(),n=i.siblings().outerWidth(!0);if(t.pageX+n>a){var o=a-(t.pageX+n+30);e(this).next().css("left",o+"px")}e(this).next().show()}).mouseout(function(){e(this).next().hide()}).click(function(){return!1})};o()}function i(t,i){var a={onChange:null},n={contain:null,pageLeft:null,pageRight:null,currentPage:null},o=function(){var e=n.currentPage.children().length,t=Number(n.currentPage.val());n.pageLeft.hide(),n.pageRight.hide(),t>1&&n.pageLeft.show(),e>=t+1&&n.pageRight.show()},r=function(){e.extend(n,{contain:t,pageLeft:t.find(".navigationLeft"),pageRight:t.find(".navigationRight"),currentPage:t.find(".navigationCurrentPage")}),e.extend(a,i),n.pageLeft.click(function(){n.currentPage.val(Number(n.currentPage.val())-1),o(),a.onChange&&a.onChange(n.currentPage.val())}),n.pageRight.click(function(){n.currentPage.val(Number(n.currentPage.val())+1),o(),a.onChange&&a.onChange(n.currentPage.val())}),n.currentPage.change(function(){o(),a.onChange&&a.onChange(n.currentPage.val())})};this.getCurrentPage=function(){return n.currentPage.val()},this.setNumPage=function(t){n.currentPage.empty();for(var i=1;t>=i;i++)e(document.createElement("option")).val(i).text(i).appendTo(n.currentPage);o()},r()}e.fn.quizMaster_preview=function(){var t={openPreview:function(t){window.open(e(t).attr("href"),"quizMasterPreview","width=900,height=900")}},i=function(){e(".quizMaster_prview").click(function(e){t.openPreview(this),e.preventDefault()})};i()},e.fn.quizMaster_quizOverall=function(){},e.fn.quizMaster_quizEdit=function(){function t(t,i,a){var n={action:"quizmaster_admin_ajax",func:t,data:i};e.post(ajaxurl,n,a,"json")}var i={addCategory:function(){var i=e.trim(e('input[name="categoryAdd"]').val());if(!a(i)){var n={categoryName:i,type:"quiz"};t("categoryAdd",n,function(t){if(t.err)return void e("#categoryMsgBox").text(t.err).show("fast").delay(2e3).hide("fast");var i=e(document.createElement("option")).val(t.categoryId).text(t.categoryName).attr("selected","selected");e('select[name="category"]').append(i).change()})}},addResult:function(){e("#resultList").children().each(function(){if("none"==e(this).css("display")){var t=e(this),i=t.find('textarea[name="resultTextGrade[text][]"]'),a=i.attr("id"),n=!0;return t.find('input[name="resultTextGrade[prozent][]"]').val("0"),t.find('input[name="resultTextGrade[activ][]"]').val("1").keyup(),void 0==tinymce.editors[a]||tinymce.editors[a].isHidden()||(n=!1),void 0==switchEditors||n||(switchEditors.go(a,"toggle"),switchEditors.go(a,"toggle")),void 0!=tinymce.editors[a]?tinymce.editors[a].setContent(""):i.val(""),void 0==tinymce.editors[a]||n||tinyMCE.execCommand("mceRemoveControl",!1,a),t.parent().children(":visible").last().after(t),void 0==tinymce.editors[a]||n||tinyMCE.execCommand("mceAddControl",!1,a),e(this).show(),void 0==switchEditors||n||switchEditors.go(a,"toggle"),!1}})},deleteResult:function(t){e(t).parent().parent().hide(),e(t).siblings('input[name="resultTextGrade[activ][]"]').val("0")},changeResult:function(t){var a=e(t);return i.validResultInput(a.val())?(a.siblings(".resultProzent").text(a.val()),a.removeAttr("style"),!0):(a.css("background-color","#FF9696"),!1)},validResultInput:function(e){return a(e)?!1:(e=e.replace(/\,/,"."),!isNaN(e)&&Number(e)<=100&&Number(e)>=0?null!=e.match(/\./)?e.split(".")[1].length<3:!0:!1)},validInput:function(){if(a(e("#quizMaster_title").val()))return alert(quizMasterLocalize.no_title_msg),!1;var t="";if(t=void 0==tinymce.editors.text||tinymce.editors.text.isHidden()?e('textarea[name="text"]').val():tinymce.editors.text.getContent(),a(t))return alert(quizMasterLocalize.no_quiz_start_msg),!1;if(e("#quizMaster_resultGradeEnabled:checked").length){var n=!0;if(e("#resultList").children().each(function(){return e(this).is(":visible")&&!i.validResultInput(e(this).find('input[name="resultTextGrade[prozent][]"]').val())?(n=!1,!1):void 0}),!n)return alert(quizMasterLocalize.fail_grade_result),!1}return!0},resetLock:function(){t("resetLock",{quizId:e('input[name="ajax_quiz_id"]').val()},function(){e("#resetLockMsg").show("fast").delay(2e3).hide("fast")})},generateFormIds:function(){var t=0;e("#form_table tbody > tr").each(function(){e(this).find('[name^="form[]"]').each(function(){var i=e(this).attr("name").substr(6);e(this).attr("name","form["+t+"]"+i)}),++t})},updateFormIds:function(){var t=-1,i=e(".emailFormVariables option:selected").val(),n=e(".formVariables").empty(),o=e(".emailFormVariables").empty().append('<option value="-1"></option>');e(".emailFormVariables").data("default")>-1&&(i=e(".emailFormVariables").data("default"),e(".emailFormVariables").data("default",-1)),e("#form_table tbody > tr").each(function(){e(this).children().first().text(t);var i=e(this).find(".formFieldName").val(),r=e(this).find('[name="form[][type]"] option:selected'),c=e(this).find('[name="form[][fieldname]"]').val();1!=e(this).find('input[name="form[][form_delete]"]').val()&&(t>=0&&!a(i)&&n.append(e("<li><span>$form{"+t+"}</span> - "+i+"</li>")),4==r.val()&&o.append(e('<option value="'+t+'">'+c+"</option>")),t++)}),e('.emailFormVariables option[value="'+i+'"]').prop("selected",!0)}},a=function(t){return t=e.trim(t),!t||0===t.length},n=function(){e("#statistics_on").change(function(){this.checked?e("#statistics_ip_lock_tr").show():e("#statistics_ip_lock_tr").hide()}),e(".addResult").click(function(){i.addResult()}),e(".deleteResult").click(function(e){i.deleteResult(this)}),e('input[name="resultTextGrade[prozent][]"]').keyup(function(e){i.changeResult(this)}).keydown(function(e){13==e.which&&e.preventDefault()}),e("#quizMaster_resultGradeEnabled").change(function(){this.checked?(e("#resultGrade").show(),e("#resultNormal").hide()):(e("#resultGrade").hide(),e("#resultNormal").show())}),e("#quizMaster_save").click(function(t){i.validInput()?i.generateFormIds():t.preventDefault(),e('select[name="prerequisiteList[]"] option').attr("selected","selected")}),e('input[name="template"]').click(function(t){return"0"==e('select[name="templateSaveList"]').val()&&a(e('input[name="templateName"]').val())?(alert(quizMasterLocalize.temploate_no_name),t.preventDefault(),!1):(i.generateFormIds(),void e('select[name="prerequisiteList[]"] option').attr("selected","selected"))}),e('select[name="templateSaveList"]').change(function(){var t=e('input[name="templateName"]');"0"==e(this).val()?t.show():t.hide()}).change(),e('input[name="quizRunOnce"]').change(function(t){this.checked?(e("#quizMaster_quiz_run_once_type").show(),e('input[name="quizRunOnceType"]:checked').change()):e("#quizMaster_quiz_run_once_type").hide()}),e('input[name="quizRunOnceType"]').change(function(t){!this.checked||"1"!=this.value&&"3"!=this.value?e("#quizMaster_quiz_run_once_cookie").hide():e("#quizMaster_quiz_run_once_cookie").show()}),e('input[name="resetQuizLock"]').click(function(e){return i.resetLock(),!1}),e(".quizMaster_demoBox a").mouseover(function(t){var i=e(this),a=e("#poststuff").width(),n=i.siblings().outerWidth(!0);if(t.pageX+n>a){var o=jQuery(document).width()-i.parent().offset().left-n-30;e(this).next().css("left",o+"px")}e(this).next().show()}).mouseout(function(){e(this).next().hide()}).click(function(){return!1}),e('input[name="showMaxQuestion"]').change(function(){this.checked?e("#quizMaster_showMaxBox").show():e("#quizMaster_showMaxBox").hide()}),e("#btnPrerequisiteAdd").click(function(){e('select[name="quizList"] option:selected').removeAttr("selected").appendTo('select[name="prerequisiteList[]"]')}),e("#btnPrerequisiteDelete").click(function(){e('select[name="prerequisiteList[]"] option:selected').removeAttr("selected").appendTo('select[name="quizList"]')}),e('input[name="prerequisite"]').change(function(){this.checked?e("#prerequisiteBox").show():e("#prerequisiteBox").hide()}).change(),e('input[name="toplistDataAddMultiple"]').change(function(){this.checked?e("#toplistDataAddBlockBox").show():e("#toplistDataAddBlockBox").hide()}).change(),e('input[name="toplistActivated"]').change(function(){this.checked?e("#toplistBox > tr:gt(0)").show():e("#toplistBox > tr:gt(0)").hide();
    22}).change(),e('input[name="showReviewQuestion"]').change(function(){this.checked?e(".quizMaster_reviewQuestionOptions").show():e(".quizMaster_reviewQuestionOptions").hide()}).change(),e("#statistics_on").change(),e("#quizMaster_resultGradeEnabled").change(),e('input[name="quizRunOnce"]').change(),e('input[name="quizRunOnceType"]:checked').change(),e('input[name="showMaxQuestion"]').change(),e("#form_add").click(function(){e("#form_table tbody > tr:eq(0)").clone(!0).appendTo("#form_table tbody").show(),i.updateFormIds()}),e('input[name="form_delete"]').click(function(){var t=e(this).parents("tr");"0"!=t.find('input[name="form[][form_id]"]').val()?(t.find('input[name="form[][form_delete]"]').val(1),t.hide()):t.remove(),i.updateFormIds()}),e("#form_table tbody").sortable({handle:".form_move",update:i.updateFormIds}),e(".form_move").click(function(){return!1}),e('select[name="form[][type]"]').change(function(){switch(Number(e(this).val())){case 7:case 8:e(this).siblings(".editDropDown").show();break;default:e(this).siblings(".editDropDown, .dropDownEditBox").hide()}}).change(),e(".editDropDown").click(function(){return e(".dropDownEditBox").not(e(this).siblings(".dropDownEditBox").toggle()).hide(),!1}),e(".dropDownEditBox input").click(function(){e(this).parent().hide()}),e('.formFieldName, select[name="form[][type]"]').change(function(){i.updateFormIds()}),e('select[name="category"]').change(function(){var t=e(this),i=e("#categoryAddBox").hide();"-1"==t.val()&&i.show()}).change(),e("#categoryAddBtn").click(function(){i.addCategory()}),e('input[name="emailNotification"]').change(function(){var t=e("#adminEmailSettings tr:gt(0)");e('input[name="emailNotification"]:checked').val()>0?t.show():t.hide()}).change(),e('input[name="userEmailNotification"]').change(function(){var t=e("#userEmailSettings tr:gt(0)");e('input[name="userEmailNotification"]:checked').val()>0?t.show():t.hide()}).change(),i.updateFormIds(),e('input[name="email[html]"]').change(function(){return void 0==switchEditors?!1:void(this.checked?switchEditors.go("adminEmailEditor","tmce"):switchEditors.go("adminEmailEditor","html"))}),e('input[name="adminEmail[html]"]').change(function(){return void 0==switchEditors?!1:void(this.checked?switchEditors.go("adminEmailEditor","tmce"):switchEditors.go("adminEmailEditor","html"))}),e('input[name="userEmail[html]"]').change(function(){return void 0==switchEditors?!1:void(this.checked?switchEditors.go("userEmailEditor","tmce"):switchEditors.go("userEmailEditor","html"))}),setTimeout(function(){e('input[name="userEmail[html]"]').change(),e('input[name="email[html]"]').change()},1e3)};n()},e.fn.quizMaster_statistics=function(){var t="quizMaster_typeAnonymeUser",i=!0,a={loadStatistics:function(t){var i=window.location.pathname+window.location.search,n=i.replace("admin.php","admin-ajax.php")+"&action=load_statistics",o={action:"quizmaster_load_statistics",userId:t};e("#quizMaster_loadData").show(),e("#quizMaster_statistics_content, #quizMaster_statistics_overview").hide(),e.post(n,o,a.setStatistics,"json")},setStatistics:function(i){var a=e(".quizMaster_statistics_table"),n=a.find("tbody");if("quizMaster_typeOverview"!=t){var o=function(e,t,i){e.find(".quizMaster_cCorrect").text(t.cCorrect+" ("+t.pCorrect+"%)"),e.find(".quizMaster_cIncorrect").text(t.cIncorrect+" ("+t.pIncorrect+"%)"),e.find(".quizMaster_cTip").text(t.cTip),e.find(".quizMaster_cPoints").text(t.cPoints),1==i&&a.find(".quizMaster_cResult").text(t.result+"%")};o(a,i.clear,!1),e.each(i.items,function(e,t){o(n.find("#quizMaster_tr_"+t.id),t,!1)}),o(a.find("tfoot"),i.global,!0),e("#quizMaster_loadData").hide(),e("#quizMaster_statistics_content, .quizMaster_statistics_table").show()}},loadOverview:function(){e(".quizMaster_statistics_table, #quizMaster_statistics_content, #quizMaster_statistics_overview").hide(),e("#quizMaster_loadData").show();var n=window.location.pathname+window.location.search,o=n.replace("admin.php","admin-ajax.php")+"&action=load_statistics",r={action:"quizmaster_load_statistics",overview:!0,pageLimit:e("#quizMaster_pageLimit").val(),onlyCompleted:Number(e("#quizMaster_onlyCompleted").is(":checked")),page:e("#quizMaster_currentPage").val(),generatePageNav:Number(i)};e.post(o,r,function(n){if(e("#quizMaster_statistics_overview_data").empty(),"quizMaster_typeOverview"==t){var o=e('<tr><th><a href="#">---</a></th><th class="quizMaster_points">---</th><th class="quizMaster_cCorrect" style="color: green;">---</th><th class="quizMaster_cIncorrect" style="color: red;">---</th><th class="quizMaster_cTip">---</th><th class="quizMaster_cResult" style="font-weight: bold;">---</th></tr>');e.each(n.items,function(t,i){var a=o.clone();a.find("a").text(i.userName).data("userId",i.userId).click(function(){return e("#userSelect").val(e(this).data("userId")),e("#quizMaster_typeRegisteredUser").click(),!1}),i.completed?(a.find(".quizMaster_points").text(i.cPoints),a.find(".quizMaster_cCorrect").text(i.cCorrect+" ("+i.pCorrect+"%)"),a.find(".quizMaster_cIncorrect").text(i.cIncorrect+" ("+i.pIncorrect+"%)"),a.find(".quizMaster_cTip").text(i.cTip),a.find(".quizMaster_cResult").text(i.result+"%")):a.find("th").removeAttr("style"),e("#quizMaster_statistics_overview_data").append(a)}),void 0!=n.page&&(a.setPageNav(n.page),i=!1),e("#quizMaster_loadData").hide(),e("#quizMaster_statistics_overview").show()}},"json")},loadFormOverview:function(){e("#quizMaster_tabFormOverview").show()},changeTab:function(i){t=i,"quizMaster_typeRegisteredUser"==i?a.loadStatistics(e("#userSelect").val()):"quizMaster_typeAnonymeUser"==i?a.loadStatistics(0):"quizMaster_typeForm"==i?a.loadFormOverview():a.loadOverview()},resetStatistic:function(i){var n="quizMaster_typeRegisteredUser"==t?e("#userSelect").val():0,o=window.location.pathname+window.location.search,r=o.replace("admin.php","admin-ajax.php")+"&action=reset",c={action:"quizmaster_statistics",userId:n,complete:i};e.post(r,c,function(e){a.changeTab(t)})},setPageNav:function(t){t=Math.ceil(t/e("#quizMaster_pageLimit").val()),e("#quizMaster_currentPage").empty();for(var i=1;t>=i;i++)e(document.createElement("option")).val(i).text(i).appendTo(e("#quizMaster_currentPage"));e("#quizMaster_pageLeft, #quizMaster_pageRight").hide(),e("#quizMaster_currentPage option").length>1&&e("#quizMaster_pageRight").show()}},n=function(){e(".quizMaster_tab").click(function(t){var i=e(this);return i.hasClass("button-primary")?!1:("quizMaster_typeRegisteredUser"==i.attr("id")?e("#quizMaster_userBox").show():e("#quizMaster_userBox").hide(),e(".quizMaster_tab").removeClass("button-primary").addClass("button-secondary"),i.removeClass("button-secondary").addClass("button-primary"),a.changeTab(i.attr("id")),!1)}),e("#userSelect").change(function(){a.changeTab("quizMaster_typeRegisteredUser")}),e(".quizMaster_update").click(function(){return a.changeTab(t),!1}),e("#quizMaster_reset").click(function(){var e=confirm(quizMasterLocalize.reset_statistics_msg);return e&&a.resetStatistic(!1),!1}),e(".quizMaster_resetComplete").click(function(){var e=confirm(quizMasterLocalize.reset_statistics_msg);return e&&a.resetStatistic(!0),!1}),e("#quizMaster_pageLimit, #quizMaster_onlyCompleted").change(function(){return e("#quizMaster_currentPage").val(0),i=!0,a.changeTab(t),!1}),e("#quizMaster_currentPage").change(function(){e("#quizMaster_pageLeft, #quizMaster_pageRight").hide(),1==e("#quizMaster_currentPage option").length||(e("#quizMaster_currentPage option:first-child:selected").length?e("#quizMaster_pageRight").show():e("#quizMaster_currentPage option:last-child:selected").length?e("#quizMaster_pageLeft").show():e("#quizMaster_pageLeft, #quizMaster_pageRight").show()),a.changeTab(t)}),e("#quizMaster_pageRight").click(function(){return e("#quizMaster_currentPage option:selected").next().attr("selected","selected"),e("#quizMaster_currentPage").change(),!1}),e("#quizMaster_pageLeft").click(function(){return e("#quizMaster_currentPage option:selected").prev().attr("selected","selected"),e("#quizMaster_currentPage").change(),!1}),a.changeTab("quizMaster_typeAnonymeUser")};n()},e.fn.quizMaster_toplist=function(){function t(t,i,a){var n={action:"quizmaster_admin_ajax",func:t,data:i};e.post(ajaxurl,n,a,"json")}var i={sort:e("#quizMaster_sorting"),pageLimit:e("#quizMaster_pageLimit"),currentPage:e("#quizMaster_currentPage"),loadDataBox:e("#quizMaster_loadData"),pageLeft:e("#quizMaster_pageLeft"),pageRight:e("#quizMaster_pageRight"),dataBody:e("#quizMaster_toplistTable tbody"),rowClone:e("#quizMaster_toplistTable tbody tr:eq(0)").clone(),content:e("#qm-quiz-content")},a={loadData:function(a){var n=this,o={sort:i.sort.val(),limit:i.pageLimit.val(),page:i.currentPage.val(),quizId:e('input[name="ajax_quiz_id"]').val()};void 0!=a&&e.extend(o,a),i.loadDataBox.show(),i.content.hide(),t("adminToplist",o,function(e){n.handleDataRequest(e.data),void 0!=e.nav&&n.handleNav(e.nav),i.loadDataBox.hide(),i.content.show()})},handleNav:function(t){i.currentPage.empty();for(var a=1;a<=t.pages;a++)e(document.createElement("option")).val(a).text(a).appendTo(i.currentPage);this.checkNav()},handleDataRequest:function(t){var a=this;i.dataBody.empty(),e.each(t,function(e,t){var a=i.rowClone.clone().children();a.eq(0).children().val(t.id),a.eq(1).find("strong").text(t.name),a.eq(1).find(".inline_editUsername").val(t.name),a.eq(2).find(".quizMaster_email").text(t.email),a.eq(2).find("input").val(t.email),a.eq(3).text(t.type),a.eq(4).text(t.date),a.eq(5).text(t.points),a.eq(6).text(t.result),a.parent().show().appendTo(i.dataBody)}),t.length||e(document.createElement("td")).attr("colspan","7").text(quizMasterLocalize.no_data_available).css({"font-weight":"bold","text-align":"center",padding:"5px"}).appendTo(document.createElement("tr")).appendTo(i.dataBody),e(".quizMaster_delete").click(function(){if(confirm(quizMasterLocalize.confirm_delete_entry)){var t=new Array(e(this).closest("tr").find('input[name="checkedData[]"]').val());a.loadData({a:"delete",toplistIds:t})}return!1}),e(".quizMaster_edit").click(function(){var t=e(this).closest("tr");return t.find(".row-actions").hide(),t.find(".inline-edit").show(),t.find(".quizMaster_username, .quizMaster_email").hide(),t.find(".inline_editUsername, .inline_editEmail").show(),!1}),e(".inline_editSave").click(function(){var t=e(this).closest("tr"),i=t.find(".inline_editUsername").val(),n=t.find(".inline_editEmail").val();return a.isEmpty(i)||a.isEmpty(n)?(alert(quizMasterLocalize.not_all_fields_completed),!1):(a.loadData({a:"edit",toplistId:t.find('input[name="checkedData[]"]').val(),name:i,email:n}),!1)}),e(".inline_editCancel").click(function(){var t=e(this).closest("tr");return t.find(".row-actions").show(),t.find(".inline-edit").hide(),t.find(".quizMaster_username, .quizMaster_email").show(),t.find(".inline_editUsername, .inline_editEmail").hide(),t.find(".inline_editUsername").val(t.find(".quizMaster_username").text()),t.find(".inline_editEmail").val(t.find(".quizMaster_email").text()),!1})},checkNav:function(){var e=i.currentPage.val();1==e?i.pageLeft.hide():i.pageLeft.show(),e==i.currentPage.children().length?i.pageRight.hide():i.pageRight.show()},isEmpty:function(t){return t=e.trim(t),!t||0===t.length}},n=function(){i.sort.change(function(){a.loadData()}),i.pageLimit.change(function(){a.loadData({nav:1})}),i.currentPage.change(function(){a.checkNav(),a.loadData()}),i.pageLeft.click(function(){i.currentPage.val(Number(i.currentPage.val())-1),a.checkNav(),a.loadData()}),i.pageRight.click(function(){i.currentPage.val(Number(i.currentPage.val())+1),a.checkNav(),a.loadData()}),e("#quizMaster_deleteAll").click(function(){a.loadData({a:"deleteAll"})}),e("#quizMaster_action").click(function(){var t=e("#quizMaster_actionName").val();if("0"!=t){var i=e('input[name="checkedData[]"]:checked').map(function(){return e(this).val()}).get();a.loadData({a:t,toplistIds:i})}}),e("#quizMaster_checkedAll").change(function(){this.checked?e('input[name="checkedData[]"]').attr("checked","checked"):e('input[name="checkedData[]"]').removeAttr("checked","checked")}),a.loadData({nav:1})};n()},e(".quizMaster_quizOverall").length&&e(".quizMaster_quizOverall").quizMaster_preview(),e(".quizMaster_quizOverall").length&&e(".quizMaster_quizOverall").quizMaster_quizOverall(),e(".quizMaster_quizEdit").length&&e(".quizMaster_quizEdit").quizMaster_quizEdit(),e(".quizMaster_toplist").length&&e(".quizMaster_toplist").quizMaster_toplist(),t()});
  • quizmaster/trunk/js/quizmaster.js

    r1712912 r1717342  
    11jQuery(document).ready(function( $ ) {
    22
    3   // datatables
    4   $('.quizmaster-info-table').DataTable({
    5         searching: false,
    6         paging: false,
    7         bInfo: false,
    8         ordering: false,
    9     });
    10 
    11   $('#quizmaster_score_table').DataTable({
    12         searching: false
    13     });
     3    // QuizMaster jQuery plugin
     4    $.fn.quizmaster = function( options = false ) {
     5
     6        var quizmaster = this;
     7
     8        quizmaster.config = {},
     9        quizmaster.status = {};
     10
     11        quizmaster.data = {
     12            results: new Object(),
     13            catResults: new Object(),
     14            currentQuestion: false,
     15            currentQuestionId: 0,
     16            quizSolved: [],
     17            lastButtonValue: "",
     18            inViewQuestions: false,
     19            currentPage: 1,
     20            isQuizStarted: false,
     21        };
     22
     23        quizmaster.elements = {
     24            checkButtonClass: '.qm-button-check',
     25            nextButtonClass: '.qm-button-next',
     26            finishButtonClass: '.qm-button-finish',
     27            skipButtonClass: '.qm-skip-button',
     28            singlePageLeft: 'input[name="quizMaster_pageLeft"]',
     29            singlePageRight: 'input[name="quizMaster_pageRight"]',
     30            startButton: quizmaster.find('.qm-start-button'),
     31            backButtonClass: '.qm-back-button',
     32            backButton: quizmaster.find('.qm-back-button'),
     33            nextButton: quizmaster.find('.qm-button-next'),
     34            finishButton: quizmaster.find('.qm-button-finish'),
     35            skipButton: quizmaster.find('.qm-skip-button'),
     36            checkButton: quizmaster.find('.qm-button-check'),
     37            restartButtonClass: '.qm-restart-quiz-button',
     38            restartButton: quizmaster.find('.qm-restart-quiz-button'),
     39            questionReviewButton: quizmaster.find('.qm-question-review-button'),
     40            quiz: quizmaster.find('.quizMaster_quiz'),
     41            questionListClass: '.qm-question-list',
     42            questionList: quizmaster.find('.quizMaster_list'),
     43            resultsBox: quizmaster.find('.qm-results-box'),
     44            reviewBox: quizmaster.find('.qm-review-box'),
     45            questionCheck: quizmaster.find('.qm-check-answer-box'),
     46            startPage: quizmaster.find('.qm-quiz-start-box'),
     47            timeLimitBox: quizmaster.find('.qm-time-limit'),
     48            hintTrigger: quizmaster.find('.qm-hint-trigger'),
     49            listItems: $()
     50        };
     51
     52        quizmaster.startPageShow = function() {
     53
     54            quizmaster.elements.startPage.show();
     55
     56            // hide hint button
     57            quizmaster.hint.buttonHide();
     58
     59            // hide next button
     60            quizmaster.elements.nextButton.hide();
     61
     62            // hide next button
     63            quizmaster.elements.finishButton.hide();
     64
     65        };
     66
     67        quizmaster.startPageHide = function() {
     68            quizmaster.elements.startPage.hide();
     69        };
     70
     71        /*
     72        * Moves quiz to next question
     73         */
     74        quizmaster.nextQuestion = function () {
     75
     76            if( !quizmaster.data.currentQuestion.next().length ) {
     77                return; // no next question (end of quiz)
     78            }
     79
     80            quizmaster.showQuestionObject( quizmaster.data.currentQuestion.next() );
     81
     82            // question show event
     83            quizmaster.trigger({
     84                type: 'quizmaster.nextQuestion',
     85                nextQuestion: quizmaster.data.currentQuestion.next(),
     86                currentQuestion: quizmaster.data.currentQuestion,
     87            });
     88
     89        };
     90
     91        quizmaster.prevQuestion = function () {
     92            quizmaster.showQuestionObject( quizmaster.data.currentQuestion.prev() );
     93
     94            quizmaster.fireChangeScreenEvent('question')
     95        };
     96
     97        quizmaster.getCurrentQuestion = function () {
     98            return quizmaster.data.currentQuestion;
     99        }
     100
     101        quizmaster.isLastQuestion = function( $questionId = 0 ) {
     102            if( quizmaster.questionCount() == quizmaster.data.currentQuestion.index() +1 ) {
     103                return true;
     104            }
     105
     106            return false;
     107        }
     108
     109        quizmaster.isFirstQuestion = function( $questionId ) {
     110            if( 0 == quizmaster.data.currentQuestion.index() ) {
     111                return true;
     112            }
     113
     114            return false;
     115        }
     116
     117        quizmaster.getCurrentQuestionId = function () {
     118            return quizmaster.data.currentQuestionId;
     119        }
     120
     121        quizmaster.showQuestionObject = function ( obj ) {
     122
     123            if( obj == 'current' ) {
     124                obj = quizmaster.data.currentQuestion;
     125            }
     126
     127            // hide current question, show new and set storage of current question
     128            quizmaster.data.currentQuestion.hide();
     129            obj.show();
     130            quizmaster.setCurrentQuestion( obj );
     131
     132            // scroll to quiz area
     133            quizmaster.scrollTo( quizmaster.elements.quiz );
     134
     135            // question show event
     136            quizmaster.trigger({
     137                type: 'quizmaster.questionShow',
     138                question: quizmaster.data.currentQuestion,
     139                questionIndex: quizmaster.data.currentQuestion.index()
     140            });
     141
     142            // last question load event
     143            if( quizmaster.questionCount() == quizmaster.data.currentQuestion.index() +1 ) {
     144
     145                quizmaster.trigger({
     146                    type: 'quizmaster.lastQuestionLoaded',
     147                    question: quizmaster.data.currentQuestion,
     148                    questionIndex: quizmaster.data.currentQuestion.index()
     149                });
     150
     151            }
     152
     153            quizmaster.timer.question.start( quizmaster.getCurrentQuestionId() );
     154
     155        };
     156
     157        quizmaster.fireChangeScreenEvent = function( $screen ) {
     158
     159            // change event
     160            quizmaster.trigger({
     161                type: 'quizmaster.changeScreen',
     162                screen: $screen
     163            });
     164
     165        }
     166
     167        quizmaster.checkButtonInit = function() {
     168
     169            quizmaster.elements.checkButton.click( function () {
     170
     171                if (quizmaster.config.options.forcingQuestionSolve && !quizmaster.data.quizSolved[ quizmaster.data.currentQuestion.index() ]
     172                    && (quizmaster.config.options.quizSummeryHide || !quizmaster.config.options.reviewQustion)) {
     173
     174                    return false;
     175                }
     176
     177                quizmaster.fireQuestionAnsweredEvent()
     178
     179            });
     180
     181        };
     182
     183        quizmaster.userAnswerData = {
     184
     185            singleMulti: function( $questionId, $questionElement ) {
     186
     187                var userAnswerData = {
     188                    answerIndexes: []
     189                };
     190
     191                var input = $questionElement.find('.quizMaster_questionInput')
     192
     193                $questionElement.find('.qm-question-list-item').each(function (i) {
     194
     195                    var $item = $(this);
     196                    var index = $item.data('pos');
     197                    var checked = input.eq(i).is(':checked');
     198
     199                    if( checked ) {
     200                        userAnswerData.answerIndexes.push( index )
     201                    }
     202
     203                });
     204
     205                return userAnswerData;
     206
     207            },
     208
     209            free: function( $questionId, $questionElement ) {
     210
     211                return $questionElement.find('.quizMaster_questionInput').val();
     212
     213            },
     214
     215            fillBlank: function( $questionId, $questionElement ) {
     216
     217                var answers = [];
     218
     219                $questionElement.find('.quizMaster_cloze input').each(function (i, v) {
     220                    answers.push( $(this).val() );
     221                });
     222
     223                return answers;
     224
     225            },
     226
     227            sorting: function( $questionId, $questionElement ) {
     228
     229                var answerOrder = $questionElement.find('.qm-sortable').sortable('toArray');
     230                return answerOrder;
     231
     232            },
     233
     234        };
     235
     236
     237        quizmaster.checker = function ( $questionId, $questionElement ) {
     238
     239            var questionData = quizmaster.config.json[ quizmaster.getCurrentQuestionId() ];
     240
     241            switch( questionData.type ) {
     242
     243                case 'single':
     244                case 'multiple':
     245                    var userAnswerData = quizmaster.userAnswerData.singleMulti( $questionId, $questionElement )
     246                break;
     247
     248                case 'free_answer':
     249                    var userAnswerData = quizmaster.userAnswerData.free( $questionId, $questionElement )
     250                break;
     251
     252                case 'fill_blank':
     253                    var userAnswerData = quizmaster.userAnswerData.fillBlank( $questionId, $questionElement )
     254                break;
     255
     256                case 'sort_answer':
     257                    var userAnswerData = quizmaster.userAnswerData.sorting( $questionId, $questionElement )
     258                break;
     259
     260            }
     261
     262            quizmaster.ajax({
     263                    action: 'quizmaster_admin_ajax',
     264                    func: 'checkAnswer',
     265                    data: {
     266
     267                        answerType: questionData.type,
     268                        quizId: quizmaster.config.quizId,
     269                        userAnswerData: userAnswerData,
     270                        questionId: $questionId,
     271
     272
     273                    }
     274            }, function (json) {
     275
     276                // organize result from checking answer
     277                quizmaster.data.results[ $questionId ].points = json.points;
     278                quizmaster.data.results[ $questionId ].correct = json.correct;
     279                quizmaster.data.results['comp'].points += json.points;
     280
     281                if( json.correct ) {
     282                    quizmaster.data.results['comp'].correctQuestions += 1;
     283                }
     284
     285                quizmaster.data.catResults[ questionData.catId ] += json.points;
     286                quizmaster.getCurrentQuestion().data('check', true);
     287
     288                // answerCheckComplete event
     289                quizmaster.trigger({
     290                    type: 'quizmaster.answerCheckComplete',
     291                    values: {
     292                        question: quizmaster.data.currentQuestion,
     293                        isCorrect: json.correct
     294                    }
     295                });
     296
     297            });
     298
     299        };
     300
     301        quizmaster.marker = function (e, correct) {
     302
     303            if ( !quizmaster.config.options.disabledAnswerMark ) {
     304                if (correct) {
     305                    e.addClass('quizMaster_answerCorrect');
     306                } else {
     307                    e.addClass('quizMaster_answerIncorrect');
     308                }
     309            }
     310
     311        };
     312
     313        quizmaster.checkQuestion = function( list, endCheck ) {
     314
     315            quizmaster.setStatus('checkQuestion')
     316
     317            // stop timer
     318            quizmaster.timer.question.stop();
     319
     320            // answer already checked
     321            if ( quizmaster.getCurrentQuestion().data('check') ) {
     322                return true;
     323            }
     324
     325            // run checker to check answer
     326            quizmaster.checker( quizmaster.getCurrentQuestionId(), quizmaster.getCurrentQuestion() );
     327
     328            // end check trigger
     329            quizmaster.trigger({
     330                type: 'quizmaster.questionChecked',
     331                values: {
     332                    item: quizmaster.data.currentQuestion,
     333                    index: quizmaster.data.currentQuestion.index(),
     334                    solved: true,
     335                    fake: true
     336                }
     337            });
     338
     339        };
     340
     341        quizmaster.questionSolved = function (e) {
     342
     343            quizmaster.data.quizSolved[ e.values.index ] = e.values.solved;
     344            var data = quizmaster.config.json[ quizmaster.getCurrentQuestionId() ];
     345
     346            quizmaster.data.results[data.id].solved = Number(e.values.fake ? quizmaster.data.results[data.id].solved : e.values.solved);
     347
     348                // record as answered, solved/skipped
     349                if( e.values.fake ) {
     350                    quizmaster.data.results.comp.answered++
     351                    if( quizmaster.data.results[data.id].solved ) {
     352                        quizmaster.data.results.comp.solved++
     353                    } else {
     354                        quizmaster.data.results.comp.skipped++
     355                    }
     356                }
     357        };
     358
     359        quizmaster.ajax = function (data, success, dataType) {
     360                dataType = dataType || 'json';
     361
     362                if (quizmaster.config.options.cors) {
     363                        jQuery.support.cors = true;
     364                }
     365
     366                $.post(QuizMasterGlobal.ajaxurl, data, success, dataType);
     367
     368                if (quizmaster.config.options.cors) {
     369                        jQuery.support.cors = false;
     370                }
     371        };
     372
     373        quizmaster.startButtonInit = function() {
     374
     375            quizmaster.elements.startButton.click( function () {
     376                quizmaster.startQuiz();
     377            });
     378
     379        };
     380
     381        /*
     382     * Initialize Next Button
     383         */
     384        quizmaster.nextButtonInit = function() {
     385
     386            quizmaster.elements.nextButton.click(function () {
     387
     388                if ( quizmaster.config.options.forcingQuestionSolve && !quizmaster.data.quizSolved[ quizmaster.getCurrentQuestion().index() ]
     389                    && ( quizmaster.config.options.quizSummeryHide || !quizmaster.config.options.reviewQustion )) {
     390                    return false;
     391                }
     392
     393                // question answered event
     394                // don't fire for mode 1 (check/continue) because it's fired from check button click
     395                if( quizmaster.config.mode != 1 ) {
     396                    quizmaster.fireQuestionAnsweredEvent()
     397                }
     398
     399                quizmaster.nextQuestion();
     400
     401            });
     402
     403        };
     404
     405        /*
     406     * Initialize Finish Button
     407         */
     408        quizmaster.finishButtonInit = function() {
     409
     410            quizmaster.elements.finishButton.click(function () {
     411
     412                quizmaster.finishQuiz();
     413
     414            });
     415
     416        };
     417
     418        quizmaster.fireQuestionAnsweredEvent = function() {
     419
     420            // question answered event
     421            quizmaster.trigger({
     422                type: 'quizmaster.questionAnswered',
     423                question: quizmaster.data.currentQuestion,
     424            });
     425
     426        };
     427
     428        quizmaster.backButtonInit = function() {
     429
     430            quizmaster.elements.backButton.click( function () {
     431                quizmaster.prevQuestion();
     432            });
     433
     434        }
     435
     436        quizmaster.startQuiz = function() {
     437
     438            quizmaster.startPageHide();
     439
     440            var $listItem = quizmaster.elements.questionList.children();
     441            quizmaster.elements.listItems = $('.quizMaster_list > li');
     442
     443            // start time limit
     444            quizmaster.timer.limit.start();
     445
     446            quizmaster.data.quizSolved = [];
     447            quizmaster.data.results = {
     448                comp: {
     449                    points: 0,
     450                    correctQuestions: 0,
     451                    quizTime: 0,
     452                    answered: 0,
     453                    skipped: 0,
     454                    solved: 0,
     455                }
     456            };
     457
     458            $('.qm-question-list').each(function () {
     459
     460                    var questionId = $(this).data('question_id');
     461
     462                    quizmaster.data.results[ questionId ] = {
     463                        time: 0,
     464                        solved: 0
     465                    };
     466
     467            });
     468
     469            quizmaster.data.catResults = {};
     470            $.each( quizmaster.config.options.catPoints, function (i, v) {
     471                quizmaster.data.catResults[i] = 0;
     472            });
     473
     474            quizmaster.elements.quiz.show();
     475
     476            // maybe show reviewBox
     477            if( quizmaster.config.options.isShowReviewQuestion ) {
     478                quizmaster.elements.reviewBox.show();
     479            }
     480
     481            // maybe show skip button
     482            if ( quizmaster.config.options.isShowSkipButton || quizmaster.config.options.isShowReviewQuestion ) {
     483                quizmaster.elements.skipButton.show();
     484            }
     485
     486            // maybe show back button
     487            if ( quizmaster.config.options.isShowBackButton ) {
     488                quizmaster.elements.backButton.show();
     489            }
     490
     491            // start timer
     492            quizmaster.timer.quiz.start();
     493
     494            // quiz start event
     495            quizmaster.trigger({
     496                type: 'quizmaster.startQuiz',
     497                mode: quizmaster.config.mode,
     498            });
     499
     500        };
     501
     502        quizmaster.showSinglePage = function (page) {
     503                $listItem = quizmaster.elements.questionList.children().hide();
     504
     505                if (!quizmaster.config.qpp) {
     506                        $listItem.show();
     507
     508                        return;
     509                }
     510
     511                page = page ? +page : 1;
     512                var maxPage = Math.ceil(quizmaster.find('.quizMaster_list > li').length / quizmaster.config.qpp);
     513
     514                if (page > maxPage)
     515                        return;
     516
     517                var pl = quizmaster.find(quizmaster.elements.singlePageLeft).hide();
     518                var pr = quizmaster.find(quizmaster.elements.singlePageRight).hide();
     519                var cs = quizmaster.find('input[name="checkSingle"]').hide();
     520
     521                if (page > 1) {
     522                        pl.val(pl.data('text').replace(/%d/, page - 1)).show();
     523                }
     524
     525                if (page == maxPage) {
     526                    cs.show();
     527                } else {
     528                    pr.val(pr.data('text').replace(/%d/, page + 1)).show();
     529                }
     530
     531                currentPage = page;
     532                var start = config.qpp * (page - 1);
     533
     534                $listItem.slice(start, start + config.qpp).show();
     535                quizmaster.scrollTo( quizmaster.elements.quiz );
     536        };
     537
     538        quizmaster.setCurrentQuestion = function( $question ) {
     539
     540            quizmaster.data.currentQuestion = $question;
     541            quizmaster.data.currentQuestionId = $question.find(quizmaster.elements.questionListClass).data('question_id');
     542
     543        };
     544
     545        quizmaster.questionCount = function () {
     546            return quizmaster.find('.quizMaster_listItem').length;
     547        };
     548
     549        quizmaster.finishQuiz = function (timeover) {
     550
     551            // hide finish button
     552            quizmaster.elements.finishButton.hide();
     553
     554            // deactivate hint trigger
     555            quizmaster.hintDisable();
     556
     557            quizmaster.timer.question.stop();
     558            quizmaster.timer.quiz.stop();
     559            quizmaster.timer.limit.stop();
     560
     561            var time = (+new Date() - quizmaster.timer.quizStartTime);
     562            time = (quizmaster.config.timeLimit && time > quizmaster.config.timeLimit) ? quizmaster.config.timeLimit : time;
     563
     564            quizmaster.find('.quizMaster_quiz_time span').text( quizmaster.timer.parseTime(time) );
     565
     566            if (timeover) {
     567                quizmaster.elements.resultsBox.find('.qm-time-limit_expired').show();
     568            }
     569
     570            // check all answers if mode is single page
     571            if( quizmaster.config.mode == 2 ) {
     572                quizmaster.checkQuestion(quizmaster.elements.questionList.children(), true);
     573            }
     574
     575
     576            quizmaster.setAverageResult(quizmaster.data.results.comp.result, false);
     577            quizmaster.setCategoryOverview();
     578
     579            quizmaster.sendCompletedQuiz();
     580
     581            /* global trigger */
     582            quizmaster.trigger({
     583                type: 'quizmaster.quizCompleted',
     584                questionCount: quizmaster.questionCount(),
     585                results: quizmaster.data.results,
     586            });
     587
     588        };
     589
     590        quizmaster.afterQuizFinish = function() {
     591
     592            // hide buttons and elements
     593            quizmaster.elements.checkButton.hide();
     594            quizmaster.elements.skipButton.hide();
     595            quizmaster.elements.reviewBox.hide();
     596            quizmaster.find('.qm-check-page, .qm-info-page').hide();
     597            quizmaster.elements.quiz.hide();
     598            quizmaster.elements.resultsBox.show();
     599            quizmaster.scrollTo(quizmaster.elements.resultsBox);
     600
     601            // reset result comp
     602            quizmaster.data.results.comp.solved     = 0;
     603            quizmaster.data.results.comp.answered = 0;
     604            quizmaster.data.results.comp.skipped    = 0;
     605
     606        }
     607
     608        quizmaster.showQuizSummary = function() {
     609
     610            quizmaster.elements.reviewBox.hide();
     611            quizmaster.elements.quiz.hide();
     612
     613            /*
     614       * Show the quiz summary
     615       * Needs to fire after question check for last question is completed
     616             */
     617
     618            // show the correct answer count
     619            var correctAnswerEl = quizmaster.find('.quizMaster_correct_answer');
     620            correctAnswerEl.text( quizmaster.data.results.comp.correctQuestions )
     621
     622            quizmaster.data.results.comp.result = Math.round(quizmaster.data.results.comp.points / quizmaster.config.globalPoints * 100 * 100) / 100;
     623            var $pointFields = quizmaster.find('.quizMaster_points span');
     624
     625            $pointFields.eq(0).text(quizmaster.data.results.comp.points);
     626            $pointFields.eq(1).text(quizmaster.config.globalPoints);
     627            $pointFields.eq(2).text(quizmaster.data.results.comp.result + '%');
     628
     629        }
     630
     631        /*
     632     * Hint Handler Functions
     633         */
     634
     635        quizmaster.hint = {
     636
     637            buttonHide: function() {
     638                quizmaster.elements.hintTrigger.hide();
     639            },
     640
     641            buttonShow: function() {
     642                quizmaster.elements.hintTrigger.show();
     643            },
     644
     645        };
     646
     647         quizmaster.hintInit = function() {
     648
     649            quizmaster.on('quizmaster.questionShow', function() {
     650
     651                var $hint = quizmaster.getCurrentQuestion().find('.quizMaster_tipp')
     652                if( ! $hint.length ) {
     653                    quizmaster.hintDisable();
     654                } else {
     655                    quizmaster.hint.buttonShow();
     656                    quizmaster.hintEnable();
     657                }
     658
     659            });
     660        };
     661
     662         quizmaster.hintDisable = function () {
     663
     664            $tipModal = $('.qm-hint-modal');
     665            $tipModal.hide();
     666            quizmaster.elements.hintTrigger.removeClass('qm-hint-enabled')
     667            quizmaster.elements.hintTrigger.addClass('qm-hint-disabled')
     668            quizmaster.elements.hintTrigger.off( 'click', quizmaster.hintHide )
     669            quizmaster.elements.hintTrigger.off( 'click', quizmaster.hintShow )
     670
     671        };
     672
     673        quizmaster.hintEnable = function () {
     674
     675            quizmaster.elements.hintTrigger.removeClass('qm-hint-disabled')
     676            quizmaster.elements.hintTrigger.addClass('qm-hint-enabled')
     677            quizmaster.elements.hintTrigger.off( 'click', quizmaster.hintHide )
     678            quizmaster.elements.hintTrigger.on( 'click', quizmaster.hintShow )
     679
     680        };
     681
     682        quizmaster.hintHide = function ( event ) {
     683
     684            $tipModal = $('.qm-hint-modal');
     685            $tipModal.hide();
     686            quizmaster.elements.hintTrigger.off( 'click', quizmaster.hintHide )
     687            quizmaster.elements.hintTrigger.on( 'click', quizmaster.hintShow )
     688
     689        };
     690
     691        quizmaster.hintShow = function ( event ) {
     692
     693            var $this = $(this);
     694            var id = quizmaster.getCurrentQuestionId();
     695
     696            // get tip div
     697            var $hint = quizmaster.data.currentQuestion.find('.quizMaster_tipp')
     698            var $tip = $hint.html();
     699            $tipModal = $('.qm-hint-modal');
     700            $tipModalContents = $('.qm-hint-modal .qm-hint-content');
     701
     702            // populate modal with current question tip
     703            $tipModalContents.html( $tip )
     704
     705            // adjust modal position
     706            $tipModal.css({
     707                position: "absolute",
     708                left: $this.position().left + "px",
     709                top: ($this.position().top + $this.outerHeight()) + "px",
     710                display: "block",
     711            });
     712
     713            quizmaster.elements.hintTrigger.on( 'click', quizmaster.hintHide )
     714            quizmaster.elements.hintTrigger.off( 'click', quizmaster.hintShow )
     715
     716            // record use of tip
     717            quizmaster.data.results[id].tip = 1;
     718
     719        };
     720
     721        /*
     722     * Timer Class
     723         */
     724        quizmaster.timer = {
     725
     726            questionStartTime: 0,
     727            quizStartTime: 0,
     728
     729            limit: {
     730
     731                intervalId: 0,
     732
     733                stop: function () {
     734                    if ( quizmaster.config.timeLimit ) {
     735                        window.clearInterval( quizmaster.timer.limit.intervalId );
     736                        quizmaster.elements.timeLimitBox.hide();
     737                    }
     738                },
     739
     740                start: function () {
     741
     742                    if (! quizmaster.config.timeLimit )
     743                        return;
     744
     745                    var $timeText = quizmaster.elements.timeLimitBox.find('span').text( quizmaster.timer.parseTime( quizmaster.config.timeLimit ) );
     746                    var $timeDiv = quizmaster.elements.timeLimitBox.find('.qm-progress-box');
     747
     748                    quizmaster.elements.timeLimitBox.show();
     749
     750                    var beforeTime = +new Date();
     751
     752                    quizmaster.timer.limit.intervalId = window.setInterval(function () {
     753
     754                        var diff = (+new Date() - beforeTime);
     755                        var elapsedTime = (quizmaster.config.timeLimit) - diff;
     756
     757                        if (diff >= 500) {
     758                            $timeText.text( quizmaster.timer.parseTime(Math.ceil(elapsedTime)) );
     759                        }
     760
     761                        $timeDiv.css('width', (elapsedTime / quizmaster.config.timeLimit * 100) + '%');
     762
     763                        if (elapsedTime <= 0) {
     764                            quizmaster.timer.limit.stop();
     765                            quizmaster.finishQuiz( true );
     766                        }
     767
     768                    });
     769                },
     770
     771            },
     772
     773            question: {
     774
     775                start: function ( questionId ) {
     776                    if ( quizmaster.data.currentQuestionId != 0 )
     777                        quizmaster.stop();
     778
     779                    quizmaster.data.currentQuestionId = questionId;
     780                    quizmaster.timer.questionStartTime = +new Date();
     781
     782                },
     783
     784                stop: function () {
     785
     786                    if ( quizmaster.getCurrentQuestionId() == 0 )
     787                            return;
     788
     789                    quizmaster.data.results[ quizmaster.getCurrentQuestionId() ].time += Math.round((new Date() - quizmaster.timer.questionStartTime));
     790
     791                },
     792
     793            },
     794
     795            quiz: {
     796
     797                start: function () {
     798                    if ( quizmaster.data.isQuizStarted )
     799                        quizmaster.stopQuiz();
     800
     801                    quizmaster.timer.quizStartTime = +new Date();
     802                    quizmaster.data.isQuizStarted = true;
     803
     804                },
     805
     806                stop: function () {
     807
     808                    if ( !quizmaster.data.isQuizStarted ) {
     809                        return;
     810                    }
     811
     812                    quizmaster.data.results['comp'].quizTime += new Date() - quizmaster.timer.quizStartTime;
     813                    quizmaster.data.isQuizStarted = false;
     814
     815                },
     816
     817            },
     818
     819            convertTimeLimitMs: function() {
     820                if( quizmaster.config.timeLimit ) {
     821                    quizmaster.config.timeLimit = quizmaster.config.timeLimit * 1000;
     822                }
     823            },
     824
     825            parseTime: function (ms) {
     826
     827                var seconds = parseInt(ms / 1000);
     828                var minutes = parseInt((seconds / 60) % 60);
     829                var hours = parseInt((seconds / 3600) % 24);
     830
     831                seconds = (seconds > 9 ? '' : '0') + seconds;
     832                minutes = (minutes > 9 ? '' : '0') + minutes;
     833                hours = (hours > 9 ? '' : '0') + hours;
     834
     835                return hours + ':' + minutes + ':' + seconds;
     836            },
     837
     838        };
     839
     840        quizmaster.setAverageResult = function (p, g) {
     841            var v = quizmaster.find('.quizMaster_resultValue:eq(' + (g ? 0 : 1) + ') > * ');
     842            v.eq(1).text(p + '%');
     843            v.eq(0).css('width', (240 * p / 100) + 'px');
     844        };
     845
     846        quizmaster.setCategoryOverview = function () {
     847
     848                quizmaster.data.results.comp.cats = {};
     849
     850                quizmaster.find('.quizMaster_catOverview li').each(function () {
     851
     852                    var $this = $(this);
     853                    var catId = $this.data('category_id');
     854
     855                    if (quizmaster.config.catPoints[catId] === undefined) {
     856                            $this.hide();
     857                            return true;
     858                    }
     859
     860                    var r = Math.round(quizmaster.data.catResults[catId] / quizmaster.config.catPoints[catId] * 100 * 100) / 100;
     861
     862                    quizmaster.data.results.comp.cats[catId] = r;
     863
     864                    $this.find('.quizMaster_catPercent').text(r + '%');
     865
     866                    $this.show();
     867                });
     868
     869        };
     870
     871        quizmaster.sendCompletedQuiz = function () {
     872
     873            quizmaster.fetchAllAnswerData( quizmaster.data.results );
     874
     875            quizmaster.ajax({
     876                action: 'quizmaster_admin_ajax',
     877                func: 'completedQuiz',
     878                data: {
     879                    quizId: quizmaster.config.quizId,
     880                    results: quizmaster.data.results,
     881                }
     882            });
     883
     884        };
     885
     886        quizmaster.fetchAllAnswerData = function (resultData) {
     887
     888                quizmaster.find('.quizMaster_question-list').each(function () {
     889                        var $this = $(this);
     890                        var questionId = $this.data('question_id');
     891                        var type = $this.data('type');
     892                        var data = {};
     893
     894                        if (type == 'single' || type == 'multiple') {
     895                                $this.find('.qm-question-list-item').each(function () {
     896                                    data[$(this).data('pos')] = +$(this).find('.quizMaster_questionInput').is(':checked');
     897                                });
     898                        } else if (type == 'free_answer') {
     899                                data[0] = $this.find('.quizMaster_questionInput').val();
     900                        } else if (type == 'sort_answer') {
     901                                return true;
     902                        } else if (type == 'matrix_sort_answer') {
     903                                return true;
     904                        } else if (type == 'fill_blank') {
     905                                var i = 0;
     906                                $this.find('.quizMaster_cloze input').each(function () {
     907                                        data[i++] = $(this).val();
     908                                });
     909                        }
     910
     911                        quizmaster.data.resultData[questionId]['data'] = data;
     912
     913                });
     914        };
     915
     916        /*
     917     * Question Review
     918         */
     919        quizmaster.questionReviewButtonInit = function() {
     920
     921            quizmaster.elements.questionReviewButton.on( 'click', function () {
     922                quizmaster.showQuestionList();
     923            });
     924
     925        };
     926
     927        quizmaster.showQuestionList = function () {
     928
     929                quizmaster.elements.quiz.toggle();
     930                quizmaster.find('.quizMaster_QuestionButton').hide();
     931                quizmaster.elements.questionList.children().show();
     932
     933                if( quizmaster.config.showReviewBox ) {
     934                    quizmaster.elements.reviewBox.toggle();
     935                }
     936
     937                quizmaster.find('.quizMaster_question_page').hide();
     938
     939        };
     940
     941        /*
     942     * Restart quiz
     943         */
     944        quizmaster.restartButtonInit = function() {
     945
     946            quizmaster.elements.restartButton.click(function () {
     947                    quizmaster.restartQuiz();
     948            });
     949
     950        };
     951
     952        quizmaster.restartQuiz = function () {
     953
     954            quizmaster.elements.resultsBox.hide();
     955            quizmaster.elements.startPage.show();
     956            quizmaster.elements.questionList.children().hide();
     957            quizmaster.elements.reviewBox.hide();
     958
     959            quizmaster.find('.quizMaster_questionInput, .quizMaster_cloze input').removeAttr('disabled').removeAttr('checked')
     960                    .css('background-color', '');
     961
     962            quizmaster.find('.quizMaster_questionListItem input[type="text"]').val('');
     963
     964            quizmaster.find('.quizMaster_answerCorrect, .quizMaster_answerIncorrect').removeClass('quizMaster_answerCorrect quizMaster_answerIncorrect');
     965
     966            quizmaster.find('.quizMaster_listItem').data('check', false);
     967
     968            // quizmaster.find('.qm-check-answer-box').hide().children().hide();
     969            quizmaster.find('.qm-check-answer-box').hide();
     970            quizmaster.find('.quizMaster_clozeCorrect, .quizMaster_QuestionButton, .qm-results-boxList > li').hide();
     971
     972            quizmaster.find('.quizMaster_question_page, input[name="tip"]').show();
     973            quizmaster.find('.quizMaster_resultForm').text('').hide();
     974
     975            quizmaster.elements.resultsBox.find('.qm-time-limit_expired').hide();
     976
     977        };
     978
     979        /*
     980     * Important utility functions
     981         */
     982
     983        quizmaster.loadQuizData = function () {
     984
     985            quizmaster.ajax({
     986                    action: 'quizmaster_admin_ajax',
     987                    func: 'quizLoadData',
     988                    data: {
     989                        quizId: quizmaster.config.quizId
     990                    }
     991            }, function (json) {
     992
     993                quizmaster.config.globalPoints = json.globalPoints;
     994                quizmaster.config.catPoints = json.catPoints;
     995                quizmaster.config.json = json.json;
     996                quizmaster.find('.quizMaster_quizAnker').after(json.content);
     997
     998                // quiz data loaded event
     999                quizmaster.trigger({
     1000                    type: 'quizmaster.quizDataLoaded',
     1001                });
     1002
     1003            });
     1004        };
     1005
     1006        quizmaster.modeHandler = function() {
     1007
     1008            // mode handling
     1009            switch (quizmaster.config.mode) {
     1010
     1011                // single page mode
     1012                case 2:
     1013
     1014                    quizmaster.elements.finishButton.show();
     1015                    quizmaster.find('.quizMaster_question_page').hide();
     1016                    var $questionList = quizmaster.elements.questionList.children();
     1017                    quizmaster.setCurrentQuestion( $questionList.last() );
     1018                    quizmaster.showSinglePage(0);
     1019                    break;
     1020
     1021                // check/continue mode
     1022                case 1:
     1023
     1024                    // show check button at start
     1025                    quizmaster.elements.checkButton.show();
     1026                    quizmaster.elements.finishButton.hide();
     1027                    quizmaster.elements.nextButton.hide();
     1028
     1029                    // handle buttons on questionCheck
     1030                    quizmaster.on( 'quizmaster.questionChecked', function() {
     1031
     1032                        if( quizmaster.isLastQuestion() ) {
     1033                            quizmaster.elements.finishButton.show()
     1034                            quizmaster.elements.checkButton.hide()
     1035                        } else {
     1036                            quizmaster.elements.nextButton.show()
     1037                            quizmaster.elements.checkButton.hide()
     1038                        }
     1039
     1040                    });
     1041
     1042                    // handle buttons on nextQuestion
     1043                    quizmaster.on( 'quizmaster.nextQuestion', function() {
     1044
     1045                        if( quizmaster.config.mode == 1 ) {
     1046
     1047                                quizmaster.elements.checkButton.show()
     1048                                quizmaster.elements.nextButton.hide()
     1049
     1050                        }
     1051
     1052                    });
     1053
     1054                    break;
     1055
     1056                // default normal mode
     1057                case 0:
     1058                    quizmaster.elements.nextButton.show();
     1059                    break;
     1060            }
     1061
     1062            // maybe hide question position overview
     1063            if ( quizmaster.config.options.hideQuestionPositionOverview ) {
     1064                quizmaster.find('.quizMaster_question_page').hide();
     1065            }
     1066
     1067            // start timer
     1068            quizmaster.timer.question.start( quizmaster.getCurrentQuestionId() )
     1069
     1070        };
     1071
     1072        quizmaster.startQuizShowQuestion = function() {
     1073
     1074            if( quizmaster.config.mode != 2 ) {
     1075
     1076                // get first question object and show
     1077                var $questionList = quizmaster.elements.questionList.children();
     1078                quizmaster.setCurrentQuestion( $questionList.eq(0) );
     1079                quizmaster.showQuestionObject( 'current' );
     1080
     1081            }
     1082
     1083        };
     1084
     1085        quizmaster.sortableInit = function () {
     1086
     1087            quizmaster.find('.qm-sortable').sortable({
     1088                update: function (event, ui) {
     1089                    var $p = $(this).parents('.quizMaster_listItem');
     1090
     1091                    quizmaster.trigger({
     1092                            type: 'quizmaster.questionSolved',
     1093                            values: {
     1094                                item: $p,
     1095                                index: $p.index(),
     1096                                solved: true
     1097                            }
     1098                    });
     1099                }
     1100            }).disableSelection();
     1101
     1102        }
     1103
     1104        quizmaster.setStatus = function ( statusCode ) {
     1105            quizmaster.status = statusCode;
     1106        }
     1107
     1108        quizmaster.getStatus = function () {
     1109            return quizmaster.status;
     1110        }
     1111
     1112        quizmaster.init = function( options ) {
     1113
     1114            // parse options to quizmaster.config
     1115            quizmaster.config = $.extend({
     1116
     1117                // default settings
     1118          bitOptions: {
     1119                    cors: true
     1120                },
     1121          options: {
     1122                    catPoints: []
     1123                }
     1124
     1125        }, options );
     1126
     1127            // convert the time limit set in seconds to ms
     1128            quizmaster.timer.convertTimeLimitMs();
     1129
     1130            quizmaster.loadQuizData()
     1131            quizmaster.checkButtonInit();
     1132            quizmaster.backButtonInit();
     1133            quizmaster.nextButtonInit();
     1134            quizmaster.finishButtonInit();
     1135            quizmaster.startButtonInit();
     1136            quizmaster.restartButtonInit();
     1137            quizmaster.questionReviewButtonInit();
     1138            quizmaster.hintInit();
     1139            quizmaster.sortableInit();
     1140
     1141            /*
     1142         * Maybe start quiz or show start page
     1143             */
     1144            if( quizmaster.config.options.isAutostart ) {
     1145                quizmaster.on( 'quizmaster.quizDataLoaded', quizmaster.startQuiz )
     1146            } else {
     1147                quizmaster.startPageShow();
     1148            }
     1149
     1150            // quiz setup functions
     1151            quizmaster.on( 'quizmaster.startQuiz', quizmaster.modeHandler );
     1152            quizmaster.on( 'quizmaster.startQuiz', quizmaster.startQuizShowQuestion );
     1153
     1154            /*
     1155         * Event Handlers
     1156             */
     1157
     1158            // bind questionSolved to questionCheck
     1159            quizmaster.on( 'quizmaster.questionChecked', quizmaster.questionSolved );
     1160
     1161            // bind to quizCompleted event
     1162            quizmaster.on( 'quizmaster.quizCompleted', function() {
     1163                quizmaster.elements.nextButton.hide()
     1164                quizmaster.elements.checkButton.hide()
     1165                quizmaster.elements.hintTrigger.hide()
     1166            });
     1167
     1168            quizmaster.on( 'quizmaster.lastQuestionLoaded', function() {
     1169
     1170                if( quizmaster.config.mode == 0 ) {
     1171                    quizmaster.elements.finishButton.show();
     1172                    quizmaster.elements.checkButton.hide();
     1173                    quizmaster.elements.nextButton.hide();
     1174                }
     1175
     1176            });
     1177
     1178            quizmaster.on( 'quizmaster.quizCompleted', function() {
     1179                quizmaster.showQuizSummary();
     1180            });
     1181
     1182            quizmaster.on( 'quizmaster.quizCompleted', function() {
     1183                quizmaster.afterQuizFinish();
     1184            });
     1185
     1186            // bind to questionAnswered event
     1187            quizmaster.on( 'quizmaster.questionAnswered', function() {
     1188                quizmaster.checkQuestion()
     1189            });
     1190
     1191            /*
     1192             * Set initial status
     1193             */
     1194            quizmaster.setStatus('initialized')
     1195
     1196    };
     1197
     1198        /*
     1199     * Initialize or return
     1200         */
     1201
     1202        if( !options ) {
     1203            // return current instance
     1204            return quizmaster;
     1205        } else {
     1206            // do init
     1207            quizmaster.init( options );
     1208        }
     1209
     1210
     1211  }; // end quizmaster jQuery plugin
    141212
    151213});
    16 
    17 /**
    18  * Source: https://github.com/jfriend00/docReady
    19  */
    20 (function(funcName, baseObj) {
    21   // The public function name defaults to window.quizMasterReady
    22   // but you can pass in your own object and own function name and those will be used
    23   // if you want to put them in a different namespace
    24   funcName = funcName || "quizMasterReady";
    25   baseObj = baseObj || window;
    26   var readyList = [];
    27   var readyFired = false;
    28   var readyEventHandlersInstalled = false;
    29 
    30     // call this when the document is ready
    31     // this function protects itself against being called more than once
    32     function ready() {
    33       if (!readyFired) {
    34         // this must be set to true before we start calling callbacks
    35         readyFired = true;
    36         for (var i = 0; i < readyList.length; i++) {
    37           // if a callback here happens to add new ready handlers,
    38           // the quizMasterReady() function will see that it already fired
    39           // and will schedule the callback to run right after
    40           // this event loop finishes so all handlers will still execute
    41           // in order and no new ones will be added to the readyList
    42           // while we are processing the list
    43           readyList[i].fn.call(window, readyList[i].ctx);
    44         }
    45         // allow any closures held by these functions to free
    46         readyList = [];
    47       }
    48     }
    49 
    50     function readyStateChange() {
    51       if ( document.readyState === "complete" ) {
    52         ready();
    53       }
    54     }
    55 
    56     // This is the one public interface
    57     // quizMasterReady(fn, context);
    58     // the context argument is optional - if present, it will be passed
    59     // as an argument to the callback
    60     baseObj[funcName] = function(callback, context) {
    61         // if ready has already fired, then just schedule the callback
    62         // to fire asynchronously, but right away
    63         if (readyFired) {
    64             setTimeout(function() {callback(context);}, 1);
    65             return;
    66         } else {
    67             // add the function and context to the list
    68             readyList.push({fn: callback, ctx: context});
    69         }
    70         // if document already ready to go, schedule the ready function to run
    71         if (document.readyState === "complete") {
    72             setTimeout(ready, 1);
    73         } else if (!readyEventHandlersInstalled) {
    74           // otherwise if we don't have event handlers installed, install them
    75           if (document.addEventListener) {
    76             // first choice is DOMContentLoaded event
    77             document.addEventListener("DOMContentLoaded", ready, false);
    78             // backup is window load event
    79             window.addEventListener("load", ready, false);
    80           } else {
    81             // must be IE
    82             document.attachEvent("onreadystatechange", readyStateChange);
    83             window.attachEvent("onload", ready);
    84           }
    85           readyEventHandlersInstalled = true;
    86         }
    87     }
    88 })("quizMasterReady", window);
    89 
    90 quizmasterQuizRegistry = quizMasterReady(function () {
    91 
    92   var r = window.quizmasterQuizRegistry || [];
    93 
    94   for(var i = 0; i < r.length; i++) {
    95     jQuery(r[i].id).quizMasterFront(r[i].init);
    96   }
    97 
    98     return window.quizmasterQuizRegistry;
    99 
    100 });
    101 
    102 (function ($) {
    103 
    104     /**
    105      * @memberOf $
    106      */
    107     $.quizMasterFront = function (element, options) {
    108 
    109         var $e = $(element);
    110         var config = options;
    111                 var callbacks = [];
    112         var plugin = this;
    113         var results = new Object();
    114         var catResults = new Object();
    115         var startTime = 0;
    116         var currentQuestion = null;
    117         var quizSolved = [];
    118         var lastButtonValue = "";
    119         var inViewQuestions = false;
    120         var currentPage = 1;
    121 
    122                 var registerCallbacks = (function () {
    123 
    124                     plugin.methode.ajax({
    125                             action: 'quizmaster_admin_ajax',
    126                             func: 'registerExtensionScriptCallbacks',
    127                             data: {}
    128                         }, function (json) {
    129                             window.quizmasterCallbackRegistry = json;
    130                         }
    131                     );
    132 
    133                 });
    134 
    135         var bitOptions = {
    136             randomAnswer: 0,
    137             randomQuestion: 0,
    138             disabledAnswerMark: 0,
    139             checkBeforeStart: 0,
    140             preview: 0,
    141             cors: 0,
    142             isAddAutomatic: 0,
    143             quizSummeryHide: 0,
    144             skipButton: 0,
    145             reviewQustion: 0,
    146             autoautoStart: 0,
    147             forcingQuestionSolve: 0,
    148             hideQuestionPositionOverview: 0,
    149             formActivated: 0,
    150             maxShowQuestion: 0,
    151             sortCategories: 0
    152         };
    153 
    154         var quizStatus = {
    155             isQuizStart: 0,
    156             isLocked: 0,
    157             loadLock: 0,
    158             isUserStartLocked: 0
    159         };
    160 
    161         var globalNames = {
    162             check: '.qm-button-check',
    163             next: '.qm-button-next',
    164             questionList: '.quizMaster_questionList',
    165             skip: 'input[name="skip"]',
    166             singlePageLeft: 'input[name="quizMaster_pageLeft"]',
    167             singlePageRight: 'input[name="quizMaster_pageRight"]'
    168         };
    169 
    170         var globalElements = {
    171             back: $e.find('input[name="back"]'),
    172             next: $e.find(globalNames.next),
    173                         skip: $e.find(globalNames.skip),
    174                         check: $e.find(globalNames.check),
    175             quiz: $e.find('.quizMaster_quiz'),
    176             questionList: $e.find('.quizMaster_list'),
    177             results: $e.find('.qm-results-box'),
    178                         questionCheck: $e.find('.qm-check-answer-box'),
    179             quizStartPage: $e.find('.qm-quiz-start-box'),
    180             timelimit: $e.find('.qm-time-limit'),
    181             toplistShowInButton: $e.find('.quizMaster_toplistShowInButton'),
    182                         hintTrigger: $e.find('.qm-hint-trigger'),
    183             listItems: $()
    184         };
    185 
    186         var toplistData = {
    187             token: '',
    188             isUser: 0
    189         };
    190 
    191         var formPosConst = {
    192             START: 0,
    193             END: 1
    194         };
    195 
    196         /**
    197          * @memberOf timelimit
    198          */
    199         var timelimit = (function () {
    200             var _counter = config.timelimit;
    201             var _intervalId = 0;
    202             var instance = {};
    203 
    204             instance.stop = function () {
    205                 if (_counter) {
    206                     window.clearInterval(_intervalId);
    207                     globalElements.timelimit.hide();
    208                 }
    209             };
    210 
    211             instance.start = function () {
    212                 if (!_counter)
    213                     return;
    214 
    215                 var x = _counter * 1000;
    216 
    217                 var $timeText = globalElements.timelimit.find('span').text(plugin.methode.parseTime(_counter));
    218                 var $timeDiv = globalElements.timelimit.find('.qm-progress-box');
    219 
    220                 globalElements.timelimit.show();
    221 
    222                 var beforeTime = +new Date();
    223 
    224                 _intervalId = window.setInterval(function () {
    225 
    226                     var diff = (+new Date() - beforeTime);
    227                     var elapsedTime = x - diff;
    228 
    229                     if (diff >= 500) {
    230                         $timeText.text(plugin.methode.parseTime(Math.ceil(elapsedTime / 1000)));
    231                     }
    232 
    233                     $timeDiv.css('width', (elapsedTime / x * 100) + '%');
    234 
    235                     if (elapsedTime <= 0) {
    236                         instance.stop();
    237                         plugin.methode.finishQuiz(true);
    238                     }
    239 
    240                 }, 16);
    241             };
    242 
    243             return instance;
    244 
    245         })();
    246 
    247         /**
    248          * @memberOf reviewBox
    249          */
    250         var reviewBox = new function () {
    251 
    252             var $contain = [], $cursor = [], $list = [], $items = [];
    253             var x = 0, offset = 0, diff = 0, top = 0, max = 0;
    254 
    255             this.init = function () {
    256 
    257                 $contain = $e.find('.quizMaster_reviewQuestion');
    258                 $cursor = $contain.find('div');
    259                 $list = $contain.find('ol');
    260                 $items = $list.children();
    261 
    262                 $cursor.mousedown(function (e) {
    263                     e.preventDefault();
    264                     e.stopPropagation();
    265 
    266                     offset = e.pageY - $cursor.offset().top + top;
    267 
    268                     $(document).bind('mouseup.scrollEvent', endScroll);
    269                     $(document).bind('mousemove.scrollEvent', moveScroll);
    270 
    271                 });
    272 
    273                 $items.click(function (e) {
    274                     plugin.methode.showQuestion($(this).index());
    275                 });
    276 
    277                 $e.bind('changeQuestion', function (e) {
    278                     $items.removeClass('quizMaster_reviewQuestionTarget');
    279 
    280                     $items.eq(e.values.index).addClass('quizMaster_reviewQuestionTarget');
    281 
    282                                         // show and hide buttons
    283                                         switch (config.mode) {
    284 
    285                                             case 2:
    286 
    287                                                 globalElements.questionCheck.hide()
    288                                                 globalElements.next.hide()
    289                                                 $(globalNames.check).show()
    290                                                 $(globalNames.skip).show()
    291 
    292                                              break;
    293 
    294                                         }
    295 
    296                     scroll(e.values.index);
    297                 });
    298 
    299                                 // show skip button if set
    300                                 if (bitOptions.skipButton)
    301                                     $(globalNames.skip).show();
    302 
    303                 $contain.bind('mousewheel DOMMouseScroll', function (e) {
    304                     e.preventDefault();
    305 
    306                     var ev = e.originalEvent;
    307                     var w = ev.wheelDelta ? -ev.wheelDelta / 120 : ev.detail / 3;
    308                     var plus = 20 * w;
    309 
    310                     var x = top - $list.offset().top + plus;
    311 
    312                     if (x > max)
    313                         x = max;
    314 
    315                     if (x < 0)
    316                         x = 0;
    317 
    318                     var o = x / diff;
    319 
    320                     $list.attr('style', 'margin-top: ' + (-x) + 'px !important');
    321                     $cursor.css({top: o});
    322 
    323                     return false;
    324                 });
    325             };
    326 
    327             this.show = function (save) {
    328 
    329                                 if (bitOptions.reviewQustion)
    330                   $contain.parent().show();
    331 
    332                 if (save)
    333                     return;
    334 
    335                 $list.attr('style', 'margin-top: 0px !important');
    336                 $cursor.css({top: 0});
    337 
    338                 var h = $list.outerHeight();
    339                 var c = $contain.height();
    340                 x = c - $cursor.height();
    341                 offset = 0;
    342                 max = h - c;
    343                 diff = max / x;
    344 
    345                 if (h > 100) {
    346                     $cursor.show();
    347                 }
    348 
    349                 top = $cursor.offset().top;
    350             };
    351 
    352             this.hide = function () {
    353                 $contain.parent().hide();
    354             };
    355 
    356             this.toggle = function () {
    357               if (bitOptions.reviewQustion) {
    358 
    359                 $contain.parent().toggle();
    360                 $items.removeClass('quizMaster_reviewQuestionTarget');
    361 
    362                 $cursor.css({top: 0});
    363 
    364                 var h = $list.outerHeight();
    365                 var c = $contain.height();
    366                 x = c - $cursor.height();
    367                 offset = 0;
    368                 max = h - c;
    369                 diff = max / x;
    370 
    371                 if (h > 100) {
    372                   $cursor.show();
    373                 }
    374 
    375                 top = $cursor.offset().top;
    376               }
    377             };
    378 
    379             function scroll(index) {
    380                 var $item = $items.eq(index);
    381                 var iTop = $item.offset().top;
    382                 var cTop = $contain.offset().top;
    383                 var calc = iTop - cTop;
    384 
    385                 if ((calc - 4) < 0 || (calc + 32) > 100) {
    386                     var x = cTop - $items.eq(0).offset().top - (cTop - $list.offset().top) + $item.position().top;
    387 
    388                     if (x > max)
    389                         x = max;
    390 
    391                     var o = x / diff;
    392 
    393                     $list.attr('style', 'margin-top: ' + (-x) + 'px !important');
    394                     $cursor.css({top: o});
    395                 }
    396             }
    397 
    398 
    399 
    400             function moveScroll(e) {
    401                 e.preventDefault();
    402 
    403                 var o = e.pageY - offset;
    404 
    405                 if (o < 0)
    406                     o = 0;
    407 
    408                 if (o > x)
    409                     o = x;
    410 
    411                 var v = diff * o;
    412 
    413                 $list.attr('style', 'margin-top: ' + (-v) + 'px !important');
    414 
    415                 $cursor.css({top: o});
    416             }
    417 
    418             function endScroll(e) {
    419                 e.preventDefault();
    420 
    421                 $(document).unbind('.scrollEvent');
    422             }
    423         };
    424 
    425         function QuestionTimer() {
    426             var questionStartTime = 0;
    427             var currentQuestionId = -1;
    428 
    429             var quizStartTimer = 0;
    430             var isQuizStart = false;
    431 
    432             this.questionStart = function (questionId) {
    433                 if (currentQuestionId != -1)
    434                     this.questionStop();
    435 
    436                 currentQuestionId = questionId;
    437                 questionStartTime = +new Date();
    438             };
    439 
    440             this.questionStop = function () {
    441                 if (currentQuestionId == -1)
    442                     return;
    443 
    444                 results[currentQuestionId].time += Math.round((new Date() - questionStartTime) / 1000);
    445 
    446                 currentQuestionId = -1;
    447             };
    448 
    449             this.startQuiz = function () {
    450                 if (isQuizStart)
    451                   this.stopQuiz();
    452 
    453                 quizStartTimer = +new Date();
    454                 isQuizStart = true;
    455             };
    456 
    457             this.stopQuiz = function () {
    458                 if (!isQuizStart)
    459                     return;
    460 
    461                 results['comp'].quizTime += Math.round((new Date() - quizStartTimer) / 1000);
    462                 isQuizStart = false;
    463             };
    464 
    465             this.init = function () {
    466 
    467             };
    468 
    469         };
    470 
    471         var questionTimer = new QuestionTimer();
    472 
    473         /**
    474          * @memberOf checker
    475          */
    476         var checker = function (name, data, $question, $questionList) {
    477             var correct = true;
    478             var points = 0;
    479             var isDiffPoints = $.isArray(data.points);
    480             var statistcAnswerData = {};
    481 
    482             var func = {
    483                 singleMulti: function () {
    484                     var input = $questionList.find('.quizMaster_questionInput').attr('disabled', 'disabled');
    485                     var isDiffMode = data.diffMode;
    486 
    487                     $questionList.children().each(function (i) {
    488                         var $item = $(this);
    489                         var index = $item.data('pos');
    490                         var checked = input.eq(i).is(':checked');
    491 
    492                         if (data.correct[index]) {
    493                             if (!checked) {
    494                                 correct = false;
    495                             } else {
    496                                 if (isDiffPoints) {
    497                                     if (isDiffMode)
    498                                         points = data.points[index];
    499                                     else
    500                                         points += data.points[index];
    501                                 }
    502                             }
    503 
    504                             if (data.disCorrect) {
    505                                 correct = true;
    506                             } else {
    507                                 plugin.methode.marker($item, true);
    508                             }
    509 
    510                         } else {
    511                             if (checked) {
    512                                 if (!data.disCorrect) {
    513                                     plugin.methode.marker($item, false);
    514                                     correct = false;
    515                                 } else {
    516                                     correct = true;
    517                                 }
    518 
    519                                 if (isDiffMode)
    520                                     points = data.points[index];
    521                             } else {
    522                                 if (isDiffPoints && !isDiffMode) {
    523                                     points += data.points[index];
    524                                 }
    525                             }
    526                         }
    527                     });
    528                 },
    529 
    530                 sort_answer: function () {
    531                     var $items = $questionList.children();
    532 
    533                     $items.each(function (i, v) {
    534                         var $this = $(this);
    535 
    536                         statistcAnswerData[i] = $this.data('pos');
    537 
    538                         if (i == $this.data('pos')) {
    539                             plugin.methode.marker($this, true);
    540 
    541                             if (isDiffPoints) {
    542                                 points += data.points[i];
    543                             }
    544                         } else {
    545                             plugin.methode.marker($this, false);
    546                             correct = false;
    547                         }
    548                     });
    549 
    550                     $items.children().css({
    551                         'box-shadow': '0 0',
    552                         'cursor': 'auto'
    553                     });
    554 
    555                     $questionList.sortable("destroy");
    556 
    557                     $items.sort(function (a, b) {
    558                         return $(a).data('pos') > $(b).data('pos') ? 1 : -1;
    559                     });
    560 
    561                     $questionList.append($items);
    562                 },
    563 
    564                 matrix_sort_answer: function () {
    565                     var $items = $questionList.children();
    566                     var matrix = new Array();
    567                     statistcAnswerData = {0: -1};
    568 
    569                     $items.each(function () {
    570                         var $this = $(this);
    571                         var i = $this.data('pos');
    572                         var $stringUl = $this.find('.quizMaster_maxtrixSortCriterion');
    573                         var $stringItem = $stringUl.children();
    574 
    575                         if ($stringItem.length)
    576                             statistcAnswerData[i] = $stringItem.data('pos');
    577 
    578                         if ($stringItem.length && $.inArray(String(i), String($stringItem.data('correct')).split(',')) >= 0) {
    579 //                      if(i == $stringItem.data('pos')) {
    580                             plugin.methode.marker($stringUl, true);
    581 
    582                             if (isDiffPoints) {
    583                                 points += data.points[i];
    584                             }
    585                         } else {
    586                             correct = false;
    587                             plugin.methode.marker($stringUl, false);
    588                         }
    589 
    590                         matrix[i] = $stringUl;
    591                     });
    592 
    593                     plugin.methode.resetMatrix($question);
    594 
    595                     $question.find('.quizMaster_sortStringItem').each(function () {
    596                         var x = matrix[$(this).data('pos')];
    597                         if (x != undefined)
    598                             x.append(this);
    599                     }).css({
    600                         'box-shadow': '0 0',
    601                         'cursor': 'auto'
    602                     });
    603 
    604                     $question.find('.quizMaster_sortStringList, .quizMaster_maxtrixSortCriterion').sortable("destroy");
    605                 },
    606 
    607                 free_answer: function () {
    608                     var $li = $questionList.children();
    609                     var value = $li.find('.quizMaster_questionInput').attr('disabled', 'disabled').val();
    610 
    611                     if ($.inArray($.trim(value).toLowerCase(), data.correct) >= 0) {
    612                         plugin.methode.marker($li, true);
    613                     } else {
    614                         plugin.methode.marker($li, false);
    615                         correct = false;
    616                     }
    617                 },
    618 
    619                 cloze_answer: function () {
    620                     $questionList.find('.quizMaster_cloze').each(function (i, v) {
    621                         var $this = $(this);
    622                         var cloze = $this.children();
    623                         var input = cloze.eq(0);
    624                         var span = cloze.eq(1);
    625                         var inputText = plugin.methode.cleanupCurlyQuotes(input.val());
    626 
    627                         if ($.inArray(inputText, data.correct[i]) >= 0) {
    628                             if (isDiffPoints) {
    629                                 points += data.points[i];
    630                             }
    631 
    632                             if (!bitOptions.disabledAnswerMark) {
    633                                 input.css('background-color', '#B0DAB0');
    634                             }
    635                         } else {
    636                             if (!bitOptions.disabledAnswerMark) {
    637                                 input.css('background-color', '#FFBABA');
    638                             }
    639 
    640                             correct = false;
    641 
    642                             span.show();
    643                         }
    644 
    645                         input.attr('disabled', 'disabled');
    646                     });
    647                 },
    648 
    649                 assessment_answer: function () {
    650                     correct = true;
    651                     var $input = $questionList.find('.quizMaster_questionInput').attr('disabled', 'disabled');
    652                     var val = 0;
    653 
    654                     $input.filter(':checked').each(function () {
    655                         val += parseInt($(this).val());
    656                     });
    657 
    658                     points = val;
    659                 }
    660             };
    661 
    662             func[name]();
    663 
    664             if (!isDiffPoints && correct) {
    665                 points = data.points;
    666             }
    667 
    668             return {
    669                 c: correct,
    670                 p: points,
    671                 s: statistcAnswerData
    672             };
    673         };
    674 
    675         /**
    676          *  @memberOf formClass
    677          */
    678         var formClass = new function () {
    679             var funcs = {
    680                 isEmpty: function (str) {
    681                     str = $.trim(str);
    682                     return (!str || 0 === str.length);
    683                 }
    684             };
    685 
    686             var typeConst = {
    687                 TEXT: 0,
    688                 TEXTAREA: 1,
    689                 NUMBER: 2,
    690                 CHECKBOX: 3,
    691                 EMAIL: 4,
    692                 YES_NO: 5,
    693                 DATE: 6,
    694                 SELECT: 7,
    695                 RADIO: 8
    696             };
    697 
    698             this.checkForm = function () {
    699                 var check = true;
    700 
    701                 $e.find('.quizMaster_forms input, .quizMaster_forms textarea, .quizMaster_forms .quizMaster_formFields, .quizMaster_forms select').each(function () {
    702                     var $this = $(this);
    703                     var isRequired = $this.data('required') == 1;
    704                     var type = $this.data('type');
    705                     var test = true;
    706                     var value = $.trim($this.val());
    707 
    708                     switch (type) {
    709                         case typeConst.TEXT:
    710                         case typeConst.TEXTAREA:
    711                         case typeConst.SELECT:
    712                             if (isRequired)
    713                                 test = !funcs.isEmpty(value);
    714 
    715                             break;
    716                         case typeConst.NUMBER:
    717                             if (isRequired || !funcs.isEmpty(value))
    718                                 test = !funcs.isEmpty(value) && !isNaN(value);
    719 
    720                             break;
    721                         case typeConst.EMAIL:
    722                             if (isRequired || !funcs.isEmpty(value))
    723                                 test = !funcs.isEmpty(value) && new RegExp(/^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/)
    724                                         .test(value);
    725 
    726                             break;
    727                         case typeConst.CHECKBOX:
    728                             if (isRequired)
    729                                 test = $this.is(':checked');
    730 
    731                             break;
    732                         case typeConst.YES_NO:
    733                         case typeConst.RADIO:
    734                             if (isRequired)
    735                                 test = $this.find('input[type="radio"]:checked').val() !== undefined;
    736                             break;
    737                         case typeConst.DATE:
    738                             var num = 0, co = 0;
    739 
    740                             $this.find('select').each(function () {
    741                                 num++;
    742                                 co += funcs.isEmpty($(this).val()) ? 0 : 1;
    743                             });
    744 
    745                             if (isRequired || co > 0)
    746                                 test = num == co;
    747 
    748                             break;
    749                     }
    750 
    751                     if (test) {
    752                         $this.siblings('.quizMaster_invalidate').hide();
    753                     } else {
    754                         check = false;
    755                         $this.siblings('.quizMaster_invalidate').show();
    756                     }
    757 
    758                 });
    759 
    760                 return check;
    761             };
    762 
    763             this.getFormData = function () {
    764                 var data = {};
    765 
    766                 $e.find('.quizMaster_forms input, .quizMaster_forms textarea, .quizMaster_forms .quizMaster_formFields, .quizMaster_forms select').each(function () {
    767                     var $this = $(this);
    768                     var id = $this.data('form_id');
    769                     var type = $this.data('type');
    770 
    771                     switch (type) {
    772                         case typeConst.TEXT:
    773                         case typeConst.TEXTAREA:
    774                         case typeConst.SELECT:
    775                         case typeConst.NUMBER:
    776                         case typeConst.EMAIL:
    777                             data[id] = $this.val();
    778                             break;
    779                         case typeConst.CHECKBOX:
    780                             data[id] = $this.is(':checked') ? 1 : 0;
    781                             break;
    782                         case typeConst.YES_NO:
    783                         case typeConst.RADIO:
    784                             data[id] = $this.find('input[type="radio"]:checked').val();
    785                             break;
    786                         case typeConst.DATE:
    787                             data[id] = {
    788                                 day: $this.find('select[name="quizMaster_field_' + id + '_day"]').val(),
    789                                 month: $this.find('select[name="quizMaster_field_' + id + '_month"]').val(),
    790                                 year: $this.find('select[name="quizMaster_field_' + id + '_year"]').val()
    791                             };
    792                             break;
    793                     }
    794                 });
    795 
    796                 return data;
    797             };
    798         };
    799 
    800         var fetchAllAnswerData = function (resultData) {
    801             $e.find('.quizMaster_questionList').each(function () {
    802                 var $this = $(this);
    803                 var questionId = $this.data('question_id');
    804                 var type = $this.data('type');
    805                 var data = {};
    806 
    807                 if (type == 'single' || type == 'multiple') {
    808                     $this.find('.quizMaster_questionListItem').each(function () {
    809                         data[$(this).data('pos')] = +$(this).find('.quizMaster_questionInput').is(':checked');
    810                     });
    811                 } else if (type == 'free_answer') {
    812                     data[0] = $this.find('.quizMaster_questionInput').val();
    813                 } else if (type == 'sort_answer') {
    814                     return true;
    815                 } else if (type == 'matrix_sort_answer') {
    816                     return true;
    817                 } else if (type == 'cloze_answer') {
    818                     var i = 0;
    819                     $this.find('.quizMaster_cloze input').each(function () {
    820                         data[i++] = $(this).val();
    821                     });
    822                 } else if (type == 'assessment_answer') {
    823                     data[0] = '';
    824 
    825                     $this.find('.quizMaster_questionInput:checked').each(function () {
    826                         data[$(this).data('index')] = $(this).val();
    827                     });
    828                 }
    829 
    830                 resultData[questionId]['data'] = data;
    831 
    832             });
    833         };
    834 
    835                 plugin.startQuiz = function () {
    836                     plugin.methode.startQuiz();
    837                 };
    838 
    839                 plugin.blockQuiz = function () {
    840                     return quizStatus.isBlocked = true;
    841                 };
    842 
    843                 plugin.unblockQuiz = function () {
    844                     return quizStatus.isBlocked = false;
    845                 };
    846 
    847                 plugin.lockQuiz = function () {
    848                     return quizStatus.isLocked = true;
    849                 };
    850 
    851                 plugin.setQuizStatus = function ( prop, val ) {
    852                     quizStatus[ prop ] = val
    853                     return quizStatus;
    854                 };
    855 
    856                 plugin.getQuizStatus = function () {
    857                     return quizStatus;
    858                 };
    859 
    860                 plugin.hideQuizStart = function () {
    861 
    862                     globalElements.quizStartPage.hide();
    863                     plugin.methode.startQuiz();
    864 
    865                 };
    866 
    867         plugin.methode = {
    868 
    869                         // public method used for extensions to hook into events
    870                         registerAction: function ( action, object, func ) {
    871 
    872                             var a = {
    873                                 object: object,
    874                                 func: func,
    875                             }
    876 
    877                             if( callbacks.hasOwnProperty( action ) == false ){
    878                                 callbacks[action] = []
    879                             }
    880 
    881                             callbacks[action].push( a )
    882 
    883                         },
    884 
    885 
    886 
    887             /**
    888              * @memberOf plugin.methode
    889              */
    890 
    891             parseBitOptions: function () {
    892 
    893                 if (config.bo) {
    894                     bitOptions.randomAnswer = config.bo & (1 << 0);
    895                     bitOptions.randomQuestion = config.bo & (1 << 1);
    896                     bitOptions.disabledAnswerMark = config.bo & (1 << 2);
    897                     bitOptions.checkBeforeStart = config.bo & (1 << 3);
    898                     bitOptions.preview = config.bo & (1 << 4);
    899                     bitOptions.isAddAutomatic = config.bo & (1 << 6);
    900                     bitOptions.reviewQustion = config.bo & ( 1 << 7);
    901                     bitOptions.quizSummeryHide = config.bo & (1 << 8);
    902                     bitOptions.skipButton = config.bo & (1 << 9);
    903                     bitOptions.autoStart = config.bo & (1 << 10);
    904                     bitOptions.forcingQuestionSolve = config.bo & (1 << 11);
    905                     bitOptions.hideQuestionPositionOverview = config.bo & (1 << 12);
    906                     bitOptions.formActivated = config.bo & (1 << 13);
    907                     bitOptions.maxShowQuestion = config.bo & (1 << 14);
    908                     bitOptions.sortCategories = config.bo & (1 << 15);
    909 
    910                     var cors = config.bo & (1 << 5);
    911 
    912                     if (cors && jQuery.support != undefined && jQuery.support.cors != undefined && jQuery.support.cors == false) {
    913                         bitOptions.cors = cors;
    914                     }
    915                 }
    916             },
    917 
    918             setClozeStyle: function () {
    919                 $e.find('.quizMaster_cloze input').each(function () {
    920                     var $this = $(this);
    921                     var word = "";
    922                     var wordLen = $this.data('wordlen');
    923 
    924                     for (var i = 0; i < wordLen; i++)
    925                         word += "w";
    926 
    927                     var clone = $(document.createElement("span"))
    928                         .css('visibility', 'hidden')
    929                         .text(word)
    930                         .appendTo($('body'));
    931 
    932                     var width = clone.width();
    933 
    934                     clone.remove();
    935 
    936                     $this.width(width + 5);
    937                 });
    938             },
    939 
    940             parseTime: function (sec) {
    941                 var seconds = parseInt(sec % 60);
    942                 var minutes = parseInt((sec / 60) % 60);
    943                 var hours = parseInt((sec / 3600) % 24);
    944 
    945                 seconds = (seconds > 9 ? '' : '0') + seconds;
    946                 minutes = (minutes > 9 ? '' : '0') + minutes;
    947                 hours = (hours > 9 ? '' : '0') + hours;
    948 
    949                 return hours + ':' + minutes + ':' + seconds;
    950             },
    951 
    952             cleanupCurlyQuotes: function (str) {
    953                 str = str.replace(/\u2018/, "'");
    954                 str = str.replace(/\u2019/, "'");
    955 
    956                 str = str.replace(/\u201C/, '"');
    957                 str = str.replace(/\u201D/, '"');
    958 
    959                 return $.trim(str).toLowerCase();
    960             },
    961 
    962             resetMatrix: function (selector) {
    963                 selector.each(function () {
    964                     var $this = $(this);
    965                     var $list = $this.find('.quizMaster_sortStringList');
    966 
    967                     $this.find('.quizMaster_sortStringItem').each(function () {
    968                         $list.append($(this));
    969                     });
    970                 });
    971             },
    972 
    973             marker: function (e, correct) {
    974                 if (!bitOptions.disabledAnswerMark) {
    975                     if (correct) {
    976                         e.addClass('quizMaster_answerCorrect');
    977                     } else {
    978                         e.addClass('quizMaster_answerIncorrect');
    979                     }
    980                 }
    981 
    982             },
    983 
    984             startQuiz: function (loadData) {
    985 
    986                             // enable hint
    987                             plugin.methode.hintEnable();
    988 
    989               if ( quizStatus.loadLock ) {
    990                 quizStatus.isQuizStart = 1;
    991                 return;
    992               }
    993 
    994               quizStatus.isQuizStart = 0;
    995 
    996                             if ( quizStatus.isBlocked ) {
    997                 globalElements.quizStartPage.hide();
    998                 return;
    999               }
    1000 
    1001               if ( quizStatus.isLocked ) {
    1002                 globalElements.quizStartPage.hide();
    1003                 $e.find('.qm-locked').show();
    1004                 return;
    1005               }
    1006 
    1007               if ( quizStatus.isUserStartLocked ) {
    1008                 globalElements.quizStartPage.hide();
    1009                 $e.find('.qm-lock-box').show();
    1010                 return;
    1011               }
    1012 
    1013               if (bitOptions.maxShowQuestion && !loadData) {
    1014 
    1015                                 globalElements.quizStartPage.hide();
    1016                 $e.find('.quizMaster_loadQuiz').show();
    1017                 plugin.methode.loadQuizDataAjax(true);
    1018                 return;
    1019 
    1020               }
    1021 
    1022               if (bitOptions.formActivated && config.formPos == formPosConst.START) {
    1023                 if (!formClass.checkForm())
    1024                   return;
    1025               }
    1026 
    1027               plugin.methode.loadQuizData();
    1028 
    1029               if (bitOptions.randomQuestion) {
    1030                 plugin.methode.random(globalElements.questionList);
    1031               }
    1032 
    1033               if (bitOptions.randomAnswer) {
    1034                 plugin.methode.random($e.find(globalNames.questionList));
    1035               }
    1036 
    1037               if (bitOptions.sortCategories) {
    1038                   plugin.methode.sortCategories();
    1039               }
    1040 
    1041               plugin.methode.random($e.find('.quizMaster_sortStringList'));
    1042               plugin.methode.random($e.find('[data-type="sort_answer"]'));
    1043 
    1044               $e.find('.quizMaster_listItem').each(function (i, v) {
    1045                   var $this = $(this);
    1046                   $this.find('.quizMaster_question_page span:eq(0)').text(i + 1);
    1047                   $this.find('> h5 span').text(i + 1);
    1048 
    1049                   $this.find('.quizMaster_questionListItem').each(function (i, v) {
    1050                       $(this).find('> span:not(.quizMaster_cloze)').text(i + 1 + '. ');
    1051                   });
    1052               });
    1053 
    1054               globalElements.next = $e.find(globalNames.next);
    1055 
    1056               switch (config.mode) {
    1057                 case 3:
    1058                   $e.find('input[name="checkSingle"]').show();
    1059                   break;
    1060                 case 2:
    1061 
    1062                   $(globalNames.check).show();
    1063 
    1064                   if ( bitOptions.skipButton || bitOptions.reviewQustion)
    1065                     $e.find(globalNames.skip).show();
    1066 
    1067                   break;
    1068 
    1069                 case 1:
    1070                   $e.find('input[name="back"]').slice(1).show();
    1071                 case 0:
    1072                   globalElements.next.show();
    1073                   break;
    1074               }
    1075 
    1076                 if (bitOptions.hideQuestionPositionOverview || config.mode == 3)
    1077                   $e.find('.quizMaster_question_page').hide();
    1078 
    1079                     var $listItem = globalElements.questionList.children();
    1080 
    1081                     globalElements.listItems = $e.find('.quizMaster_list > li');
    1082 
    1083                 if (config.mode == 3) {
    1084                   plugin.methode.showSinglePage(0);
    1085                 } else {
    1086                   currentQuestion = $listItem.eq(0).show();
    1087 
    1088                   var questionId = currentQuestion.find(globalNames.questionList).data('question_id');
    1089                   questionTimer.questionStart(questionId);
    1090                 }
    1091 
    1092                 questionTimer.startQuiz();
    1093 
    1094                 $e.find('.quizMaster_sortable').parents('ul').sortable({
    1095                     update: function (event, ui) {
    1096                         var $p = $(this).parents('.quizMaster_listItem');
    1097 
    1098                         $e.trigger({
    1099                             type: 'questionSolved',
    1100                             values: {
    1101                               item: $p,
    1102                               index: $p.index(),
    1103                               solved: true
    1104                             }
    1105                         });
    1106                     }
    1107                 }).disableSelection();
    1108 
    1109                 $e.find('.quizMaster_sortStringList, .quizMaster_maxtrixSortCriterion').sortable({
    1110                     connectWith: '.quizMaster_maxtrixSortCriterion:not(:has(li)), .quizMaster_sortStringList',
    1111                     placeholder: 'quizMaster_placehold',
    1112                     update: function (event, ui) {
    1113                         var $p = $(this).parents('.quizMaster_listItem');
    1114 
    1115                         $e.trigger({
    1116                             type: 'questionSolved',
    1117                             values: {
    1118                                 item: $p,
    1119                                 index: $p.index(),
    1120                                 solved: true
    1121                             }
    1122                         });
    1123 
    1124                     }
    1125                 }).disableSelection();
    1126 
    1127                 quizSolved = [];
    1128 
    1129                 timelimit.start();
    1130 
    1131                 startTime = +new Date();
    1132 
    1133                 results = {
    1134                     comp: {
    1135                       points: 0,
    1136                       correctQuestions: 0,
    1137                       quizTime: 0,
    1138                                             answered: 0,
    1139                                             skipped: 0,
    1140                                             solved: 0,
    1141                     }
    1142                 };
    1143 
    1144                 $e.find('.quizMaster_questionList').each(function () {
    1145                     var questionId = $(this).data('question_id');
    1146 
    1147                     results[questionId] = {
    1148                       time: 0,
    1149                       solved: 0
    1150                     };
    1151                 });
    1152 
    1153                 catResults = {};
    1154 
    1155                 $.each(options.catPoints, function (i, v) {
    1156                     catResults[i] = 0;
    1157                 });
    1158 
    1159                 globalElements.quizStartPage.hide();
    1160                 $e.find('.quizMaster_loadQuiz').hide();
    1161                 globalElements.quiz.show();
    1162                 reviewBox.show();
    1163 
    1164                 if (config.mode != 3) {
    1165                   $e.trigger({
    1166                     type: 'changeQuestion',
    1167                     values: {
    1168                       item: currentQuestion,
    1169                       index: currentQuestion.index()
    1170                     }
    1171                   });
    1172                 }
    1173             },
    1174 
    1175             showSingleQuestion: function (question) {
    1176                 var page = question ? Math.ceil(question / config.qpp) : 1;
    1177                 this.showSinglePage(page);
    1178             },
    1179 
    1180             showSinglePage: function (page) {
    1181                 $listItem = globalElements.questionList.children().hide();
    1182 
    1183                 if (!config.qpp) {
    1184                     $listItem.show();
    1185 
    1186                     return;
    1187                 }
    1188 
    1189                 page = page ? +page : 1;
    1190                 var maxPage = Math.ceil($e.find('.quizMaster_list > li').length / config.qpp);
    1191 
    1192                 if (page > maxPage)
    1193                     return;
    1194 
    1195                 var pl = $e.find(globalNames.singlePageLeft).hide();
    1196                 var pr = $e.find(globalNames.singlePageRight).hide();
    1197                 var cs = $e.find('input[name="checkSingle"]').hide();
    1198 
    1199                 if (page > 1) {
    1200                     pl.val(pl.data('text').replace(/%d/, page - 1)).show();
    1201                 }
    1202 
    1203                 if (page == maxPage) {
    1204                   cs.show();
    1205                 } else {
    1206                   pr.val(pr.data('text').replace(/%d/, page + 1)).show();
    1207                 }
    1208 
    1209                 currentPage = page;
    1210                 var start = config.qpp * (page - 1);
    1211 
    1212                 $listItem.slice(start, start + config.qpp).show();
    1213                 plugin.methode.scrollTo(globalElements.quiz);
    1214             },
    1215 
    1216             nextQuestion: function () {
    1217               this.showQuestionObject(currentQuestion.next());
    1218             },
    1219 
    1220             prevQuestion: function () {
    1221               this.showQuestionObject(currentQuestion.prev());
    1222             },
    1223 
    1224             showQuestion: function (index) {
    1225                 var $element = globalElements.listItems.eq(index);
    1226 
    1227                 if (config.mode == 3 || inViewQuestions) {
    1228                     if (config.qpp) {
    1229                       plugin.methode.showSingleQuestion(index + 1);
    1230                     }
    1231                     plugin.methode.scrollTo($element, 1);
    1232                     questionTimer.startQuiz();
    1233                     return;
    1234                 }
    1235 
    1236                 this.showQuestionObject($element);
    1237             },
    1238 
    1239                         questionCount: function () {
    1240                             return $e.find('.quizMaster_listItem').length;
    1241                         },
    1242 
    1243             showQuestionObject: function (obj) {
    1244 
    1245                 if (!obj.length && bitOptions.forcingQuestionSolve && bitOptions.quizSummeryHide && bitOptions.reviewQustion) {
    1246                   for (var i = 0, c = $e.find('.quizMaster_listItem').length; i < c; i++) {
    1247                     if (!quizSolved[i]) {
    1248                       alert(QuizMasterGlobal.questionsNotSolved);
    1249                       return false;
    1250                     }
    1251                   }
    1252                 }
    1253 
    1254                 currentQuestion.hide();
    1255                 currentQuestion = obj.show();
    1256 
    1257                                 // Change last name
    1258                                 if( plugin.methode.questionCount() == currentQuestion.index() +1 ) {
    1259                                     var $lastButton = globalElements.next.last();
    1260                                     lastButtonValue = $lastButton.val();
    1261                                     $lastButton.val(config.lbn);
    1262                                 }
    1263 
    1264                 plugin.methode.scrollTo( globalElements.quiz );
    1265 
    1266                                 // Change Question Trigger
    1267                 $e.trigger({
    1268                     type: 'changeQuestion',
    1269                     values: {
    1270                       item: currentQuestion,
    1271                       index: currentQuestion.index()
    1272                     }
    1273                 });
    1274 
    1275                 if ( !currentQuestion.length ) {
    1276                   plugin.methode.showQuizSummary();
    1277                 } else {
    1278                   var questionId = currentQuestion.find(globalNames.questionList).data('question_id');
    1279                   questionTimer.questionStart(questionId);
    1280                 }
    1281             },
    1282 
    1283             skipQuestion: function () {
    1284               $e.trigger({
    1285                   type: 'skipQuestion',
    1286                   values: {
    1287                       item: currentQuestion,
    1288                       index: currentQuestion.index()
    1289                   }
    1290               });
    1291 
    1292               plugin.methode.nextQuestion();
    1293             },
    1294 
    1295             reviewQuestion: function () {
    1296               $e.trigger({
    1297                   type: 'reviewQuestion',
    1298                   values: {
    1299                       item: currentQuestion,
    1300                       index: currentQuestion.index()
    1301                   }
    1302               });
    1303             },
    1304 
    1305             showQuizSummary: function () {
    1306 
    1307                 questionTimer.questionStop();
    1308                 questionTimer.stopQuiz();
    1309 
    1310                 if (bitOptions.quizSummeryHide || !bitOptions.reviewQustion) {
    1311                     if (bitOptions.formActivated && config.formPos == formPosConst.END) {
    1312                         reviewBox.hide();
    1313                         globalElements.quiz.hide();
    1314                         plugin.methode.scrollTo($e.find('.qm-info-page').show());
    1315                     } else {
    1316                         plugin.methode.finishQuiz();
    1317                     }
    1318 
    1319                     return;
    1320                 }
    1321 
    1322                 var quizSummary = $e.find('.qm-check-page');
    1323 
    1324                 quizSummary.find('ol:eq(0)').empty()
    1325                     .append($e.find('.quizMaster_reviewQuestion ol li').clone().removeClass('quizMaster_reviewQuestionTarget'))
    1326                     .children().click(function (e) {
    1327                         quizSummary.hide();
    1328                         globalElements.quiz.show();
    1329                         reviewBox.show(true);
    1330 
    1331                         plugin.methode.showQuestion($(this).index());
    1332                     });
    1333 
    1334                 var cSolved = 0;
    1335 
    1336                 for (var i = 0, c = quizSolved.length; i < c; i++) {
    1337                     if (quizSolved[i]) {
    1338                         cSolved++;
    1339                     }
    1340                 }
    1341 
    1342                 quizSummary.find('span:eq(0)').text(cSolved);
    1343 
    1344                 reviewBox.hide();
    1345                 globalElements.quiz.hide();
    1346 
    1347                 quizSummary.show();
    1348 
    1349                 plugin.methode.scrollTo(quizSummary);
    1350             },
    1351 
    1352             finishQuiz: function (timeover) {
    1353 
    1354                             // deactivate hint trigger
    1355                             plugin.methode.hintDisable();
    1356 
    1357               questionTimer.questionStop();
    1358               questionTimer.stopQuiz();
    1359               timelimit.stop();
    1360 
    1361               var time = (+new Date() - startTime) / 1000;
    1362               time = (config.timelimit && time > config.timelimit) ? config.timelimit : time;
    1363 
    1364               $e.find('.quizMaster_quiz_time span').text(plugin.methode.parseTime(time));
    1365 
    1366               if (timeover) {
    1367                 globalElements.results.find('.qm-time-limit_expired').show();
    1368               }
    1369 
    1370               plugin.methode.checkQuestion(globalElements.questionList.children(), true);
    1371               $e.find('.quizMaster_correct_answer').text(results.comp.correctQuestions);
    1372 
    1373               results.comp.result = Math.round(results.comp.points / config.globalPoints * 100 * 100) / 100;
    1374               var $pointFields = $e.find('.quizMaster_points span');
    1375 
    1376               $pointFields.eq(0).text(results.comp.points);
    1377               $pointFields.eq(1).text(config.globalPoints);
    1378               $pointFields.eq(2).text(results.comp.result + '%');
    1379 
    1380               var $resultText = $e.find('.qm-results-boxList > li').eq(0);
    1381 
    1382               var formData = formClass.getFormData();
    1383 
    1384               $resultText.find('.quizMaster_resultForm').each(function () {
    1385                 var $this = $(this);
    1386                 var formId = $this.data('form_id');
    1387                 var data = formData[formId];
    1388 
    1389                 if (typeof data === 'object') {
    1390                     data = data['day'] + '-' + data['month'] + '-' + data['year'];
    1391                 }
    1392 
    1393                 $this.text(data).show();
    1394               });
    1395 
    1396               $resultText.show();
    1397 
    1398               //Result-Text END
    1399 
    1400               plugin.methode.setAverageResult(results.comp.result, false);
    1401 
    1402               this.setCategoryOverview();
    1403 
    1404               plugin.methode.sendCompletedQuiz();
    1405 
    1406                             // hide buttons
    1407                             globalElements.check.hide();
    1408                             globalElements.skip.hide();
    1409 
    1410               reviewBox.hide();
    1411 
    1412               $e.find('.qm-check-page, .qm-info-page').hide();
    1413               globalElements.quiz.hide();
    1414               globalElements.results.show();
    1415               plugin.methode.scrollTo(globalElements.results);
    1416 
    1417                             /* global trigger */
    1418                             $(document).trigger({
    1419                                 type: 'quizmasterQuizCompleted',
    1420                                 values: {
    1421                                     questionCount: plugin.methode.questionCount(),
    1422                                     results: results,
    1423                                 }
    1424                             });
    1425 
    1426                             // reset result comp
    1427                             /*
    1428                             results.comp.solved     = 0;
    1429                             results.comp.answered = 0;
    1430                             results.comp.skipped    = 0;
    1431                             */
    1432 
    1433             },
    1434 
    1435             setCategoryOverview: function () {
    1436                 results.comp.cats = {};
    1437 
    1438                 $e.find('.quizMaster_catOverview li').each(function () {
    1439                     var $this = $(this);
    1440                     var catId = $this.data('category_id');
    1441 
    1442                     if (config.catPoints[catId] === undefined) {
    1443                         $this.hide();
    1444                         return true;
    1445                     }
    1446 
    1447                     var r = Math.round(catResults[catId] / config.catPoints[catId] * 100 * 100) / 100;
    1448 
    1449                     results.comp.cats[catId] = r;
    1450 
    1451                     $this.find('.quizMaster_catPercent').text(r + '%');
    1452 
    1453                     $this.show();
    1454                 });
    1455             },
    1456 
    1457             questionSolved: function (e) {
    1458 
    1459               quizSolved[e.values.index] = e.values.solved;
    1460 
    1461               var $questionList = e.values.item.find( globalNames.questionList );
    1462               var data = config.json[$questionList.data('question_id')];
    1463 
    1464               results[data.id].solved = Number(e.values.fake ? results[data.id].solved : e.values.solved);
    1465 
    1466                                 // record as answered, solved/skipped
    1467                                 if( e.values.fake ) {
    1468                                     results.comp.answered++
    1469                                     if( results[data.id].solved ) {
    1470                                         results.comp.solved++
    1471                                     } else {
    1472                                         results.comp.skipped++
    1473                                     }
    1474                                 }
    1475             },
    1476 
    1477             sendCompletedQuiz: function () {
    1478                 if (bitOptions.preview)
    1479                     return;
    1480 
    1481                 fetchAllAnswerData(results);
    1482 
    1483                 var formData = formClass.getFormData();
    1484 
    1485                 plugin.methode.ajax({
    1486                   action: 'quizmaster_admin_ajax',
    1487                   func: 'completedQuiz',
    1488                   data: {
    1489                     quizId: config.quizId,
    1490                     results: results,
    1491                     forms: formData
    1492                   }
    1493                 });
    1494             },
    1495 
    1496             showQustionList: function () {
    1497                 inViewQuestions = !inViewQuestions;
    1498                 globalElements.toplistShowInButton.hide();
    1499                 globalElements.quiz.toggle();
    1500                 $e.find('.quizMaster_QuestionButton').hide();
    1501                 globalElements.questionList.children().show();
    1502                 reviewBox.toggle();
    1503 
    1504                 $e.find('.quizMaster_question_page').hide();
    1505             },
    1506 
    1507             random: function (group) {
    1508                 group.each(function () {
    1509                     var e = $(this).children().get().sort(function () {
    1510                         return Math.round(Math.random()) - 0.5;
    1511                     });
    1512 
    1513                     $(e).appendTo(e[0].parentNode);
    1514                 });
    1515             },
    1516 
    1517             sortCategories: function () {
    1518                 var e = $('.quizMaster_list').children().get().sort(function (a, b) {
    1519                     var aQuestionId = $(a).find('.quizMaster_questionList').data('question_id');
    1520                     var bQuestionId = $(b).find('.quizMaster_questionList').data('question_id');
    1521 
    1522                     return config.json[aQuestionId].catId - config.json[bQuestionId].catId;
    1523                 });
    1524 
    1525                 $(e).appendTo(e[0].parentNode);
    1526             },
    1527 
    1528             restartQuiz: function () {
    1529 
    1530               globalElements.results.hide();
    1531               globalElements.quizStartPage.show();
    1532               globalElements.questionList.children().hide();
    1533               globalElements.toplistShowInButton.hide();
    1534               reviewBox.hide();
    1535 
    1536               $e.find('.quizMaster_questionInput, .quizMaster_cloze input').removeAttr('disabled').removeAttr('checked')
    1537                   .css('background-color', '');
    1538 
    1539               $e.find('.quizMaster_questionListItem input[type="text"]').val('');
    1540 
    1541               $e.find('.quizMaster_answerCorrect, .quizMaster_answerIncorrect').removeClass('quizMaster_answerCorrect quizMaster_answerIncorrect');
    1542 
    1543               $e.find('.quizMaster_listItem').data('check', false);
    1544 
    1545                             // $e.find('.qm-check-answer-box').hide().children().hide();
    1546                             $e.find('.qm-check-answer-box').hide();
    1547 
    1548               plugin.methode.resetMatrix($e.find('.quizMaster_listItem'));
    1549               $e.find('.quizMaster_sortStringItem, .quizMaster_sortable').removeAttr('style');
    1550               $e.find('.quizMaster_clozeCorrect, .quizMaster_QuestionButton, .qm-results-boxList > li').hide();
    1551 
    1552               $e.find('.quizMaster_question_page, input[name="tip"]').show();
    1553               $e.find('.quizMaster_resultForm').text('').hide();
    1554 
    1555               globalElements.results.find('.qm-time-limit_expired').hide();
    1556 
    1557                             // @TODO add trigger that extensions can use to reset items on restart
    1558 
    1559               inViewQuestions = false;
    1560 
    1561             },
    1562 
    1563                         currentQuestionId: function() {
    1564                             return currentQuestion.find(globalNames.questionList).data('question_id');
    1565                         },
    1566 
    1567             checkQuestion: function ( list, endCheck ) {
    1568 
    1569                             // either check list passed (at quiz finish) or use current question
    1570                             list = (list == undefined) ? currentQuestion : list;
    1571 
    1572                             list.each(function () {
    1573 
    1574                   var $this = $(this);
    1575                                 var $questionList = $this.find(globalNames.questionList);
    1576                   var data = config.json[$questionList.data('question_id')];
    1577                   var name = data.type;
    1578 
    1579                   questionTimer.questionStop();
    1580 
    1581                   if ( $this.data('check') ) {
    1582                     return true;
    1583                   }
    1584 
    1585                                 // check answer
    1586                   if (data.type == 'single' || data.type == 'multiple') {
    1587                     name = 'singleMulti';
    1588                   }
    1589                   var result = checker( name, data, $this, $questionList );
    1590 
    1591                                 // show questionCheck box
    1592                                 if( endCheck == true ) {
    1593 
    1594                                     // insert points earned
    1595                                     $('.qm-check-question-points span').text( result.p );
    1596 
    1597                                     // show check message
    1598                       if (result.c) {
    1599                                         // correct answer
    1600                                         $('.qm-check-message').html( data.correctMessage )
    1601                                         globalElements.questionCheck.removeClass('qm-check-answer-incorrect')
    1602                                         globalElements.questionCheck.addClass('qm-check-answer-correct')
    1603                                         $('.qm-check-message').show()
    1604                                         results['comp'].correctQuestions += 1;
    1605                       } else {
    1606                                         $('.qm-check-message').html( data.incorrectMessage )
    1607                                         globalElements.questionCheck.removeClass('qm-check-answer-correct')
    1608                                         globalElements.questionCheck.addClass('qm-check-answer-incorrect')
    1609                                         $('.qm-check-message').show()
    1610                       }
    1611 
    1612                                     // show and hide buttons
    1613                       $(globalNames.check).hide();
    1614                       $(globalNames.skip).hide();
    1615                       $(globalNames.next).show();
    1616                                     globalElements.questionCheck.show();
    1617 
    1618                                     return;
    1619 
    1620                                 }
    1621 
    1622                                 // organize result from checking answer
    1623                   results[data.id].points = result.p;
    1624                   results[data.id].correct = Number(result.c);
    1625                   results[data.id].data = result.s;
    1626                   results['comp'].points += result.p;
    1627                   catResults[data.catId] += result.p;
    1628                                 $this.data('check', true);
    1629 
    1630                                 // end check trigger
    1631                   $e.trigger({
    1632                     type: 'questionSolved',
    1633                     values: {
    1634                       item: currentQuestion,
    1635                       index: currentQuestion.index(),
    1636                       solved: true,
    1637                       fake: true
    1638                     }
    1639                   });
    1640 
    1641                                 // global event
    1642                                 $(document).trigger({
    1643                                     type: 'quizmasterQuestionSolved',
    1644                                     values: {
    1645                       item: currentQuestion,
    1646                       index: currentQuestion.index(),
    1647                                         questionCount: plugin.methode.questionCount(),
    1648                       solved: true,
    1649                                         results: results,
    1650                     }
    1651                                 });
    1652 
    1653                             });
    1654 
    1655             },
    1656 
    1657                         hintDisable: function () {
    1658 
    1659                             $tipModal = $('.qm-hint-modal');
    1660                             $tipModal.hide();
    1661                             globalElements.hintTrigger.removeClass('qm-hint-enabled')
    1662                             globalElements.hintTrigger.addClass('qm-hint-disabled')
    1663                             globalElements.hintTrigger.off( 'click', plugin.methode.hintHide )
    1664                             globalElements.hintTrigger.off( 'click', plugin.methode.hintShow )
    1665 
    1666                         },
    1667 
    1668                         hintEnable: function () {
    1669 
    1670                             globalElements.hintTrigger.removeClass('qm-hint-disabled')
    1671                             globalElements.hintTrigger.addClass('qm-hint-enabled')
    1672                             globalElements.hintTrigger.off( 'click', plugin.methode.hintHide )
    1673                             globalElements.hintTrigger.on( 'click', plugin.methode.hintShow )
    1674 
    1675                         },
    1676 
    1677                         hintHide: function ( event ) {
    1678 
    1679                             $tipModal = $('.qm-hint-modal');
    1680                             $tipModal.hide();
    1681                             globalElements.hintTrigger.off( 'click', plugin.methode.hintHide )
    1682                             globalElements.hintTrigger.on( 'click', plugin.methode.hintShow )
    1683 
    1684                         },
    1685 
    1686             hintShow: function ( event ) {
    1687 
    1688               var $this = $(this);
    1689               var id = currentQuestion.find(globalNames.questionList).data('question_id');
    1690 
    1691                             // get tip div
    1692                             var $hint = currentQuestion.find('.quizMaster_tipp')
    1693                             var $tip = $hint.html();
    1694                             $tipModal = $('.qm-hint-modal');
    1695                             $tipModalContents = $('.qm-hint-modal .qm-hint-content');
    1696 
    1697                             // populate modal with current question tip
    1698                             $tipModalContents.html( $tip )
    1699 
    1700                             // adjust modal position
    1701                             $tipModal.css({
    1702                                 position: "absolute",
    1703                                 left: $this.position().left + "px",
    1704                                 top: ($this.position().top + $this.outerHeight()) + "px",
    1705                                 display: "block",
    1706                             });
    1707 
    1708                             globalElements.hintTrigger.on( 'click', plugin.methode.hintHide )
    1709                             globalElements.hintTrigger.off( 'click', plugin.methode.hintShow )
    1710 
    1711                             // record use of tip
    1712               results[id].tip = 1;
    1713 
    1714             },
    1715 
    1716             ajax: function (data, success, dataType) {
    1717                 dataType = dataType || 'json';
    1718 
    1719                 if (bitOptions.cors) {
    1720                     jQuery.support.cors = true;
    1721                 }
    1722 
    1723                 $.post(QuizMasterGlobal.ajaxurl, data, success, dataType);
    1724 
    1725                 if (bitOptions.cors) {
    1726                     jQuery.support.cors = false;
    1727                 }
    1728             },
    1729 
    1730             checkQuizLock: function () {
    1731 
    1732                 quizStatus.loadLock = 1;
    1733 
    1734                 plugin.methode.ajax({
    1735                     action: 'quizmaster_admin_ajax',
    1736                     func: 'quizCheckLock',
    1737                     data: {
    1738                       quizId: config.quizId
    1739                     }
    1740                 }, function (json) {
    1741 
    1742                                 // global trigger
    1743                                 $(document).trigger({
    1744                                     type: 'quizmasterCheckQuizLock',
    1745                                     values: {
    1746                                         lockData: json,
    1747                                     }
    1748                                 });
    1749 
    1750                                 // run callback hooks
    1751                                 var quizLockCallbacks = callbacks['checkQuizLock'];
    1752                                 $.each( quizLockCallbacks, function( index, value ) {
    1753 
    1754                                     // find object
    1755                                     var fn = window[value.object][value.func];
    1756 
    1757                                     // is object a function?
    1758                                     if (typeof fn === "function") {
    1759                                         var quizMasterFront = this;
    1760                                         fn( json, quizStatus, globalElements );
    1761                                     }
    1762 
    1763                                 });
    1764 
    1765                 if (json.lock != undefined) {
    1766                   quizStatus.isLocked = json.lock.is;
    1767 
    1768                   if ( json.lock.pre ) {
    1769                     $e.find('input[name="restartQuiz"]').hide();
    1770                   }
    1771                 }
    1772 
    1773                 if (json.startUserLock != undefined) {
    1774                   quizStatus.isUserStartLocked = json.startUserLock;
    1775                 }
    1776 
    1777                 quizStatus.loadLock = 0;
    1778 
    1779                 if ( quizStatus.isQuizStart ) {
    1780                   plugin.methode.startQuiz();
    1781                 }
    1782 
    1783                 });
    1784             },
    1785 
    1786             loadQuizData: function () {
    1787                 plugin.methode.ajax({
    1788                     action: 'quizmaster_admin_ajax',
    1789                     func: 'loadQuizData',
    1790                     data: {
    1791                         quizId: config.quizId
    1792                     }
    1793                 }, function (json) {
    1794 
    1795                     if (json.averageResult != undefined) {
    1796                         plugin.methode.setAverageResult(json.averageResult, true);
    1797                     }
    1798 
    1799                 });
    1800 
    1801             },
    1802 
    1803             setAverageResult: function (p, g) {
    1804                 var v = $e.find('.quizMaster_resultValue:eq(' + (g ? 0 : 1) + ') > * ');
    1805 
    1806                 v.eq(1).text(p + '%');
    1807                 v.eq(0).css('width', (240 * p / 100) + 'px');
    1808             },
    1809 
    1810             scrollTo: function (e, h) {
    1811                 var x = e.offset().top - 100;
    1812 
    1813                 if (h || (window.pageYOffset || document.body.scrollTop) > x) {
    1814                     $('html,body').animate({scrollTop: x}, 300);
    1815                 }
    1816             },
    1817 
    1818             registerSolved: function () {
    1819 
    1820               $e.find('.quizMaster_questionInput[type="text"]').change(function (e) {
    1821                 var $this = $(this);
    1822                 var $p = $this.parents('.quizMaster_listItem');
    1823                 var s = false;
    1824 
    1825                 if ($this.val() != '') {
    1826                   s = true;
    1827                 }
    1828 
    1829                 $e.trigger({
    1830                   type: 'questionSolved',
    1831                   values: {
    1832                     item: $p,
    1833                     index: $p.index(),
    1834                     solved: s
    1835                   }
    1836                 });
    1837 
    1838               });
    1839 
    1840                 $e.find('.quizMaster_questionList[data-type="single"] .quizMaster_questionInput, .quizMaster_questionList[data-type="assessment_answer"] .quizMaster_questionInput').change(function (e) {
    1841                     var $this = $(this);
    1842                     var $p = $this.parents('.quizMaster_listItem');
    1843                     var s = this.checked;
    1844 
    1845                     $e.trigger({
    1846                         type: 'questionSolved',
    1847                         values: {
    1848                             item: $p,
    1849                             index: $p.index(),
    1850                             solved: s
    1851                         }
    1852                     });
    1853 
    1854                 });
    1855 
    1856                 $e.find('.quizMaster_cloze input').change(function () {
    1857                     var $this = $(this);
    1858                     var $p = $this.parents('.quizMaster_listItem');
    1859                     var s = true;
    1860 
    1861                     $p.find('.quizMaster_cloze input').each(function () {
    1862                         if ($(this).val() == '') {
    1863                             s = false;
    1864                             return false;
    1865                         }
    1866                     });
    1867 
    1868                     $e.trigger({
    1869                         type: 'questionSolved',
    1870                         values: {
    1871                             item: $p,
    1872                             index: $p.index(),
    1873                             solved: s
    1874                         }
    1875                     });
    1876 
    1877                 });
    1878 
    1879                 $e.find('.quizMaster_questionList[data-type="multiple"] .quizMaster_questionInput').change(function (e) {
    1880                     var $this = $(this);
    1881                     var $p = $this.parents('.quizMaster_listItem');
    1882                     var c = 0;
    1883 
    1884                     $p.find('.quizMaster_questionList[data-type="multiple"] .quizMaster_questionInput').each(function (e) {
    1885                         if (this.checked)
    1886                             c++;
    1887                     });
    1888 
    1889                     $e.trigger({
    1890                         type: 'questionSolved',
    1891                         values: {
    1892                             item: $p,
    1893                             index: $p.index(),
    1894                             solved: (c) ? true : false
    1895                         }
    1896                     });
    1897 
    1898                 });
    1899             },
    1900 
    1901             loadQuizDataAjax: function (quizStart) {
    1902                 plugin.methode.ajax({
    1903                     action: 'quizmaster_admin_ajax',
    1904                     func: 'quizLoadData',
    1905                     data: {
    1906                         quizId: config.quizId
    1907                     }
    1908                 }, function (json) {
    1909 
    1910                     config.globalPoints = json.globalPoints;
    1911                     config.catPoints = json.catPoints;
    1912                     config.json = json.json;
    1913 
    1914                     globalElements.quiz.remove();
    1915 
    1916                     $e.find('.quizMaster_quizAnker').after(json.content);
    1917 
    1918                     //Reinit globalElements
    1919                     globalElements = {
    1920                       back: $e.find('input[name="back"]'),
    1921                       next: $e.find(globalNames.next),
    1922                                             skip: $e.find(globalNames.skip),
    1923                       quiz: $e.find('.quizMaster_quiz'),
    1924                       questionList: $e.find('.quizMaster_list'),
    1925                       results: $e.find('.qm-results-box'),
    1926                                             questionCheck: $e.find('.qm-check-answer-box'),
    1927                       quizStartPage: $e.find('.qm-quiz-start-box'),
    1928                       timelimit: $e.find('.qm-time-limit'),
    1929                       toplistShowInButton: $e.find('.quizMaster_toplistShowInButton'),
    1930                       listItems: $()
    1931                     };
    1932 
    1933                     plugin.methode.initQuiz();
    1934 
    1935                     if (quizStart)
    1936                       plugin.methode.startQuiz(true);
    1937 
    1938                 });
    1939             },
    1940 
    1941             initQuiz: function () {
    1942 
    1943                 plugin.methode.setClozeStyle();
    1944                 plugin.methode.registerSolved();
    1945 
    1946                                 // Next Button Click
    1947                 globalElements.next.click(function () {
    1948 
    1949                   if (bitOptions.forcingQuestionSolve && !quizSolved[currentQuestion.index()]
    1950                     && (bitOptions.quizSummeryHide || !bitOptions.reviewQustion)) {
    1951 
    1952                     alert(QuizMasterGlobal.questionNotSolved);
    1953                     return false;
    1954                   }
    1955 
    1956                   plugin.methode.nextQuestion();
    1957                 });
    1958 
    1959                 globalElements.back.click(function () {
    1960                     plugin.methode.prevQuestion();
    1961                 });
    1962 
    1963                                 // Check Answer Button Click
    1964                 $e.find(globalNames.check).click(function () {
    1965 
    1966                   if (bitOptions.forcingQuestionSolve && !quizSolved[currentQuestion.index()]
    1967                       && (bitOptions.quizSummeryHide || !bitOptions.reviewQustion)) {
    1968 
    1969                       alert(QuizMasterGlobal.questionNotSolved);
    1970                       return false;
    1971                   }
    1972 
    1973                   plugin.methode.checkQuestion();
    1974 
    1975                 });
    1976 
    1977                 $e.find('input[name="checkSingle"]').click(function () {
    1978                     if (bitOptions.forcingQuestionSolve && (bitOptions.quizSummeryHide || !bitOptions.reviewQustion)) {
    1979                         for (var i = 0, c = $e.find('.quizMaster_listItem').length; i < c; i++) {
    1980                             if (!quizSolved[i]) {
    1981                                 alert(QuizMasterGlobal.questionsNotSolved);
    1982                                 return false;
    1983                             }
    1984                         }
    1985                     }
    1986 
    1987                     plugin.methode.showQuizSummary();
    1988                 });
    1989 
    1990                                 // enable hint
    1991                 //plugin.methode.hintEnable()
    1992 
    1993                 $e.find('input[name="skip"]').click(plugin.methode.skipQuestion);
    1994 
    1995                 $e.find('input[name="quizMaster_pageLeft"]').click(function () {
    1996                     plugin.methode.showSinglePage(currentPage - 1);
    1997                 });
    1998 
    1999                 $e.find('input[name="quizMaster_pageRight"]').click(function () {
    2000                     plugin.methode.showSinglePage(currentPage + 1);
    2001                 });
    2002             }
    2003         };
    2004 
    2005         /**
    2006          * @memberOf plugin
    2007          */
    2008         plugin.preInit = function () {
    2009 
    2010                         // if hint if open when question solved hide it
    2011                         $e.bind('changeQuestion', plugin.methode.hintHide);
    2012 
    2013                         // disable hint if not activated for question
    2014                         $e.bind('changeQuestion', function() {
    2015                             var $hint = currentQuestion.find('.quizMaster_tipp')
    2016                             if( ! $hint.length ) {
    2017                                 plugin.methode.hintDisable()
    2018                             } else {
    2019                                 plugin.methode.hintEnable()
    2020                             }
    2021                         });
    2022 
    2023                         // hint close button
    2024                         $e.find('.qm-hint-modal .qm-hint-close').on('click', plugin.methode.hintHide)
    2025 
    2026             plugin.methode.parseBitOptions();
    2027             reviewBox.init();
    2028 
    2029             $e.find('input[name="startQuiz"]').click(function () {
    2030               plugin.methode.startQuiz();
    2031               return false;
    2032             });
    2033 
    2034                         // check quiz lock
    2035             plugin.methode.checkQuizLock();
    2036 
    2037             $e.find('input[name="reShowQuestion"]').click(function () {
    2038                 plugin.methode.showQustionList();
    2039             });
    2040 
    2041             $e.find('input[name="restartQuiz"]').click(function () {
    2042                 plugin.methode.restartQuiz();
    2043             });
    2044 
    2045             $e.find('input[name="review"]').click(plugin.methode.reviewQuestion);
    2046 
    2047             $e.find('input[name="quizSummary"]').click(plugin.methode.showQuizSummary);
    2048 
    2049             $e.find('input[name="endQuizSummary"]').click(function () {
    2050                 if (bitOptions.forcingQuestionSolve) {
    2051                     for (var i = 0, c = $e.find('.quizMaster_listItem').length; i < c; i++) {
    2052                         if (!quizSolved[i]) {
    2053                             alert(QuizMasterGlobal.questionsNotSolved);
    2054                             return false;
    2055                         }
    2056                     }
    2057                 }
    2058 
    2059                 if (bitOptions.formActivated && config.formPos == formPosConst.END && !formClass.checkForm())
    2060                     return;
    2061 
    2062                 plugin.methode.finishQuiz();
    2063             });
    2064 
    2065             $e.bind('questionSolved', plugin.methode.questionSolved);
    2066 
    2067             if (!bitOptions.maxShowQuestion) {
    2068               plugin.methode.initQuiz();
    2069             }
    2070 
    2071                         // start quiz if autostart active, otherwise show quiz start page
    2072             if (bitOptions.autoStart) {
    2073                             plugin.methode.startQuiz();
    2074                         } else {
    2075                             globalElements.quizStartPage.show();
    2076                         }
    2077 
    2078 
    2079 
    2080         };
    2081 
    2082         plugin.preInit();
    2083     };
    2084 
    2085     $.fn.quizMasterFront = function (options) {
    2086         return this.each(function () {
    2087             if (undefined == $(this).data('quizMasterFront')) {
    2088                 $(this).data('quizMasterFront', new $.quizMasterFront(this, options));
    2089             }
    2090         });
    2091     };
    2092 
    2093 })(jQuery);
  • quizmaster/trunk/js/quizmaster.min.js

    r1671450 r1717342  
    1 !function(i,e){function t(){if(!r){r=!0;for(var i=0;i<n.length;i++)n[i].fn.call(window,n[i].ctx);n=[]}}function o(){"complete"===document.readyState&&t()}i=i||"quizMasterReady",e=e||window;var n=[],r=!1,s=!1;e[i]=function(i,e){return r?void setTimeout(function(){i(e)},1):(n.push({fn:i,ctx:e}),void("complete"===document.readyState?setTimeout(t,1):s||(document.addEventListener?(document.addEventListener("DOMContentLoaded",t,!1),window.addEventListener("load",t,!1)):(document.attachEvent("onreadystatechange",o),window.attachEvent("onload",t)),s=!0)))}}("quizMasterReady",window),quizMasterReady(function(){for(var i=window.quizMasterInitList||[],e=0;e<i.length;e++)jQuery(i[e].id).quizMasterFront(i[e].init)}),function(i){i.quizMasterFront=function(e,t){function o(){var i=0,e=-1,t=0,o=!1;this.questionStart=function(t){-1!=e&&this.questionStop(),e=t,i=+new Date},this.questionStop=function(){-1!=e&&(a[e].time+=Math.round((new Date-i)/1e3),e=-1)},this.startQuiz=function(){o&&this.stopQuiz(),t=+new Date,o=!0},this.stopQuiz=function(){o&&(a.comp.quizTime+=Math.round((new Date-t)/1e3),o=!1)},this.init=function(){}}var n=i(e),r=t,s=this,a=new Object,u=new Object,d=0,c=null,p=[],l="",h=!1,f=1,m={randomAnswer:0,randomQuestion:0,disabledAnswerMark:0,checkBeforeStart:0,preview:0,cors:0,isAddAutomatic:0,quizSummeryHide:0,skipButton:0,reviewQustion:0,autoStart:0,forcingQuestionSolve:0,hideQuestionPositionOverview:0,formActivated:0,maxShowQuestion:0,sortCategories:0},w={isQuizStart:0,isLocked:0,loadLock:0,isPrerequisite:0,isUserStartLocked:0},Q={check:'input[name="check"]',next:'input[name="next"]',questionList:".quizMaster_questionList",skip:'input[name="skip"]',singlePageLeft:'input[name="quizMaster_pageLeft"]',singlePageRight:'input[name="quizMaster_pageRight"]'},v={back:n.find('input[name="back"]'),next:n.find(Q.next),quiz:n.find(".quizMaster_quiz"),questionList:n.find(".quizMaster_list"),results:n.find(".qm-results-box"),quizStartPage:n.find(".qm-start-box"),timelimit:n.find(".qm-time-limit"),toplistShowInButton:n.find(".quizMaster_toplistShowInButton"),listItems:i()},z={token:"",isUser:0},_={START:0,END:1},P=function(){var i=r.timelimit,e=0,t={};return t.stop=function(){i&&(window.clearInterval(e),v.timelimit.hide())},t.start=function(){if(i){var o=1e3*i,n=v.timelimit.find("span").text(s.methode.parseTime(i)),r=v.timelimit.find(".qm-progress-box");v.timelimit.show();var a=+new Date;e=window.setInterval(function(){var i=+new Date-a,e=o-i;i>=500&&n.text(s.methode.parseTime(Math.ceil(e/1e3))),r.css("width",e/o*100+"%"),0>=e&&(t.stop(),s.methode.finishQuiz(!0))},16)}},t}(),g=new function(){function e(i){var e=c.eq(i),t=e.offset().top,o=a.offset().top,n=t-o;if(0>n-4||n+32>100){var r=o-c.eq(0).offset().top-(o-d.offset().top)+e.position().top;r>w&&(r=w);var s=r/h;d.attr("style","margin-top: "+-r+"px !important"),u.css({top:s})}}function t(i){var e="",t=Q[i];t.review?e="#FFB800":t.solved&&(e="#6CA54C"),c.eq(i).css("background-color",e)}function o(i){i.preventDefault();var e=i.pageY-l;0>e&&(e=0),e>p&&(e=p);var t=h*e;d.attr("style","margin-top: "+-t+"px !important"),u.css({top:e})}function r(e){e.preventDefault(),i(document).unbind(".scrollEvent")}var a=[],u=[],d=[],c=[],p=0,l=0,h=0,f=0,w=0,Q=[];this.init=function(){a=n.find(".quizMaster_reviewQuestion"),u=a.find("div"),d=a.find("ol"),c=d.children(),u.mousedown(function(e){e.preventDefault(),e.stopPropagation(),l=e.pageY-u.offset().top+f,i(document).bind("mouseup.scrollEvent",r),i(document).bind("mousemove.scrollEvent",o)}),c.click(function(e){s.methode.showQuestion(i(this).index())}),n.bind("questionSolved",function(i){Q[i.values.index].solved=i.values.solved,t(i.values.index)}),n.bind("changeQuestion",function(i){c.removeClass("quizMaster_reviewQuestionTarget"),c.eq(i.values.index).addClass("quizMaster_reviewQuestionTarget"),e(i.values.index)}),n.bind("reviewQuestion",function(i){Q[i.values.index].review=!Q[i.values.index].review,t(i.values.index)}),a.bind("mousewheel DOMMouseScroll",function(i){i.preventDefault();var e=i.originalEvent,t=e.wheelDelta?-e.wheelDelta/120:e.detail/3,o=20*t,n=f-d.offset().top+o;n>w&&(n=w),0>n&&(n=0);var r=n/h;return d.attr("style","margin-top: "+-n+"px !important"),u.css({top:r}),!1})},this.show=function(i){if(m.reviewQustion&&a.parent().show(),n.find(".qmr-review-box .quizMaster_button2").show(),!i){d.attr("style","margin-top: 0px !important"),u.css({top:0});var e=d.outerHeight(),t=a.height();p=t-u.height(),l=0,w=e-t,h=w/p,this.reset(),e>100&&u.show(),f=u.offset().top}},this.hide=function(){a.parent().hide()},this.toggle=function(){if(m.reviewQustion){a.parent().toggle(),c.removeClass("quizMaster_reviewQuestionTarget"),n.find(".qmr-review-box .quizMaster_button2").hide(),d.attr("style","margin-top: 0px !important"),u.css({top:0});var i=d.outerHeight(),e=a.height();p=e-u.height(),l=0,w=i-e,h=w/p,i>100&&u.show(),f=u.offset().top}},this.reset=function(){for(var i=0,e=c.length;e>i;i++)Q[i]={};c.removeClass("quizMaster_reviewQuestionTarget").css("background-color","")}},q=new o,x=function(e,t,o,n){var r=!0,a=0,u=i.isArray(t.points),d={},c={singleMulti:function(){var e=n.find(".quizMaster_questionInput").attr("disabled","disabled"),o=t.diffMode;n.children().each(function(n){var d=i(this),c=d.data("pos"),p=e.eq(n).is(":checked");t.correct[c]?(p?u&&(o?a=t.points[c]:a+=t.points[c]):r=!1,t.disCorrect?r=!0:s.methode.marker(d,!0)):p?(t.disCorrect?r=!0:(s.methode.marker(d,!1),r=!1),o&&(a=t.points[c])):u&&!o&&(a+=t.points[c])})},sort_answer:function(){var e=n.children();e.each(function(e,o){var n=i(this);d[e]=n.data("pos"),e==n.data("pos")?(s.methode.marker(n,!0),u&&(a+=t.points[e])):(s.methode.marker(n,!1),r=!1)}),e.children().css({"box-shadow":"0 0",cursor:"auto"}),n.sortable("destroy"),e.sort(function(e,t){return i(e).data("pos")>i(t).data("pos")?1:-1}),n.append(e)},matrix_sort_answer:function(){var e=n.children(),c=new Array;d={0:-1},e.each(function(){var e=i(this),o=e.data("pos"),n=e.find(".quizMaster_maxtrixSortCriterion"),p=n.children();p.length&&(d[o]=p.data("pos")),p.length&&i.inArray(String(o),String(p.data("correct")).split(","))>=0?(s.methode.marker(n,!0),u&&(a+=t.points[o])):(r=!1,s.methode.marker(n,!1)),c[o]=n}),s.methode.resetMatrix(o),o.find(".quizMaster_sortStringItem").each(function(){var e=c[i(this).data("pos")];void 0!=e&&e.append(this)}).css({"box-shadow":"0 0",cursor:"auto"}),o.find(".quizMaster_sortStringList, .quizMaster_maxtrixSortCriterion").sortable("destroy")},free_answer:function(){var e=n.children(),o=e.find(".quizMaster_questionInput").attr("disabled","disabled").val();i.inArray(i.trim(o).toLowerCase(),t.correct)>=0?s.methode.marker(e,!0):(s.methode.marker(e,!1),r=!1)},cloze_answer:function(){n.find(".quizMaster_cloze").each(function(e,o){var n=i(this),d=n.children(),c=d.eq(0),p=d.eq(1),l=s.methode.cleanupCurlyQuotes(c.val());i.inArray(l,t.correct[e])>=0?(u&&(a+=t.points[e]),m.disabledAnswerMark||c.css("background-color","#B0DAB0")):(m.disabledAnswerMark||c.css("background-color","#FFBABA"),r=!1,p.show()),c.attr("disabled","disabled")})},assessment_answer:function(){r=!0;var e=n.find(".quizMaster_questionInput").attr("disabled","disabled"),t=0;e.filter(":checked").each(function(){t+=parseInt(i(this).val())}),a=t}};return c[e](),!u&&r&&(a=t.points),{c:r,p:a,s:d}},k=new function(){var e={isEmpty:function(e){return e=i.trim(e),!e||0===e.length}},t={TEXT:0,TEXTAREA:1,NUMBER:2,CHECKBOX:3,EMAIL:4,YES_NO:5,DATE:6,SELECT:7,RADIO:8};this.checkForm=function(){var o=!0;return n.find(".quizMaster_forms input, .quizMaster_forms textarea, .quizMaster_forms .quizMaster_formFields, .quizMaster_forms select").each(function(){var n=i(this),r=1==n.data("required"),s=n.data("type"),a=!0,u=i.trim(n.val());switch(s){case t.TEXT:case t.TEXTAREA:case t.SELECT:r&&(a=!e.isEmpty(u));break;case t.NUMBER:(r||!e.isEmpty(u))&&(a=!e.isEmpty(u)&&!isNaN(u));break;case t.EMAIL:(r||!e.isEmpty(u))&&(a=!e.isEmpty(u)&&new RegExp(/^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/).test(u));break;case t.CHECKBOX:r&&(a=n.is(":checked"));break;case t.YES_NO:case t.RADIO:r&&(a=void 0!==n.find('input[type="radio"]:checked').val());break;case t.DATE:var d=0,c=0;n.find("select").each(function(){d++,c+=e.isEmpty(i(this).val())?0:1}),(r||c>0)&&(a=d==c)}a?n.siblings(".quizMaster_invalidate").hide():(o=!1,n.siblings(".quizMaster_invalidate").show())}),o},this.getFormData=function(){var e={};return n.find(".quizMaster_forms input, .quizMaster_forms textarea, .quizMaster_forms .quizMaster_formFields, .quizMaster_forms select").each(function(){var o=i(this),n=o.data("form_id"),r=o.data("type");switch(r){case t.TEXT:case t.TEXTAREA:case t.SELECT:case t.NUMBER:case t.EMAIL:e[n]=o.val();break;case t.CHECKBOX:e[n]=o.is(":checked")?1:0;break;case t.YES_NO:case t.RADIO:e[n]=o.find('input[type="radio"]:checked').val();break;case t.DATE:e[n]={day:o.find('select[name="quizMaster_field_'+n+'_day"]').val(),month:o.find('select[name="quizMaster_field_'+n+'_month"]').val(),year:o.find('select[name="quizMaster_field_'+n+'_year"]').val()}}}),e}},S=function(e){n.find(".quizMaster_questionList").each(function(){var t=i(this),o=t.data("question_id"),n=t.data("type"),r={};if("single"==n||"multiple"==n)t.find(".quizMaster_questionListItem").each(function(){r[i(this).data("pos")]=+i(this).find(".quizMaster_questionInput").is(":checked")});else if("free_answer"==n)r[0]=t.find(".quizMaster_questionInput").val();else{if("sort_answer"==n)return!0;if("matrix_sort_answer"==n)return!0;if("cloze_answer"==n){var s=0;t.find(".quizMaster_cloze input").each(function(){r[s++]=i(this).val()})}else"assessment_answer"==n&&(r[0]="",t.find(".quizMaster_questionInput:checked").each(function(){r[i(this).data("index")]=i(this).val()}))}e[o].data=r})};s.methode={parseBitOptions:function(){if(r.bo){m.randomAnswer=1&r.bo,m.randomQuestion=2&r.bo,m.disabledAnswerMark=4&r.bo,m.checkBeforeStart=8&r.bo,m.preview=16&r.bo,m.isAddAutomatic=64&r.bo,m.reviewQustion=128&r.bo,m.quizSummeryHide=256&r.bo,m.skipButton=512&r.bo,m.autoStart=1024&r.bo,m.forcingQuestionSolve=2048&r.bo,m.hideQuestionPositionOverview=4096&r.bo,m.formActivated=8192&r.bo,m.maxShowQuestion=16384&r.bo,m.sortCategories=32768&r.bo;var i=32&r.bo;i&&void 0!=jQuery.support&&void 0!=jQuery.support.cors&&0==jQuery.support.cors&&(m.cors=i)}},setClozeStyle:function(){n.find(".quizMaster_cloze input").each(function(){for(var e=i(this),t="",o=e.data("wordlen"),n=0;o>n;n++)t+="w";var r=i(document.createElement("span")).css("visibility","hidden").text(t).appendTo(i("body")),s=r.width();r.remove(),e.width(s+5)})},parseTime:function(i){var e=parseInt(i%60),t=parseInt(i/60%60),o=parseInt(i/3600%24);return e=(e>9?"":"0")+e,t=(t>9?"":"0")+t,o=(o>9?"":"0")+o,o+":"+t+":"+e},cleanupCurlyQuotes:function(e){return e=e.replace(/\u2018/,"'"),e=e.replace(/\u2019/,"'"),e=e.replace(/\u201C/,'"'),e=e.replace(/\u201D/,'"'),i.trim(e).toLowerCase()},resetMatrix:function(e){e.each(function(){var e=i(this),t=e.find(".quizMaster_sortStringList");e.find(".quizMaster_sortStringItem").each(function(){t.append(i(this))})})},marker:function(i,e){m.disabledAnswerMark||(e?i.addClass("quizMaster_answerCorrect"):i.addClass("quizMaster_answerIncorrect"))},startQuiz:function(e){if(w.loadLock)return void(w.isQuizStart=1);if(w.isQuizStart=0,w.isLocked)return v.quizStartPage.hide(),void n.find(".qm-locked").show();if(w.isPrerequisite)return v.quizStartPage.hide(),void n.find(".quizMaster_prerequisite").show();if(w.isUserStartLocked)return v.quizStartPage.hide(),void n.find(".qm-lock-box").show();if(m.maxShowQuestion&&!e)return v.quizStartPage.hide(),n.find(".quizMaster_loadQuiz").show(),void s.methode.loadQuizDataAjax(!0);if(!m.formActivated||r.formPos!=_.START||k.checkForm()){switch(s.methode.loadQuizData(),m.randomQuestion&&s.methode.random(v.questionList),m.randomAnswer&&s.methode.random(n.find(Q.questionList)),m.sortCategories&&s.methode.sortCategories(),s.methode.random(n.find(".quizMaster_sortStringList")),s.methode.random(n.find('[data-type="sort_answer"]')),n.find(".quizMaster_listItem").each(function(e,t){var o=i(this);o.find(".quizMaster_question_page span:eq(0)").text(e+1),o.find("> h5 span").text(e+1),o.find(".quizMaster_questionListItem").each(function(e,t){i(this).find("> span:not(.quizMaster_cloze)").text(e+1+". ")})}),v.next=n.find(Q.next),r.mode){case 3:n.find('input[name="checkSingle"]').show();break;case 2:n.find(Q.check).show(),!m.skipButton&&m.reviewQustion&&n.find(Q.skip).show();break;case 1:n.find('input[name="back"]').slice(1).show();case 0:v.next.show()}(m.hideQuestionPositionOverview||3==r.mode)&&n.find(".quizMaster_question_page").hide();var o=v.next.last();l=o.val(),o.val(r.lbn);var h=v.questionList.children();if(v.listItems=n.find(".quizMaster_list > li"),3==r.mode)s.methode.showSinglePage(0);else{c=h.eq(0).show();var f=c.find(Q.questionList).data("question_id");q.questionStart(f)}q.startQuiz(),n.find(".quizMaster_sortable").parents("ul").sortable({update:function(e,t){var o=i(this).parents(".quizMaster_listItem");n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:!0}})}}).disableSelection(),n.find(".quizMaster_sortStringList, .quizMaster_maxtrixSortCriterion").sortable({connectWith:".quizMaster_maxtrixSortCriterion:not(:has(li)), .quizMaster_sortStringList",placeholder:"quizMaster_placehold",update:function(e,t){var o=i(this).parents(".quizMaster_listItem");n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:!0}})}}).disableSelection(),p=[],P.start(),d=+new Date,a={comp:{points:0,correctQuestions:0,quizTime:0}},n.find(".quizMaster_questionList").each(function(){var e=i(this).data("question_id");a[e]={time:0,solved:0}}),u={},i.each(t.catPoints,function(i,e){u[i]=0}),v.quizStartPage.hide(),n.find(".quizMaster_loadQuiz").hide(),v.quiz.show(),g.show(),3!=r.mode&&n.trigger({type:"changeQuestion",values:{item:c,index:c.index()}})}},showSingleQuestion:function(i){var e=i?Math.ceil(i/r.qpp):1;this.showSinglePage(e)},showSinglePage:function(i){if($listItem=v.questionList.children().hide(),!r.qpp)return void $listItem.show();i=i?+i:1;var e=Math.ceil(n.find(".quizMaster_list > li").length/r.qpp);if(!(i>e)){var t=n.find(Q.singlePageLeft).hide(),o=n.find(Q.singlePageRight).hide(),a=n.find('input[name="checkSingle"]').hide();i>1&&t.val(t.data("text").replace(/%d/,i-1)).show(),i==e?a.show():o.val(o.data("text").replace(/%d/,i+1)).show(),f=i;var u=r.qpp*(i-1);$listItem.slice(u,u+r.qpp).show(),s.methode.scrollTo(v.quiz)}},nextQuestion:function(){this.showQuestionObject(c.next())},prevQuestion:function(){this.showQuestionObject(c.prev())},showQuestion:function(i){var e=v.listItems.eq(i);return 3==r.mode||h?(r.qpp&&s.methode.showSingleQuestion(i+1),s.methode.scrollTo(e,1),void q.startQuiz()):void this.showQuestionObject(e)},showQuestionObject:function(i){if(!i.length&&m.forcingQuestionSolve&&m.quizSummeryHide&&m.reviewQustion)for(var e=0,t=n.find(".quizMaster_listItem").length;t>e;e++)if(!p[e])return alert(QuizMasterGlobal.questionsNotSolved),!1;if(c.hide(),c=i.show(),s.methode.scrollTo(v.quiz),n.trigger({type:"changeQuestion",values:{item:c,index:c.index()}}),c.length){var o=c.find(Q.questionList).data("question_id");q.questionStart(o)}else s.methode.showQuizSummary()},skipQuestion:function(){n.trigger({type:"skipQuestion",values:{item:c,index:c.index()}}),s.methode.nextQuestion()},reviewQuestion:function(){n.trigger({type:"reviewQuestion",values:{item:c,index:c.index()}})},showQuizSummary:function(){if(q.questionStop(),q.stopQuiz(),m.quizSummeryHide||!m.reviewQustion)return void(m.formActivated&&r.formPos==_.END?(g.hide(),v.quiz.hide(),s.methode.scrollTo(n.find(".qm-info-page").show())):s.methode.finishQuiz());var e=n.find(".qm-check-page");e.find("ol:eq(0)").empty().append(n.find(".quizMaster_reviewQuestion ol li").clone().removeClass("quizMaster_reviewQuestionTarget")).children().click(function(t){e.hide(),v.quiz.show(),g.show(!0),s.methode.showQuestion(i(this).index())});for(var t=0,o=0,a=p.length;a>o;o++)p[o]&&t++;e.find("span:eq(0)").text(t),g.hide(),v.quiz.hide(),e.show(),s.methode.scrollTo(e)},finishQuiz:function(e){q.questionStop(),q.stopQuiz(),P.stop();var t=(+new Date-d)/1e3;t=r.timelimit&&t>r.timelimit?r.timelimit:t,n.find(".quizMaster_quiz_time span").text(s.methode.parseTime(t)),e&&v.results.find(".qm-time-limit_expired").show(),s.methode.checkQuestion(v.questionList.children(),!0),n.find(".quizMaster_correct_answer").text(a.comp.correctQuestions),a.comp.result=Math.round(a.comp.points/r.globalPoints*100*100)/100,a.comp.solved=0;var o=n.find(".quizMaster_points span");o.eq(0).text(a.comp.points),o.eq(1).text(r.globalPoints),o.eq(2).text(a.comp.result+"%");var u=n.find(".qm-results-boxList > li").eq(s.methode.findResultIndex(a.comp.result)),c=k.getFormData();u.find(".quizMaster_resultForm").each(function(){var e=i(this),t=e.data("form_id"),o=c[t];"object"==typeof o&&(o=o.day+"-"+o.month+"-"+o.year),e.text(o).show()}),u.show(),s.methode.setAverageResult(a.comp.result,!1),this.setCategoryOverview(),s.methode.sendCompletedQuiz(),m.isAddAutomatic&&z.isUser&&s.methode.addToplist(),g.hide(),n.find(".qm-check-page, .qm-info-page").hide(),v.quiz.hide(),v.results.show(),s.methode.scrollTo(v.results)},setCategoryOverview:function(){a.comp.cats={},n.find(".quizMaster_catOverview li").each(function(){var e=i(this),t=e.data("category_id");if(void 0===r.catPoints[t])return e.hide(),!0;var o=Math.round(u[t]/r.catPoints[t]*100*100)/100;a.comp.cats[t]=o,e.find(".quizMaster_catPercent").text(o+"%"),e.show()})},questionSolved:function(i){p[i.values.index]=i.values.solved;var e=i.values.item.find(Q.questionList),t=r.json[e.data("question_id")];a[t.id].solved=Number(i.values.fake?a[t.id].solved:i.values.solved)},sendCompletedQuiz:function(){if(!m.preview){S(a);var i=k.getFormData();s.methode.ajax({action:"quizmaster_admin_ajax",func:"completedQuiz",data:{quizId:r.quizId,results:a,forms:i}})}},findResultIndex:function(i){for(var e=r.resultsGrade,t=-1,o=999999,n=0;n<e.length;n++){var s=e[n];i>=s&&o>i-s&&(o=i-s,t=n)}return t},showQustionList:function(){h=!h,v.toplistShowInButton.hide(),v.quiz.toggle(),n.find(".quizMaster_QuestionButton").hide(),v.questionList.children().show(),g.toggle(),n.find(".quizMaster_question_page").hide()},random:function(e){e.each(function(){var e=i(this).children().get().sort(function(){return Math.round(Math.random())-.5});i(e).appendTo(e[0].parentNode)})},sortCategories:function(){var e=i(".quizMaster_list").children().get().sort(function(e,t){var o=i(e).find(".quizMaster_questionList").data("question_id"),n=i(t).find(".quizMaster_questionList").data("question_id");return r.json[o].catId-r.json[n].catId});i(e).appendTo(e[0].parentNode)},restartQuiz:function(){v.results.hide(),v.quizStartPage.show(),v.questionList.children().hide(),v.toplistShowInButton.hide(),g.hide(),n.find(".quizMaster_questionInput, .quizMaster_cloze input").removeAttr("disabled").removeAttr("checked").css("background-color",""),n.find('.quizMaster_questionListItem input[type="text"]').val(""),n.find(".quizMaster_answerCorrect, .quizMaster_answerIncorrect").removeClass("quizMaster_answerCorrect quizMaster_answerIncorrect"),n.find(".quizMaster_listItem").data("check",!1),n.find(".quizMaster_response").hide().children().hide(),s.methode.resetMatrix(n.find(".quizMaster_listItem")),n.find(".quizMaster_sortStringItem, .quizMaster_sortable").removeAttr("style"),n.find(".quizMaster_clozeCorrect, .quizMaster_QuestionButton, .qm-results-boxList > li").hide(),n.find('.quizMaster_question_page, input[name="tip"]').show(),n.find(".quizMaster_resultForm").text("").hide(),v.results.find(".qm-time-limit_expired").hide(),v.next.last().val(l),h=!1},checkQuestion:function(e,t){e=void 0==e?c:e,e.each(function(){var e=i(this),o=e.find(Q.questionList),s=r.json[o.data("question_id")],d=s.type;if(q.questionStop(),e.data("check"))return!0;("single"==s.type||"multiple"==s.type)&&(d="singleMulti");var c=x(d,s,e,o);e.find(".quizMaster_response").show(),e.find(Q.check).hide(),e.find(Q.skip).hide(),e.find(Q.next).show(),a[s.id].points=c.p,a[s.id].correct=Number(c.c),a[s.id].data=c.s,a.comp.points+=c.p,u[s.catId]+=c.p,c.c?(e.find(".quizMaster_correct").show(),a.comp.correctQuestions+=1):e.find(".quizMaster_incorrect").show(),e.find(".quizMaster_responsePoints").text(c.p),e.data("check",!0),t||n.trigger({type:"questionSolved",values:{item:e,index:e.index(),solved:!0,fake:!0}})})},showTip:function(){var e=i(this),t=e.siblings(".quizMaster_question").find(Q.questionList).data("question_id");e.siblings(".quizMaster_tipp").toggle("fast"),a[t].tip=1,i(document).bind("mouseup.tipEvent",function(e){var t=n.find(".quizMaster_tipp"),o=n.find('input[name="tip"]');t.is(e.target)||0!=t.has(e.target).length||o.is(e.target)||(t.hide("fast"),i(document).unbind(".tipEvent"))})},ajax:function(e,t,o){o=o||"json",m.cors&&(jQuery.support.cors=!0),i.post(QuizMasterGlobal.ajaxurl,e,t,o),m.cors&&(jQuery.support.cors=!1)},checkQuizLock:function(){w.loadLock=1,s.methode.ajax({action:"quizmaster_admin_ajax",func:"quizCheckLock",data:{quizId:r.quizId}},function(i){void 0!=i.lock&&(w.isLocked=i.lock.is,i.lock.pre&&n.find('input[name="restartQuiz"]').hide()),void 0!=i.prerequisite&&(w.isPrerequisite=1,n.find(".quizMaster_prerequisite span").text(i.prerequisite)),void 0!=i.startUserLock&&(w.isUserStartLocked=i.startUserLock),w.loadLock=0,w.isQuizStart&&s.methode.startQuiz()})},loadQuizData:function(){s.methode.ajax({action:"quizmaster_admin_ajax",func:"loadQuizData",data:{quizId:r.quizId}},function(i){i.toplist&&s.methode.handleToplistData(i.toplist),void 0!=i.averageResult&&s.methode.setAverageResult(i.averageResult,!0)})},setAverageResult:function(i,e){var t=n.find(".quizMaster_resultValue:eq("+(e?0:1)+") > * ");t.eq(1).text(i+"%"),t.eq(0).css("width",240*i/100+"px")},handleToplistData:function(i){var e=n.find(".quizMaster_addToplist"),t=e.find(".quizMaster_addBox").show().children("div");if(i.canAdd)if(e.show(),e.find(".quizMaster_addToplistMessage").hide(),e.find(".quizMaster_toplistButton").show(),z.token=i.token,z.isUser=0,i.userId)t.hide(),z.isUser=1,m.isAddAutomatic&&e.hide();else{t.show();var o=t.children().eq(1);i.captcha?(o.find('input[name="quizMaster_captchaPrefix"]').val(i.captcha.code),o.find(".quizMaster_captchaImg").attr("src",i.captcha.img),o.find('input[name="quizMaster_captcha"]').val(""),o.show()):o.hide()}else e.hide()},scrollTo:function(e,t){var o=e.offset().top-100;(t||(window.pageYOffset||document.body.scrollTop)>o)&&i("html,body").animate({scrollTop:o},300)},addToplist:function(){if(!m.preview){var i=n.find(".quizMaster_addToplistMessage").text(QuizMasterGlobal.loadData).show(),e=n.find(".quizMaster_addBox").hide();s.methode.ajax({action:"quizmaster_admin_ajax",func:"addInToplist",data:{quizId:r.quizId,token:z.token,name:e.find('input[name="quizMaster_toplistName"]').val(),email:e.find('input[name="quizMaster_toplistEmail"]').val(),captcha:e.find('input[name="quizMaster_captcha"]').val(),prefix:e.find('input[name="quizMaster_captchaPrefix"]').val(),points:a.comp.points,totalPoints:r.globalPoints}},function(t){i.text(t.text),t.clear?(e.hide(),s.methode.updateToplist()):e.show(),t.captcha&&(e.find(".quizMaster_captchaImg").attr("src",t.captcha.img),e.find('input[name="quizMaster_captchaPrefix"]').val(t.captcha.code),e.find('input[name="quizMaster_captcha"]').val(""))})}},updateToplist:function(){"function"==typeof quizMaster_fetchToplist&&quizMaster_fetchToplist()},registerSolved:function(){n.find('.quizMaster_questionInput[type="text"]').change(function(e){var t=i(this),o=t.parents(".quizMaster_listItem"),r=!1;""!=t.val()&&(r=!0),n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:r}})}),n.find('.quizMaster_questionList[data-type="single"] .quizMaster_questionInput, .quizMaster_questionList[data-type="assessment_answer"] .quizMaster_questionInput').change(function(e){var t=i(this),o=t.parents(".quizMaster_listItem"),r=this.checked;n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:r}})}),n.find(".quizMaster_cloze input").change(function(){var e=i(this),t=e.parents(".quizMaster_listItem"),o=!0;t.find(".quizMaster_cloze input").each(function(){return""==i(this).val()?(o=!1,!1):void 0}),n.trigger({type:"questionSolved",values:{item:t,index:t.index(),solved:o}})}),n.find('.quizMaster_questionList[data-type="multiple"] .quizMaster_questionInput').change(function(e){var t=i(this),o=t.parents(".quizMaster_listItem"),r=0;o.find('.quizMaster_questionList[data-type="multiple"] .quizMaster_questionInput').each(function(i){this.checked&&r++}),n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:r?!0:!1}})})},loadQuizDataAjax:function(e){s.methode.ajax({action:"quizmaster_admin_ajax",func:"quizLoadData",data:{quizId:r.quizId}},function(t){r.globalPoints=t.globalPoints,r.catPoints=t.catPoints,r.json=t.json,v.quiz.remove(),n.find(".quizMaster_quizAnker").after(t.content),v={back:n.find('input[name="back"]'),next:n.find(Q.next),quiz:n.find(".quizMaster_quiz"),questionList:n.find(".quizMaster_list"),results:n.find(".qm-results-box"),quizStartPage:n.find(".qm-start-box"),timelimit:n.find(".qm-time-limit"),toplistShowInButton:n.find(".quizMaster_toplistShowInButton"),listItems:i()},s.methode.initQuiz(),e&&s.methode.startQuiz(!0)})},initQuiz:function(){s.methode.setClozeStyle(),s.methode.registerSolved(),v.next.click(function(){return!m.forcingQuestionSolve||p[c.index()]||!m.quizSummeryHide&&m.reviewQustion?void s.methode.nextQuestion():(alert(QuizMasterGlobal.questionNotSolved),!1)}),v.back.click(function(){s.methode.prevQuestion()}),n.find(Q.check).click(function(){return!m.forcingQuestionSolve||p[c.index()]||!m.quizSummeryHide&&m.reviewQustion?void s.methode.checkQuestion():(alert(QuizMasterGlobal.questionNotSolved),!1)}),n.find('input[name="checkSingle"]').click(function(){if(m.forcingQuestionSolve&&(m.quizSummeryHide||!m.reviewQustion))for(var i=0,e=n.find(".quizMaster_listItem").length;e>i;i++)if(!p[i])return alert(QuizMasterGlobal.questionsNotSolved),!1;s.methode.showQuizSummary()}),n.find('input[name="tip"]').click(s.methode.showTip),n.find('input[name="skip"]').click(s.methode.skipQuestion),n.find('input[name="quizMaster_pageLeft"]').click(function(){s.methode.showSinglePage(f-1)}),n.find('input[name="quizMaster_pageRight"]').click(function(){s.methode.showSinglePage(f+1)})}},s.preInit=function(){s.methode.parseBitOptions(),g.init(),n.find('input[name="startQuiz"]').click(function(){return s.methode.startQuiz(),!1}),m.checkBeforeStart&&!m.preview&&s.methode.checkQuizLock(),n.find('input[name="reShowQuestion"]').click(function(){s.methode.showQustionList()}),n.find('input[name="restartQuiz"]').click(function(){s.methode.restartQuiz()}),n.find('input[name="review"]').click(s.methode.reviewQuestion),n.find('input[name="quizMaster_toplistAdd"]').click(s.methode.addToplist),n.find('input[name="quizSummary"]').click(s.methode.showQuizSummary),n.find('input[name="endQuizSummary"]').click(function(){if(m.forcingQuestionSolve)for(var i=0,e=n.find(".quizMaster_listItem").length;e>i;i++)if(!p[i])return alert(QuizMasterGlobal.questionsNotSolved),!1;(!m.formActivated||r.formPos!=_.END||k.checkForm())&&s.methode.finishQuiz()}),n.find('input[name="endInfopage"]').click(function(){k.checkForm()&&s.methode.finishQuiz()}),n.find('input[name="showToplist"]').click(function(){v.quiz.hide(),v.toplistShowInButton.toggle()}),n.bind("questionSolved",s.methode.questionSolved),m.maxShowQuestion||s.methode.initQuiz(),m.autoStart&&s.methode.startQuiz()},s.preInit()},i.fn.quizMasterFront=function(e){return this.each(function(){void 0==i(this).data("quizMasterFront")&&i(this).data("quizMasterFront",new i.quizMasterFront(this,e))})}}(jQuery);
     1!function(i,e){function t(){if(!r){r=!0;for(var i=0;i<n.length;i++)n[i].fn.call(window,n[i].ctx);n=[]}}function o(){"complete"===document.readyState&&t()}i=i||"quizMasterReady",e=e||window;var n=[],r=!1,s=!1;e[i]=function(i,e){return r?void setTimeout(function(){i(e)},1):(n.push({fn:i,ctx:e}),void("complete"===document.readyState?setTimeout(t,1):s||(document.addEventListener?(document.addEventListener("DOMContentLoaded",t,!1),window.addEventListener("load",t,!1)):(document.attachEvent("onreadystatechange",o),window.attachEvent("onload",t)),s=!0)))}}("quizMasterReady",window),quizMasterReady(function(){for(var i=window.quizMasterInitList||[],e=0;e<i.length;e++)jQuery(i[e].id).quizMasterFront(i[e].init)}),function(i){i.quizMasterFront=function(e,t){function o(){var i=0,e=-1,t=0,o=!1;this.questionStart=function(t){-1!=e&&this.questionStop(),e=t,i=+new Date},this.questionStop=function(){-1!=e&&(a[e].time+=Math.round((new Date-i)/1e3),e=-1)},this.startQuiz=function(){o&&this.stopQuiz(),t=+new Date,o=!0},this.stopQuiz=function(){o&&(a.comp.quizTime+=Math.round((new Date-t)/1e3),o=!1)},this.init=function(){}}var n=i(e),r=t,s=this,a=new Object,u=new Object,d=0,c=null,p=[],l="",h=!1,f=1,m={randomAnswer:0,randomQuestion:0,disabledAnswerMark:0,checkBeforeStart:0,preview:0,cors:0,isAddAutomatic:0,quizSummeryHide:0,skipButton:0,reviewQustion:0,autoStart:0,forcingQuestionSolve:0,hideQuestionPositionOverview:0,formActivated:0,maxShowQuestion:0,sortCategories:0},w={isQuizStart:0,isLocked:0,loadLock:0,isPrerequisite:0,isUserStartLocked:0},Q={check:'input[name="check"]',next:'input[name="next"]',questionList:".quizMaster_questionList",skip:'input[name="skip"]',singlePageLeft:'input[name="quizMaster_pageLeft"]',singlePageRight:'input[name="quizMaster_pageRight"]'},v={back:n.find('input[name="back"]'),next:n.find(Q.next),quiz:n.find(".quizMaster_quiz"),questionList:n.find(".quizMaster_list"),results:n.find(".qm-results-box"),quizStartPage:n.find(".qm-start-box"),timelimit:n.find(".qm-time-limit"),toplistShowInButton:n.find(".quizMaster_toplistShowInButton"),listItems:i()},z={token:"",isUser:0},_={START:0,END:1},P=function(){var i=r.timelimit,e=0,t={};return t.stop=function(){i&&(window.clearInterval(e),v.timelimit.hide())},t.start=function(){if(i){var o=1e3*i,n=v.timelimit.find("span").text(s.methode.parseTime(i)),r=v.timelimit.find(".qm-progress-box");v.timelimit.show();var a=+new Date;e=window.setInterval(function(){var i=+new Date-a,e=o-i;i>=500&&n.text(s.methode.parseTime(Math.ceil(e/1e3))),r.css("width",e/o*100+"%"),0>=e&&(t.stop(),s.methode.finishQuiz(!0))},16)}},t}(),g=new function(){function e(i){var e=c.eq(i),t=e.offset().top,o=a.offset().top,n=t-o;if(0>n-4||n+32>100){var r=o-c.eq(0).offset().top-(o-d.offset().top)+e.position().top;r>w&&(r=w);var s=r/h;d.attr("style","margin-top: "+-r+"px !important"),u.css({top:s})}}function t(i){var e="",t=Q[i];t.review?e="#FFB800":t.solved&&(e="#6CA54C"),c.eq(i).css("background-color",e)}function o(i){i.preventDefault();var e=i.pageY-l;0>e&&(e=0),e>p&&(e=p);var t=h*e;d.attr("style","margin-top: "+-t+"px !important"),u.css({top:e})}function r(e){e.preventDefault(),i(document).unbind(".scrollEvent")}var a=[],u=[],d=[],c=[],p=0,l=0,h=0,f=0,w=0,Q=[];this.init=function(){a=n.find(".quizMaster_reviewQuestion"),u=a.find("div"),d=a.find("ol"),c=d.children(),u.mousedown(function(e){e.preventDefault(),e.stopPropagation(),l=e.pageY-u.offset().top+f,i(document).bind("mouseup.scrollEvent",r),i(document).bind("mousemove.scrollEvent",o)}),c.click(function(e){s.methode.showQuestion(i(this).index())}),n.bind("questionSolved",function(i){Q[i.values.index].solved=i.values.solved,t(i.values.index)}),n.bind("changeQuestion",function(i){c.removeClass("quizMaster_reviewQuestionTarget"),c.eq(i.values.index).addClass("quizMaster_reviewQuestionTarget"),e(i.values.index)}),n.bind("reviewQuestion",function(i){Q[i.values.index].review=!Q[i.values.index].review,t(i.values.index)}),a.bind("mousewheel DOMMouseScroll",function(i){i.preventDefault();var e=i.originalEvent,t=e.wheelDelta?-e.wheelDelta/120:e.detail/3,o=20*t,n=f-d.offset().top+o;n>w&&(n=w),0>n&&(n=0);var r=n/h;return d.attr("style","margin-top: "+-n+"px !important"),u.css({top:r}),!1})},this.show=function(i){if(m.reviewQustion&&a.parent().show(),n.find(".qmr-review-box .quizMaster_button2").show(),!i){d.attr("style","margin-top: 0px !important"),u.css({top:0});var e=d.outerHeight(),t=a.height();p=t-u.height(),l=0,w=e-t,h=w/p,this.reset(),e>100&&u.show(),f=u.offset().top}},this.hide=function(){a.parent().hide()},this.toggle=function(){if(m.reviewQustion){a.parent().toggle(),c.removeClass("quizMaster_reviewQuestionTarget"),n.find(".qmr-review-box .quizMaster_button2").hide(),d.attr("style","margin-top: 0px !important"),u.css({top:0});var i=d.outerHeight(),e=a.height();p=e-u.height(),l=0,w=i-e,h=w/p,i>100&&u.show(),f=u.offset().top}},this.reset=function(){for(var i=0,e=c.length;e>i;i++)Q[i]={};c.removeClass("quizMaster_reviewQuestionTarget").css("background-color","")}},q=new o,x=function(e,t,o,n){var r=!0,a=0,u=i.isArray(t.points),d={},c={singleMulti:function(){var e=n.find(".quizMaster_questionInput").attr("disabled","disabled"),o=t.diffMode;n.children().each(function(n){var d=i(this),c=d.data("pos"),p=e.eq(n).is(":checked");t.correct[c]?(p?u&&(o?a=t.points[c]:a+=t.points[c]):r=!1,t.disCorrect?r=!0:s.methode.marker(d,!0)):p?(t.disCorrect?r=!0:(s.methode.marker(d,!1),r=!1),o&&(a=t.points[c])):u&&!o&&(a+=t.points[c])})},sort_answer:function(){var e=n.children();e.each(function(e,o){var n=i(this);d[e]=n.data("pos"),e==n.data("pos")?(s.methode.marker(n,!0),u&&(a+=t.points[e])):(s.methode.marker(n,!1),r=!1)}),e.children().css({"box-shadow":"0 0",cursor:"auto"}),n.sortable("destroy"),e.sort(function(e,t){return i(e).data("pos")>i(t).data("pos")?1:-1}),n.append(e)},matrix_sort_answer:function(){var e=n.children(),c=new Array;d={0:-1},e.each(function(){var e=i(this),o=e.data("pos"),n=e.find(".quizMaster_maxtrixSortCriterion"),p=n.children();p.length&&(d[o]=p.data("pos")),p.length&&i.inArray(String(o),String(p.data("correct")).split(","))>=0?(s.methode.marker(n,!0),u&&(a+=t.points[o])):(r=!1,s.methode.marker(n,!1)),c[o]=n}),s.methode.resetMatrix(o),o.find(".quizMaster_sortStringItem").each(function(){var e=c[i(this).data("pos")];void 0!=e&&e.append(this)}).css({"box-shadow":"0 0",cursor:"auto"}),o.find(".quizMaster_sortStringList, .quizMaster_maxtrixSortCriterion").sortable("destroy")},free_answer:function(){var e=n.children(),o=e.find(".quizMaster_questionInput").attr("disabled","disabled").val();i.inArray(i.trim(o).toLowerCase(),t.correct)>=0?s.methode.marker(e,!0):(s.methode.marker(e,!1),r=!1)},fill_blank:function(){n.find(".quizMaster_cloze").each(function(e,o){var n=i(this),d=n.children(),c=d.eq(0),p=d.eq(1),l=s.methode.cleanupCurlyQuotes(c.val());i.inArray(l,t.correct[e])>=0?(u&&(a+=t.points[e]),m.disabledAnswerMark||c.css("background-color","#B0DAB0")):(m.disabledAnswerMark||c.css("background-color","#FFBABA"),r=!1,p.show()),c.attr("disabled","disabled")})},assessment_answer:function(){r=!0;var e=n.find(".quizMaster_questionInput").attr("disabled","disabled"),t=0;e.filter(":checked").each(function(){t+=parseInt(i(this).val())}),a=t}};return c[e](),!u&&r&&(a=t.points),{c:r,p:a,s:d}},k=new function(){var e={isEmpty:function(e){return e=i.trim(e),!e||0===e.length}},t={TEXT:0,TEXTAREA:1,NUMBER:2,CHECKBOX:3,EMAIL:4,YES_NO:5,DATE:6,SELECT:7,RADIO:8};this.checkForm=function(){var o=!0;return n.find(".quizMaster_forms input, .quizMaster_forms textarea, .quizMaster_forms .quizMaster_formFields, .quizMaster_forms select").each(function(){var n=i(this),r=1==n.data("required"),s=n.data("type"),a=!0,u=i.trim(n.val());switch(s){case t.TEXT:case t.TEXTAREA:case t.SELECT:r&&(a=!e.isEmpty(u));break;case t.NUMBER:(r||!e.isEmpty(u))&&(a=!e.isEmpty(u)&&!isNaN(u));break;case t.EMAIL:(r||!e.isEmpty(u))&&(a=!e.isEmpty(u)&&new RegExp(/^[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/).test(u));break;case t.CHECKBOX:r&&(a=n.is(":checked"));break;case t.YES_NO:case t.RADIO:r&&(a=void 0!==n.find('input[type="radio"]:checked').val());break;case t.DATE:var d=0,c=0;n.find("select").each(function(){d++,c+=e.isEmpty(i(this).val())?0:1}),(r||c>0)&&(a=d==c)}a?n.siblings(".quizMaster_invalidate").hide():(o=!1,n.siblings(".quizMaster_invalidate").show())}),o},this.getFormData=function(){var e={};return n.find(".quizMaster_forms input, .quizMaster_forms textarea, .quizMaster_forms .quizMaster_formFields, .quizMaster_forms select").each(function(){var o=i(this),n=o.data("form_id"),r=o.data("type");switch(r){case t.TEXT:case t.TEXTAREA:case t.SELECT:case t.NUMBER:case t.EMAIL:e[n]=o.val();break;case t.CHECKBOX:e[n]=o.is(":checked")?1:0;break;case t.YES_NO:case t.RADIO:e[n]=o.find('input[type="radio"]:checked').val();break;case t.DATE:e[n]={day:o.find('select[name="quizMaster_field_'+n+'_day"]').val(),month:o.find('select[name="quizMaster_field_'+n+'_month"]').val(),year:o.find('select[name="quizMaster_field_'+n+'_year"]').val()}}}),e}},S=function(e){n.find(".quizMaster_questionList").each(function(){var t=i(this),o=t.data("question_id"),n=t.data("type"),r={};if("single"==n||"multiple"==n)t.find(".quizMaster_questionListItem").each(function(){r[i(this).data("pos")]=+i(this).find(".quizMaster_questionInput").is(":checked")});else if("free_answer"==n)r[0]=t.find(".quizMaster_questionInput").val();else{if("sort_answer"==n)return!0;if("matrix_sort_answer"==n)return!0;if("fill_blank"==n){var s=0;t.find(".quizMaster_cloze input").each(function(){r[s++]=i(this).val()})}else"assessment_answer"==n&&(r[0]="",t.find(".quizMaster_questionInput:checked").each(function(){r[i(this).data("index")]=i(this).val()}))}e[o].data=r})};s.methode={parseBitOptions:function(){if(r.bo){m.randomAnswer=1&r.bo,m.randomQuestion=2&r.bo,m.disabledAnswerMark=4&r.bo,m.checkBeforeStart=8&r.bo,m.preview=16&r.bo,m.isAddAutomatic=64&r.bo,m.reviewQustion=128&r.bo,m.quizSummeryHide=256&r.bo,m.skipButton=512&r.bo,m.autoStart=1024&r.bo,m.forcingQuestionSolve=2048&r.bo,m.hideQuestionPositionOverview=4096&r.bo,m.formActivated=8192&r.bo,m.maxShowQuestion=16384&r.bo,m.sortCategories=32768&r.bo;var i=32&r.bo;i&&void 0!=jQuery.support&&void 0!=jQuery.support.cors&&0==jQuery.support.cors&&(m.cors=i)}},setClozeStyle:function(){n.find(".quizMaster_cloze input").each(function(){for(var e=i(this),t="",o=e.data("wordlen"),n=0;o>n;n++)t+="w";var r=i(document.createElement("span")).css("visibility","hidden").text(t).appendTo(i("body")),s=r.width();r.remove(),e.width(s+5)})},parseTime:function(i){var e=parseInt(i%60),t=parseInt(i/60%60),o=parseInt(i/3600%24);return e=(e>9?"":"0")+e,t=(t>9?"":"0")+t,o=(o>9?"":"0")+o,o+":"+t+":"+e},cleanupCurlyQuotes:function(e){return e=e.replace(/\u2018/,"'"),e=e.replace(/\u2019/,"'"),e=e.replace(/\u201C/,'"'),e=e.replace(/\u201D/,'"'),i.trim(e).toLowerCase()},resetMatrix:function(e){e.each(function(){var e=i(this),t=e.find(".quizMaster_sortStringList");e.find(".quizMaster_sortStringItem").each(function(){t.append(i(this))})})},marker:function(i,e){m.disabledAnswerMark||(e?i.addClass("quizMaster_answerCorrect"):i.addClass("quizMaster_answerIncorrect"))},startQuiz:function(e){if(w.loadLock)return void(w.isQuizStart=1);if(w.isQuizStart=0,w.isLocked)return v.quizStartPage.hide(),void n.find(".qm-locked").show();if(w.isPrerequisite)return v.quizStartPage.hide(),void n.find(".quizMaster_prerequisite").show();if(w.isUserStartLocked)return v.quizStartPage.hide(),void n.find(".qm-lock-box").show();if(m.maxShowQuestion&&!e)return v.quizStartPage.hide(),n.find(".quizMaster_loadQuiz").show(),void s.methode.loadQuizDataAjax(!0);if(!m.formActivated||r.formPos!=_.START||k.checkForm()){switch(s.methode.loadQuizData(),m.randomQuestion&&s.methode.random(v.questionList),m.randomAnswer&&s.methode.random(n.find(Q.questionList)),m.sortCategories&&s.methode.sortCategories(),s.methode.random(n.find(".quizMaster_sortStringList")),s.methode.random(n.find('[data-type="sort_answer"]')),n.find(".quizMaster_listItem").each(function(e,t){var o=i(this);o.find(".quizMaster_question_page span:eq(0)").text(e+1),o.find("> h5 span").text(e+1),o.find(".quizMaster_questionListItem").each(function(e,t){i(this).find("> span:not(.quizMaster_cloze)").text(e+1+". ")})}),v.next=n.find(Q.next),r.mode){case 3:n.find('input[name="checkSingle"]').show();break;case 2:n.find(Q.check).show(),!m.skipButton&&m.reviewQustion&&n.find(Q.skip).show();break;case 1:n.find('input[name="back"]').slice(1).show();case 0:v.next.show()}(m.hideQuestionPositionOverview||3==r.mode)&&n.find(".quizMaster_question_page").hide();var o=v.next.last();l=o.val(),o.val(r.lbn);var h=v.questionList.children();if(v.listItems=n.find(".quizMaster_list > li"),3==r.mode)s.methode.showSinglePage(0);else{c=h.eq(0).show();var f=c.find(Q.questionList).data("question_id");q.questionStart(f)}q.startQuiz(),n.find(".quizMaster_sortable").parents("ul").sortable({update:function(e,t){var o=i(this).parents(".quizMaster_listItem");n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:!0}})}}).disableSelection(),n.find(".quizMaster_sortStringList, .quizMaster_maxtrixSortCriterion").sortable({connectWith:".quizMaster_maxtrixSortCriterion:not(:has(li)), .quizMaster_sortStringList",placeholder:"quizMaster_placehold",update:function(e,t){var o=i(this).parents(".quizMaster_listItem");n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:!0}})}}).disableSelection(),p=[],P.start(),d=+new Date,a={comp:{points:0,correctQuestions:0,quizTime:0}},n.find(".quizMaster_questionList").each(function(){var e=i(this).data("question_id");a[e]={time:0,solved:0}}),u={},i.each(t.catPoints,function(i,e){u[i]=0}),v.quizStartPage.hide(),n.find(".quizMaster_loadQuiz").hide(),v.quiz.show(),g.show(),3!=r.mode&&n.trigger({type:"changeQuestion",values:{item:c,index:c.index()}})}},showSingleQuestion:function(i){var e=i?Math.ceil(i/r.qpp):1;this.showSinglePage(e)},showSinglePage:function(i){if($listItem=v.questionList.children().hide(),!r.qpp)return void $listItem.show();i=i?+i:1;var e=Math.ceil(n.find(".quizMaster_list > li").length/r.qpp);if(!(i>e)){var t=n.find(Q.singlePageLeft).hide(),o=n.find(Q.singlePageRight).hide(),a=n.find('input[name="checkSingle"]').hide();i>1&&t.val(t.data("text").replace(/%d/,i-1)).show(),i==e?a.show():o.val(o.data("text").replace(/%d/,i+1)).show(),f=i;var u=r.qpp*(i-1);$listItem.slice(u,u+r.qpp).show(),s.methode.scrollTo(v.quiz)}},nextQuestion:function(){this.showQuestionObject(c.next())},prevQuestion:function(){this.showQuestionObject(c.prev())},showQuestion:function(i){var e=v.listItems.eq(i);return 3==r.mode||h?(r.qpp&&s.methode.showSingleQuestion(i+1),s.methode.scrollTo(e,1),void q.startQuiz()):void this.showQuestionObject(e)},showQuestionObject:function(i){if(!i.length&&m.forcingQuestionSolve&&m.quizSummeryHide&&m.reviewQustion)for(var e=0,t=n.find(".quizMaster_listItem").length;t>e;e++)if(!p[e])return alert(QuizMasterGlobal.questionsNotSolved),!1;if(c.hide(),c=i.show(),s.methode.scrollTo(v.quiz),n.trigger({type:"changeQuestion",values:{item:c,index:c.index()}}),c.length){var o=c.find(Q.questionList).data("question_id");q.questionStart(o)}else s.methode.showQuizSummary()},skipQuestion:function(){n.trigger({type:"skipQuestion",values:{item:c,index:c.index()}}),s.methode.nextQuestion()},reviewQuestion:function(){n.trigger({type:"reviewQuestion",values:{item:c,index:c.index()}})},showQuizSummary:function(){if(q.questionStop(),q.stopQuiz(),m.quizSummeryHide||!m.reviewQustion)return void(m.formActivated&&r.formPos==_.END?(g.hide(),v.quiz.hide(),s.methode.scrollTo(n.find(".qm-info-page").show())):s.methode.finishQuiz());var e=n.find(".qm-check-page");e.find("ol:eq(0)").empty().append(n.find(".quizMaster_reviewQuestion ol li").clone().removeClass("quizMaster_reviewQuestionTarget")).children().click(function(t){e.hide(),v.quiz.show(),g.show(!0),s.methode.showQuestion(i(this).index())});for(var t=0,o=0,a=p.length;a>o;o++)p[o]&&t++;e.find("span:eq(0)").text(t),g.hide(),v.quiz.hide(),e.show(),s.methode.scrollTo(e)},finishQuiz:function(e){q.questionStop(),q.stopQuiz(),P.stop();var t=(+new Date-d)/1e3;t=r.timelimit&&t>r.timelimit?r.timelimit:t,n.find(".quizMaster_quiz_time span").text(s.methode.parseTime(t)),e&&v.results.find(".qm-time-limit_expired").show(),s.methode.checkQuestion(v.questionList.children(),!0),n.find(".quizMaster_correct_answer").text(a.comp.correctQuestions),a.comp.result=Math.round(a.comp.points/r.globalPoints*100*100)/100,a.comp.solved=0;var o=n.find(".quizMaster_points span");o.eq(0).text(a.comp.points),o.eq(1).text(r.globalPoints),o.eq(2).text(a.comp.result+"%");var u=n.find(".qm-results-boxList > li").eq(s.methode.findResultIndex(a.comp.result)),c=k.getFormData();u.find(".quizMaster_resultForm").each(function(){var e=i(this),t=e.data("form_id"),o=c[t];"object"==typeof o&&(o=o.day+"-"+o.month+"-"+o.year),e.text(o).show()}),u.show(),s.methode.setAverageResult(a.comp.result,!1),this.setCategoryOverview(),s.methode.sendCompletedQuiz(),m.isAddAutomatic&&z.isUser&&s.methode.addToplist(),g.hide(),n.find(".qm-check-page, .qm-info-page").hide(),v.quiz.hide(),v.results.show(),s.methode.scrollTo(v.results)},setCategoryOverview:function(){a.comp.cats={},n.find(".quizMaster_catOverview li").each(function(){var e=i(this),t=e.data("category_id");if(void 0===r.catPoints[t])return e.hide(),!0;var o=Math.round(u[t]/r.catPoints[t]*100*100)/100;a.comp.cats[t]=o,e.find(".quizMaster_catPercent").text(o+"%"),e.show()})},questionSolved:function(i){p[i.values.index]=i.values.solved;var e=i.values.item.find(Q.questionList),t=r.json[e.data("question_id")];a[t.id].solved=Number(i.values.fake?a[t.id].solved:i.values.solved)},sendCompletedQuiz:function(){if(!m.preview){S(a);var i=k.getFormData();s.methode.ajax({action:"quizmaster_admin_ajax",func:"completedQuiz",data:{quizId:r.quizId,results:a,forms:i}})}},findResultIndex:function(i){for(var e=r.resultsGrade,t=-1,o=999999,n=0;n<e.length;n++){var s=e[n];i>=s&&o>i-s&&(o=i-s,t=n)}return t},showQustionList:function(){h=!h,v.toplistShowInButton.hide(),v.quiz.toggle(),n.find(".quizMaster_QuestionButton").hide(),v.questionList.children().show(),g.toggle(),n.find(".quizMaster_question_page").hide()},random:function(e){e.each(function(){var e=i(this).children().get().sort(function(){return Math.round(Math.random())-.5});i(e).appendTo(e[0].parentNode)})},sortCategories:function(){var e=i(".quizMaster_list").children().get().sort(function(e,t){var o=i(e).find(".quizMaster_questionList").data("question_id"),n=i(t).find(".quizMaster_questionList").data("question_id");return r.json[o].catId-r.json[n].catId});i(e).appendTo(e[0].parentNode)},restartQuiz:function(){v.results.hide(),v.quizStartPage.show(),v.questionList.children().hide(),v.toplistShowInButton.hide(),g.hide(),n.find(".quizMaster_questionInput, .quizMaster_cloze input").removeAttr("disabled").removeAttr("checked").css("background-color",""),n.find('.quizMaster_questionListItem input[type="text"]').val(""),n.find(".quizMaster_answerCorrect, .quizMaster_answerIncorrect").removeClass("quizMaster_answerCorrect quizMaster_answerIncorrect"),n.find(".quizMaster_listItem").data("check",!1),n.find(".quizMaster_response").hide().children().hide(),s.methode.resetMatrix(n.find(".quizMaster_listItem")),n.find(".quizMaster_sortStringItem, .quizMaster_sortable").removeAttr("style"),n.find(".quizMaster_clozeCorrect, .quizMaster_QuestionButton, .qm-results-boxList > li").hide(),n.find('.quizMaster_question_page, input[name="tip"]').show(),n.find(".quizMaster_resultForm").text("").hide(),v.results.find(".qm-time-limit_expired").hide(),v.next.last().val(l),h=!1},checkQuestion:function(e,t){e=void 0==e?c:e,e.each(function(){var e=i(this),o=e.find(Q.questionList),s=r.json[o.data("question_id")],d=s.type;if(q.questionStop(),e.data("check"))return!0;("single"==s.type||"multiple"==s.type)&&(d="singleMulti");var c=x(d,s,e,o);e.find(".quizMaster_response").show(),e.find(Q.check).hide(),e.find(Q.skip).hide(),e.find(Q.next).show(),a[s.id].points=c.p,a[s.id].correct=Number(c.c),a[s.id].data=c.s,a.comp.points+=c.p,u[s.catId]+=c.p,c.c?(e.find(".quizMaster_correct").show(),a.comp.correctQuestions+=1):e.find(".quizMaster_incorrect").show(),e.find(".quizMaster_responsePoints").text(c.p),e.data("check",!0),t||n.trigger({type:"questionSolved",values:{item:e,index:e.index(),solved:!0,fake:!0}})})},showTip:function(){var e=i(this),t=e.siblings(".quizMaster_question").find(Q.questionList).data("question_id");e.siblings(".quizMaster_tipp").toggle("fast"),a[t].tip=1,i(document).bind("mouseup.tipEvent",function(e){var t=n.find(".quizMaster_tipp"),o=n.find('input[name="tip"]');t.is(e.target)||0!=t.has(e.target).length||o.is(e.target)||(t.hide("fast"),i(document).unbind(".tipEvent"))})},ajax:function(e,t,o){o=o||"json",m.cors&&(jQuery.support.cors=!0),i.post(QuizMasterGlobal.ajaxurl,e,t,o),m.cors&&(jQuery.support.cors=!1)},checkQuizLock:function(){w.loadLock=1,s.methode.ajax({action:"quizmaster_admin_ajax",func:"quizCheckLock",data:{quizId:r.quizId}},function(i){void 0!=i.lock&&(w.isLocked=i.lock.is,i.lock.pre&&n.find('input[name="restartQuiz"]').hide()),void 0!=i.prerequisite&&(w.isPrerequisite=1,n.find(".quizMaster_prerequisite span").text(i.prerequisite)),void 0!=i.startUserLock&&(w.isUserStartLocked=i.startUserLock),w.loadLock=0,w.isQuizStart&&s.methode.startQuiz()})},loadQuizData:function(){s.methode.ajax({action:"quizmaster_admin_ajax",func:"loadQuizData",data:{quizId:r.quizId}},function(i){i.toplist&&s.methode.handleToplistData(i.toplist),void 0!=i.averageResult&&s.methode.setAverageResult(i.averageResult,!0)})},setAverageResult:function(i,e){var t=n.find(".quizMaster_resultValue:eq("+(e?0:1)+") > * ");t.eq(1).text(i+"%"),t.eq(0).css("width",240*i/100+"px")},handleToplistData:function(i){var e=n.find(".quizMaster_addToplist"),t=e.find(".quizMaster_addBox").show().children("div");if(i.canAdd)if(e.show(),e.find(".quizMaster_addToplistMessage").hide(),e.find(".quizMaster_toplistButton").show(),z.token=i.token,z.isUser=0,i.userId)t.hide(),z.isUser=1,m.isAddAutomatic&&e.hide();else{t.show();var o=t.children().eq(1);i.captcha?(o.find('input[name="quizMaster_captchaPrefix"]').val(i.captcha.code),o.find(".quizMaster_captchaImg").attr("src",i.captcha.img),o.find('input[name="quizMaster_captcha"]').val(""),o.show()):o.hide()}else e.hide()},scrollTo:function(e,t){var o=e.offset().top-100;(t||(window.pageYOffset||document.body.scrollTop)>o)&&i("html,body").animate({scrollTop:o},300)},addToplist:function(){if(!m.preview){var i=n.find(".quizMaster_addToplistMessage").text(QuizMasterGlobal.loadData).show(),e=n.find(".quizMaster_addBox").hide();s.methode.ajax({action:"quizmaster_admin_ajax",func:"addInToplist",data:{quizId:r.quizId,token:z.token,name:e.find('input[name="quizMaster_toplistName"]').val(),email:e.find('input[name="quizMaster_toplistEmail"]').val(),captcha:e.find('input[name="quizMaster_captcha"]').val(),prefix:e.find('input[name="quizMaster_captchaPrefix"]').val(),points:a.comp.points,totalPoints:r.globalPoints}},function(t){i.text(t.text),t.clear?(e.hide(),s.methode.updateToplist()):e.show(),t.captcha&&(e.find(".quizMaster_captchaImg").attr("src",t.captcha.img),e.find('input[name="quizMaster_captchaPrefix"]').val(t.captcha.code),e.find('input[name="quizMaster_captcha"]').val(""))})}},updateToplist:function(){"function"==typeof quizMaster_fetchToplist&&quizMaster_fetchToplist()},registerSolved:function(){n.find('.quizMaster_questionInput[type="text"]').change(function(e){var t=i(this),o=t.parents(".quizMaster_listItem"),r=!1;""!=t.val()&&(r=!0),n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:r}})}),n.find('.quizMaster_questionList[data-type="single"] .quizMaster_questionInput, .quizMaster_questionList[data-type="assessment_answer"] .quizMaster_questionInput').change(function(e){var t=i(this),o=t.parents(".quizMaster_listItem"),r=this.checked;n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:r}})}),n.find(".quizMaster_cloze input").change(function(){var e=i(this),t=e.parents(".quizMaster_listItem"),o=!0;t.find(".quizMaster_cloze input").each(function(){return""==i(this).val()?(o=!1,!1):void 0}),n.trigger({type:"questionSolved",values:{item:t,index:t.index(),solved:o}})}),n.find('.quizMaster_questionList[data-type="multiple"] .quizMaster_questionInput').change(function(e){var t=i(this),o=t.parents(".quizMaster_listItem"),r=0;o.find('.quizMaster_questionList[data-type="multiple"] .quizMaster_questionInput').each(function(i){this.checked&&r++}),n.trigger({type:"questionSolved",values:{item:o,index:o.index(),solved:r?!0:!1}})})},loadQuizDataAjax:function(e){s.methode.ajax({action:"quizmaster_admin_ajax",func:"quizLoadData",data:{quizId:r.quizId}},function(t){r.globalPoints=t.globalPoints,r.catPoints=t.catPoints,r.json=t.json,v.quiz.remove(),n.find(".quizMaster_quizAnker").after(t.content),v={back:n.find('input[name="back"]'),next:n.find(Q.next),quiz:n.find(".quizMaster_quiz"),questionList:n.find(".quizMaster_list"),results:n.find(".qm-results-box"),quizStartPage:n.find(".qm-start-box"),timelimit:n.find(".qm-time-limit"),toplistShowInButton:n.find(".quizMaster_toplistShowInButton"),listItems:i()},s.methode.initQuiz(),e&&s.methode.startQuiz(!0)})},initQuiz:function(){s.methode.setClozeStyle(),s.methode.registerSolved(),v.next.click(function(){return!m.forcingQuestionSolve||p[c.index()]||!m.quizSummeryHide&&m.reviewQustion?void s.methode.nextQuestion():(alert(QuizMasterGlobal.questionNotSolved),!1)}),v.back.click(function(){s.methode.prevQuestion()}),n.find(Q.check).click(function(){return!m.forcingQuestionSolve||p[c.index()]||!m.quizSummeryHide&&m.reviewQustion?void s.methode.checkQuestion():(alert(QuizMasterGlobal.questionNotSolved),!1)}),n.find('input[name="checkSingle"]').click(function(){if(m.forcingQuestionSolve&&(m.quizSummeryHide||!m.reviewQustion))for(var i=0,e=n.find(".quizMaster_listItem").length;e>i;i++)if(!p[i])return alert(QuizMasterGlobal.questionsNotSolved),!1;s.methode.showQuizSummary()}),n.find('input[name="tip"]').click(s.methode.showTip),n.find('input[name="skip"]').click(s.methode.skipQuestion),n.find('input[name="quizMaster_pageLeft"]').click(function(){s.methode.showSinglePage(f-1)}),n.find('input[name="quizMaster_pageRight"]').click(function(){s.methode.showSinglePage(f+1)})}},s.preInit=function(){s.methode.parseBitOptions(),g.init(),n.find('input[name="startQuiz"]').click(function(){return s.methode.startQuiz(),!1}),m.checkBeforeStart&&!m.preview&&s.methode.checkQuizLock(),n.find('input[name="reShowQuestion"]').click(function(){s.methode.showQustionList()}),n.find('input[name="restartQuiz"]').click(function(){s.methode.restartQuiz()}),n.find('input[name="review"]').click(s.methode.reviewQuestion),n.find('input[name="quizMaster_toplistAdd"]').click(s.methode.addToplist),n.find('input[name="quizSummary"]').click(s.methode.showQuizSummary),n.find('input[name="endQuizSummary"]').click(function(){if(m.forcingQuestionSolve)for(var i=0,e=n.find(".quizMaster_listItem").length;e>i;i++)if(!p[i])return alert(QuizMasterGlobal.questionsNotSolved),!1;(!m.formActivated||r.formPos!=_.END||k.checkForm())&&s.methode.finishQuiz()}),n.find('input[name="endInfopage"]').click(function(){k.checkForm()&&s.methode.finishQuiz()}),n.find('input[name="showToplist"]').click(function(){v.quiz.hide(),v.toplistShowInButton.toggle()}),n.bind("questionSolved",s.methode.questionSolved),m.maxShowQuestion||s.methode.initQuiz(),m.autoStart&&s.methode.startQuiz()},s.preInit()},i.fn.quizMasterFront=function(e){return this.each(function(){void 0==i(this).data("quizMasterFront")&&i(this).data("quizMasterFront",new i.quizMasterFront(this,e))})}}(jQuery);
  • quizmaster/trunk/lib/controller/QuizMaster_Controller_Admin.php

    r1713430 r1717342  
    4040        wp_enqueue_style('jquery-ui',
    4141            'http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.2/themes/smoothness/jquery-ui.css');
     42
     43                wp_enqueue_style( 'quizmaster-admin-css', plugins_url('css/quizmaster-admin.css', QUIZMASTER_FILE), array(), QUIZMASTER_VERSION );
    4244
    4345        $this->localizeScript();
     
    100102
    101103        foreach ($pages as $p) {
    102           add_action('admin_print_scripts-' . $p, array($this, 'enqueueScript'));
     104
    103105          add_action('load-' . $p, array($this, 'routeLoadAction'));
    104106        }
     107
     108                add_action('admin_print_scripts', array($this, 'enqueueScript'));
    105109    }
    106110
  • quizmaster/trunk/lib/controller/QuizMaster_Controller_Ajax.php

    r1671450 r1717342  
    5757            'quizCheckLock' => array('QuizMaster_Controller_Quiz', 'ajaxQuizCheckLock'),
    5858            'registerExtensionScriptCallbacks' => array('QuizMaster_Helper_Extension', 'ajaxRegisterExtensionScriptCallbacks'),
    59 
     59            'checkAnswer' => array('QuizMaster_Helper_CheckAnswers', 'ajaxCheckAnswer'),
    6060    );
    6161
     
    6767      'quizCheckLock' => array('QuizMaster_Controller_Quiz', 'ajaxQuizCheckLock'),
    6868            'registerExtensionScriptCallbacks' => array('QuizMaster_Helper_Extension', 'ajaxRegisterExtensionScriptCallbacks'),
     69            'checkAnswer' => array('QuizMaster_Helper_CheckAnswers', 'ajaxCheckAnswer'),
    6970    );
    7071  }
  • quizmaster/trunk/lib/helper/QuizMaster_Helper_DbUpgrade.php

    r1663661 r1717342  
    476476
    477477                }
    478             } elseif ($row['answer_type'] == 'cloze_answer') {
     478            } elseif ($row['answer_type'] == 'fill_blank') {
    479479                $x = new QuizMaster_Model_AnswerTypes();
    480480
  • quizmaster/trunk/lib/helper/QuizMaster_Helper_Upgrade.php

    r1663661 r1717342  
    5858            SELECT id, answer_data
    5959            FROM {$wpdb->prefix}quizmaster_question
    60             WHERE answer_type = 'cloze_answer' AND answer_points_activated = 1", ARRAY_A);
     60            WHERE answer_type = 'fill_blank' AND answer_points_activated = 1", ARRAY_A);
    6161
    6262        foreach ($results as $row) {
     
    103103
    104104                    foreach ($into as $c) {
    105                         if ($row['answer_type'] == 'cloze_answer') {
     105                        if ($row['answer_type'] == 'fill_blank') {
    106106                            preg_match_all('#\{(.*?)(?:\|(\d+))?(?:[\s]+)?\}#im', $c->getAnswer(), $matches);
    107107
  • quizmaster/trunk/lib/model/QuizMaster_Model_Question.php

    r1671450 r1717342  
    165165     * @return QuizMaster_Model_AnswerTypes[]|null|string
    166166     */
    167     public function getAnswerData($serialize = false) {
    168       if ($this->_answerData === null) {
    169           return null;
    170       }
    171 
    172       if (is_array($this->_answerData) || $this->_answerData instanceof QuizMaster_Model_AnswerTypes) {
    173           if ($serialize) {
    174               return @serialize($this->_answerData);
    175           }
    176       } else {
    177           if (!$serialize) {
    178               if (QuizMaster_Helper_Until::saveUnserialize($this->_answerData, $into) === false) {
    179                   return null;
    180               }
    181 
    182               $this->_answerData = $into;
    183           }
    184       }
    185 
     167    public function getAnswerData() {
    186168      return $this->_answerData;
    187169    }
     
    246228
    247229    public function loadAnswerDataCloze( $fields ) {
    248       $fieldAnswerData['answer'] = $fields['qmqe_cloze_answers'];
     230      $fieldAnswerData['answer'] = $fields['qmqe_fill_blanks'];
    249231      $answerData[] = new QuizMaster_Model_AnswerTypes( $fieldAnswerData );
    250       return $answerData;
    251     }
    252 
    253     public function loadAnswerDataMatrixSortingAnswer( $fields ) {
    254       $fieldAnswerData = $fields['qmqe_matrix_sorting_answers'];
    255       $answerData = array();
    256       foreach( $fieldAnswerData as $fieldAnswer ) {
    257         $fieldAnswer['answer'] = $fieldAnswer['qmqe_matrix_sorting_criterion'];
    258         $fieldAnswer['sort_string'] = $fieldAnswer['qmqe_matrix_sorting_sort_string'];
    259         $answerData[] = new QuizMaster_Model_AnswerTypes( $fieldAnswer );
    260       }
    261232      return $answerData;
    262233    }
     
    317288          $answerData = $this->loadAnswerDataSortingChoice( $fields );
    318289          break;
    319         case 'cloze_answer':
     290        case 'fill_blank':
    320291          $answerData = $this->loadAnswerDataCloze( $fields );
    321292          break;
     
    408379          case 'sort_answer':
    409380            return new QuizMaster_Answer_Sorting;
    410           case 'cloze_answer':
     381          case 'fill_blank':
    411382            return  new QuizMaster_Answer_Fill_Blank;
    412383        }
  • quizmaster/trunk/lib/model/QuizMaster_Model_QuestionMapper.php

    r1663661 r1717342  
    4343      'free_answer'   => 'QuizMaster_Question_Free',
    4444      'sort_answer'   => 'QuizMaster_Question_Sorting',
    45       'cloze_answer'  => 'QuizMaster_Question_FillBlank',
     45      'fill_blank'  => 'QuizMaster_Question_FillBlank',
    4646    );
    4747
  • quizmaster/trunk/lib/model/QuizMaster_Model_Quiz.php

    r1712912 r1717342  
    5858        protected $_staticHeaderMessage;
    5959        protected $_showSkipButton;
     60        protected $_showBackButton;
    6061
    6162    public function setId($_id)
     
    675676        }
    676677
     678        public function setShowBackButton( $_showBackButton ) {
     679            $this->_showBackButton = $_showBackButton;
     680        }
     681
     682        public function isShowBackButton() {
     683            return $this->_showBackButton;
     684        }
     685
    677686    public function fieldGroupKey() {
    678687      return 'quiz';
  • quizmaster/trunk/lib/model/answer_types/QuizMaster_Answer_Sorting.php

    r1671450 r1717342  
    33
    44class QuizMaster_Answer_Sorting extends QuizMaster_Model_Answer {
     5
     6    protected $_answer_id;
    57
    68  public function getKey() {
     
    1921    foreach( $fieldAnswerData as $fieldAnswer ) {
    2022      $answer['answer'] = $fieldAnswer['qmqe_sorting_choice_answer'];
     23            $answer['answer_id'] = $fieldAnswer['qmqe_sorting_choice_answer_id'];
    2124      $answerData[] = new self( $answer );
    2225    }
     26
    2327    return $answerData;
    2428
    2529  }
    2630
     31    public function getAnswerId() {
     32        return $this->_answer_id;
     33    }
     34
     35    public function setAnswerId( $_answer_id ) {
     36        $this->_answer_id = $_answer_id;
     37    }
     38
    2739}
  • quizmaster/trunk/lib/view/QuizMaster_View_FrontQuiz.php

    r1712912 r1717342  
    7777    }
    7878
    79     public function createOption($preview)
    80     {
    81         $bo = 0;
    82 
    83         $bo |= ((int)$this->quiz->isAnswerRandom()) << 0;
    84         $bo |= ((int)$this->quiz->isQuestionRandom()) << 1;
    85         $bo |= ((int)$this->quiz->isDisabledAnswerMark()) << 2;
    86         $bo |= ((int)($this->quiz->isQuizRunOnce() || $this->quiz->isStartOnlyRegisteredUser() )) << 3;
    87         $bo |= ((int)$preview) << 4;
    88         $bo |= ((int)get_option('quizMaster_corsActivated')) << 5;
    89         $bo |= ((int)$this->quiz->isShowReviewQuestion()) << 7;
    90         $bo |= ((int)$this->quiz->isQuizSummaryHide()) << 8;
    91         $bo |= ((int)$this->quiz->isShowSkipButton()) << 9;
    92         $bo |= ((int)$this->quiz->isAutostart()) << 10;
    93         $bo |= ((int)$this->quiz->isForcingQuestionSolve()) << 11;
    94         $bo |= ((int)$this->quiz->isHideQuestionPositionOverview()) << 12;
    95         $bo |= ((int)$this->quiz->isFormActivated()) << 13;
    96         $bo |= ((int)$this->quiz->isShowMaxQuestion()) << 14;
    97         $bo |= ((int)$this->quiz->isSortCategories()) << 15;
    98 
    99         return $bo;
    100     }
    101 
    102     public function showMaxQuestion() {
    103 
    104         $this->loadButtonNames();
    105         $question_count = count($this->question);
    106         $result = $this->quiz->getResultText();
    107 
    108         ?>
    109         <div class="qm-quiz-content" id="quizMaster_<?php echo $this->quiz->getId(); ?>">
    110             <?php
    111 
    112             if (!$this->quiz->isTitleHidden()) {
    113                 echo '<h2>', $this->quiz->getName(), '</h2>';
    114             }
    115 
    116             $this->showTimeLimitBox();
    117             $this->showCheckPageBox($question_count);
    118             $this->showInfoPageBox();
    119             $this->showStartQuizBox();
    120             $this->showLockBox();
    121             $this->showLoadQuizBox();
    122             $this->showStartOnlyRegisteredUserBox();
    123             $this->showResultBox($result, $question_count);
    124             $this->showReviewBox($question_count);
    125             $this->showQuizAnker();
    126             ?>
    127         </div>
    128         <?php
    129 
    130         $bo = $this->createOption(false);
    131 
    132         ?>
    133         <script type="text/javascript">
    134             jQuery(document).ready(function ($) {
    135                 $('#quizMaster_<?php echo $this->quiz->getId(); ?>').quizMasterFront({
    136                     quizId: <?php echo (int)$this->quiz->getId(); ?>,
    137                     mode: <?php echo (int)$this->quiz->getQuizModus(); ?>,
    138                     timelimit: <?php echo (int)$this->quiz->getTimeLimit(); ?>,
    139                     bo: <?php echo $bo ?>,
    140                     qpp: <?php echo $this->quiz->getQuestionsPerPage(); ?>,
    141                     formPos: <?php echo (int)$this->quiz->getFormShowPosition(); ?>,
    142                     lbn: <?php echo json_encode(($this->quiz->isShowReviewQuestion() && !$this->quiz->isQuizSummaryHide()) ? $this->_buttonNames['quiz_summary'] : $this->_buttonNames['finish_quiz']); ?>
    143                 });
    144             });
    145         </script>
    146         <?php
     79    public function createOption() {
     80      $options = array(
     81                'isAnswerRandom' => (int)$this->quiz->isAnswerRandom(),
     82                'isQuestionRandom'  => (int)$this->quiz->isQuestionRandom(),
     83                'isDisabledAnswerMark' => (int)$this->quiz->isDisabledAnswerMark(),
     84                'isQuizRunOnce' => (int)$this->quiz->isQuizRunOnce(),
     85                'isStartOnlyRegisteredUser' => $this->quiz->isStartOnlyRegisteredUser(),
     86                'isCorsActivated' => (int)get_option('quizMaster_corsActivated'),
     87                'isShowReviewQuestion' => (int)$this->quiz->isShowReviewQuestion(),
     88                'isQuizSummaryHide' => (int)$this->quiz->isQuizSummaryHide(),
     89                'isShowSkipButton' => (int)$this->quiz->isShowSkipButton(),
     90                'isAutostart' => (int)$this->quiz->isAutostart(),
     91                'isForcingQuestionSolve' => (int)$this->quiz->isForcingQuestionSolve(),
     92                'isHideQuestionPositionOverview' => (int)$this->quiz->isHideQuestionPositionOverview(),
     93                'isFormActivated' => (int)$this->quiz->isFormActivated(),
     94                'isShowMaxQuestion' => (int)$this->quiz->isShowMaxQuestion(),
     95                'isSortCategories' => (int)$this->quiz->isSortCategories(),
     96                'isShowBackButton' => (int)$this->quiz->isShowBackButton(),
     97            );
     98
     99            print json_encode( $options );
    147100    }
    148101
     
    343296
    344297          // cloze
    345           if ($question->getAnswerType() === 'cloze_answer') {
     298          if ($question->getAnswerType() === 'fill_blank') {
    346299            $clozeData = $question->fetchCloze($v->getAnswer());
    347300            $json[$question->getId()]['correct'] = $clozeData['correct'];
  • quizmaster/trunk/quizmaster.php

    r1713430 r1717342  
    44Plugin URI: http://wordpress.org/extend/plugins/quizmaster
    55Description: Best free quiz plugin for WordPress.
    6 Version: 0.6.5
     6Version: 0.7.0
    77Author: GoldHat Group
    88Author URI: https://goldhat.ca
     
    1212*/
    1313
    14 define('QUIZMASTER_VERSION', '0.6.5');
     14define('QUIZMASTER_VERSION', '0.7.0');
    1515define('QUIZMASTER_DEV', true);
    1616define('QUIZMASTER_PATH', dirname(__FILE__));
     
    5050        $enableCopyPosts = array( 'quizmaster_quiz', 'quizmaster_question' );
    5151        new QuizMaster_Helper_CopyPost( $enableCopyPosts );
     52
     53        add_filter( quizmaster_get_fields_prefix() . '/load_value/name=qmqe_sorting_choice_answer_id', array( $this, 'makeSortingChoiceAnswerId' ), 10, 3 );
     54    }
     55
     56    public function makeSortingChoiceAnswerId( $value ) {
     57
     58        if( $value == '' || strlen( $value ) <= 6 ) {
     59            return quizmasterGenerateRandomString( 12 );
     60        }
     61
     62        return $value;
     63
    5264    }
    5365
  • quizmaster/trunk/readme.txt

    r1713430 r1717342  
    55Requires at least: 4.0
    66Tested up to: 4.3
    7 Stable tag: 0.6.5
     7Stable tag: 0.7.0
    88License: GPLv2 or later
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html
    1010
    11 The best quiz system plugin for WordPress.
     11The most extendable, feature-rich quiz system plugin for WordPress.
    1212
    1313== Description ==
    1414
    15 The best quiz system plugin for WordPress. Highly extendable and developer-friendly. Requires FieldMaster (Free) or ACF Pro. Forked in 2016 from WP Pro Quiz, a free quiz plugin developed by Julius Fischer (http://www.it-gecko.de/).
     15The most extendable, feature-rich quiz system plugin for WordPress. Developer-friendly, customizable and extension based with numerous extensions available to extend the feature set. Requires FieldMaster (Free) or ACF Pro. Forked in 2016 from WP Pro Quiz, a free quiz plugin developed by Julius Fischer (http://www.it-gecko.de/).
    1616
    1717= Features =
     
    4343== Installation ==
    4444
     451. Search for "quizmaster" from your Add New Plugin page in the WP Admin.
     462. Click to install, then activate.
     47
     48OR
     49
    45501. Upload the "quizmaster" folder to the /wp-content/plugins/ directory
    46512. Activate the plugin through the 'Plugins' menu in WordPress
    4752
    4853== Changelog ==
     54
     55= 0.7.0 =
     56
     57Contains a rebuilt front-end JS file with the newly developed QuizMaster jQuery plugin. This file features global event hooks that extension developers can leverage to adapt the quiz flow at run-time.
    4958
    5059= 0.6.5 =
     
    6170We originally included ACF Pro because of it's great UX fields and because it allows us to offer great support for extending the plugin. Developers are able to easily add fields into the UX and there is great consistency in the interface by using ACF. However we were not able to strike a deal with the ACF developer to enable us to embed ACF Pro into the plugin, and QuizMaster already relied on certain pro features including repeater field and options pages. Thus we invented the new fields plugin FieldMaster which is a fork of ACF Pro, and available for free. We recommend using FieldMaster unless you already have ACF Pro installed, because we are bundling additional ACF integration plugins that provide an even better UX, such as collapsing repeater fields.
    6271
     72= How can I customize the front-end UX and style templates? =
     73
     74QuizMaster has a sophisticated templating system similar to that found in most advanced WP plugins such as WooCommerce. Developers may override templates at the theme level simply by creating a directory named "quizmaster" and copying the original template from quizmaster using the same name and/or subfolder. These overrides give you the ability to edit template output. QuizMaster has over 20 of these templates and the vast majority of output comes from them (not from the view layer as in WP Pro Quiz). For other styling changes such as color, fonts etc. use your child theme CSS file or integrated theme style editor. We've eliminated the WP Pro Quiz usage of "!important" declarations so that the styles can be overwritten. Most QuizMaster CSS class names are prefixed with "qm-" but some inconsistency remains at this point in the naming of classes.
     75
    6376== Screenshots ==
    6477
    65 1. Test
     781. Quiz List
     792. Add New Quiz
     803. Email List
     814. Email Editor
     825. Categories & Tags
     836. Main Menu
     847. Quiz Category Editor
     858. Questions List
     869. Quiz Scores List
     8710. Add New Question
     8811. Student Quiz Scores List
    6689
    6790== Credits ==
  • quizmaster/trunk/templates/question/fill_blank.php

    r1671450 r1717342  
    1515  </div>
    1616
    17   <ul class="quizMaster_questionList" data-question_id="<?php echo $question->getId(); ?>"
     17  <ul class="qm-question-list" data-question_id="<?php echo $question->getId(); ?>"
    1818    data-type="<?php echo $question->getAnswerType(); ?>">
    1919
    20     <li class="quizMaster_questionListItem" data-pos="0">
     20    <li class="qm-question-list-item" data-pos="0">
    2121
    2222      <?php
  • quizmaster/trunk/templates/question/free.php

    r1671450 r1717342  
    1717  </div>
    1818
    19   <ul class="quizMaster_questionList" data-question_id="<?php echo $question->getId(); ?>"
     19  <ul class="qm-question-list" data-question_id="<?php echo $question->getId(); ?>"
    2020    data-type="<?php echo $question->getAnswerType(); ?>">
    2121
     
    3030    ?>
    3131
    32     <li class="quizMaster_questionListItem" data-pos="<?php echo $answer_index; ?>">
     32    <li class="qm-question-list-item" data-pos="<?php echo $answer_index; ?>">
    3333      <label>
    3434        <input class="quizMaster_questionInput" type="text"
  • quizmaster/trunk/templates/question/multiple.php

    r1671450 r1717342  
    1515  </div>
    1616
    17     <ul class="quizMaster_questionList" data-question_id="<?php echo $question->getId(); ?>"
    18       data-type="<?php echo $question->getAnswerType(); ?>">
     17  <ul class="qm-question-list" data-question_id="<?php echo $question->getId(); ?>"
     18    data-type="<?php echo $question->getAnswerType(); ?>">
    1919
    20       <?php
    21       $answer_index = 0;
     20    <?php
     21    $answer_index = 0;
    2222
    23       foreach ($question->getAnswerData() as $v) :
    24           $answer_text = $v->isHtml() ? $v->getAnswer() : esc_html($v->getAnswer());
    25           ?>
     23    foreach ($question->getAnswerData() as $v) :
     24        $answer_text = $v->isHtml() ? $v->getAnswer() : esc_html($v->getAnswer());
     25        ?>
    2626
    27           <li class="quizMaster_questionListItem" data-pos="<?php echo $answer_index; ?>">
    28             <span></span>
    29             <label>
    30                 <input class="quizMaster_questionInput"
    31                    type="checkbox"
    32                    name="question_<?php echo $question->getId(); ?>"
    33                    value="<?php echo($answer_index + 1); ?>"> <?php echo $answer_text; ?>
    34             </label>
    35           </li>
     27        <li class="qm-question-list-item" data-pos="<?php echo $answer_index; ?>">
     28          <span></span>
     29          <label>
     30              <input class="quizMaster_questionInput"
     31                 type="checkbox"
     32                 name="question_<?php echo $question->getId(); ?>"
     33                 value="<?php echo($answer_index + 1); ?>"> <?php echo $answer_text; ?>
     34          </label>
     35        </li>
    3636
    37     <?php $answer_index++; endforeach; ?>
     37      <?php $answer_index++; endforeach; ?>
    3838
    3939  </ul>
    4040
    41     </div>
    4241</div>
  • quizmaster/trunk/templates/question/single.php

    r1671450 r1717342  
    1919  </div>
    2020
    21   <ul class="quizMaster_questionList" data-question_id="<?php echo $question->getId(); ?>"
     21  <ul class="qm-question-list" data-question_id="<?php echo $question->getId(); ?>"
    2222    data-type="<?php echo $question->getAnswerType(); ?>">
    2323
     
    3030
    3131
    32         <li class="quizMaster_questionListItem" data-pos="<?php echo $answer_index; ?>">
     32        <li class="qm-question-list-item" data-pos="<?php echo $answer_index; ?>">
    3333          <span></span>
    3434          <label>
  • quizmaster/trunk/templates/question/sorting.php

    r1671450 r1717342  
    99?>
    1010
    11 <div class="quizMaster_question">
     11<div class="qm-question">
    1212
    1313  <div class="qm-question-text">
     
    1515  </div>
    1616
    17   <ul class="quizMaster_questionList" data-question_id="<?php echo $question->getId(); ?>"
     17  <ul class="qm-question-list qm-sortable" data-question_id="<?php echo $question->getId(); ?>"
    1818    data-type="<?php echo $question->getAnswerType(); ?>">
    1919
    2020    <?php
    2121      $answer_index = 0;
    22       foreach ($question->getAnswerData() as $v) :
    23         $answer_text = $v->isHtml() ? $v->getAnswer() : esc_html($v->getAnswer());
     22            $sortingAnswers = $question->getAnswerData();
     23            shuffle( $sortingAnswers );
     24      foreach ( $sortingAnswers as $v ) :
     25        $answer_text = $v->getAnswer();
    2426    ?>
    2527
    26       <li class="quizMaster_questionListItem" data-pos="<?php echo $answer_index; ?>">
    27         <div class="quizMaster_sortable">
    28           <?php echo $answer_text; ?>
    29         </div>
     28      <li class="qm-question-list-item" id="<?php print $v->getAnswerId(); ?>" data-pos="<?php echo $answer_index; ?>">
     29
     30                <?php echo $answer_text; ?>
     31
    3032      </li>
    3133
  • quizmaster/trunk/templates/quiz/body.php

    r1712912 r1717342  
    3232            ?>
    3333
    34 
    3534        </div>
    3635
  • quizmaster/trunk/templates/quiz/button-back.php

    r1671450 r1717342  
    1 <input type="button" name="back" value="<?php _e('Back', 'quizmaster'); ?>"
    2        class="qm-button quizMaster_QuestionButton"
    3        style="float: left !important; margin-right: 10px !important; display: none;">
     1<input type="button" value="<?php _e('Back', 'quizmaster'); ?>" class="qm-back-button qm-button">
  • quizmaster/trunk/templates/quiz/button-hint.php

    r1671450 r1717342  
    1 <input type="button" value="<?php _e('Hint', 'quizmaster'); ?>"
    2        class="qm-hint-trigger qm-button quizMaster_QuestionButton quizMaster_TipButton"
    3        style="float: left !important; display: inline-block; margin-right: 10px !important;">
     1<input type="button" value="<?php _e('Hint', 'quizmaster'); ?>" class="qm-hint-trigger qm-button">
  • quizmaster/trunk/templates/quiz/button-next.php

    r1671450 r1717342  
    1 <input type="button" class="qm-button-next qm-button" value="<?php _e('Next', 'quizmaster'); ?>"
    2        class="qm-button quizMaster_QuestionButton" style="float: right; display: none;">
     1<input type="button" class="qm-button-next qm-button" value="<?php _e('Next', 'quizmaster'); ?>">
  • quizmaster/trunk/templates/quiz/button-skip.php

    r1671450 r1717342  
    1 <input type="button" name="skip" value="<?php _e('Skip', 'quizmaster'); ?>"
    2        class="quizmaster-skip-button qm-button quizMaster_QuestionButton">
     1<input type="button" name="skip" value="<?php _e('Skip', 'quizmaster'); ?>" class="qm-skip-button qm-button">
  • quizmaster/trunk/templates/quiz/check.php

    r1671450 r1717342  
    44
    55    <p>
    6             <?php printf(__('%s of %s questions completed', 'quizmaster'), '<span>0</span>', $questionCount); ?>
     6        <?php printf(__('%s of %s questions completed', 'quizmaster'), '<span>0</span>', $questionCount); ?>
    77    </p>
    88
    9     <p><?php _e('Questions', 'quizmaster'); ?>:</p>
    10 
    11     <div class="quizMaster_box">
    12         <ol>
    13             <?php for ($xy = 1; $xy <= $questionCount; $xy++) { ?>
    14                     <li><?php echo $xy; ?></li>
    15             <?php } ?>
    16         </ol>
    17     </div>
    18 
    19     <?php
    20         if ($view->quiz->isFormActivated() && $view->quiz->getFormShowPosition() == QuizMaster_Model_Quiz::QUIZ_FORM_POSITION_END
    21                 && ($view->quiz->isShowReviewQuestion() && !$view->quiz->isQuizSummaryHide())
    22         ) {
    23     ?>
    24 
    25         <h4 class="quizMaster_header"><?php _e('Information', 'quizmaster'); ?></h4>
    26 
    27     <?php } ?>
    28 
    29     <input type="button" name="endQuizSummary" value="<?php echo $view->_buttonNames['finish_quiz']; ?>" class="qm-button">
    30 
    319</div>
  • quizmaster/trunk/templates/quiz/footer.php

    r1712912 r1717342  
    99                }
    1010
    11                 ?>
     11                print quizmaster_get_template( 'quiz/button-back.php' );
     12
     13            ?>
    1214
    1315        </div>
     
    1618            <?php print quizmaster_get_template( 'quiz/button-check.php' ); ?>
    1719            <?php print quizmaster_get_template( 'quiz/button-next.php' ); ?>
     20            <?php print quizmaster_get_template( 'quiz/button-finish.php' ); ?>
    1821
    1922        </div>
  • quizmaster/trunk/templates/quiz/loader.php

    r1671450 r1717342  
    3434</div>
    3535
    36 <?php
     36<script type="text/javascript">
     37        jQuery(document).ready(function ($) {
    3738
    38 $bo = $view->createOption($view->preview);
     39            $('#quizMaster_<?php echo $view->quiz->getId(); ?>').quizmaster({
    3940
    40 ?>
     41                quizId: <?php echo (int)$view->quiz->getId(); ?>,
     42                mode: <?php echo (int)$view->quiz->getQuizModus(); ?>,
     43                globalPoints: <?php echo (int)$quizData['globalPoints']; ?>,
     44                timeLimit: <?php echo (int)$view->quiz->getTimeLimit(); ?>,
     45                options: <?php echo $view->createOption(); ?>,
     46                qpp: <?php echo $view->quiz->getQuestionsPerPage(); ?>,
     47                catPoints: <?php echo json_encode($quizData['catPoints']); ?>,
     48                formPos: <?php echo (int)$view->quiz->getFormShowPosition(); ?>,
     49                showReviewBox: 0,
     50                lbn: <?php echo json_encode(($view->quiz->isShowReviewQuestion() && !$view->quiz->isQuizSummaryHide()) ? $view->_buttonNames['quiz_summary'] : $view->_buttonNames['finish_quiz']); ?>,
     51                json: <?php echo json_encode($quizData['json']); ?>
    4152
    42 <script type="text/javascript">
     53            });
    4354
    44   window.quizmasterQuizRegistry = window.quizmasterQuizRegistry || [];
    45 
    46   window.quizmasterQuizRegistry.push({
    47     id: '#quizMaster_<?php echo $view->quiz->getId(); ?>',
    48     init: {
    49       quizId: <?php echo (int)$view->quiz->getId(); ?>,
    50       mode: <?php echo (int)$view->quiz->getQuizModus(); ?>,
    51       globalPoints: <?php echo (int)$quizData['globalPoints']; ?>,
    52       timelimit: <?php echo (int)$view->quiz->getTimeLimit(); ?>,
    53       bo: <?php echo $bo ?>,
    54       qpp: <?php echo $view->quiz->getQuestionsPerPage(); ?>,
    55       catPoints: <?php echo json_encode($quizData['catPoints']); ?>,
    56       formPos: <?php echo (int)$view->quiz->getFormShowPosition(); ?>,
    57       lbn: <?php echo json_encode(($view->quiz->isShowReviewQuestion() && !$view->quiz->isQuizSummaryHide()) ? $view->_buttonNames['quiz_summary'] : $view->_buttonNames['finish_quiz']); ?>,
    58       json: <?php echo json_encode($quizData['json']); ?>
    59     }
    60   });
    61 
     55        });
    6256</script>
  • quizmaster/trunk/templates/quiz/question-buttons.php

    r1671450 r1717342  
    1010<?php
    1111
    12 print quizmaster_get_template( 'quiz/button-back.php' );
    13 
    14   if ($question->isTipEnabled()) {
    15         // @TODO make this question setting work outside question
    16     print quizmaster_get_template( 'quiz/button-hint.php' );
    17   }
     12if ($question->isTipEnabled()) {
     13    // @TODO make this question setting work outside question
     14  print quizmaster_get_template( 'quiz/button-hint.php' );
     15}
    1816
    1917?>
  • quizmaster/trunk/templates/quiz/question-item.php

    r1671450 r1717342  
    88    ?>
    99
    10     <li class="quizMaster_listItem" style="display: none;">
     10    <li class="quizMaster_listItem" style="display: none;" data-pos="<?php print $index; ?>">
    1111
    1212        <div class="quizMaster_question_page" <?php $view->isDisplayNone($view->quiz->getQuizModus() != QuizMaster_Model_Quiz::QUIZ_MODUS_SINGLE && !$view->quiz->isHideQuestionPositionOverview()); ?> >
  • quizmaster/trunk/templates/quiz/review.php

    r1671450 r1717342  
    1 <div class="qmr-review-box qm-hidden">
     1<div class="qm-review-box qm-hidden">
    22
    33    <div class="quizMaster_reviewQuestion">
    44        <ol>
    55            <?php for ($xy = 1; $xy <= $questionCount; $xy++) { ?>
    6                     <div></div>
    76                    <li>
    87                        <?php echo $xy; ?>
     
    2625    </div>
    2726
    28         <!-- Question Review -->
    29         <div>
    30             <?php if ($view->quiz->getQuizModus() != QuizMaster_Model_Quiz::QUIZ_MODUS_SINGLE) { ?>
    31                 <input type="button" name="review" value="<?php _e('Review question', 'quizmaster'); ?>" class="qm_button">
    32                 <?php if (!$view->quiz->isQuizSummaryHide()) { ?>
    33                     <input type="button" name="quizSummary" value="<?php echo $view->_buttonNames['quiz_summary']; ?>" class="qm-button">
    34                 <?php } ?>
     27    <!-- Question Review -->
     28    <div>
     29        <?php if ($view->quiz->getQuizModus() != QuizMaster_Model_Quiz::QUIZ_MODUS_SINGLE) { ?>
     30            <input type="button" name="review" value="<?php _e('Review question', 'quizmaster'); ?>" class="qm_button">
     31            <?php if (!$view->quiz->isQuizSummaryHide()) { ?>
     32                <input type="button" name="quizSummary" value="<?php echo $view->_buttonNames['quiz_summary']; ?>" class="qm-button">
    3533            <?php } ?>
    36         </div>
     34        <?php } ?>
     35    </div>
    3736
    3837</div>
Note: See TracChangeset for help on using the changeset viewer.