File: /var/www/epamokos.kaunokolegija.lt/wp-content/plugins/lifterlms/assets/maps/js/llms-quiz.min.js.map
{"version":3,"file":"../../js/llms-quiz.min.js","sources":["llms-quiz.js"],"sourcesContent":[";/* global LLMS, $ */\n/* jshint strict: true */\n\n/**\n * Front End Quiz Class.\n *\n * @type {Object}\n *\n * @since 1.0.0\n * @version 7.8.0\n */( function( $ ) {\n\n\tvar quiz = {\n\n\t\t/**\n\t\t * Selector of all the available button elements\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\t$buttons: null,\n\n\t\t/**\n\t\t * Main Question Container Element.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\t$container: null,\n\n\t\t/**\n\t\t * Main Quiz container UI element.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\t$ui: null,\n\n\t\t/**\n\t\t * Attempt key for the current quiz.\n\t\t *\n\t\t * @type {[type]}\n\t\t */\n\t\tattempt_key: null,\n\n\t\t/**\n\t\t * Question ID of the current question.\n\t\t *\n\t\t * @type {Number}\n\t\t */\n\t\tcurrent_question: 0,\n\n\t\t/**\n\t\t * Total number of questions in the current quiz.\n\t\t *\n\t\t * @type {Number}\n\t\t */\n\t\ttotal_questions: 0,\n\n\t\t/**\n\t\t * Object of quiz question HTML.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tquestions: {},\n\n\t\t/**\n\t\t * Validator functions for question type.\n\t\t * Third party custom question types can register validators for use when answering questions.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tvalidators: {},\n\n\t\t/**\n\t\t * Records current status of a quiz session.\n\t\t * If a user attempts to navigate away from a quiz\n\t\t * while taking the quiz they'll be warned that their progress\n\t\t * will not be saved if this status is not null.\n\t\t *\n\t\t * @type {Bool}\n\t\t */\n\t\tstatus: null,\n\n\t\t/**\n\t\t * Records if the quiz can be resumed.\n\t\t */\n\t\tresumable: null,\n\n\t\t/**\n\t\t * Flag if the user is exiting the quiz.\n\t\t */\n\t\texiting_quiz: false,\n\n\t\t/**\n\t\t * Bind DOM events.\n\t\t *\n\t\t * @since 1.0.0\n\t\t * @since 3.16.6 Unknown.\n\t\t * @since 7.8.0 Add quiz resume and hide leave warning if quiz is resumable.\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tbind: function() {\n\n\t\t\tvar self = this;\n\n\t\t\t// Start quiz.\n\t\t\t$( '#llms_start_quiz' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.start_quiz();\n\t\t\t} );\n\n\t\t\t// Resume quiz.\n\t\t\t$( '#llms_resume_quiz' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.resume_quiz();\n\t\t\t} );\n\n\t\t\t// Draw quiz grade circular chart.\n\t\t\t$( '.llms-donut' ).each( function() {\n\t\t\t\tLLMS.Donut( $( this ) );\n\t\t\t} );\n\n\t\t\t// Redirect to attempt on attempt selection change.\n\t\t\t$( '#llms-quiz-attempt-select' ).on( 'change', function() {\n\t\t\t\tvar val = $( this ).val();\n\t\t\t\tif ( val ) {\n\t\t\t\t\twindow.location.href = val;\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t// Warn when quiz is running and user tries to leave the page when quiz is not resumable.\n\t\t\t$( window ).on( 'beforeunload', function() {\n\t\t\t\tif ( self.status && ! self.exiting_quiz ) {\n\t\t\t\t\treturn LLMS.l10n.translate( 'Are you sure you wish to quit this quiz attempt?' );\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t} );\n\n\t\t\t// Complete the quiz attempt when user leaves if the quiz is running.\n\t\t\t$( window ).on( 'unload', function() {\n\t\t\t\tif ( self.status && ! self.resumable ) {\n\t\t\t\t\tself.complete_quiz();\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\t$( document ).on( 'llms-post-append-question', self.post_append_question );\n\n\t\t\t// Register validators.\n\t\t\tthis.register_validator( 'content', this.validate );\n\t\t\tthis.register_validator( 'choice', this.validate_choice );\n\t\t\tthis.register_validator( 'picture_choice', this.validate_choice );\n\t\t\tthis.register_validator( 'true_false', this.validate_choice );\n\n\t\t},\n\n\t\t/**\n\t\t * Add an error message to the UI\n\t\t *\n\t\t * @param string msg error message string\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tadd_error: function( msg ) {\n\n\t\t\tvar self = this;\n\n\t\t\tself.$container.find( '.llms-error' ).remove();\n\t\t\tvar $err = $( '<p class=\"llms-error\">' + msg + '<a href=\"#\"><i class=\"fa fa-times-circle\" aria-hidden=\"true\"></i></a></p>' );\n\t\t\t$err.on( 'click', 'a', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\t$err.fadeOut( '200' );\n\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t$err.remove();\n\t\t\t\t}, 210 );\n\t\t\t} );\n\t\t\tself.$container.append( $err );\n\n\t\t},\n\n\t\tsave_question: function( options ) {\n\t\t\tvar self = this,\n\t\t\t\t$question = this.$container.find( '.llms-question-wrapper' ),\n\t\t\t\ttype = $question.attr( 'data-type' ),\n\t\t\t\tvalid;\n\n\t\t\tif ( ! this.validators[ type ] ) {\n\t\t\t\tconsole.log( 'No validator registered for question type ' + type );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvalid = this.validators[ type ]( $question );\n\n\t\t\tvar requestData = {\n\t\t\t\taction: 'quiz_answer_question',\n\t\t\t\tanswer: valid.answer,\n\t\t\t\tattempt_key: self.attempt_key,\n\t\t\t\tquestion_id: $question.attr( 'data-id' ),\n\t\t\t\tquestion_type: $question.attr( 'data-type' ),\n\t\t\t};\n\n\t\t\tif ( options && options.exit_quiz ) {\n\t\t\t\trequestData.via_exit_quiz = true;\n\t\t\t}\n\n\t\t\tif ( options && options.previous_question ) {\n\t\t\t\trequestData.via_previous_question = true;\n\t\t\t}\n\n\t\t\tLLMS.Ajax.call( {\n\t\t\t\tdata: requestData,\n\t\t\t\tsuccess: function( r ) {\n\t\t\t\t\tif (options && typeof options.callback === 'function') {\n\t\t\t\t\t\toptions.callback();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Answer a Question\n\t\t *\n\t\t * @param obj $btn jQuery object for the \"Next Lesson\" button\n\t\t * @return void\n\t\t * @since 1.0.0\n\t\t * @version 3.16.6\n\t\t */\n\t\tanswer_question: function( $btn ) {\n\n\t\t\tvar self = this,\n\t\t\t\t$question = this.$container.find( '.llms-question-wrapper' ),\n\t\t\t\ttype = $question.attr( 'data-type' ),\n\t\t\t\tvalid;\n\n\t\t\tif ( ! this.validators[ type ] ) {\n\n\t\t\t\tconsole.log( 'No validator registered for question type ' + type );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvalid = this.validators[ type ]( $question );\n\t\t\tif ( ! valid || true !== valid.valid || ! valid.answer ) {\n\t\t\t\treturn self.add_error( valid.valid );\n\t\t\t}\n\n\t\t\tLLMS.Ajax.call( {\n\t\t\t\tdata: {\n\t\t\t\t\taction: 'quiz_answer_question',\n\t\t\t\t\tanswer: valid.answer,\n\t\t\t\t\tattempt_key: self.attempt_key,\n\t\t\t\t\tquestion_id: $question.attr( 'data-id' ),\n\t\t\t\t\tquestion_type: $question.attr( 'data-type' ),\n\t\t\t\t},\n\t\t\t\tbeforeSend: function() {\n\n\t\t\t\t\tvar msg = $btn.hasClass( 'llms-button-quiz-complete' ) ? LLMS.l10n.translate( 'Grading Quiz...' ) : LLMS.l10n.translate( 'Loading Question...' );\n\t\t\t\t\tself.toggle_loader( 'show', msg );\n\n\t\t\t\t\tself.update_progress_bar( 'increment' );\n\n\t\t\t\t},\n\t\t\t\tsuccess: function( r ) {\n\n\t\t\t\t\tself.toggle_loader( 'hide' );\n\n\t\t\t\t\tif ( r.data && r.data.html ) {\n\n\t\t\t\t\t\t// load html from the cached questions if it exists already\n\t\t\t\t\t\tif ( r.data.question_id && self.questions[ 'q-' + r.data.question_id ] ) {\n\n\t\t\t\t\t\t\tself.load_question( self.questions[ 'q-' + r.data.question_id ] );\n\n\t\t\t\t\t\t\t// load html from server if the question's never been seen before\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.load_question( r.data.html );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( r.data && r.data.redirect ) {\n\n\t\t\t\t\t\tself.redirect( r.data.redirect );\n\n\t\t\t\t\t} else if ( r.message ) {\n\n\t\t\t\t\t\tself.$container.append( '<p>' + r.message + '</p>' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar msg = LLMS.l10n.translate( 'An unknown error occurred. Please try again.' );\n\t\t\t\t\t\tself.$container.append( '<p>' + msg + '</p>' );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\t\t\t\terror: function ( jqXHR, status, error ) {\n\t\t\t\t\tself.reload_question();\n\t\t\t\t\tself.add_error( LLMS.l10n.translate( 'An unknown error occurred. Please try again.' ) );\n\t\t\t\t\tconsole.log( error );\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Complete the quiz\n\t\t * Called when timed quizzes reach time limit\n\t\t * & during unload events to record the attempt as abandoned\n\t\t *\n\t\t * @return void\n\t\t * @since 1.0.0\n\t\t * @version 3.9.0\n\t\t */\n\t\tcomplete_quiz: function() {\n\n\t\t\tvar self = this;\n\n\t\t\tLLMS.Ajax.call( {\n\t\t\t\tdata: {\n\t\t\t\t\taction: 'quiz_end',\n\t\t\t\t\tattempt_key: self.attempt_key,\n\t\t\t\t},\n\t\t\t\tbeforeSend: function() {\n\n\t\t\t\t\tself.toggle_loader( 'show', 'Grading Quiz...' );\n\n\t\t\t\t},\n\t\t\t\tsuccess: function( r ) {\n\n\t\t\t\t\tself.toggle_loader( 'hide' );\n\n\t\t\t\t\tif ( r.data && r.data.redirect ) {\n\n\t\t\t\t\t\tself.redirect( r.data.redirect );\n\n\t\t\t\t\t} else if ( r.message ) {\n\n\t\t\t\t\t\tself.$container.append( '<p>' + r.message + '</p>' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar msg = LLMS.l10n.translate( 'An unknown error occurred. Please try again.' );\n\t\t\t\t\t\tself.$container.append( '<p>' + msg + '</p>' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t},\n\n\t\t/**\n\t\t * Retrieve the index of a question by question id\n\t\t *\n\t\t * @param int qid WP Post ID of the question\n\t\t * @return int\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tget_question_index: function( qid ) {\n\n\t\t\treturn Object.keys( this.questions ).indexOf( 'q-' + qid );\n\n\t\t},\n\n\t\t/**\n\t\t * Redirect on quiz completion / timeout\n\t\t *\n\t\t * @param string url redirect url\n\t\t * @return void\n\t\t * @since 3.9.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tredirect: function( url ) {\n\n\t\t\tthis.toggle_loader( 'show', 'Grading Quiz...' );\n\t\t\tthis.status = null;\n\t\t\twindow.location.href = url;\n\n\t\t},\n\n\t\treload_question: function() {\n\t\t\tvar self = this;\n\n\t\t\tself.toggle_loader( 'show', LLMS.l10n.translate( 'Loading Question...' ) );\n\t\t\tself.update_progress_bar( 'reload' );\n\n\t\t\tsetTimeout( function() {\n\t\t\t\tself.toggle_loader( 'hide' );\n\t\t\t\tself.load_question( self.questions[ 'q-' + self.current_question ] );\n\t\t\t}, 100 );\n\n\t\t},\n\n\t\t/**\n\t\t * Return to the previous question.\n\t\t *\n\t\t * @since 1.0.0\n\t\t * @since 3.16.6 Unknown.\n\t\t * @since 7.8.0 Retrieve question HTML from the server when not cached.\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tprevious_question: function() {\n\n\t\t\tvar self = this;\n\n\t\t\tthis.save_question( {\n\t\t\t\tprevious_question: true,\n\t\t\t\tcallback: function() {\n\n\t\t\t\t\tself.toggle_loader( 'show', LLMS.l10n.translate( 'Loading Question...' ) );\n\t\t\t\t\tself.update_progress_bar( 'decrement' );\n\n\t\t\t\t\tvar ids = Object.keys( self.questions ),\n\t\t\t\t\t\tcurr = ids.indexOf( 'q-' + self.current_question ),\n\t\t\t\t\t\tprev_id = ids[0];\n\n\t\t\t\t\tif ( curr >= 1 ) {\n\t\t\t\t\t\tprev_id = ids[ curr - 1 ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Retrieve previous question HTML from the server.\n\t\t\t\t\tif ( ! self.questions[ prev_id ] ) {\n\t\t\t\t\t\tLLMS.Ajax.call( {\n\t\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\t\taction : 'quiz_get_question',\n\t\t\t\t\t\t\t\tattempt_key: self.attempt_key,\n\t\t\t\t\t\t\t\tquestion_id: prev_id.substring(2), // Remove 'q-'.\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsuccess: function( r ) {\n\n\t\t\t\t\t\t\t\tself.toggle_loader( 'hide' );\n\t\t\t\t\t\t\t\tif ( r.data && r.data.html ) {\n\n\t\t\t\t\t\t\t\t\tself.load_question( r.data.html );\n\n\t\t\t\t\t\t\t\t} else if ( r.data && r.data.redirect ) {\n\n\t\t\t\t\t\t\t\t\tself.redirect( r.data.redirect );\n\n\t\t\t\t\t\t\t\t} else if ( r.message ) {\n\n\t\t\t\t\t\t\t\t\tself.$container.append( '<p>' + r.message + '</p>' );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tvar msg = LLMS.l10n.translate( 'An unknown error occurred. Please try again.' );\n\t\t\t\t\t\t\t\t\tself.$container.append( '<p>' + msg + '</p>' );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsetTimeout( function() {\n\t\t\t\t\t\t\tself.toggle_loader( 'hide' );\n\t\t\t\t\t\t\tself.load_question( self.questions[ prev_id ] );\n\t\t\t\t\t\t}, 100 );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\n\t\t/**\n\t\t * Register question type validator functions\n\t\t *\n\t\t * @param string type question type id\n\t\t * @param function func callback function to validate the question with\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tregister_validator: function( type, func ) {\n\n\t\t\tthis.validators[ type ] = func;\n\n\t\t},\n\n\t\t/**\n\t\t * Start a Quiz.\n\t\t *\n * @since 1.0.0\n * @since 3.24.3 Unknown.\n\t\t * @since 7.8.0 Abstracted the function in `init_quiz`.\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tstart_quiz: function () {\n\n\t\t\tthis.init_quiz( 'quiz_start' );\n\t\t},\n\n\t\t/**\n\t\t * Resume a Quiz.\n\t\t *\n\t\t * @since 7.8.0\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tresume_quiz: function () {\n\n\t\t\tthis.init_quiz( 'quiz_resume' );\n\t\t},\n\n\t\t/**\n\t\t * Initiate 'Start' or 'Resume' action on a Quiz via AJAX call.\n\t\t *\n\t\t * @since 7.8.0\n\t\t *\n\t\t * @return {Void}\n\t\t */\n\t\tinit_quiz: function ( action ) {\n\n\t\t\tvar self = this;\n\n\t\t\tif( 'quiz_resume' === action ) {\n\t\t\t\t// Disable resume button.\n\t\t\t\t$( '#llms_resume_quiz' ).attr( 'disabled', 'disabled' );\n\t\t\t}\n\n\t\t\tthis.load_ui_elements();\n\t\t\tthis.$ui = $( '#llms-quiz-ui' );\n\t\t\tthis.$buttons = $( '#llms-quiz-nav button' );\n\t\t\tthis.$container = $( '#llms-quiz-question-wrapper' );\n\n\t\t\t// Bind submission event for answering questions.\n\t\t\t$( '#llms-next-question, #llms-complete-quiz' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.answer_question( $( this ) );\n\t\t\t} );\n\n\t\t\t// Bind submission event for navigating backwards.\n\t\t\t$( '#llms-prev-question' ).on( 'click', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.previous_question();\n\t\t\t} );\n\n\t\t\t// Bind exit event for quiz.\n\t\t\t$( '#llms-quiz-nav' ).on( 'click', '#llms-exit-quiz', function( e ) {\n\t\t\t\te.preventDefault();\n\t\t\t\tself.save_question( {\n\t\t\t\t\texit_quiz: true,\n\t\t\t\t\tcallback: function() {\n\t\t\t\t\t\tself.exiting_quiz = true;\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} );\n\n\t\t\tif ( 'quiz_resume' === action ) {\n\t\t\t\tdata = {\n\t\t\t\t\taction: 'quiz_resume',\n\t\t\t\t\tattempt_key: $( '#llms-attempt-key' ).val(),\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tdata = {\n\t\t\t\t\taction: 'quiz_start',\n\t\t\t\t\tattempt_key: $( '#llms-attempt-key' ).val(),\n\t\t\t\t\tlesson_id : $( '#llms-lesson-id' ).val(),\n\t\t\t\t\tquiz_id : $( '#llms-quiz-id' ).val(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tLLMS.Ajax.call( {\n\t\t\t\tdata: data,\n\t\t\t\tbeforeSend: function() {\n\n\t\t\t\t\tself.status = true;\n\t\t\t\t\t$( '#llms-quiz-wrapper, #quiz-start-button, #quiz-resume-button' ).remove();\n\t\t\t\t\t$( 'html, body' ).stop().animate( {scrollTop: 0 }, 500 );\n\t\t\t\t\tself.toggle_loader( 'show', LLMS.l10n.translate( 'Loading Quiz...' ) );\n\n\t\t\t\t},\n\t\t\t\terror: function( r, s, t ) {\n\t\t\t\t\tconsole.log( r, s, t );\n\t\t\t\t},\n\t\t\t\tsuccess: function( r ) {\n\n\t\t\t\t\tself.toggle_loader( 'hide' );\n\n\t\t\t\t\tif ( r.data && r.data.html ) {\n\n\t\t\t\t\t\tself.attempt_key = r.data.attempt_key;\n\t\t\t\t\t\tself.total_questions = r.data.total;\n\t\t\t\t\t\tself.resumable = r.data.can_be_resumed;\n\n\t\t\t\t\t\tif( 'quiz_resume' === action ) {\n\t\t\t\t\t\t\tr.data.question_ids.forEach( id => self.questions[`q-${id}`] = '' );\n\t\t\t\t\t\t} else if ( r.data.time_limit ) {\n\t\t\t\t\t\t\tself.start_quiz_timer( r.data.time_limit );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Adding Exit Button in Layout if quiz is resumable.\n\t\t\t\t\t\tif ( self.resumable ) {\n\t\t\t\t\t\t\t$( '#llms-quiz-nav' ).append( '<button class=\"button llms-button-secondary\" id=\"llms-exit-quiz\" name=\"llms_exit_quiz\">' + LLMS.l10n.translate( 'Exit Quiz' ) + '</button>' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tself.load_question( r.data.html );\n\n\t\t\t\t\t\tif ( 'quiz_resume' === action ) {\n\t\t\t\t\t\t\tself.update_progress_bar( 'reload' );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( r.message ) {\n\n\t\t\t\t\t\tself.$container.append( '<p>' + r.message + '</p>' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar msg = LLMS.l10n.translate( 'An unknown error occurred. Please try again.' );\n\t\t\t\t\t\tself.$container.append( '<p>' + msg + '</p>' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t/**\n\t\t\t * Use JS mouse events instead of CSS :hover because iOS is really smart\n\t\t\t *\n\t\t\t * @see: https://css-tricks.com/annoying-mobile-double-tap-link-issue/\n\t\t\t */\n\t\t\tif ( ! LLMS.is_touch_device() ) {\n\n\t\t\t\tthis.$ui.on( 'mouseenter', 'li.llms-choice label', function() {\n\t\t\t\t\t$( this ).addClass( 'hovered' );\n\t\t\t\t} );\n\t\t\t\tthis.$ui.on( 'mouseleave', 'li.llms-choice label', function() {\n\t\t\t\t\t$( this ).removeClass( 'hovered' );\n\t\t\t\t} );\n\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Start Quiz Timer\n\t\t * Gets minutes from hidden field\n\t\t * Not used as actual quiz timer. Quiz is timed on the server from the quiz class\n\t\t * Calculates minutes to milliseconds and then converts to hours / minutes\n\t\t * When time limit reaches 0 calls complete_quiz() to complete quiz.\n\t\t *\n\t\t * @return Calls get_count_down at a set interval of 1 second\n\t\t * @since 1.0.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tstart_quiz_timer: function( total_minutes ) {\n\n\t\t\t// create and append the UI for the countdown clock\n\t\t\tvar $el = $( '<div class=\"llms-quiz-timer\" id=\"llms-quiz-timer\" />' ),\n\t\t\t\tmsg = LLMS.l10n.translate( 'Time Remaining' );\n\n\t\t\t$el.append( '<i class=\"fa fa-clock-o\" aria-hidden=\"true\"></i><span class=\"screen-reader-text\">' + msg + '</span>' );\n\t\t\t$el.append( '<div id=\"llms-tiles\" class=\"llms-tiles\"></div>' );\n\n\t\t\t$( '#llms-quiz-header' ).append( $el );\n\n\t\t\t// start the timer\n\t\t\tvar self = this,\n\t\t\t\ttarget_date = new Date().getTime() + ( ( total_minutes * 60 ) * 1000 ), // set the countdown date\n\t\t\t\ttime_limit = ( ( total_minutes * 60 ) * 1000 ),\n\t\t\t\tcountdown = document.getElementById( 'llms-tiles' ), // get tag element\n\t\t\t\tdays, hours, minutes, seconds; // variables for time units\n\n\t\t\t// set actual timer\n\t\t\tsetTimeout( function() {\n\t\t\t\tself.complete_quiz();\n\t\t\t}, time_limit + 1000 );\n\n\t\t\tthis.getCountdown(\n\t\t\t\ttotal_minutes,\n\t\t\t\ttarget_date,\n\t\t\t\ttime_limit,\n\t\t\t\tdays,\n\t\t\t\thours,\n\t\t\t\tminutes,\n\t\t\t\tseconds,\n\t\t\t\tcountdown\n\t\t\t);\n\n\t\t\t// call get_count_down every 1 second\n\t\t\tsetInterval( function () {\n\t\t\t\tself.getCountdown(\n\t\t\t\t\ttotal_minutes,\n\t\t\t\t\ttarget_date,\n\t\t\t\t\ttime_limit,\n\t\t\t\t\tdays,\n\t\t\t\t\thours,\n\t\t\t\t\tminutes,\n\t\t\t\t\tseconds,\n\t\t\t\t\tcountdown\n\t\t\t\t);\n\t\t\t}, 1000 );\n\t\t},\n\n\t\t/**\n\t\t * Trigger events\n\t\t *\n\t\t * @param string event event to trigger\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\ttrigger: function( event ) {\n\n\t\t\tvar self = this;\n\n\t\t\t// trigger question submission for the current question\n\t\t\tif ( 'answer_question' === event ) {\n\n\t\t\t\tif ( this.get_question_index( self.current_question ) === self.total_questions ) {\n\n\t\t\t\t\t$( '#llms-complete-quiz' ).trigger( 'click' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t$( '#llms-next-question' ).trigger( 'click' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Load the HTML of a question into the DOM and the question cache\n\t\t *\n\t\t * @param string html string of html\n\t\t * @return void\n\t\t * @since 3.9.0\n\t\t * @version 3.16.6\n\t\t */\n\t\tload_question: function( html ) {\n\n\t\t\tvar $html = $( html ),\n\t\t\t\tqid = $html.attr( 'data-id' );\n\n\t\t\t// cache the question HTML for faster rewinds\n\t\t\tif ( ! this.questions[ 'q-' + qid ] ) {\n\t\t\t\tthis.questions[ 'q-' + qid ] = $html;\n\t\t\t}\n\n\t\t\tthis.update_progress( qid );\n\n\t\t\tthis.current_question = qid;\n\n\t\t\t$( document ).trigger( 'llms-pre-append-question', $html );\n\n\t\t\tthis.$container.append( $html );\n\n\t\t\t$( document ).trigger( 'llms-post-append-question', $html );\n\n\t\t},\n\n\t\t/**\n\t\t * Constructs the quiz UI & adds the elements into the DOM\n\t\t *\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.9\n\t\t */\n\t\tload_ui_elements: function() {\n\n\t\t\t// Removing the quiz UI elements if they already exist.\n\t\t\tif ( $( '#llms-quiz-ui').length > 0 ) {\n\t\t\t\t$( '#llms-quiz-ui' ).remove();\n\t\t\t}\n\n\t\t\tvar $html = $( '<div class=\"llms-quiz-ui\" id=\"llms-quiz-ui\" />' ),\n\t\t\t\t$header = $( '<header class=\"llms-quiz-header\" id=\"llms-quiz-header\" />' )\n\t\t\t\t$footer = $( '<footer class=\"llms-quiz-nav\" id=\"llms-quiz-nav\" />' );\n\n\t\t\t$footer.append( '<button class=\"button large llms-button-action\" id=\"llms-next-question\" name=\"llms_next_question\" type=\"submit\">' + LLMS.l10n.translate( 'Next Question' ) + '</button>' );\n\t\t\t$footer.append( '<button class=\"button large llms-button-action llms-button-quiz-complete\" id=\"llms-complete-quiz\" name=\"llms_complete_quiz\" type=\"submit\" style=\"display:none;\">' + LLMS.l10n.translate( 'Complete Quiz' ) + '</button>' );\n\t\t\t$footer.append( '<button class=\"button llms-button-secondary\" id=\"llms-prev-question\" name=\"llms_prev_question\" type=\"submit\" style=\"display:none;\">' + LLMS.l10n.translate( 'Previous Question' ) + '</button>' );\n\n\t\t\t$header.append( '<div class=\"llms-progress\"><div class=\"progress-bar-complete\"></div></div>' );\n\t\t\t$footer.append( '<div class=\"llms-quiz-counter\" id=\"llms-quiz-counter\"><span class=\"llms-current\"></span><span class=\"llms-sep\">/</span><span class=\"llms-total\"></span></div>' )\n\n\t\t\t$html.append( $header )\n\t\t\t\t .append( '<div class=\"llms-quiz-question-wrapper\" id=\"llms-quiz-question-wrapper\" />' )\n\t\t\t\t .append( $footer );\n\n\t\t\t$( '#llms-quiz-wrapper' ).after( $html );\n\n\t\t},\n\n\t\t/**\n\t\t * Perform actions on question HTML after it's been appended to the DOM\n\t\t *\n\t\t * @param obj event js event object\n\t\t * @param obj html js HTML object\n\t\t * @return void\n\t\t * @since 3.16.6\n\t\t * @version 3.16.6\n\t\t */\n\t\tpost_append_question: function( event, html ) {\n\n\t\t\tvar $html = $( html );\n\n\t\t\tif ( $html.find( 'audio' ).length ) {\n\t\t\t\twp.mediaelement.initialize();\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Show or hide the \"loading\" spinner with an option message\n\t\t *\n\t\t * @param string display show|hide\n\t\t * @param string msg text to display when showing\n\t\t * @return void\n\t\t * @since 3.9.0\n\t\t * @version 3.16.6\n\t\t */\n\t\ttoggle_loader: function( display, msg ) {\n\n\t\t\tif ( 'show' === display ) {\n\n\t\t\t\tmsg = msg || LLMS.l10n.translate( 'Loading...' );\n\n\t\t\t\tthis.$buttons.attr( 'disabled', 'disabled' );\n\n\t\t\t\tthis.$container.empty();\n\t\t\t\tLLMS.Spinner.start( this.$container );\n\t\t\t\tthis.$container.append( '<div class=\"llms-quiz-loading\">' + LLMS.l10n.translate( msg ) + '</div>' );\n\n\t\t\t} else {\n\n\t\t\t\tLLMS.Spinner.stop( this.$container );\n\t\t\t\tthis.$buttons.removeAttr( 'disabled' );\n\t\t\t\tthis.$container.find( '.llms-quiz-loading' ).remove();\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Update the progress bar and toggle button availability based on question the question being shown.\n\t\t *\n\t\t * @since 3.16.0\n\t\t * @since 7.8.0 Show counter and set the total as when needed.\n\t\t *\n\t\t * @param {Int} qid Question ID.\n\t\t * @return {Void}\n\t\t */\n\t\tupdate_progress: function( qid ) {\n\n\t\t\tvar index = this.get_question_index( qid );\n\n\t\t\tif ( -1 === index ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tindex++;\n\n\t\t\t$( '#llms-quiz-counter .llms-current' ).text( index );\n\t\t\tif ( index > 0 && ! $( '#llms-quiz-counter .llms-total' ).text() ) {\n\t\t\t\t$( '#llms-quiz-counter .llms-total' ).text( this.total_questions );\n\t\t\t\t$( '#llms-quiz-counter' ).show();\n\t\t\t}\n\n\t\t\t// Handle prev question.\n\t\t\tif ( index >= 2 ) {\n\t\t\t\t$( '#llms-prev-question' ).show();\n\t\t\t} else {\n\t\t\t\t$( '#llms-prev-question' ).hide();\n\t\t\t}\n\n\t\t\tif ( index === this.total_questions ) {\n\t\t\t\t$( '#llms-next-question' ).hide();\n\t\t\t\t$( '#llms-complete-quiz' ).show();\n\t\t\t} else {\n\t\t\t\t$( '#llms-next-question' ).show();\n\t\t\t\t$( '#llms-complete-quiz' ).hide();\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Increase progress bar ui element\n\t\t *\n\t\t * @param string dir update direction [increment|decrement|reload]\n\t\t * @return void\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tupdate_progress_bar: function( dir ) {\n\n\t\t\tvar index = this.get_question_index( this.current_question );\n\t\t\tswitch ( dir ) {\n\t\t\t\tcase 'increment':\n\t\t\t\t\tindex++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'decrement':\n\t\t\t\t\tindex--;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'reload':\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tprogress = ( index / this.total_questions ) * 100;\n\t\t\tthis.$ui.find( '.progress-bar-complete' ).css( 'width', progress + '%' );\n\n\t\t},\n\n\t\t/**\n\t\t * Get Count Down\n\t\t * Called every second to update the on screen countdown timer\n\t\t * Changes color to yellow at 1/2 of total time\n\t\t * Changes color to red at 1/4 of total time\n\t\t *\n\t\t * @param {[int]} minutes [description]\n\t\t * @param {[date]} target_date [description]\n\t\t * @param {[int]} time_limit [description]\n\t\t * @param {[int]} days [description]\n\t\t * @param {[int]} hours [description]\n\t\t * @param {[int]} minutes [description]\n\t\t * @param {[int]} seconds [description]\n\t\t * @param {[int]} countdown [description]\n\t\t * @return Displays updates hours, minutes on quiz timer\n\t\t * @since 1.0.0\n\t\t * @version 1.0.0\n\t\t */\n\t\tgetCountdown: function( total_minutes, target_date, time_limit, days, hours, minutes, seconds, countdown ){\n\n\t\t\t// find the amount of \"seconds\" between now and target\n\t\t\tvar current_date = new Date().getTime(),\n\t\t\t\tseconds_left = ( target_date - current_date ) / 1000;\n\n\t\t\tif ( seconds_left >= 0 ) {\n\n\t\t\t\tif ( ( seconds_left * 1000 ) < ( time_limit / 2 ) ) {\n\n\t\t\t\t\t$( '#llms-quiz-timer' ).addClass( 'color-half' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( seconds_left * 1000 ) < ( time_limit / 4 ) ) {\n\n\t\t\t\t\t$( '#llms-quiz-timer' ).removeClass( 'color-half' );\n\t\t\t\t\t$( '#llms-quiz-timer' ).addClass( 'color-empty' );\n\n\t\t\t\t}\n\n\t\t\t\tdays = this.pad( parseInt( seconds_left / 86400 ) );\n\t\t\t\tseconds_left = seconds_left % 86400;\n\t\t\t\thours = this.pad( parseInt( seconds_left / 3600 ) );\n\t\t\t\tseconds_left = seconds_left % 3600;\n\t\t\t\tminutes = this.pad( parseInt( seconds_left / 60 ) );\n\t\t\t\tseconds = this.pad( parseInt( seconds_left % 60 ) );\n\n\t\t\t\t// format countdown string + set tag value\n\t\t\t\tcountdown.innerHTML = '<span class=\"hours\">' + hours + '</span>:<span class=\"minutes\">' + minutes + '</span>:<span class=\"seconds\">' + seconds + '</span>';\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Pad Number\n\t\t * pads number with 0 if single digit.\n\t\t *\n\t\t * @param {[int]} n [number]\n\t\t * @return {[string]} [padded number]\n\t\t * @since 1.0.0\n\t\t * @version 1.0.0\n\t\t */\n\t\tpad: function(n) {\n\t\t\treturn (n < 10 ? '0' : '') + n;\n\t\t},\n\n\t\t/**\n\t\t * Basic validation method which performs no validation and returns a validation object\n\t\t * in the format required by the application\n\t\t *\n\t\t * @param obj $question jQuery selector of the question\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tvalidate: function( $question ) {\n\t\t\treturn {\n\t\t\t\tanswer: [],\n\t\t\t\tvalid: true,\n\t\t\t};\n\t\t},\n\n\t\t/**\n\t\t * Validates a choice question to ensure there's at least one checked input\n\t\t *\n\t\t * @param obj $question jQuery selector of the question\n\t\t * @return obj\n\t\t * @since 3.16.0\n\t\t * @version 3.16.0\n\t\t */\n\t\tvalidate_choice: function( $question ) {\n\n\t\t\tvar ret = window.llms.quizzes.validate( $question ),\n\t\t\t\tchecked = $question.find( 'input:checked' );\n\n\t\t\tif ( ! checked.length ) {\n\t\t\t\tret.valid = LLMS.l10n.translate( 'You must select an answer to continue.' );\n\t\t\t} else {\n\t\t\t\tchecked.each( function() {\n\t\t\t\t\tret.answer.push( $( this ).val() );\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn ret;\n\n\t\t},\n\n\t};\n\n\tquiz.bind();\n\n\twindow.llms = window.llms || {};\n\twindow.llms.quizzes = quiz;\n\n} )( jQuery );\n"],"names":["$","quiz","$buttons","$container","$ui","attempt_key","current_question","total_questions","questions","validators","status","resumable","exiting_quiz","bind","self","this","on","e","preventDefault","start_quiz","resume_quiz","each","LLMS","Donut","val","window","location","href","l10n","translate","complete_quiz","document","post_append_question","register_validator","validate","validate_choice","add_error","msg","find","remove","$err","fadeOut","setTimeout","append","save_question","options","$question","type","attr","requestData","action","answer","question_id","question_type","exit_quiz","via_exit_quiz","previous_question","via_previous_question","Ajax","call","data","success","r","callback","console","log","answer_question","$btn","valid","beforeSend","hasClass","toggle_loader","update_progress_bar","html","load_question","redirect","message","error","jqXHR","reload_question","get_question_index","qid","Object","keys","indexOf","url","ids","curr","prev_id","substring","func","init_quiz","load_ui_elements","reload","lesson_id","quiz_id","stop","animate","scrollTop","s","t","total","can_be_resumed","question_ids","forEach","id","time_limit","start_quiz_timer","is_touch_device","addClass","removeClass","total_minutes","$el","target_date","Date","getTime","countdown","getElementById","getCountdown","days","hours","minutes","seconds","setInterval","trigger","event","$html","update_progress","length","$header","$footer","after","wp","mediaelement","initialize","display","empty","Spinner","start","removeAttr","index","text","show","hide","dir","progress","css","seconds_left","pad","parseInt","innerHTML","n","ret","llms","quizzes","checked","push","jQuery"],"mappings":"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","sourceRoot":"../../js"}