PageSourceSearch

http://fitnessenlanube.com/wp-content/plugins/quiz-master-next/js/qsm-quiz.js?ver=11.2.7

js fitnessenlanube.com collected 2026-10-08 03:35:29 UTC 94,576 bytes, 2,270 lines download raw bytes

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.