1/************************** 2 * Quiz And Survey Master 3 *************************/ 4 5/************************** 6 * This object contains the newer functions. All global functions under are slowly 7 * being deprecated and replaced with rewritten newer functions 8 **************************/ 9 10var QSM; 11var qsmTimerInterval = []; 12(function ($) { 13 QSM = { 14 /** 15 * Initializes all quizzes or surveys on the page 16 */ 17 init: function () { 18 // Makes sure we have quizzes on this page 19 if (typeof qmn_quiz_data != 'undefined' && qmn_quiz_data) { 20 // hide the recaptcha by default 21 $('.g-recaptcha').hide(); 22 // Cycle through all quizzes 23 _.each(qmn_quiz_data, function (quiz) { 24 let quizID = parseInt(quiz.quiz_id); 25 if ( !qmn_quiz_data[quizID].hasOwnProperty('timer_limit') && null !== localStorage.getItem('mlw_time_quiz' + quizID) ) { 26 localStorage.removeItem('mlw_time_quiz' + quizID); 27 } 28 if ( null == localStorage.getItem('mlw_quiz_start_date' + quizID) ) { 29 localStorage.setItem('mlw_quiz_start_date' + quizID, qmn_ajax_object.start_date); 30 localStorage.setItem('mlw_time_consumed_quiz' + quizID, 1); 31 } 32 jQuery.ajax({ 33 url: qmn_ajax_object.ajaxurl, 34 data: { 35 action: "qsm_create_quiz_nonce", 36 quiz_id: quizID, 37 }, 38 type: 'POST', 39 success: function (response) { 40 jQuery('.qsm-quiz-container-' + quizID + ' #qsm_unique_key_'+quizID).val(response.data.unique_key); 41 jQuery('.qsm-quiz-container-' + quizID + ' #qsm_nonce_'+quizID).val(response.data.nonce); 42 } 43 }); 44 QSM.initPagination(quizID); 45 if ( ( quiz.hasOwnProperty('pagination') || ( _.keys(quiz.qpages).length > 1 && !jQuery('.qsm-quiz-container-'+quizID+' .qsm-auto-page-row').length ) ) ) { 46 qsmEndTimeTakenTimer(quizID); 47 jQuery('.qsm-quiz-container-' + quizID + ' #timer').val(0); 48 jQuery(".qsm-quiz-container-" + quizID + " input[name='timer_ms']").val(0); 49 quizType = 'paginated'; 50 jQuery(document).trigger('start_stop_page_timer', [quizID]); 51 } 52 if (quiz.hasOwnProperty('timer_limit') && 0 != quiz.timer_limit) { 53 QSM.initTimer(quizID); 54 quizType = 'timer'; 55 } else if (jQuery('.qsm-quiz-container-' + quizID + ' #timer').val() == 0) { 56 if (qsmTimerInterval[quizID]) { 57 clearInterval(qsmTimerInterval[quizID]); 58 } 59 qsmTimerInterval[quizID] = setInterval(function () { qmnTimeTakenTimer(quizID) }, 1000); 60 } 61 if (jQuery('.qsm-quiz-container-' + quizID + ' .qsm-submit-btn').is(':visible') && !jQuery('.qsm-quiz-container-' + quizID).hasClass('qsm_auto_pagination_enabled') ) { 62 jQuery('.qsm-quiz-container-' + quizID + ' .qsm-quiz-comment-section').fadeIn(); 63 } 64 }); 65 } 66 }, 67 68 /** 69 * Sets up timer for a quiz 70 * 71 * @param int quizID The ID of the quiz 72 */ 73 initTimer: function (quizID) { 74 75 jQuery(document).trigger('qsm_init_timer_before', [quizID]); 76 77 // Gets our form 78 var $quizForm = QSM.getQuizForm(quizID); 79 80 // Creates timer status key. 81 qmn_quiz_data[quizID].timerStatus = false; 82 83 // If we are using the newer pagination system... 84 if (0 < $quizForm.children('.qsm-page').length) { 85 // If there is a first page... 86 if (!qmn_quiz_data[quizID].hasOwnProperty('first_page') || !qmn_quiz_data[quizID].first_page) { 87 QSM.activateTimer(quizID); 88 $('.qsm-quiz-container-' + quizID).find('.stoptimer-p').show(); 89 } 90 // ...else, we must be using the questions per page option. 91 } else if (qmn_quiz_data[quizID].hasOwnProperty('pagination') && qmn_quiz_data[quizID].first_page) { 92 $(document).on('click', '.qsm-quiz-container-' + quizID + ' .mlw_next', function (event) { 93 event.preventDefault(); 94 if ( qmn_quiz_data[quizID].hasOwnProperty('advanced_timer') && qmn_quiz_data[quizID].advanced_timer.hasOwnProperty('show_stop_timer') ) { 95 var start_timer = parseInt(qmn_quiz_data[quizID].advanced_timer.start_timer_page); 96 if ($('.qsm-quiz-container-' + quizID).find('.qmn_pagination > .slide_number_hidden').val() == start_timer) { 97 QSM.activateTimer(quizID); 98 $('.qsm-quiz-container-' + quizID).find('.stoptimer-p').show(); 99 } 100 } else if (!qmn_quiz_data[quizID].timerStatus && (0 == $('.quiz_begin:visible').length || (1 == $('.quiz_begin:visible').length && qmnValidatePage('quizForm' + quizID)))) { 101 QSM.activateTimer(quizID); 102 $('.qsm-quiz-container-' + quizID).find('.stoptimer-p').show(); 103 } 104 }); 105 } else { 106 QSM.activateTimer(quizID); 107 $('.qsm-quiz-container-' + quizID).find('.stoptimer-p').show(); 108 } 109 jQuery(document).trigger('qsm_init_timer_after', [quizID]); 110 }, 111 /** 112 * Starts the timer for the quiz. 113 * 114 * @param int quizID The ID of the quiz. 115 */ 116 activateTimer: function (quizID) { 117 var timer_ms = jQuery(".qsm-quiz-container-" + quizID + " input[name='timer_ms']").val(); 118 if (timer_ms == 0) { 119 jQuery('.qsm-quiz-container-' + quizID + ' #timer').val(0); 120 if (qsmTimerInterval[quizID]) { 121 clearInterval(qsmTimerInterval[quizID]); 122 } 123 qsmTimerInterval[quizID] = setInterval(function () { qmnTimeTakenTimer(quizID) }, 1000); 124 jQuery(".qsm-quiz-container-" + quizID + " input[name='timer_ms']").each(function () { 125 var timems = qsmTimeInMS(); 126 jQuery(this).val(timems); 127 }); 128 } 129 130 jQuery(document).trigger('qsm_activate_time_before', [quizID, qmn_quiz_data]); 131 // Gets our form. 132 var $timer = QSM.getTimer(quizID); 133 134 // Sets up our variables. 135 qmn_quiz_data[quizID].timerStatus = true; 136 var seconds = 0; 137 138 // Calculates starting time. 139 var timerTotal = parseFloat(qmn_quiz_data[quizID].timer_limit) * 60; 140 var timerStarted = localStorage.getItem('mlw_started_quiz' + quizID); 141 var timerConsumed = parseInt(localStorage.getItem('mlw_time_consumed_quiz' + quizID)) || 1; 142 var timerRemaning = timerTotal - timerConsumed; 143 if ('yes' == timerStarted && 0 < timerRemaning) { 144 seconds = parseInt(timerRemaning); 145 } else { 146 seconds = parseFloat(qmn_quiz_data[quizID].timer_limit) * 60; 147 } 148 qmn_quiz_data[quizID].timerRemaning = seconds; 149 qmn_quiz_data[quizID].timerConsumed = timerConsumed; 150 151 //hidden timer 152 jQuery(".hiddentimer").html(seconds); 153 154 // Makes the timer appear. 155 $timer.show(); 156 $timer.text(QSM.secondsToTimer(seconds)); 157 158 // Sets up timer interval. 159 if (!isNaN(qmn_quiz_data[quizID].timerRemaning)) { 160 clearInterval(qmn_quiz_data[quizID].timerInterval); 161 qmn_quiz_data[quizID].timerInterval = setInterval(QSM.timer, 1000, quizID); 162 } 163 jQuery(document).trigger('qsm_activate_time_after', [quizID, qmn_quiz_data]); 164 }, 165 /** 166 * Reduces the timer by one second and checks if timer is 0 167 * 168 * @param int quizID The ID of the quiz. 169 */ 170 timer: function (quizID) { 171 jQuery(document).trigger('qmn_timer_consumed_seconds', [quizID, qmn_quiz_data, qsm_timer_consumed_obj]); 172 qmn_quiz_data[quizID].timerRemaning -= 1; 173 qmn_quiz_data[quizID].timerConsumed += 1; 174 if (0 > qmn_quiz_data[quizID].timerRemaning) { 175 qmn_quiz_data[quizID].timerRemaning = 0; 176 } 177 var secondsRemaining = qmn_quiz_data[quizID].timerRemaning; 178 var secondsConsumed = qmn_quiz_data[quizID].timerConsumed; 179 if (localStorage.getItem('mlw_time_quiz' + quizID) != null ) { 180 secondsRemaining = (parseFloat(qmn_quiz_data[quizID].timer_limit) * 60) - secondsConsumed + 1; 181 if(qsm_timer_consumed_obj.qmn_count_upward_status){ 182 secondsConsumed = qmn_quiz_data[quizID].timerConsumed - 1; 183 secondsRemaining = (parseFloat(qmn_quiz_data[quizID].timer_limit) * 60) - secondsConsumed; 184 } 185 if(secondsRemaining < 0) { 186 secondsRemaining = 0; 187 } 188 } 189 var display = QSM.secondsToTimer(secondsRemaining); 190 if(qsm_timer_consumed_obj.qmn_count_upward_status){ 191 display = QSM.secondsToTimer(secondsConsumed); 192 } 193 var systemTime = new Date().getTime() / 1000; 194 systemTime = Math.round(systemTime); 195 if ('1' === qmn_quiz_data[quizID].not_allow_after_expired_time && systemTime > qmn_quiz_data[quizID].scheduled_time_end) { 196 MicroModal.show('modal-4'); 197 return false;
198 } 199 // Sets our local storage values for the timer being started and current timer value. 200 localStorage.setItem('mlw_time_consumed_quiz' + quizID, secondsConsumed ); 201 localStorage.setItem('mlw_time_quiz' + quizID, secondsRemaining); 202 localStorage.setItem('mlw_started_quiz' + quizID, "yes"); 203 204 // Updates timer element and title on browser tab. 205 var $timer = QSM.getTimer(quizID); 206 $timer.text(display); 207 if (0 < qmn_quiz_data[quizID].timer_limit) { 208 document.title = display + ' ' + qsmTitleText; 209 } 210 211 var $quizForm = QSM.getQuizForm(quizID); 212 var total_seconds = parseFloat(qmn_quiz_data[quizID].timer_limit) * 60; 213 var ninety_sec = total_seconds - (total_seconds * 90 / 100); 214 /*CUSTOM TIMER*/ 215 jQuery(document).trigger('load_timer_faces', [quizID, secondsRemaining, total_seconds, display]); 216 if (ninety_sec == secondsRemaining) { 217 $quizForm.closest('.qmn_quiz_container').find('.qsm_ninety_warning').fadeIn(); 218 } 219 220 // If timer is run out, disable fields. 221 if (0 >= secondsRemaining && 0 < qmn_quiz_data[quizID].timer_limit) { 222 clearInterval(qmn_quiz_data[quizID].timerInterval); 223 $(".mlw_qmn_quiz input:radio").attr('disabled', true); 224 $(".mlw_qmn_quiz input:checkbox").attr('disabled', true); 225 $(".mlw_qmn_quiz select").attr('disabled', true); 226 $(".mlw_qmn_question_comment").attr('disabled', true); 227 $(".mlw_answer_open_text").attr('disabled', true); 228 $(".mlw_answer_number").attr('readonly', true); 229 230 $quizForm.closest('.qmn_quiz_container').addClass('qsm_timer_ended'); 231 $quizForm.closest('.qmn_quiz_container').prepend('<p class="qmn_error_message" style="color: red;">' + qmn_ajax_object.quiz_time_over + '</p>'); 232 if (qmn_quiz_data[quizID].enable_result_after_timer_end == 1) { 233 $quizForm.closest('.qmn_quiz_container').find('.qsm-submit-btn').trigger('click'); 234 } else { 235 $('.qsm-quiz-container-' + quizID).find('.stoptimer-p').hide(); 236 MicroModal.show('modal-3'); 237 } 238 jQuery(document).trigger('qsm_timer_ended', [quizID, qmn_quiz_data, qsm_timer_consumed_obj]); 239 return; 240 } 241 }, 242 /** 243 * Clears timer interval 244 * 245 * @param int quizID The ID of the quiz 246 */ 247 endTimer: function (quizID) { 248 localStorage.setItem('mlw_time_quiz' + quizID, 'completed'); 249 localStorage.setItem('mlw_started_quiz' + quizID, 'no'); 250 localStorage.removeItem('mlw_time_consumed_quiz' + quizID); 251 document.title = qsmTitleText; 252 if (typeof qmn_quiz_data[quizID].timerInterval != 'undefined') { 253 clearInterval(qmn_quiz_data[quizID].timerInterval); 254 } 255 jQuery(document).trigger('qsm_end_timer', [quizID, qmn_quiz_data]); 256 }, 257 /** 258 * Converts seconds to 00:00:00 format 259 * 260 * @param int seconds The number of seconds 261 * @return string A string in H:M:S format 262 */ 263 secondsToTimer: function (seconds) { 264 var formattedTime = ''; 265 seconds = parseInt(seconds); 266 267 // Prepares the hours part. 268 var hours = Math.floor(seconds / 3600); 269 if (0 === hours) { 270 formattedTime = '00:'; 271 } else if (10 > hours) { 272 formattedTime = '0' + hours + ':'; 273 } else { 274 formattedTime = hours + ':'; 275 } 276 277 // Prepares the minutes part. 278 var minutes = Math.floor((seconds % 3600) / 60); 279 if (0 === minutes) { 280 formattedTime = formattedTime + '00:'; 281 } else if (10 > minutes) { 282 formattedTime = formattedTime + '0' + minutes + ':'; 283 } else { 284 formattedTime = formattedTime + minutes + ':'; 285 } 286 287 // Prepares the seconds part. 288 var remainder = Math.floor((seconds % 60)); 289 if (0 === remainder) { 290 formattedTime = formattedTime + '00'; 291 } else if (10 > remainder) { 292 formattedTime = formattedTime + '0' + remainder; 293 } else { 294 formattedTime = formattedTime + remainder; 295 } 296 return formattedTime; 297 }, 298 /** 299 * Gets the jQuery object for the timer 300 */ 301 getTimer: function (quizID) { 302 var $quizForm = QSM.getQuizForm(quizID); 303 return $quizForm.children('.mlw_qmn_timer'); 304 }, 305 306 /** 307 * Sets up pagination for a quiz 308 * 309 * @param int quizID The ID of the quiz. 310 */ 311 initPagination: function (quizID) { 312 var $quizForm = QSM.getQuizForm(quizID); 313 /** 314 * 315 * CHecking if the quiz is random 316 */ 317 $is_random = $('.qmn_quiz_container').hasClass('random'); 318 if (0 < $quizForm.children('.qsm-page').length) { 319 $quizForm.children('.qsm-page').hide(); 320 template = wp.template('qsm-pagination-' + quizID); 321 $quizForm.append(template()); 322 if ($quizForm.find('.qsm-pagination > .current_page_hidden').length == 0) { 323 $quizForm.find('.qsm-pagination').append('<input type="hidden" value="
3230" name="current_page" class="current_page_hidden" />'); 324 } 325 if ('0' != qmn_quiz_data[quizID].progress_bar) { 326 jQuery(document).trigger('qsm_init_progressbar_before', [quizID, qmn_quiz_data]); 327 $('#quizForm' + quizID).find('.qsm-progress-bar').show(); 328 qmn_quiz_data[quizID].bar = createQSMProgressBar(quizID, '#quizForm' + quizID + ' .qsm-progress-bar'); 329 jQuery(document).trigger('qsm_init_progressbar_after', [quizID, qmn_quiz_data]); 330 } 331 QSM.goToPage(quizID, 1); 332 jQuery(document).on('click', '.qsm-quiz-container-' + quizID + ' .qsm-next', function (event) { 333 jQuery(document).trigger('qsm_next_button_click_before', [quizID]); 334 event.preventDefault(); 335 let $quizForm = QSM.getQuizForm(quizID); 336 jQuery('.qsm-quiz-container-' + quizID + ' .mlw_custom_next').addClass('qsm-disabled-btn'); 337 jQuery('.qsm-quiz-container-' + quizID + ' .mlw_custom_next').append('<div class="qsm-spinner-loader" style="font-size: 3.5px;margin-right: -5px;margin-left: 10px;"></div>'); 338 jQuery('.qsm-multiple-response-input:checked, .qmn-multiple-choice-input:checked , .qsm_select:visible').each(function () { 339 if (qmn_quiz_data[quizID].end_quiz_if_wrong > 0 && jQuery(this).parents().is(':visible') && jQuery(this).is('input, select')) { 340 if (jQuery(this).parents('.qmn_radio_answers, .qsm_check_answer')) { 341 let question_id = jQuery(this).attr('name').split('question')[1], 342 value = jQuery(this).val(), 343 $this = jQuery(this).parents('.quiz_section'); 344 if (value !== "") { 345 qsm_submit_quiz_if_answer_wrong(question_id, value, $this, $quizForm); 346 } 347 } 348 } 349 }) 350 jQuery('.qsm-quiz-container-' + quizID + ' .mlw_custom_next').removeClass('qsm-disabled-btn'); 351 jQuery('.qsm-quiz-container-' + quizID + ' .qsm-spinner-loader').remove(); 352 QSM.nextPage(quizID); 353 var $container = jQuery('.qsm-quiz-container-' + quizID); 354 if (qmn_quiz_data[quizID].disable_scroll_next_previous_click != 1) { 355 qsmScrollTo($container); 356 } 357 jQuery(document).trigger('qsm_next_button_click_after', [quizID]); 358 }); 359 jQuery(document).on('click', '.qsm-quiz-container-' + quizID + ' .qsm-previous', function (event) { 360 jQuery(document).trigger('qsm_previous_button_click_before', [quizID]); 361 event.preventDefault(); 362 QSM.prevPage(quizID); 363 var $container = jQuery('.qsm-quiz-container-' + quizID); 364 if (qmn_quiz_data[quizID].disable_scroll_next_previous_click != 1) { 365 qsmScrollTo($container); 366 } 367 jQuery(document).trigger('qsm_previous_button_click_after', [quizID]); 368 }); 369 } 370 // Gets timer element. 371 let $timer = QSM.getTimer(quizID); 372 373 // Calculates starting time. 374 let timerStarted = localStorage.getItem('mlw_started_quiz' + quizID); 375 let timerConsumed = parseInt(localStorage.getItem('mlw_time_consumed_quiz' + quizID)) || 1; 376 let seconds = parseFloat(qmn_quiz_data[quizID].timer_limit) * 60; 377 let timerRemaning = seconds - timerConsumed; 378 if ('yes' == timerStarted && 0 < timerRemaning) { 379 seconds = parseInt(timerRemaning); 380 } 381 $timer.text(QSM.secondsToTimer(seconds)); 382 jQuery(document).trigger('qsm_init_pagination_after', [quizID]); 383 }, 384 /** 385 * Navigates quiz to specific page 386 * 387 * @param int pageNumber The number of the page 388 */ 389 goToPage: function (quizID, pageNumber) { 390 jQuery(document).trigger('qsm_go_to_page_before', [quizID, pageNumber]); 391 var $quizForm = QSM.getQuizForm(quizID); 392 var $pages = $quizForm.children('.qsm-page'); 393 var $currentPage = $quizForm.children('.qsm-page:nth-of-type(' + pageNumber + ')'); 394 var $container = jQuery( '.qsm-quiz-container-' + quizID ); 395 $pages.hide(); 396 $currentPage.show(); 397 jQuery(document).trigger('end_page_timer_init_page_timer', [quizID, $currentPage]); 398 $quizForm.find('.current_page_hidden').val(pageNumber - 1); 399 $quizForm.find('.qsm-previous').hide(); 400 $quizForm.find('.qsm-next').hide(); 401 $quizForm.find('.qsm-submit-btn').hide(); 402 $quizForm.find('.g-recaptcha').hide(); 403 if (pageNumber < $pages.length) { 404 $quizForm.find('.qsm-next').show(); 405 check_if_show_start_quiz_button($container, $pages.length, pageNumber); 406 } else { 407 $quizForm.find('.qsm-submit-btn').show(); 408 if ( !jQuery('.qsm-quiz-container-'+ quizID +'.random') || !qmn_quiz_data[quizID].hasOwnProperty('pagination') ) { 409 $quizForm.find('.g-recaptcha').show(); 410 } 411 } 412 if (1 < pageNumber) { 413 $quizForm.find('.qsm-previous').show(); 414 } 415 if (1 == $currentPage.data('prevbtn')) { 416 $quizForm.find('.qsm-previous').hide(); 417 } 418 if ('1' == qmn_quiz_data[quizID].disable_first_page) { 419 if (pageNumber == 1) { 420 $quizForm.find(".mlw_previous").hide(); 421 $quizForm.find('.qsm-page-' + (parseInt(pageNumber))).show(); 422 } 423 jQuery('#quizForm' + quizID).find('.current_page_hidden').val(pageNumber); 424 } 425 if ('0' != qmn_quiz_data[quizID].progress_bar) { 426 var current_page = jQuery('#quizForm' + quizID).find('.current_page_hidden').val(); 427 var total_page_length = $pages.length - 1; 428 if ('1' == qmn_quiz_data[quizID].disable_first_page) { 429 total_page_length = total_page_length + 1; 430 } 431 if (qmn_quiz_data[quizID].contact_info_location == 0) { 432 //Do nothing. 433 } else if (qmn_quiz_data[quizID].contact_info_location == 1) { 434 if ($quizForm.children('.qsm-page').find('.qsm_contact_div ').length > 0) { 435 //total_page_length = total_page_length - 1; 436 } 437 } 438 var animate_value = current_page / total_page_length; 439 if (animate_value <= 1) { 440 if (!qmn_quiz_data[quizID].bar) { 441 jQuery( '#quizForm' + quizID + ' .qsm-progress-bar svg' ).remove(); 442 qmn_quiz_data[quizID].bar = createQSMProgressBar(quizID, '#quizForm' + quizID + ' .qsm-progress-bar'); 443 } 444 qmn_quiz_data[quizID].bar.animate(animate_value); 445 var old_text = jQuery('#quizForm' + quizID).find('.progressbar-text').text().replace(' %', ''); 446 var new_text = Math.round(animate_value * 100); 447 jQuery({ 448 Counter: old_text 449 }).animate({ 450 Counter: new_text 451 }, {
452 duration: 1000, 453 easing: 'swing', 454 step: function () { 455 jQuery('#quizForm' + quizID).find('.progressbar-text').text(Math.round(this.Counter) + ' %'); 456 } 457 }); 458 } 459 } 460 QSM.savePage(quizID, pageNumber); 461 jQuery(document).trigger('qsm_go_to_page_after', [quizID, pageNumber]); 462 }, 463 /** 464 * Moves forward or backwards through the pages 465 * 466 * @param int quizID The ID of the quiz 467 * @param int difference The number of pages to forward or back 468 */ 469 changePage: function (quizID, difference) { 470 var page = QSM.getPage(quizID); 471 if (qmn_quiz_data[quizID].hasOwnProperty('first_page') && qmn_quiz_data[quizID].first_page) { 472 if (qmn_quiz_data[quizID].hasOwnProperty('advanced_timer') && qmn_quiz_data[quizID].advanced_timer.hasOwnProperty('show_stop_timer') ) { 473 var start_timer = parseInt(qmn_quiz_data[quizID].advanced_timer.start_timer_page); 474 if (page == start_timer) { // check current page 475 QSM.activateTimer(quizID); 476 $('.qsm-quiz-container-' + quizID).find('.stoptimer-p').show(); 477 } 478 } else if (!qmn_quiz_data[quizID].timerStatus) { 479 QSM.activateTimer(quizID); 480 $('.qsm-quiz-container-' + quizID).find('.stoptimer-p').show(); 481 } 482 483 } 484 page += difference; 485 QSM.goToPage(quizID, page); 486 }, 487 nextPage: function (quizID) { 488 if (qmnValidatePage('quizForm' + quizID)) { 489 QSM.changePage(quizID, 1); 490 } 491 }, 492 prevPage: function (quizID) { 493 QSM.changePage(quizID, -1); 494 }, 495 savePage: function (quizID, pageNumber) { 496 sessionStorage.setItem('quiz' + quizID + 'page', pageNumber); 497 }, 498 getPage: function (quizID) { 499 pageNumber = parseInt(sessionStorage.getItem('quiz' + quizID + 'page')); 500 if (isNaN(pageNumber) || null == pageNumber) { 501 pageNumber = 1; 502 } 503 return pageNumber; 504 }, 505 /** 506 * Scrolls to the top of supplied element 507 * 508 * @param jQueryObject The jQuery version of an element. i.e. $('#quizForm3') 509 */ 510 scrollTo: function ($element) { 511 jQuery('html, body').animate( 512 { 513 scrollTop: $element.offset().top - 150 514 }, 515 1000); 516 }, 517 /** 518 * Gets the jQuery object of the quiz form 519 */ 520 getQuizForm: function (quizID) { 521 return $('#quizForm' + quizID); 522 }, 523 q_counter: Backbone.Model.extend({ 524 defaults: { 525 answers: [] 526 } 527 }), 528 changes: function (data, question_id, quiz_id) { 529 answers = qsmLogicModel.get('answers'); 530 answers.push({ 531 'q_id': question_id, 532 'incorrect': data.success == 'correct' ? 0 : 1, 533 }); 534 qsmLogicModel.set({ 'answers': QSM.filter_question(qsmLogicModel.get('answers')) }); 535 let update_answers = qsmLogicModel.get('answers'); 536 let incorrect = 0; 537 538 update_answers.forEach(function(obj){ 539 if(obj.incorrect == 1){ 540 incorrect++; 541 } 542 }); 543 if( qmn_quiz_data[quiz_id].end_quiz_if_wrong <= incorrect ) { 544 submit_status = true; 545 }else{ 546 submit_status = false; 547 } 548 }, 549 filter_question: function(arr) { 550 let result = {}; 551 arr.forEach(function(obj) { 552 if (obj.q_id) { 553 result[obj.q_id] = obj; 554 } 555 }); 556 return Object.values(result); 557 }, 558 }; 559 // On load code 560 $(function () { 561 qmnDoInit(); 562 }); 563}(jQuery)); 564 565// Global Variables 566var qsmTitleText = document.title; 567var qsmLogicModel = new QSM.q_counter({}); 568 569/** 570 * Validates an email ID. 571 * 572 * @param email The Email Id to validate. 573 * @returns Boolean 574 */ 575function isEmail(email) { 576 var regex = /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; 577 if (!regex.test(email)) { 578 return false; 579 } else { 580 return true; 581 } 582} 583/** 584 * Validates an email ID from specific domains. 585 * 586 * @param email The Email Id to validate. 587 * @returns Boolean 588 */ 589function isValidDomains(email, domains) { 590 if ('undefined' == domains) { 591 return true; 592 } 593 if (0 == domains.length) { 594 return true; 595 } 596 for (let i = 0; i < domains.length; i++) { 597 if (email.indexOf(domains[i]) != -1) { 598 return true; 599 } 600 } 601 return false; 602} 603function isBlockedDomain(email, blockdomains) { 604 if (typeof blockdomains === 'undefined') { 605 return false; 606 } 607 if (blockdomains.length === 0) { 608 return false; 609 } 610 for (let i = 0; i < blockdomains.length; i++) { 611 if (email.indexOf(blockdomains[i]) !== -1) { 612 return true; 613 } 614 } 615 return false;
616} 617 618/** 619 * Validates a URL. 620 * 621 * @param url URL to validate. 622 * @returns Boolean 623 */ 624function isUrlValid(url) { 625 return /^(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i.test(url); 626} 627 628/** 629 * Create QSM progress bar 630 * @returns 631 */ 632function createQSMProgressBar(quizID, elementID) { 633 return new ProgressBar.Line(elementID, { 634 strokeWidth: 2, 635 easing: 'easeInOut', 636 duration: 1400, 637 color: '#3498db', 638 trailColor: '#eee', 639 trailWidth: 1, 640 svgStyle: { width: '100%', height: '100%' }, 641 text: { 642 style: { 643 'position': 'absolute', 644 'right': '10px', 645 'font-size': '13px', 646 'font-weight': 'bold' 647 }, 648 autoStyleContainer: false 649 }, 650 from: { color: '#3498db' }, 651 to: { color: '#ED6A5A' } 652 }); 653} 654 655/** 656 * Limit multiple response based on question limit 657 * @returns 658 */ 659function qsmCheckMR(event, limit) { 660 var checked = jQuery(event).parents('.quiz_section').find(':checkbox:checked').length; 661 if (checked > limit) { 662 event.checked = false; 663 if (jQuery(event).parents('.quiz_section').find('.multi-checkbox-limit-reach').length == 0) { 664 jQuery(event).parents('.quiz_section').append('<span class="multi-checkbox-limit-reach">' + qmn_ajax_object.multicheckbox_limit_reach + '</span>'); 665 } 666 } else { 667 jQuery(event).parents('.quiz_section').find('.multi-checkbox-limit-reach').remove(); 668 } 669} 670 671function qmnDoInit() { 672 // Legacy init. 673 qmnInit(); 674 675 // Call main initialization. 676 qsminstance = QSM.init(); 677 678 jQuery(document).on("qsm_next_button_click_after", function (_event, _quiz_id) { 679 if (quizType == 'paginated') { 680 var timer_ms = jQuery(".qsm-quiz-container-" + _quiz_id + " input[name='timer_ms']").val(); 681 if (timer_ms == 0) { 682 jQuery('.qsm-quiz-container-' + _quiz_id + ' #timer').val(0); 683 if (qsmTimerInterval[_quiz_id]) { 684 clearInterval(qsmTimerInterval[_quiz_id]); 685 } 686 qsmTimerInterval[_quiz_id] = setInterval(function () { qmnTimeTakenTimer(_quiz_id) }, 1000); 687 jQuery(".qsm-quiz-container-" + _quiz_id + " input[name='timer_ms']").each(function () { 688 var timems = qsmTimeInMS(); 689 jQuery(this).val(timems); 690 }); 691 } 692 } 693 if ( jQuery('.qsm-quiz-container-' + _quiz_id + ' .qsm-submit-btn').is(':visible') || jQuery('.qsm-quiz-container-' + _quiz_id + ' .qsm-quiz-comment-section').closest('.qsm-page').is(':visible') ) { 694 jQuery('.qsm-quiz-container-' + _quiz_id + ' .qsm-quiz-comment-section').fadeIn(); 695 } 696 }); 697} 698 699function qmnTimeTakenTimer(quizID) { 700 var x = +jQuery('.qsm-quiz-container-' + quizID + ' #timer').val(); 701 if (NaN === x) { 702 x = 0; 703 } 704 x = x + 1; 705 jQuery('.qsm-quiz-container-' + quizID + ' #timer').val(x); 706} 707 708function qsmEndTimeTakenTimer(quiz_id) { 709 clearInterval(qsmTimerInterval[quiz_id]); 710} 711 712function qsmTimeInMS() { 713 var d = new Date(); 714 var n = d.getTime(); 715 return n; 716} 717 718var qsmPagescrolling = false; 719function qsmScrollTo($element) { 720 if ($element.length > 0 && !qsmPagescrolling) { 721 qsmPagescrolling = true; 722 jQuery(document).trigger('qsm_scroll_to_top_before', [$element]); 723 jQuery('html, body').animate({ scrollTop: $element.offset().top - 150 }, 1000, function() { 724 qsmPagescrolling = false; 725 jQuery(document).trigger('qsm_scroll_to_top_after', [$element]); 726 }); 727 } 728} 729 730 731function qmnDisplayError(message, field, quiz_form_id) { 732 jQuery('#' + quiz_form_id + ' .qmn_error_message_section').addClass('qmn_error_message'); 733 jQuery('#' + quiz_form_id + ' .qmn_error_message').text(message); 734 if (field.parents('.qsm_contact_div').length) { 735 field.parents('.qsm_contact_div').addClass('qmn_error'); 736 } else { 737 field.closest('.quiz_section').addClass('qmn_error'); 738 } 739} 740 741function qmnResetError(quiz_form_id) { 742 jQuery('#' + quiz_form_id + ' .qmn_error_message').text(''); 743 jQuery('#' + quiz_form_id + ' .qmn_error_message_section').removeClass('qmn_error_message'); 744 jQuery('#' + quiz_form_id + ' .qsm_contact_div').removeClass('qmn_error'); 745 jQuery('#' + quiz_form_id + ' .quiz_section').removeClass('qmn_error'); 746} 747var show_result_validation = true; 748function qmnValidation(element, quiz_form_id) { 749 show_result_validation = true; 750 jQuery(document).trigger('qsm_before_validation', [element, quiz_form_id]); 751 let quiz_id = quiz_form_id.replace('quizForm', ''); 752 var error_messages = qmn_quiz_data[quiz_id].error_messages; 753 qmnResetError(quiz_form_id); 754 jQuery(element).each(function () { 755 if ( jQuery(this).attr('class') && ( jQuery(this).is(':visible') || jQuery(this).attr('class').indexOf('mlwRequiredAccept') || ( jQuery(this).attr('class').indexOf('mlwRequiredPolar') > -1 && jQuery(this).parent().is(':visible') ) ) ) { 756 if (jQuery(this).attr('class').indexOf('mlwEmail') !== -1 && this.value !== "") { 757 // Remove any trailing and preceeding space. 758 var x = jQuery.trim(this.value); 759 if (!isEmail(x)) { 760 qmnDisplayError(error_messages.email_error_text, jQuery(this), quiz_form_id); 761 show_result_validation = false;
762 } 763 /** 764 * Validate email from allowed domains. 765 */ 766 var domains = jQuery(this).attr('data-domains'); 767 if ('undefined' != typeof domains) { 768 if (!isValidDomains(x, domains.split(","))) { 769 qmnDisplayError(error_messages.email_error_text, jQuery(this), quiz_form_id); 770 show_result_validation = false; 771 } 772 } 773 /** 774 * Validate email from blocked domains. 775 */ 776 let blockdomains = jQuery(this).attr('data-blockdomains'); 777 if (typeof blockdomains !== 'undefined') { 778 if (isBlockedDomain(x, blockdomains.split(","))) { 779 qmnDisplayError(error_messages.email_error_text, jQuery(this), quiz_form_id); 780 show_result_validation = false; 781 } 782 } 783 } 784 if (jQuery(this).hasClass('mlwPhoneNumber') && this.value !== "") { 785 let phoneValue = jQuery.trim(this.value); 786 let phonePattern = jQuery(this).attr('data-phone-pattern'); 787 if (phonePattern !== undefined && phonePattern !== '') { 788 let escapedPattern = phonePattern.replaceAll(/[.+?^$|()\\]/g, String.raw`\$&`); 789 escapedPattern = escapedPattern.replaceAll(/ /g, String.raw`\s+`); 790 let pattern = new RegExp(String.raw`^${escapedPattern}$`); 791 if (!pattern.test(phoneValue)) { 792 qmnDisplayError(error_messages.phone_error_text, jQuery(this), quiz_form_id); 793 show_result_validation = false; 794 } 795 } 796 } 797 if (jQuery(this).attr('class').indexOf('mlwUrl') !== -1 && this.value !== "") { 798 // Remove any trailing and preceeding space. 799 if (!isUrlValid(jQuery.trim(this.value))) { 800 qmnDisplayError(error_messages.url_error_text, jQuery(this), quiz_form_id); 801 show_result_validation = false; 802 } 803 } 804 if (jQuery(this).attr('class').indexOf('mlwMinLength') !== -1 && this.value !== "") { 805 // Remove any trailing and preceeding space. 806 if (jQuery.trim(this.value).length < jQuery(this).attr('minlength')) { 807 var minlength_error = error_messages.minlength_error_text; 808 minlength_error = minlength_error.replace('%minlength%', jQuery(this).attr('minlength')); 809 qmnDisplayError(minlength_error, jQuery(this), quiz_form_id); 810 show_result_validation = false; 811 } 812 } 813 if ( jQuery(this).hasClass('mlw_answer_open_text') || jQuery(this).hasClass('qmn_fill_blank') || jQuery(this).hasClass('mlw_answer_number')) { 814 if (jQuery.trim(this.value).length < jQuery(this).attr('minlength')) { 815 let minCharError = error_messages.minlength_error_text; 816 minCharError = minCharError.replace('%minlength%', jQuery(this).attr('minlength')); 817 qmnDisplayError(minCharError, jQuery(this), quiz_form_id); 818 show_result_validation = false; 819 } 820 } 821 if (jQuery(this).attr('class').indexOf('mlwMaxLength') !== -1 && this.value !== "") { 822 // Remove any trailing and preceeding space. 823 if (jQuery.trim(this.value).length > jQuery(this).attr('maxlength')) { 824 var maxlength_error = error_messages.maxlength_error_text; 825 maxlength_error = maxlength_error.replace('%maxlength%', jQuery(this).attr('maxlength')); 826 qmnDisplayError(maxlength_error, jQuery(this), quiz_form_id); 827 show_result_validation = false; 828 } 829 } 830 var by_pass = true; 831 if (qmn_quiz_data[quiz_id].timer_limit_val > 0 && qmn_quiz_data[quiz_id].hasOwnProperty('skip_validation_time_expire') && qmn_quiz_data[quiz_id].skip_validation_time_expire != 1) { 832 by_pass = false; 833 } 834 if (localStorage.getItem('mlw_time_quiz' + quiz_id) === null || (0 == localStorage.getItem('mlw_time_quiz' + quiz_id) && by_pass == false) || localStorage.getItem('mlw_time_quiz' + quiz_id) > 0.08 || by_pass === false) { 835 // Check if this is a contact field 836 let isContactField = jQuery(this).closest('.qsm_contact_div').length > 0; 837 let requiredErrorMsg = (isContactField && error_messages.contact_field_required_error_text) 838 ? error_messages.contact_field_required_error_text 839 : error_messages.empty_error_text; 840 841 if (jQuery(this).attr('class').indexOf('mlwRequiredNumber') > -1 && this.value === "" && +this.value != NaN) { 842 qmnDisplayError(error_messages.number_error_text, jQuery(this), quiz_form_id); 843 show_result_validation = false;
844 } 845 if (jQuery(this).attr('class').indexOf('mlwRequiredDate') > -1 && this.value === "") { 846 qmnDisplayError(error_messages.empty_error_text, jQuery(this), quiz_form_id); 847 show_result_validation = false; 848 } 849 if (jQuery(this).attr('class').indexOf('mlwRequiredText') > -1 && jQuery.trim(this.value) === "") { 850 qmnDisplayError(requiredErrorMsg, jQuery(this), quiz_form_id); 851 show_result_validation = false; 852 } 853 if (jQuery(this).attr('class').indexOf('mlwRequiredCaptcha') > -1 && this.value != mlw_code) { 854 qmnDisplayError(error_messages.incorrect_error_text, jQuery(this), quiz_form_id); 855 show_result_validation = false; 856 } 857 if (jQuery(this).attr('class').indexOf('mlwRequiredAccept') > -1 && !jQuery(this).prop('checked')) { 858 qmnDisplayError(error_messages.empty_error_text, jQuery(this), quiz_form_id); 859 show_result_validation = false; 860 } 861 if (jQuery(this).attr('class').indexOf('mlwRequiredRadio') > -1) { 862 check_val = jQuery(this).find('input:checked').val(); 863 if (check_val == "" || check_val == undefined) { 864 qmnDisplayError(error_messages.empty_error_text, jQuery(this), quiz_form_id); 865 show_result_validation = false; 866 } 867 } 868 if (jQuery(this).attr('class').indexOf('mlwRequiredFileUpload') > -1) { 869 var selected_file = jQuery(this).get(0).files.length; 870 if (selected_file === 0) { 871 qmnDisplayError(error_messages.empty_error_text, jQuery(this), quiz_form_id); 872 show_result_validation = false; 873 } 874 } 875 if (jQuery(this).attr('class').indexOf('qsmRequiredSelect') > -1) { 876 check_val = jQuery(this).val(); 877 if (check_val == "" || check_val == null) { 878 qmnDisplayError(error_messages.empty_error_text, jQuery(this), quiz_form_id); 879 show_result_validation = false; 880 } 881 } 882 if (jQuery(this).attr('class').indexOf('mlwRequiredCheck') > -1) { 883 if (!jQuery(this).find('input:checked').length) { 884 qmnDisplayError(error_messages.empty_error_text, jQuery(this), quiz_form_id); 885 show_result_validation = false; 886 } 887 } 888 //Google recaptcha validation 889 if (jQuery(this).attr('class').indexOf('g-recaptcha-response') > -1) { 890 let recaptcha_id = jQuery(this).attr('id'); 891 let recaptcha_index = 'g-recaptcha-response' === recaptcha_id ? 0 : recaptcha_id.replace("g-recaptcha-response-", ""); 892 if (grecaptcha.getResponse(recaptcha_index) == "") { 893 alert(error_messages.recaptcha_error_text); 894 show_result_validation = false; 895 } 896 } 897 } 898 } 899 }); 900 jQuery(document).trigger('qsm_after_validation', [element, quiz_form_id]); 901 return show_result_validation; 902} 903 904function getFormData($form) { 905 var unindexed_array = $form.serializeArray(); 906 var indexed_array = {}; 907 908 jQuery.map(unindexed_array, function (n, i) { 909 indexed_array[n['name']] = n['value']; 910 }); 911 912 return indexed_array; 913} 914 915 916function qmnFormSubmit(quiz_form_id, $this) { 917 var quiz_id = +jQuery('#' + quiz_form_id).find('.qmn_quiz_id').val(); 918 let $container = jQuery($this).closest('.qmn_quiz_container'); 919 let result = qmnValidation( $container.find('*'), quiz_form_id); 920 if (!result) { return result; } 921 922 /** 923 * Update Timer in MS 924 */ 925 var timer_ms = jQuery('#' + quiz_form_id).find(".qsm-quiz-container-" + quiz_id + " input[name='timer_ms']").val(); 926 var new_timer_ms = qsmTimeInMS(); 927 jQuery('#' + quiz_form_id).find(".qsm-quiz-container-" + quiz_id + " input[name='timer_ms']").val(Math.abs(new_timer_ms - timer_ms)); 928 929 jQuery('.mlw_qmn_quiz input:radio').attr('disabled', false); 930 jQuery('.mlw_qmn_quiz input:checkbox').attr('disabled', false); 931 jQuery('.mlw_qmn_quiz select').attr('disabled', false); 932 jQuery('.mlw_qmn_question_comment').attr('disabled', false); 933 jQuery('.mlw_answer_open_text').attr('disabled', false); 934 //Convert serialize data into index array 935 var unindexed_array = jQuery('#' + quiz_form_id).serializeArray(); 936 unindexed_array.push( 937 { 938 name: 'quiz_start_date', 939 value: localStorage.getItem('mlw_quiz_start_date' + quiz_id) 940 } 941 ); 942 jQuery(document).trigger('qsm_before_form_data_process', [quiz_form_id, unindexed_array]); 943 var fd = new FormData(); 944 jQuery.each(unindexed_array, function (key, input) { 945 fd.append(input.name, input.value); 946 }); 947 jQuery('#' + quiz_form_id + ' input[type="file"]').each(function () { 948 const file = this.files ? this.files[0] : null; 949 if ( file !== null ) { 950 fd.append(this.name, file); 951 } 952 }); 953 fd.append("action", 'qmn_process_quiz'); 954 fd.append("nonce", jQuery('#qsm_nonce_' + quiz_id ).val() ); 955 fd.append("qsm_unique_key", jQuery('#qsm_unique_key_' + quiz_id ).val() ); 956 fd.append("currentuserTime", Math.round(new Date().getTime() / 1000)); 957 fd.append("currentuserTimeZone", Intl.DateTimeFormat().resolvedOptions().timeZone); 958 jQuery(document).trigger('qsm_after_form_data_process', [quiz_form_id, fd]); 959 qsmEndTimeTakenTimer(quiz_id); 960 961 if (qmn_quiz_data[quiz_id].hasOwnProperty('timer_limit')) { 962 QSM.endTimer(quiz_id); 963 } 964 jQuery(document).trigger('qsm_before_quiz_submit', [quiz_form_id]); 965 jQuery('#' + quiz_form_id + ' input[type=submit]').attr('disabled', 'disabled'); 966 qsmDisplayLoading($container, quiz_id); 967 968 let disableScroll = qmn_quiz_data[quiz_id].disable_scroll_on_result == '1'; 969 if (disableScroll) { 970 jQuery('body').css('overflow', 'hidden'); 971 } 972 973 jQuery.ajax({ 974 url: qmn_ajax_object.ajaxurl, 975 data: fd, 976 contentType: false, 977 processData: false, 978 type: 'POST', 979 success: function (response) { 980 response = JSON.parse(response); 981 if (window.qsm_results_data === undefined) { 982 window.qsm_results_data = new Object(); 983 } 984 window.qsm_results_data[quiz_id] = {
985 'save_response': response.result_status['save_response'], 986 'id': response.result_status['id'] 987 }; 988 989 if (response.quizExpired) { 990 MicroModal.show('modal-4'); 991 return false; 992 } else { 993 qmnDisplayResults(response, quiz_form_id, $container, quiz_id); 994 // run MathJax on the new content 995 if (1 != qmn_quiz_data[quiz_id].disable_mathjax) { 996 if (typeof MathJax !== 'undefined') { 997 // MathJax v3 998 if (typeof MathJax.typesetPromise === 'function') { 999 MathJax.typesetPromise(); 1000 } 1001 // MathJax v2 fallback 1002 else if (MathJax.Hub && typeof MathJax.Hub.Queue === 'function') { 1003 MathJax.Hub.Queue(["Typeset", MathJax.Hub]); 1004 } 1005 } 1006 } 1007 1008 jQuery(document).trigger('qsm_after_quiz_submit_load_chart'); 1009 jQuery(document).trigger('qsm_after_quiz_submit', [quiz_form_id]); 1010 if (disableScroll) { 1011 jQuery('body').css('overflow', 'auto'); 1012 } 1013 } 1014 }, 1015 error: function (errorThrown) { 1016 let response = { display: errorThrown.responseText + "<br/> Error:" + errorThrown.statusText}; 1017 qmnDisplayResults(response, quiz_form_id, $container, quiz_id); 1018 console.log(errorThrown); 1019 if (disableScroll) { 1020 jQuery('body').css('overflow', 'auto'); 1021 } 1022 } 1023 }); 1024 1025 return false; 1026} 1027 1028jQuery(document).on('qsm_after_quiz_submit', function(e, quiz_form_id) { 1029 let quiz_id = quiz_form_id.replace("quizForm", ""); 1030 if( localStorage.getItem('mlw_quiz_start_date' + quiz_id) ) { 1031 localStorage.removeItem('mlw_quiz_start_date' + quiz_id); 1032 } 1033}) 1034 1035function qsmDisplayLoading($container, quiz_id) { 1036 jQuery(document).trigger('qsm_before_loader_init', [$container,quiz_id]); 1037 var loader_html = '<div class="qsm_quiz_processing_box">'; 1038 loader_html += '<div class="qsm-spinner-loader qsm_quiz_processing_loader"></div>'; 1039 if (qmn_quiz_data[quiz_id].hasOwnProperty('quiz_processing_message') && qmn_quiz_data[quiz_id].quiz_processing_message != '') { 1040 loader_html += '<div class="qsm_quiz_processing_message">' + qmn_quiz_data[quiz_id].quiz_processing_message + '</div>'; 1041 } 1042 loader_html += '</div>'; 1043 $container.empty(); 1044 $container.append(loader_html); 1045 if (qmn_quiz_data[quiz_id].hasOwnProperty('disable_scroll_next_previous_click') && qmn_quiz_data[quiz_id].disable_scroll_next_previous_click != 1) { 1046 qsmScrollTo($container); 1047 } 1048 jQuery(document).trigger('qsm_after_loader_init', [$container,quiz_id]); 1049} 1050 1051function qmnDisplayResults(results, quiz_form_id, $container, quiz_id) { 1052 $container.empty(); 1053 jQuery(document).trigger('qsm_before_display_result', [results, quiz_form_id, $container]); 1054 if (results.redirect) { 1055 window.location.replace(results.redirect); 1056 } else { 1057 $container.append('<div class="qmn_results_page"></div>'); 1058 $container.find('.qmn_results_page').html(results.display); 1059 if (qmn_quiz_data[quiz_id].hasOwnProperty('disable_scroll_next_previous_click') && qmn_quiz_data[quiz_id].disable_scroll_next_previous_click != 1) { 1060 qsmScrollTo($container); 1061 } 1062 // Fires after result is populates via ajax 1063 jQuery(document).trigger('qsm_after_display_result', [results, quiz_form_id, $container]); 1064 } 1065} 1066
1067function qmnInit() { 1068 if (typeof qmn_quiz_data != 'undefined' && qmn_quiz_data) { 1069 _.each(qmn_quiz_data, function (quiz) { 1070 let key = parseInt(quiz.quiz_id); 1071 if (qmn_quiz_data[key].ajax_show_correct === '1') { 1072 jQuery('.qmn-multiple-choice-input, .qsm_dropdown, .qsm-multiple-response-input').change(function () { 1073 let $this = jQuery(this); 1074 let value = $this.val(); 1075 let quiz_form_id = $this.parents('.qsm-quiz-form').attr('id'); 1076 let quiz_id = quiz_form_id.replace('quizForm', ''); 1077 let question_id = $this.attr('name').replace(/question/i, ''); 1078 let data = qsm_question_quick_result_js(question_id, value, '', qmn_quiz_data[quiz_id].enable_quick_correct_answer_info,quiz_id); 1079 if (data.success == 'correct') { 1080 $this.parent().addClass("qmn_correct_answer"); 1081 } else if (data.success == 'incorrect') { 1082 $this.parent().addClass("qmn_incorrect_answer"); 1083 } 1084 }); 1085 } 1086 1087 if (qmn_quiz_data[key].disable_answer === '1') { 1088 1089 jQuery('#quizForm' + qmn_quiz_data[key].quiz_id + ' .qmn_quiz_radio').change(function () { 1090 var radio_group = jQuery(this).attr('name'); 1091 jQuery('input[type=radio][name=' + radio_group + ']').prop('disabled', true); 1092 let radio_value = jQuery(this).val(); 1093 let disableAnswer = {}; 1094 if (localStorage.getItem("disable_answer")) { 1095 disableAnswer = JSON.parse(localStorage.getItem("disable_answer")); 1096 } 1097 if (!disableAnswer[key]) { 1098 disableAnswer[key] = []; 1099 } 1100 let disabledQuestions = disableAnswer[key].map(element => element[0]); 1101 if (!disabledQuestions.includes(radio_group)) { 1102 disableAnswer[key].push([radio_group, radio_value]); 1103 } 1104 localStorage.setItem("disable_answer", JSON.stringify(disableAnswer)); 1105 }); 1106 1107 if (localStorage.getItem("disable_answer")) { 1108 let disabledAnswer = JSON.parse(localStorage.getItem("disable_answer")); 1109 if (disabledAnswer[key]) { 1110 disabledAnswer[key].forEach(element => { 1111 let element1 = element[1].replaceAll(' ', '-'); 1112 jQuery('#' + element[0] + '-' + element1 + ' input').prop('checked', true).trigger('change'); 1113 }); 1114 } 1115 } 1116 jQuery(document).on('qsm_after_quiz_submit', function (event, quiz_form_id) { 1117 event.preventDefault(); 1118 if (localStorage.getItem("disable_answer")) { 1119 let disabledAnswer2 = JSON.parse(localStorage.getItem("disable_answer")); 1120 if (disabledAnswer2[key]) { 1121 delete disabledAnswer2[key]; 1122 localStorage.setItem("disable_answer", JSON.stringify(disabledAnswer2)); 1123 } 1124 } 1125 }); 1126 } 1127 1128 if (qmn_quiz_data[key].hasOwnProperty('pagination')) { 1129 qmnInitPagination(qmn_quiz_data[key].quiz_id); 1130 } 1131 }); 1132 } 1133} 1134 1135//Function to validate the answers provided in quiz 1136function qmnValidatePage(quiz_form_id) { 1137 var result = qmnValidation('#' + quiz_form_id + ' .quiz_section:visible *', quiz_form_id); 1138 return result; 1139} 1140 1141// Show start quiz button if first page is visible 1142function check_if_show_start_quiz_button(container, total_pages, page_number) { 1143 let quiz_id = container.find('.qmn_quiz_id').val(); 1144 if(container.find('.quiz_begin').is(':visible')){ 1145 container.find(".mlw_custom_start").show(); 1146 container.find(".mlw_custom_next").hide(); 1147 container.find(".qsm-quiz-default-feature-image").show(); 1148 }else{ 1149 container.find(".qsm-quiz-default-feature-image").hide(); 1150 container.find(".mlw_custom_start").hide(); 1151 let numberToAdd = 2; 1152 // Fixed Missing Next Button in single question quiz created with text after quiz 1153 if ( '3' == total_pages && 0 < container.find('.quiz_end .mlw_qmn_message_end').length ) { 1154 numberToAdd = 1; 1155 } 1156 if(total_pages != parseInt(page_number) + numberToAdd){ // check if not last page based on condition (1140) 1157 container.find(".mlw_custom_next").show(); 1158 if (container.find('.quiz_end').is(':visible')) { 1159 container.find(".mlw_custom_next").hide(); 1160 } 1161 } 1162 } 1163} 1164 1165//Function to advance quiz to next page 1166function qmnNextSlide(pagination, go_to_top, quiz_form_id) { 1167 jQuery(document).trigger('qsm_next_button_click_before', [quiz_form_id]); 1168 var quiz_id = +jQuery(quiz_form_id).find('.qmn_quiz_id').val(); 1169 var $container = jQuery(quiz_form_id).closest('.qmn_quiz_container'); 1170 var slide_number = +$container.find('.slide_number_hidden').val(); 1171 var page_number = +$container.find('.current_page_hidden').val(); 1172 var section_totals = +$container.find('.total_sections_hidden').val(); 1173 if (pagination == 1) { 1174 section_totals = section_totals - 1; 1175 } 1176 var total_pages = $container.find('.total_pages_hidden').val(); 1177 1178 jQuery(quiz_form_id + " .qsm-auto-page-row").hide(); 1179 if (page_number >= total_pages) { 1180 alert('Next page not found.'); 1181 $container.find(".mlw_next").hide(); 1182 $container.find(".qsm-submit-btn").show(); 1183 jQuery(quiz_form_id + " .qsm-auto-page-row.quiz_end").show(); 1184 return true; 1185 } 1186 if (slide_number == 0 && page_number == 0) { 1187 jQuery(quiz_form_id + " .qsm-auto-page-row.quiz_begin").show(); 1188 $container.find(".mlw_previous").hide(); 1189 $container.find('.current_page_hidden').val('1'); 1190 } else if (total_pages == parseInt(page_number) + 1) { //Last page 1191 $container.find(".mlw_next").hide(); 1192 $container.find(".qsm-submit-btn").show(); 1193 jQuery(quiz_form_id + " .qsm-auto-page-row.quiz_end").show(); 1194 $container.find('.slide_number_hidden').val(parseInt(slide_number) + 1); 1195 $container.find('.current_page_hidden').val(parseInt(page_number) + 1); 1196 $container.find(".mlw_previous").show(); 1197 $container.find('.g-recaptcha').show(); 1198 } else if (slide_number >= 0 && page_number >= 1) { 1199 if (total_pages == parseInt(page_number) + 2) { // if last page empty 1200 if (jQuery(quiz_form_id + " .qsm-auto-page-row.empty_quiz_end").length) { 1201 jQuery(quiz_form_id + " .qsm-auto-page-row.empty_quiz_end").show(); 1202 $container.find(".qsm-submit-btn").show(); 1203 $container.find(".mlw_next").hide(); 1204 $container.find('.g-recaptcha').show(); 1205 } 1206 } 1207 $container.find('.qsm-auto-page-row.qsm-apc-' + page_number).show(); 1208 $container.find('.slide_number_hidden').val(parseInt(slide_number) + 1); 1209 $container.find('.current_page_hidden').val(parseInt(page_number) + 1); 1210 $container.find(".mlw_previous").show(); 1211 } 1212 check_if_show_start_quiz_button($container, total_pages, page_number);
1213 if (jQuery(quiz_form_id + " .quiz_section.quiz_end").is(':visible')) { 1214 var button_width = jQuery(quiz_form_id + ' .qsm-submit-btn').width(); 1215 var progress_width = jQuery(quiz_form_id).parent().find('.qmn_pagination').width(); 1216 jQuery(quiz_form_id).parent().find('.qmn_pagination').css('width', progress_width - button_width - 40); 1217 } else { 1218 jQuery(quiz_form_id).parent().find('.qmn_pagination').css('width', '100%'); 1219 } 1220 if (go_to_top == 1 && qmn_quiz_data[quiz_id].disable_scroll_next_previous_click != 1) { 1221 qsmScrollTo($container); 1222 } 1223 if (!qmn_quiz_data[quiz_id].hasOwnProperty('first_page') || !qmn_quiz_data[quiz_id].first_page) { 1224 if (slide_number == 0 && page_number == 0) { 1225 $container.find(".qsm-auto-page-row.quiz_begin").hide(); 1226 $container.find('.qsm-auto-page-row.qsm-apc-' + (parseInt(page_number) + 1)).show(); 1227 $container.find('.slide_number_hidden').val(parseInt(slide_number) + 1); 1228 $container.find('.current_page_hidden').val(parseInt(page_number) + 2); 1229 $container.find(".mlw_previous").hide(); 1230 } 1231 } 1232 //Show the page counts 1233 if (page_number > 0 && jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').length > 0) { 1234 var actual_pages = total_pages - 2; 1235 if (page_number <= actual_pages) { 1236 jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').text('').text(page_number + qmn_ajax_object.out_of_text + actual_pages); 1237 jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').show(); 1238 } else { 1239 jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').hide(); 1240 } 1241 } else { 1242 jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').hide(); 1243 } 1244 qmnInitProgressbarOnClick(quiz_id, page_number, total_pages); 1245 jQuery(document).trigger('qsm_auto_next_button_click_after', [quiz_form_id]); 1246} 1247 1248function qmnPrevSlide(pagination, go_to_top, quiz_form_id) { 1249 jQuery(document).trigger('qsm_previous_button_click_before', [quiz_form_id]); 1250 var quiz_id = +jQuery(quiz_form_id).find('.qmn_quiz_id').val(); 1251 var $container = jQuery(quiz_form_id).closest('.qmn_quiz_container'); 1252 var slide_number = +$container.find('.slide_number_hidden').val(); 1253 var previous = +$container.find('.previous_amount_hidden').val(); 1254 var section_totals = +$container.find('.total_sections_hidden').val(); 1255 var page_number = +$container.find('.current_page_hidden').val(); 1256 var total_pages = $container.find('.total_pages_hidden').val(); 1257 jQuery(quiz_form_id + " .qsm-auto-page-row").hide(); 1258 jQuery(quiz_form_id + " .g-recaptcha").hide(); 1259 var slide_original_val = parseInt(slide_number) - 1; 1260 if (slide_original_val == 0) { 1261 $container.find(".mlw_next").show(); 1262 $container.find(".qsm-submit-btn").hide(); 1263 jQuery(quiz_form_id + " .qsm-auto-page-row.quiz_begin").show(); 1264 $container.find('.slide_number_hidden').val(slide_original_val); 1265 $container.find('.current_page_hidden').val(parseInt(page_number) - 1); 1266 $container.find(".mlw_previous").hide(); 1267 } else { 1268 $container.find('.qsm-auto-page-row.qsm-apc-' + slide_original_val).show(); 1269 $container.find('.slide_number_hidden').val(slide_original_val); 1270 $container.find('.current_page_hidden').val(parseInt(page_number) - 1); 1271 $container.find(".mlw_next").show(); 1272 $container.find(".qsm-submit-btn").hide(); 1273 } 1274 check_if_show_start_quiz_button($container, total_pages, page_number); 1275 if (go_to_top == 1 && qmn_quiz_data[quiz_id].disable_scroll_next_previous_click != 1) { 1276 qsmScrollTo($container); 1277 } 1278 if (qmn_quiz_data[quiz_id].disable_first_page == 1) { 1279 if (page_number == 3) { 1280 $container.find(".qsm-auto-page-row.quiz_begin").hide(); 1281 $container.find(".mlw_previous").hide(); 1282 } 1283 } 1284 if (page_number > 0 && jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').length > 0) { 1285 var actual_pages = total_pages - 2; 1286 if (slide_original_val <= actual_pages) { 1287 jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').text('').text(slide_original_val + qmn_ajax_object.out_of_text + actual_pages); 1288 if (slide_original_val == 0) { 1289 jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').hide(); 1290 } else { 1291 jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').show(); 1292 } 1293 } else { 1294 jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.pages_count').hide(); 1295 } 1296 } 1297 jQuery(quiz_form_id).parent().find('.qmn_pagination').css('width', '100%'); 1298 qmnInitProgressbarOnClick(quiz_id, slide_original_val, total_pages); 1299 jQuery(document).trigger('qsm_auto_previous_button_click_after', [quiz_form_id]); 1300} 1301 1302/** 1303 * @since 6.4.11 1304 * @param {int} quiz_id 1305 * @param {int} page_number 1306 * @param {int} total_page_number 1307 * @returns Change progress bar on next and previous button click 1308 */ 1309function qmnInitProgressbarOnClick(quiz_id, page_number, total_page_number) { 1310 if ('0' != qmn_quiz_data[quiz_id].progress_bar) { 1311 if ( ( !qmn_quiz_data[quiz_id].hasOwnProperty('first_page') || !qmn_quiz_data[quiz_id].first_page ) && 0 == page_number ) { 1312 page_number++; 1313 } 1314 var qmn_total_questions = qmn_quiz_data[quiz_id].pagination.total_questions; 1315 var pagination = qmn_quiz_data[quiz_id].pagination.amount;
1316 total_page_number = Math.ceil(qmn_total_questions / pagination); 1317 if (!jQuery('#quizForm' + quiz_id).closest('.qmn_quiz_container').find('.empty_quiz_end').length) { 1318 total_page_number = total_page_number + 1; //Increase for quiz end section 1319 } 1320 var animate_value = page_number / total_page_number; 1321 if (animate_value <= 1) { 1322 qmn_quiz_data[quiz_id].bar.animate(animate_value); 1323 var old_text = jQuery('#qsm_progress_bar_' + quiz_id).find('.progressbar-text').text().replace(' %', ''); 1324 var new_text = Math.round(animate_value * 100); 1325 jQuery({ 1326 Counter: old_text 1327 }).animate({ 1328 Counter: new_text 1329 }, { 1330 duration: 500, 1331 easing: 'swing', 1332 step: function () { 1333 jQuery('#qsm_progress_bar_' + quiz_id).find('.progressbar-text').text(Math.round(this.Counter) + ' %'); 1334 } 1335 }); 1336 } 1337 } 1338} 1339 1340function qmnUpdatePageNumber(amount, quiz_form_id) { 1341 var current_page = +jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.current_page_hidden').val(); 1342 var total_pages = jQuery(quiz_form_id).closest('.qmn_quiz_container').find('.total_pages_hidden').val(); 1343 current_page += amount; 1344 //jQuery( quiz_form_id ).siblings( '.qmn_pagination' ).find( " .qmn_page_counter_message" ).text( current_page + "/" + total_pages ); 1345} 1346 1347function qmnInitPagination(quiz_id) { 1348 jQuery(document).trigger('qsm_init_pagination_before', [quiz_id, qmn_quiz_data]); 1349 var qmn_section_total = +qmn_quiz_data[quiz_id].pagination.total_questions; 1350 var qmn_total_questions = jQuery('#quizForm' + quiz_id).find('#qmn_all_questions_count').val(); 1351 var qmn_total_pages = Math.ceil(qmn_total_questions / +qmn_quiz_data[quiz_id].pagination.amount); 1352 1353 qmn_total_pages = qmn_total_pages + 1; //quiz begin 1354 qmn_total_pages = qmn_total_pages + 1; //quiz end 1355 1356 1357 jQuery('#quizForm' + quiz_id).closest('.qmn_quiz_container').append('<div class="qmn_pagination border margin-bottom"></div>'); 1358 jQuery('#quizForm' + quiz_id).closest('.qmn_quiz_container').find('.qmn_pagination').append('<input type="hidden" value="0" name="slide_number" class="slide_number_hidden" />') 1359 .append('<input type="hidden" value="0" name="current_page" class="current_page_hidden" />') 1360 .append('<input type="hidden" value="' + qmn_total_pages + '" name="total_pages" class="total_pages_hidden" />') 1361 .append('<input type="hidden" value="' + qmn_section_total + '" name="total_sections" class="total_sections_hidden" />') 1362 .append('<input type="hidden" value="0" name="previous_amount" class="previous_amount_hidden" />') 1363 .append('<a class="qmn_btn mlw_qmn_quiz_link mlw_previous" href="javascript:void(0)">' + qmn_quiz_data[quiz_id].pagination.previous_text + '</a>') 1364 .append('<span class="qmn_page_message"></span>') 1365 .append('<div class="qmn_page_counter_message"></div>') 1366 .append('<div class="qsm-progress-bar" id="qsm_progress_bar_' + quiz_id + '" style="display:none;"><div class="progressbar-text"></div></div>') 1367 .append('<a class="qmn_btn mlw_qmn_quiz_link mlw_next mlw_custom_start" href="javascript:void(0)">' + qmn_quiz_data[quiz_id].pagination.start_quiz_survey_text + '</a>') 1368 .append('<input type="submit" value="' + qmn_quiz_data[quiz_id].pagination.submit_quiz_text + '" class="qsm-btn qsm-submit-btn qmn_btn" style="display:none;"/>') 1369 .append('<a class="qmn_btn mlw_qmn_quiz_link mlw_next mlw_custom_next" href="javascript:void(0)">' + qmn_quiz_data[quiz_id].pagination.next_text + '</a>'); 1370 1371 if ('0' != qmn_quiz_data[quiz_id].progress_bar) { 1372 jQuery(document).trigger('qsm_init_progressbar_before', [quiz_id, qmn_quiz_data]); 1373 jQuery('#quizForm' + quiz_id).closest('.qmn_quiz_container').find('.qsm-progress-bar').show(); 1374 qmn_quiz_data[quiz_id].bar = createQSMProgressBar(quiz_id, '#qsm_progress_bar_' + quiz_id); 1375 jQuery(document).trigger('qsm_init_progressbar_after', [quiz_id, qmn_quiz_data]); 1376 } 1377 1378 jQuery(document).on("click", ".qsm-quiz-container-" + quiz_id + " .mlw_next", function (event) { 1379 let quiz_id = +jQuery(this).closest('.qmn_quiz_container').find('.qmn_quiz_id').val(); 1380 jQuery(document).trigger('qsm_auto_next_button_click_before', [quiz_id]); 1381 event.preventDefault(); 1382 let $quizForm = QSM.getQuizForm(quiz_id); 1383 jQuery('.qsm-quiz-container-' + quiz_id + ' .mlw_custom_next').addClass('qsm-disabled-btn'); 1384 jQuery('.qsm-quiz-container-' + quiz_id + ' .mlw_custom_next').append('<div class="qsm-spinner-loader" style="font-size: 3.5px;margin-right: -5px;margin-left: 10px;"></div>'); 1385 1386 jQuery('.qsm-multiple-response-input:checked, .qmn-multiple-choice-input:checked , .qsm_select:visible').each(function () { 1387 if (qmn_quiz_data[quiz_id].end_quiz_if_wrong > 0 && jQuery(this).parents().is(':visible') && jQuery(this).is('input, select')) { 1388 if (jQuery(this).parents('.qmn_radio_answers, .qsm_check_answer')) { 1389 let question_id = jQuery(this).attr('name').split('question')[1], 1390 value = jQuery(this).val(), 1391 $this = jQuery(this).parents('.quiz_section'); 1392 if (value !== "") { 1393 qsm_submit_quiz_if_answer_wrong(question_id, value, $this, $quizForm); 1394 } 1395 } 1396 } 1397 }); 1398 1399 jQuery('.qsm-quiz-container-' + quiz_id + ' .mlw_custom_next').removeClass('qsm-disabled-btn'); 1400 jQuery('.qsm-quiz-container-' + quiz_id + ' .qsm-spinner-loader').remove(); 1401 if (qmnValidatePage('quizForm' + quiz_id)) { 1402 qmnNextSlide(qmn_quiz_data[quiz_id].pagination.amount, 1, '#quizForm' + quiz_id); 1403 } 1404 1405 jQuery(document).trigger('qsm_next_button_click_after', [quiz_id]); 1406 }); 1407 1408 jQuery(document).on("click", ".qsm-quiz-container-" + quiz_id + " .mlw_previous", function (event) { 1409 event.preventDefault(); 1410 var quiz_id = +jQuery(this).closest('.qmn_quiz_container').find('.qmn_quiz_id').val(); 1411 qmnPrevSlide(qmn_quiz_data[quiz_id].pagination.amount, 1, '#quizForm' + quiz_id); 1412 jQuery(document).trigger('qsm_previous_button_click_after', [quiz_id]); 1413 }); 1414 1415 if (qmn_quiz_data[quiz_id].first_page) { 1416 qmnNextSlide(1, 0, '#quizForm' + quiz_id); 1417 } else { 1418 qmnNextSlide(qmn_quiz_data[quiz_id].pagination.amount, 0, '#quizForm' + quiz_id); 1419 } 1420 1421 jQuery(document).trigger('qsm_init_pagination_after', [quiz_id, qmn_quiz_data]); 1422} 1423jQuery(document).on('qsm_next_button_click_after qsm_previous_button_click_after', function(event, quiz_id) { 1424 jQuery(document).trigger('qsm_before_iframe_section',[quiz_id]); 1425 let video_sections = jQuery('.qsm-quiz-container-' + quiz_id + '.qmn_quiz_container').find('video'); 1426 let iframeVideos = jQuery('.qsm-quiz-container-' + quiz_id + '.qmn_quiz_container .qsm
1426-page, .qsm-quiz-container-' + quiz_id + '.qmn_quiz_container .qsm-auto-page-row').find('iframe'); 1427 let audio_sections = jQuery('.qsm-quiz-container-' + quiz_id + '.qmn_quiz_container').find('audio'); 1428 iframeVideos.each(function() { 1429 let src = this.src; 1430 jQuery(this).attr('src', src); 1431 }); 1432 video_sections.each(function() { 1433 if (!this.paused) { 1434 this.pause(); 1435 } 1436 }); 1437 audio_sections.each(function() { 1438 if (!this.paused) { 1439 this.pause(); 1440 } 1441 }); 1442 jQuery(document).trigger('qsm_after_iframe_section',[quiz_id]); 1443}); 1444function maxLengthCheck(object) { 1445 if (object.value.length > object.maxLength) { 1446 object.value = object.value.slice(0, object.maxLength) 1447 } 1448} 1449 1450async function qsm_remove_uploaded_file_fd_question( $this ) { 1451 let parents_section = $this.parents('.quiz_section'); 1452 parents_section.find('.qsm-file-upload-status').removeClass('qsm-processing qsm-success'); 1453 parents_section.find('.qsm-file-upload-status').addClass('qsm-error'); 1454 parents_section.find('.qsm-file-upload-status').html(qmn_ajax_object.remove_file).show(); 1455 parents_section.find('.qsm-file-upload-name').html('').show(); 1456 $this.hide(); 1457 parents_section.find('.mlw_answer_file_upload').val(''); 1458 parents_section.find('.qsm-file-upload-status').text(qmn_ajax_object.remove_file_success); 1459 // triggers after file remove 1460 jQuery(document).trigger('qsm_after_file_remove', [$this.parent(), {type: 'success', message: qmn_ajax_object.remove_file_success}]); 1461} 1462 1463jQuery(function () { 1464 jQuery('.qmn_quiz_container').tooltip({ 1465 position: { 1466 my: "center top+10", 1467 at: "center bottom", 1468 classes: { 1469 "ui-tooltip": "hint-qsm-tooltip" 1470 }, 1471 using: function( position, feedback ) { 1472 jQuery( this ).css( position ); 1473 jQuery( "<div>" ) 1474 .addClass( "qsm-tooltip-arrow" ) 1475 .addClass( feedback.vertical ) 1476 .addClass( feedback.horizontal ) 1477 .appendTo( this ); 1478 } 1479 } 1480 }); 1481 1482 jQuery('.qmn_quiz_container input').on('keypress', function (e) { 1483 if (e.which === 13) { 1484 e.preventDefault(); 1485 } 1486 }); 1487 1488 jQuery(document).on('click', ".qsm-submit-btn", function (event) { 1489 event.preventDefault(); 1490 let $this = jQuery(this); 1491 let quiz_id = +jQuery(this).closest('.qmn_quiz_container').find('.qmn_quiz_id').val(); 1492 let form_id = "quizForm"+quiz_id; 1493 jQuery(document).trigger('qsm_quiz_submit_trigger', [quiz_id]); 1494 let recaptcha = jQuery('#' + form_id).find("#qsm_grecaptcha_v3"); 1495 if (!recaptcha.length) { 1496 qmnFormSubmit(form_id, $this); 1497 return false; 1498 } 1499 1500 // Proceed reCaptcha v3 1501 let site_key = jQuery('#' + form_id).find("#qsm_grecaptcha_v3_sitekey").val(); 1502 let submit_action = jQuery('#' + form_id).find("#qsm_grecaptcha_v3_nonce").val(); 1503 grecaptcha.ready(function () { 1504 grecaptcha.execute(site_key, { action: submit_action }).then(function (token) { 1505 jQuery('#' + form_id).find("#qsm_grecaptcha_v3_response").val(token); 1506 qmnFormSubmit(form_id, $this); 1507 }); 1508 }); 1509 }); 1510 1511 jQuery(document).on('change', '.qmn-multiple-choice-input, .qsm_dropdown, .mlw_answer_date ' , function (e) { 1512 let $i_this = jQuery(this); 1513 var quizID = jQuery(this).parents('.qsm-quiz-container').find('.qmn_quiz_id').val(); 1514 var $quizForm = QSM.getQuizForm(quizID); 1515 let value = jQuery(this).val(); 1516 let $this = jQuery(this).parents('.quiz_section'); 1517 let question_id = $i_this.attr('name').split('question')[1]; 1518 let inputType; 1519 if ($i_this.hasClass('mlw_answer_date')) { 1520 inputType = 'input'; 1521 } else { 1522 inputType = 'radio'; 1523 } 1524 if (qmn_quiz_data[quizID].enable_quick_result_mc == 1) { 1525 qsm_show_inline_result(quizID, question_id, value, $this, inputType, $i_this) 1526 } else if (qmn_quiz_data[quizID].enable_quick_correct_answer_info != 0) { 1527 let data = qsm_question_quick_result_js(question_id, value, inputType, qmn_quiz_data[quizID].enable_quick_correct_answer_info,quizID); 1528 $this.find('.quick-question-res-p, .qsm-inline-correct-info').remove(); 1529 if ( 0 < value.length && data.success != '') { 1530 $this.append('<div class="qsm-inline-correct-info">' + qsm_check_shortcode(data.message) + '</div>'); 1531 } 1532 } 1533 jQuery(document).trigger('qsm_after_select_answer', [quizID, question_id, value, $this, inputType]); 1534 if (qmn_quiz_data[quizID].end_quiz_if_wrong > 0 && !jQuery(this).parents('.qsm-quiz-container').find('.mlw_next:visible').length ) { 1535 qsm_submit_quiz_if_answer_wrong(question_id, value, $this, $quizForm); 1536 } 1537 }); 1538 let qsm_inline_result_timer; 1539 jQuery(document).on('keyup', '.mlw_answer_open_text, .mlw_answer_number, .qmn_fill_blank ', function (e) { 1540 let $i_this = jQuery(this); 1541 let quizID = jQuery(this).parents('.qsm-quiz-container').find('.qmn_quiz_id').val(); 1542 let question_id = $i_this.attr('name').split('question')[1];
1543 let $this = $i_this.parents('.quiz_section'); 1544 let value; 1545 if ($i_this.hasClass('qmn_fill_blank')) { 1546 let $fill_blank_clicks = $this.find('.qmn_fill_blank').map(function () { 1547 var val = jQuery(this).val(); 1548 return val || null; 1549 }).get().filter(function (v) { 1550 return v !== null; 1551 }); 1552 value = $fill_blank_clicks; 1553 } else { 1554 value = $i_this.val(); 1555 } 1556 let sendValue; 1557 if (typeof value === 'string') { 1558 sendValue = value.trim(); 1559 } else if (value.length) { 1560 sendValue = value[value.length - 1]; 1561 } else { 1562 sendValue = ''; 1563 } 1564 clearTimeout(qsm_inline_result_timer); 1565 qsm_inline_result_timer = setTimeout(() => { 1566 let showFeedback = true; 1567 let allCorrect = true; 1568 let isFillBlank = $i_this.hasClass('qmn_fill_blank'); 1569 1570 if (isFillBlank) { 1571 let $allBlanks = $this.find('.qmn_fill_blank'); 1572 let filledBlanks = $allBlanks.filter(function() { 1573 return jQuery(this).val().trim() !== ''; 1574 }); 1575 showFeedback = filledBlanks.length === $allBlanks.length && $allBlanks.length > 0; 1576 1577 if (!showFeedback) { 1578 $this.find('.quick-question-res-p, .qsm-inline-correct-info').remove(); 1579 } else { 1580 filledBlanks.each(function(index) { 1581 let blankData = qsm_question_quick_result_js(question_id, jQuery(this).val().trim(), 'input', qmn_quiz_data[quizID].enable_quick_correct_answer_info, quizID, index); 1582 if (blankData.success !== 'correct') { 1583 allCorrect = false; 1584 return false; 1585 } 1586 }); 1587 } 1588 } 1589 1590 if (showFeedback) { 1591 let quickResultEnabled = qmn_quiz_data[quizID].enable_quick_result_mc == 1; 1592 let correctInfoEnabled = qmn_quiz_data[quizID].enable_quick_correct_answer_info != 0; 1593 1594 if (quickResultEnabled) { 1595 if (isFillBlank) { 1596 $this.find('.quick-question-res-p, .qsm-inline-correct-info').remove(); 1597 let displayData = qsm_question_quick_result_js(question_id, sendValue, 'input', qmn_quiz_data[quizID].enable_quick_correct_answer_info, quizID, $this.find('.qmn_fill_blank').index($i_this)); 1598 let resultClass = allCorrect ? 'qsm-correct-answer-info' : 'qsm-incorrect-answer-info'; 1599 let resultText = allCorrect ? qmn_quiz_data[quizID].quick_result_correct_answer_text : qmn_quiz_data[quizID].quick_result_wrong_answer_text; 1600 1601 $this.append(`<div class="quick-question-res-p ${resultClass}">${resultText}</div>`); 1602 if (displayData.message) { 1603 $this.append(`<div class="qsm-inline-correct-info">${qsm_check_shortcode(displayData.message)}</div>`); 1604 } 1605 if (1 != qmn_quiz_data[quizID].disable_mathjax) MathJax.typesetPromise(); 1606 jQuery('.qsm-spinner-loader').remove(); 1607 } else { 1608 qsm_show_inline_result(quizID, question_id, sendValue, $this, 'input', $i_this, $this.find('.qmn_fill_blank').index($i_this)); 1609 } 1610 } else if (correctInfoEnabled) { 1611 let data = qsm_question_quick_result_js(question_id, sendValue, 'input', correctInfoEnabled, quizID, $this.find('.qmn_fill_blank').index($i_this)); 1612 $this.find('.quick-question-res-p, .qsm-inline-correct-info').remove(); 1613 1614 if (isFillBlank) { 1615 data.success = allCorrect ? 'correct' : 'incorrect'; 1616 } 1617 1618 if (0 < value.length && data.success != '' && data.message) { 1619 $this.append(`<div class="qsm-inline-correct-info">${qsm_check_shortcode(data.message)}</div>`); 1620 } 1621 } 1622 } 1623 jQuery(document).trigger('qsm_after_select_answer', [quizID, question_id, value, $this, 'input', $this.find('.qmn_fill_blank').index($i_this)]); 1624 }, 2000); 1625 }); 1626 1627 //inline result status function 1628 1629 // Autocomplete off 1630 jQuery('.qsm-quiz-container').find('.qmn_quiz_id').each(function () { 1631 var quizID = jQuery(this).val(); 1632 if (qmn_quiz_data[quizID].form_disable_autofill == 1) { 1633 jQuery('#quizForm' + quizID).attr('autocomplete', 'off'); 1634 } 1635 }); 1636 1637 jQuery(document).on('change ', '.qsm-multiple-response-input', function (e) { 1638 let $i_this = jQuery(this); 1639 let quizID = jQuery(this).parents('.qsm-quiz-container').find('.qmn_quiz_id').val(); 1640 let $quizForm = QSM.getQuizForm(quizID); 1641 let question_id = jQuery(this).attr('name').split('question')[1],
1642 $this = jQuery(this).parents('.quiz_section'); 1643 let parent = jQuery(this).closest('.qmn_check_answers'); 1644 let checkedValues = parent.find('input[type="checkbox"]:checked').map(function() { 1645 return jQuery(this).val(); 1646 }).get(); 1647 if (qmn_quiz_data[quizID].end_quiz_if_wrong > 0 && !jQuery(this).parents('.qsm-quiz-container').find('.mlw_next:visible').length ) { 1648 qsm_submit_quiz_if_answer_wrong(question_id, checkedValues, $this, $quizForm, 'checkbox'); 1649 } 1650 if (qmn_quiz_data[quizID].enable_quick_result_mc == 1) { 1651 qsm_show_inline_result(quizID, question_id, checkedValues, $this, 'checkbox', $i_this) 1652 } else if (qmn_quiz_data[quizID].enable_quick_correct_answer_info != 0) { 1653 let data = qsm_question_quick_result_js(question_id, checkedValues, 'checkbox', qmn_quiz_data[quizID].enable_quick_correct_answer_info,quizID); 1654 $this.find('.quick-question-res-p, .qsm-inline-correct-info').remove(); 1655 if ( 0 < checkedValues.length && data.success != '') { 1656 $this.append('<div class="qsm-inline-correct-info">' + qsm_check_shortcode(data.message) + '</div>'); 1657 } 1658 } 1659 jQuery(document).trigger('qsm_after_select_answer', [quizID, question_id, checkedValues, $this, 'checkbox']); 1660 }); 1661 1662 //Ajax upload file code 1663 jQuery('.quiz_section .mlw_answer_file_upload').on('change', async function () { 1664 var $this = jQuery(this); 1665 var file_data = jQuery(this).prop('files')[0]; 1666 if (!file_data) { 1667 await qsm_remove_uploaded_file_fd_question( $this.parent('.quiz_section').find('.qsm-file-upload-container').find('.remove-uploaded-file') ); 1668 return false; 1669 } 1670 let question_id = $this.parent('.quiz_section').find('.mlw_answer_file_upload').attr("name").replace('qsm_file_question', ''); 1671 let quiz_id = jQuery(this).closest('.qmn_quiz_container').find('.qmn_quiz_id').val(); 1672 let file_upload_type = qmn_quiz_data[quiz_id].questions_settings[question_id].file_upload_type; 1673 let file_upload_limit = qmn_quiz_data[quiz_id].questions_settings[question_id].file_upload_limit || 1; // Default 1MB 1674 let $file_upload_status = $this.parent('.quiz_section').find('.qsm-file-upload-status'); 1675 $file_upload_status.removeClass('qsm-error qsm-success qsm-processing'); 1676 $file_upload_status.addClass('qsm-processing'); 1677 $file_upload_status.text(qmn_ajax_object.validate_process).show(); 1678 // Build allowed mime types array 1679 var allowed_mime_types = []; 1680 if (file_upload_type) { 1681 let types = file_upload_type.split(','); 1682 types.forEach(function(type) { 1683 type = type.trim(); 1684 if (type === 'image') { 1685 allowed_mime_types.push('image/jpeg', 'image/png', 'image/x-icon', 'image/gif', 'image/webp'); 1686 } else if (type === 'doc') { 1687 allowed_mime_types.push('application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'); 1688 } else if (type === 'excel') { 1689 allowed_mime_types.push('application/excel', 'application/vnd.ms-excel', 'application/x-excel', 'application/x-msexcel', 1690 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'text/csv'); 1691 } else if (type) { 1692 allowed_mime_types.push(type); 1693 } 1694 }); 1695 } 1696 1697 let trigger_message, trigger_type = ''; 1698 // Validate file type 1699 if (!allowed_mime_types.includes(file_data.type) || file_upload_limit > 0 && file_data.size > file_upload_limit * 1024 * 1024) { 1700 let warning_message = ''; 1701 if(file_upload_limit > 0 && file_data.size > file_upload_limit * 1024 * 1024) { 1702 warning_message = qmn_ajax_object.invalid_file_size + file_upload_limit + 'MB'; 1703 } else { 1704 warning_message = qmn_ajax_object.invalid_file_type + file_upload_type; 1705 } 1706 $this.val(''); 1707 $file_upload_status.removeClass('qsm-processing'); 1708 $file_upload_status.addClass('qsm-error').text(warning_message).show(); 1709 trigger_message = warning_message; 1710 trigger_type = 'error'; 1711 } else {
1712 // If validation passes, update UI to show success 1713 $file_upload_status.removeClass('qsm-error qsm-processing'); 1714 $file_upload_status.addClass('qsm-success'); 1715 $this.parent('.quiz_section').find('.qsm-file-upload-name').html(jQuery(this)[0].files[0].name).show(); 1716 $this.parent('.quiz_section').find('.qsm-file-upload-container').find('.remove-uploaded-file').show(); 1717 $file_upload_status.text(qmn_ajax_object.validate_success).show(); 1718 trigger_message = qmn_ajax_object.validate_success; 1719 trigger_type = 'success'; 1720 } 1721 1722 // Trigger event for any listeners 1723 const obj = { 1724 type: trigger_type, 1725 message: trigger_message, 1726 file_name: file_data.name, 1727 file_type: file_data.type, 1728 file_size: file_data.size, 1729 file_path: '', 1730 file_url: '', 1731 }; 1732 jQuery(document).trigger('qsm_after_file_upload', [$this.parent(), obj]); 1733 1734 return false; 1735 }); 1736 1737 //Ajax remove file code 1738 jQuery(document).on('click ', '.quiz_section .remove-uploaded-file', async function () { 1739 await qsm_remove_uploaded_file_fd_question( jQuery(this) ); 1740 return false; 1741 }); 1742 jQuery(document).on('click', '.quiz_section .qsm-file-upload-container', function (e) { 1743 e.preventDefault(); 1744 // Don't trigger file upload if clicking on remove button 1745 if (!jQuery(e.target).hasClass('remove-uploaded-file')) { 1746 jQuery(this).prev('.mlw_answer_file_upload').trigger('click'); 1747 } 1748 }); 1749 jQuery(document).on( 1750 'dragover', 1751 '.quiz_section .qsm-file-upload-container', 1752 function (e) { 1753 e.preventDefault(); 1754 e.stopPropagation(); 1755 jQuery(this).addClass('file-hover'); 1756 } 1757 ) 1758 jQuery(document).on( 1759 'dragenter', 1760 '.quiz_section .qsm-file-upload-container', 1761 function (e) { 1762 e.preventDefault(); 1763 e.stopPropagation(); 1764 } 1765 ) 1766 jQuery(document).on( 1767 'dragleave', 1768 '.quiz_section .qsm-file-upload-container', 1769 function (e) { 1770 e.preventDefault(); 1771 e.stopPropagation(); 1772 jQuery(this).removeClass('file-hover'); 1773 } 1774 ) 1775 jQuery(document).on( 1776 'drop', 1777 '.quiz_section .qsm-file-upload-container', 1778 function (e) { 1779 jQuery(this).removeClass('file-hover'); 1780 jQuery(this).find('.qsm-file-upload-name').html(e.originalEvent.dataTransfer.files[0].name).fadeIn(); 1781 if (e.originalEvent.dataTransfer) { 1782 if (e.originalEvent.dataTransfer.files.length) { 1783 e.preventDefault(); 1784 e.stopPropagation(); 1785 jQuery(this).prev('.mlw_answer_file_upload').prop('files', e.originalEvent.dataTransfer.files); 1786 jQuery(this).prev('.mlw_answer_file_upload').trigger('change'); 1787 } 1788 } 1789 } 1790 ); 1791 jQuery(document).on( 1792 'mouseleave', 1793 '.quiz_section .qsm-file-upload-container', 1794 function () { 1795 jQuery(this).removeClass('file-hover'); 1796 } 1797 ); 1798 //Deselect all answer on select 1799 jQuery('.qsm-deselect-answer').click(function (e) { 1800 e.preventDefault(); 1801 jQuery(this).parents('.quiz_section').find('input[type="radio"]').prop('checked', false); 1802 jQuery(this).parents('.quiz_section').find('input[type="radio"]:hidden').prop('checked', true); 1803 }); 1804 1805 //Submit the form on popup click 1806 jQuery(document).on('click', '.submit-the-form', function (e) { 1807 e.preventDefault(); 1808 // Triggger the click event on the quiz form's submit button. 1809 jQuery('.qsm-submit-btn').trigger('click'); 1810 jQuery('#modal-3').removeClass('is-open'); 1811 }); 1812 1813 jQuery('.pagetime-goto-nextpage').click(function (e) { 1814 e.preventDefault(); 1815 var quiz_id = jQuery(this).data('quiz_id'); 1816 var $container = jQuery('#quizForm' + quiz_id).closest('.qmn_quiz_container'); 1817 if(!$container.find('.qsm-submit-btn').is(':visible')) { 1818 QSM.nextPage(quiz_id); 1819 qsmScrollTo($container); 1820 }else{ 1821 $container.find(".mlw_custom_next").hide(); 1822 } 1823 }); 1824 1825 jQuery(document).on('keyup', '.mlwPhoneNumber', function (e) { 1826 this.value = this.value.replace(/[^- +()0-9.]/g, ''); 1827 }); 1828 1829 jQuery(document).on('click', '.qsm_social_share_link', function (e) { 1830 e.preventDefault(); 1831 var network = jQuery(this).attr('data-network'); 1832 var share_url = jQuery(this).attr('data-link'); 1833 var social_text = jQuery(this).attr('data-text'); 1834 var social_id = jQuery(this).attr('data-id'); 1835 var url = ''; 1836 if (network == 'facebook') { 1837 url = "https://www.facebook.com/dialog/feed?" + "display=popup&" + "app_id=" + social_id + 1838 "&" + "link=" + encodeURIComponent(share_url) + "&" + "name=" + social_text; 1839 } 1840 if (network == 'twitter') { 1841 url = "https://twitter.com/intent/tweet?text=" + social_text; 1842 } 1843 if (network == 'linkedin') { 1844 url = "https://www.linkedin.com/feed/?text=" + social_text; 1845 } 1846 var sTop = window.screen.height / 2 - (218); 1847 var sLeft = window.screen.width / 2 - (313); 1848 var sqShareOptions = "height=400,width=580,toolbar=0,status=0,location=0,menubar=0,directories=0,scrollbars=0,top=" + sTop + ",left=" + sLeft; 1849 window.open(url, "Share", sqShareOptions); 1850 return false;
1851 }); 1852}); 1853 1854const videoAttributePatterns = [ 1855 /\ssrc="([^"]+)"/, 1856 /\smp4="([^"]+)"/, 1857 /\sm4v="([^"]+)"/, 1858 /\swebm="([^"]+)"/, 1859 /\sogv="([^"]+)"/, 1860 /\swmv="([^"]+)"/, 1861 /\sflv="([^"]+)"/, 1862 /\swidth="(\d+)"/, 1863 /\sheight="(\d+)"/ 1864]; 1865 1866function parseAttributes(match, src, width, height) { 1867 let videoAttrs = { src: '', width: '', height: '' }; 1868 1869 videoAttributePatterns.forEach(pattern => { 1870 const attrMatch = match.match(pattern); 1871 if (attrMatch) { 1872 const value = attrMatch[1] || ''; 1873 if (pattern.toString().includes('width')) { 1874 videoAttrs.width = value; 1875 } else if (pattern.toString().includes('height')) { 1876 videoAttrs.height = value; 1877 } else { 1878 videoAttrs.src = value; 1879 } 1880 } 1881 }); 1882 1883 return videoAttrs; 1884} 1885 1886function generateVideoTag(src, width, height, content) { 1887 return `<video src="${src}" width="${width}" height="${height}" controls>${content}</video>`; 1888} 1889 1890function qsm_check_shortcode(message = null) { 1891 const videoContentRegex = /\[video(?:\s(?:src|mp4|m4v|webm|ogv|wmv|flv|width|height)="[^"]*")*\](.*?)\[\/video\]/g; 1892 let videoMatch = message.match(videoContentRegex); 1893 1894 if (videoMatch) { 1895 let videoHTML = message.replace(videoContentRegex, function(match, content) { 1896 const { src, width, height } = parseAttributes(match); 1897 const videoTag = generateVideoTag(src, width, height, content); 1898 return `<div class="video-content">${videoTag}</div>`; 1899 }); 1900 return videoHTML; 1901 } 1902 1903 // Check if message contains an image shortcode 1904 let imageRegex = /\[img(?:(?:\ssrc="([^"]+)")|(?:\salt="([^"]+)")|(?:\swidth="(\d+)")|(?:\sheight="(\d+)")){0,4}\s*\]/g; 1905 let imageMatch = message.match(imageRegex); 1906 1907 if (imageMatch) { 1908 let imageHTML = message.replace(imageRegex, function(match, src, alt, width, height) { 1909 return '<img src="' + (src || '') + '" alt="' + (alt || '') + '" width="' + (width || '') + '" height="' + (height || '') + '">'; 1910 }); 1911 return '<div class="image-content">' + imageHTML + '</div>'; 1912 } 1913 1914 return message; 1915} 1916 1917function qsm_show_inline_result(quizID, question_id, value, $this, answer_type, $i_this, index = null) { 1918 if ($i_this?.hasClass?.('mlw_answer_date')) { 1919 if (!/^[1-9]\d{3}-\d{2}-\d{2}$/.test(value)) { 1920 return; 1921 } 1922 } 1923 jQuery('.qsm-spinner-loader').remove(); 1924 addSpinnerLoader($this,$i_this); 1925 let data = qsm_question_quick_result_js(question_id, value, answer_type, qmn_quiz_data[quizID].enable_quick_correct_answer_info,quizID, index); 1926 $this.find('.quick-question-res-p, .qsm-inline-correct-info').remove(); 1927 $this.find('.qmn_radio_answers').children().removeClass('data-correct-answer'); 1928 if ( 0 < value.length && data.success == 'correct') { 1929 $this.append('<div class="quick-question-res-p qsm-correct-answer-info">' + qmn_quiz_data[quizID].quick_result_correct_answer_text + '</div>') 1930 $this.append('<div class="qsm-inline-correct-info">' + qsm_check_shortcode(data.message) + '</div>'); 1931 } else if (0 < value.length && data.success == 'incorrect') { 1932 $this.find('.qmn_radio_answers input[value="' + data.correct_index + '"]').parent().addClass('data-correct-answer'); 1933 $this.append('<div class="quick-question-res-p qsm-incorrect-answer-info">' + qmn_quiz_data[quizID].quick_result_wrong_answer_text + '</div>') 1934 $this.append('<div class="qsm-inline-correct-info">' + qsm_check_shortcode(data.message) + '</div>'); 1935 } 1936 if (1 != qmn_quiz_data[quizID].disable_mathjax) { 1937 MathJax.typesetPromise(); 1938 } 1939 jQuery('.qsm-spinner-loader').remove(); 1940 jQuery(document).trigger('qsm_show_inline_result_after', [quizID, question_id, value, $this, answer_type, $i_this, index]); 1941} 1942function addSpinnerLoader($this,$i_this) { 1943 if ($this.find('.mlw_answer_open_text').length) { 1944 $this.find('.mlw_answer_open_text').after('<div class="qsm-spinner-loader" style="font-size: 2.5px;margin-left:10px;"></div>'); 1945 } else if ($this.find('.mlw_answer_number').length) { 1946 $this.find('.mlw_answer_number').after('<div class="qsm-spinner-loader" style="font-size: 2.5px;margin-left:10px;"></div>'); 1947 } else { 1948 $i_this.next('.qsm-input-label').after('<div class="qsm-spinner-loader" style="font-size: 2.5px;"></div>'); 1949 } 1950 } 1951 1952// captcha question type 1953var mlw_code; 1954jQuery(document).ready(function () { 1955 let captchaElement = jQuery('#mlw_code_captcha'); 1956 if (captchaElement.length !== 0) { 1957 mlw_code = ''; 1958 let mlw_chars = '0123456789ABCDEFGHIJKL!@#$%^&*()MNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'; 1959 let mlw_code_length = 5; 1960 for (let i = 0; i < mlw_code_length; i++) { 1961 let rnum = Math.floor(Math.random() * mlw_chars.length); 1962 mlw_code += mlw_chars.substring(rnum, rnum + 1); 1963 } 1964 var captchaCanvas = document.getElementById('mlw_captcha'); 1965 var mlw_captchaCTX = captchaCanvas.getContext('2d'); 1966 var containerDirection = window.getComputedStyle(captchaCanvas).direction || 'ltr'; 1967 mlw_captchaCTX.font = 'normal 24px Verdana'; 1968 mlw_captchaCTX.strokeStyle = '#000000'; 1969 mlw_captchaCTX.clearRect(0, 0, captchaCanvas.width, captchaCanvas.height); 1970 if (containerDirection === 'rtl') { 1971 mlw_captchaCTX.textAlign = 'right'; 1972 mlw_captchaCTX.strokeText(mlw_code, captchaCanvas.width - 10, captchaCanvas.height / 2); 1973 } else { 1974 mlw_captchaCTX.textAlign = 'left'; 1975 mlw_captchaCTX.strokeText(mlw_code, 10, captchaCanvas.height / 2); 1976 } 1977 document.getElementById('mlw_code_captcha').value = mlw_code; 1978 } 1979 window.onbeforeunload = function (e) {
1980 let startButton = jQuery('.qsm-quiz-container .qsm-submit-btn'); 1981 let quiz_id = jQuery('.qsm-quiz-container .qmn_quiz_id').val(); 1982 let flag = false; 1983 if( startButton.length ){ 1984 flag = true; 1985 } 1986 if( flag && qmn_quiz_data[quiz_id].prevent_reload == 1 ){ 1987 return true; 1988 }else{ 1989 return null; 1990 } 1991 } 1992}); 1993 1994var quizType = 'default'; 1995 1996let submit_status = true; 1997function qsm_submit_quiz_if_answer_wrong(question_id, value, $this, $quizForm, answer_type = '') { 1998 let quiz_id = $quizForm.closest('.qmn_quiz_container').find('.qmn_quiz_id').val(); 1999 let data = qsm_question_quick_result_js(question_id, value, answer_type, qmn_quiz_data[quiz_id].enable_quick_correct_answer_info,quiz_id); 2000 QSM.changes(data, question_id.replace(/\D/g, ""), quiz_id); 2001 if (data.success == 'incorrect' && submit_status) { 2002 $quizForm.closest('.qmn_quiz_container').find('[class*="Required"]').removeClass(); 2003 $quizForm.closest('.qmn_quiz_container').find('.qsm-submit-btn').trigger('click'); 2004 } 2005 if (1 != qmn_quiz_data[quiz_id].disable_mathjax) { 2006 MathJax.typesetPromise(); 2007 } 2008} 2009 2010function qsm_format_date_answer(v) { 2011 if (typeof v === 'string') { 2012 let ymd = /^([1-9]\d{3})[-/](\d{2})[-/](\d{2})$/.exec(v); 2013 if (ymd) { 2014 return ymd[1] + '-' + ymd[2] + '-' + ymd[3]; 2015 } 2016 let dmy = /^(\d{2})[-/](\d{2})[-/]([1-9]\d{3})$/.exec(v); 2017 if (dmy) { 2018 return dmy[3] + '-' + dmy[2] + '-' + dmy[1]; 2019 } 2020 } 2021 return v; 2022} 2023 2024function qsm_question_quick_result_js(question_id, answer, answer_type = '', show_correct_info = '',quiz_id='', ans_index=null) { 2025 if (typeof encryptedData[quiz_id] !== 'undefined') { 2026 let decryptedBytes = CryptoJS.AES.decrypt(encryptedData[quiz_id], encryptionKey[quiz_id]); 2027 let decryptedData = decryptedBytes.toString(CryptoJS.enc.Utf8); 2028 let decrypt = JSON.parse(decryptedData); 2029 question_id = typeof question_id !== 'undefined' ? parseInt(question_id) : 0; 2030 answer = typeof answer !== 'undefined' ? answer : ''; 2031 answer_type = typeof answer_type !== 'undefined' ? answer_type : ''; 2032 let answer_array = decrypt[question_id].answer_array; 2033 let settings = decrypt[question_id].settings; 2034 let correct_info_text = decrypt[question_id].correct_info_text; 2035 let correct_answer_logic = decrypt.correct_answer_logic; 2036 show_correct_info = typeof show_correct_info !== 'undefined' && show_correct_info != 0 ? show_correct_info : ''; 2037 let got_ans = false; 2038 let correct_answer = false; 2039 let count = 0; 2040 var index = typeof index !== 'undefined' ? index : 0; 2041 let correct_index = 0; 2042 let answer_count = 0; 2043 let total_correct_answer = 0; 2044 if (answer_array && false === got_ans) { 2045 for ( let key in answer_array) { 2046 let value = answer_array[key]; 2047 2048 if ('input' === answer_type) { 2049 if (!settings['case_sensitive']) { 2050 answer = answer.toUpperCase(); 2051 value[0] = value[0].toUpperCase(); 2052 } 2053 2054 let isDateQuestion = 12 === Number.parseInt(decrypt[question_id].question_type_new); 2055 let correctValue = isDateQuestion ? qsm_format_date_answer(value[0]) : value[0]; 2056 2057 if (answer == correctValue && (1 === Number.parseInt(value[2]) || 14 === Number.parseInt(decrypt[question_id].question_type_new)) && (!settings['matchAnswer'] || 'random' === settings['matchAnswer'] || key == ans_index)) { 2058 got_ans = true; 2059 correct_answer = true; 2060 break; 2061 } 2062 } else if ('checkbox' === answer_type) { 2063 if (0 == correct_answer_logic) { 2064 for (let anskey in answer) { 2065 let ansvalue = answer[anskey]; 2066 if (parseInt(ansvalue) === parseInt(key) && 1 == value[2]) { 2067 got_ans = true; 2068 correct_answer = true; 2069 break; 2070 } 2071 } 2072 } else { 2073 2074 if (answer_array[answer[key]] !== undefined) { 2075 if (1 == answer_array[answer[key]][2]) { 2076 answer_count++; 2077 } else if (answer[key] !== undefined) { 2078 answer_count--; 2079 } 2080 } 2081 if (1 == value[2]) { 2082 total_correct_answer++; 2083 } 2084 } 2085 } else if (parseInt(answer) === parseInt(key) && 1 === parseInt(value[2])) { 2086 got_ans = true; 2087 correct_answer = true; 2088 break; 2089 } 2090 } 2091 2092 for (let key in answer_array) { 2093 let value = answer_array[key]; 2094 if (false == correct_answer) { 2095 if (1 == value[2]) { 2096 correct_index = count; 2097 } 2098 count++; 2099 } 2100 } 2101 2102 if ('checkbox' === answer_type) { 2103 if (1 == correct_answer_logic) {
2104 if (0 != answer_count && 0 != total_correct_answer && total_correct_answer == answer_count) { 2105 got_ans = true; 2106 correct_answer = true; 2107 } 2108 } 2109 } 2110 } 2111 2112 if (2 == show_correct_info) { 2113 got_ans = true; 2114 } 2115 2116 let returnObject = { 2117 "correct_index": correct_index, 2118 "success": correct_answer ? 'correct' : 'incorrect', 2119 "message": show_correct_info && got_ans ? correct_info_text : "" 2120 }; 2121 2122 jQuery(document).trigger('qsm_question_quick_result_js_after', [returnObject, correct_answer, answer, answer_array, answer_type, settings, decrypt, question_id]); 2123 return returnObject; 2124 } 2125} 2126 2127jQuery(document).on('click', function(event) { 2128 if (jQuery(event.target).closest('.qsm-quiz-container').length) { 2129 jQuery('.qsm-quiz-container').removeClass('qsm-recently-active'); 2130 jQuery(event.target).closest('.qsm-quiz-container').addClass('qsm-recently-active'); 2131 } else { 2132 jQuery('.qsm-quiz-container').removeClass('qsm-recently-active'); 2133 } 2134}); 2135 2136jQuery(document).keydown(function(event) { 2137 if (jQuery('.qsm-quiz-container.qsm-recently-active').length) { 2138 let qsm_keypress_action = { allowed: true }; 2139 jQuery(document).trigger('qsm_keyboard_quiz_action_start', [event, qsm_keypress_action]); 2140 if(qsm_keypress_action.allowed === false){ 2141 return; 2142 } 2143 if (jQuery(event.target).is('input')) { 2144 // Check if the parent div has the class 'qsm_contact_div' 2145 if (jQuery(event.target).closest('div.qsm_contact_div').length > 0) { 2146 return; 2147 } 2148 } 2149 let lastVisibleWrapper = jQuery('.qsm-question-wrapper:visible:last'); 2150 if (lastVisibleWrapper.hasClass('qsm-active-question')) { 2151 lastVisibleWrapper.addClass('qsm-last-active-question'); 2152 return; 2153 } 2154 const inputSelector = 'textarea:focus, input[type="text"]:focus, input[type="email"]:focus, input[type="number"]:focus, input[type="tel"]:focus, input[type="url"]:focus'; 2155 if ([39, 37, 13, 9].includes(event.keyCode) && jQuery(inputSelector).length === 0) { 2156 event.preventDefault(); 2157 } 2158 if (event.keyCode === 39 && jQuery(inputSelector).length === 0 ) { 2159 jQuery('.qsm-quiz-container.qsm-recently-active').find('.mlw_next:visible').click(); 2160 } 2161 if (event.keyCode === 37 && jQuery(inputSelector).length === 0 ) { 2162 jQuery('.qsm-quiz-container.qsm-recently-active').find('.mlw_previous:visible').click(); 2163 } 2164 if (event.keyCode === 13 && jQuery(inputSelector).length === 0) { 2165 jQuery('.qsm-quiz-container.qsm-recently-active').find('.qsm-submit-btn:visible').click(); 2166 jQuery('.qsm-quiz-container.qsm-recently-active').find('.mlw_next:visible').click(); 2167 } 2168 if (event.keyCode === 40 && jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question:visible .qmn_radio_answers:not(.qsm_multiple_grid_answers)').length) { 2169 event.preventDefault(); 2170 let checkedInputs = jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question .qmn_radio_answers .qmn_mc_answer_wrap input:checked, .qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question .qmn_radio_answers .mlw_horizontal_choice input:checked'); 2171 if (checkedInputs.length === 0) { 2172 jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question .qmn_radio_answers').find('input:first').click(); 2173 } else { 2174 let nextInput = checkedInputs.closest('.qmn_mc_answer_wrap, .mlw_horizontal_choice').next('.qmn_mc_answer_wrap, .mlw_horizontal_choice').find('input[type="radio"]'); 2175 if (nextInput.length) { 2176 nextInput.click(); 2177 } else { 2178 jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question .qmn_radio_answers').find('input:first').click(); 2179 } 2180 } 2181 } 2182 if (event.keyCode === 38 && jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question:visible .qmn_radio_answers:not(.qsm_multiple_grid_answers)').length) { 2183 event.preventDefault(); 2184 let checkedInputs = jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question .qmn_radio_answers .qmn_mc_answer_wrap input:checked, .qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question .qmn_radio_answers .mlw_horizontal_choice input:checked'); 2185 if (checkedInputs.length === 0) { 2186 jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question .qmn_radio_answers').find('.qmn_mc_answer_wrap input:last, .mlw_horizontal_choice input:last').click(); 2187 } else { 2188 let prevInput = checkedInputs.closest('.qmn_mc_answer_wrap, .mlw_horizontal_choice').prev('.qmn_mc_answer_wrap, .mlw_horizontal_choice').find('input[type="radio"]'); 2189 if (prevInput.length) { 2190 prevInput.click(); 2191 } else { 2192 jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question .qmn_radio_answers').find('.qmn_mc_answer_wrap input:last, .mlw_horizontal_choice input:last').click(); 2193 } 2194 } 2195 } 2196 if (event.shiftKey && event.keyCode === 9) { 2197 let active_question = jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question'); 2198 if (active_question.length) { 2199 jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper').removeClass("qsm-active-question");
2200 active_question.prev('.qsm-question-wrapper:visible').addClass("qsm-active-question").removeClass('qsm-last-active-question'); 2201 } else { 2202 jQuery(".qsm-quiz-container.qsm-recently-active .qsm-question-wrapper:visible:first-child").addClass("qsm-active-question").removeClass('qsm-last-active-question'); 2203 } 2204 } else if (event.keyCode === 9) { 2205 let active_question = jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question'); 2206 if (active_question.length) { 2207 jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper').removeClass("qsm-active-question"); 2208 active_question.next('.qsm-question-wrapper:visible').addClass("qsm-active-question").removeClass('qsm-last-active-question'); 2209 } else { 2210 jQuery(".qsm-quiz-container.qsm-recently-active .qsm-question-wrapper:visible:first").addClass("qsm-active-question").removeClass('qsm-last-active-question'); 2211 } 2212 } 2213 if (event.keyCode === 9) { 2214 let active_question = jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question'); 2215 if (active_question.length) { 2216 jQuery('.qsm-quiz-container.qsm-recently-active .qsm-question-wrapper.qsm-active-question input:first').focus(); 2217 } 2218 } 2219 jQuery(document).trigger('qsm_keyboard_quiz_action_end', event); 2220 } 2221}); 2222const qsm_timer_consumed_obj = { 2223 qmn_count_upward_status : false 2224} 2225 2226const userAnswers = {}; 2227 2228jQuery(document).on('qsm_after_select_answer', (event, quizID, question_id, value, $this, answer_type) => { 2229 const variableName = `%USER_ANSWER_${parseInt(question_id)}%`; 2230 2231 let replacementValue; 2232 2233 if (answer_type === 'radio') { 2234 if (jQuery('.qsm_select.qsm_dropdown').length) { 2235 replacementValue = jQuery(`option[value="${value}"]`).text().trim(); 2236 } else { 2237 const ansValue = ++value; 2238 const forValue = `question${question_id}_${ansValue}`; 2239 replacementValue = jQuery(`label[for="${forValue}"]`).text().trim(); 2240 } 2241 } else { 2242 replacementValue = value; 2243 } 2244 2245 if (replacementValue !== undefined) { 2246 userAnswers[variableName] = replacementValue; 2247 2248 jQuery('.qsm-quiz-container-' + quizID).each((_, container) => { 2249 const replacePlaceholders = (node) => { 2250 if (node.nodeType === Node.TEXT_NODE) { 2251 if (!node.hasOwnProperty('__originalText')) { 2252 node.__originalText = node.nodeValue; 2253 } 2254 2255 let newValue = node.__originalText; 2256 for (const [varName, answer] of Object.entries(userAnswers)) { 2257 newValue = newValue.replace(new RegExp(varName, 'g'), answer); 2258 } 2259 node.nodeValue = newValue; 2260 2261 } else if (node.nodeType === Node.ELEMENT_NODE && !['INPUT', 'TEXTAREA'].includes(node.tagName)) { 2262 Array.from(node.childNodes).forEach(child => replacePlaceholders(child)); 2263 } 2264 }; 2265 2266 replacePlaceholders(container); 2267 }); 2268 } 2269 2270});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.