PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.0.4
Tutor LMS – eLearning and online course solution v1.0.4
4.0.1 4.0.0 3.9.15 3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / assets / js / tutor-front.js
tutor / assets / js Last commit date
gutenberg_blocks.js 7 years ago mce-button.js 7 years ago tutor-admin.js 7 years ago tutor-front.js 7 years ago
tutor-front.js
563 lines
1 jQuery(document).ready(function($){
2 'use strict';
3
4 $(document).on('change', '.tutor-course-filter-form', function(e){
5 e.preventDefault();
6 $(this).closest('form').submit();
7 });
8
9 const videoPlayer = {
10 nonce_key : _tutorobject.nonce_key,
11 video_track_data : $('#tutor_video_tracking_information').val(),
12 track_player : function(){
13 var that = this;
14
15 var video_data = this.video_track_data ? JSON.parse(this.video_track_data) : {};
16
17 if (typeof Plyr !== 'undefined') {
18 const player = new Plyr('#tutorPlayer');
19
20 player.on('ready', function(event){
21 const instance = event.detail.plyr;
22 if (video_data.best_watch_time > 0) {
23 instance.media.currentTime = video_data.best_watch_time;
24 }
25 that.sync_time(instance);
26 });
27
28 var tempTimeNow = 0;
29 var intervalSeconds = 60; //Send to tutor backend about video playing time in this interval
30 player.on('timeupdate', function(event){
31 const instance = event.detail.plyr;
32
33 var tempTimeNowInSec = (tempTimeNow / 4); //timeupdate firing 250ms interval
34 if (tempTimeNowInSec >= intervalSeconds){
35 that.sync_time(instance);
36 tempTimeNow = 0;
37 }
38 tempTimeNow++;
39 });
40
41 player.on('ended', function(event){
42 const instance = event.detail.plyr;
43
44 var data = {is_ended:true};
45 that.sync_time(instance, data)
46 });
47 }
48 },
49 sync_time: function(instance, options){
50 /**
51 * TUTOR is sending about video playback information to server.
52 */
53 var video_data = this.video_track_data ? JSON.parse(this.video_track_data) : {};
54 var data = {action: 'sync_video_playback', currentTime : instance.currentTime, duration:instance.duration, post_id : video_data.post_id};
55 data[this.nonce_key] = _tutorobject[this.nonce_key];
56
57 var data_send = data;
58 if(options){
59 data_send = Object.assign(data, options);
60 }
61 $.post(_tutorobject.ajaxurl, data_send);
62 },
63 init: function(){
64 this.track_player();
65 }
66 };
67
68 /**
69 * Fire TUTOR video
70 * @since v.1.0.0
71 */
72 if ($('#tutorPlayer').length){
73 videoPlayer.init();
74 }
75
76 $(document).on('change keyup paste', '.tutor_user_name', function(){
77 $(this).val(tutor_slugify($(this).val()));
78 });
79
80 function tutor_slugify(text) {
81 return text.toString().toLowerCase()
82 .replace(/\s+/g, '-') // Replace spaces with -
83 .replace(/[^\w\-]+/g, '') // Remove all non-word chars
84 .replace(/\-\-+/g, '-') // Replace multiple - with single -
85 .replace(/^-+/, '') // Trim - from start of text
86 .replace(/-+$/, ''); // Trim - from end of text
87 }
88
89 /**
90 * Hover tutor rating and set value
91 */
92 $(document).on('hover', '.tutor-write-review-box .tutor-star-rating-group i', function(){
93 $(this).closest('.tutor-star-rating-group').find('i').removeClass('tutor-icon-star-full').addClass('tutor-icon-star-line');
94 var currentRateValue = $(this).attr('data-rating-value');
95 for (var i = 1; i<= currentRateValue; i++){
96 $(this).closest('.tutor-star-rating-group').find('i[data-rating-value="'+i+'"]').removeClass('tutor-icon-star-line').addClass('tutor-icon-star-full');
97 }
98 $(this).closest('.tutor-star-rating-group').find('input[name="tutor_rating_gen_input"]').val(currentRateValue);
99 });
100
101 $(document).on('click', '.tutor-star-rating-group i', function(){
102 var rating = $(this).attr('data-rating-value');
103 $(this).closest('.tutor-star-rating-group').find('input[name="tutor_rating_gen_input"]').val(rating);
104 });
105
106 $(document).on('click', '.tutor_submit_review_btn', function (e) {
107 e.preventDefault();
108 var $that = $(this);
109 var rating = $that.closest('form').find('input[name="tutor_rating_gen_input"]').val();
110 var review = $that.closest('form').find('textarea[name="review"]').val();
111 review = review.trim();
112
113 var course_id = $('input[name="tutor_course_id"]').val();
114 var data = {course_id : course_id, rating : rating, review:review, action: 'tutor_place_rating' };
115
116 if (review) {
117 $.ajax({
118 url: _tutorobject.ajaxurl,
119 type: 'POST',
120 data: data,
121 beforeSend: function () {
122 $that.addClass('updating-icon');
123 },
124 success: function (data) {
125 var review_id = data.data.review_id;
126 var review = data.data.review;
127 $('.tutor-review-'+review_id+' .review-content').html(review);
128 },
129 complete: function () {
130 $('.tutor-write-review-form').slideUp();
131 $that.removeClass('updating-icon');
132 }
133 });
134 }
135 });
136
137 $(document).on('click', '.write-course-review-link-btn', function(e){
138 e.preventDefault();
139 $(this).siblings('.tutor-write-review-form').slideToggle();
140 });
141
142 $(document).on('click', '.tutor-ask-question-btn', function(e){
143 e.preventDefault();
144 $('.tutor-add-question-wrap').slideToggle();
145 });
146 $(document).on('click', '.tutor_question_cancel', function(e){
147 e.preventDefault();
148 $('.tutor-add-question-wrap').toggle();
149 });
150
151 $(document).on('submit', '#tutor-ask-question-form', function(e){
152 e.preventDefault();
153
154 var $form = $(this);
155 var data = $(this).serialize()+'&action=tutor_ask_question';
156
157 $.ajax({
158 url: _tutorobject.ajaxurl,
159 type: 'POST',
160 data: data,
161 beforeSend: function () {
162 $form.find('.tutor_ask_question_btn').addClass('updating-icon');
163 },
164 success: function (data) {
165 if (data.success){
166 $('.tutor-add-question-wrap').hide();
167 window.location.reload();
168 }
169 },
170 complete: function () {
171 $form.find('.tutor_ask_question_btn').removeClass('updating-icon');
172 }
173 });
174 });
175
176 $(document).on('submit', '.tutor-add-answer-form', function(e){
177 e.preventDefault();
178
179 var $form = $(this);
180 var data = $(this).serialize()+'&action=tutor_add_answer';
181
182 $.ajax({
183 url: _tutorobject.ajaxurl,
184 type: 'POST',
185 data: data,
186 beforeSend: function () {
187 $form.find('.tutor_add_answer_btn').addClass('updating-icon');
188 },
189 success: function (data) {
190 if (data.success){
191 window.location.reload();
192 }
193 },
194 complete: function () {
195 $form.find('.tutor_add_answer_btn').removeClass('updating-icon');
196 }
197 });
198 });
199
200 $(document).on('focus', '.tutor_add_answer_textarea', function(e){
201 e.preventDefault();
202
203 var question_id = $(this).closest('.tutor_add_answer_wrap').attr('data-question-id');
204 var conf = {
205 tinymce: {
206 wpautop:true,
207 //plugins : 'charmap colorpicker compat3x directionality fullscreen hr image lists media paste tabfocus textcolor wordpress wpautoresize wpdialogs wpeditimage wpemoji wpgallery wplink wptextpattern wpview',
208 toolbar1: 'bold italic underline bullist strikethrough numlist blockquote alignleft aligncenter alignright undo redo link unlink spellchecker fullscreen'
209 },
210 };
211 wp.editor.initialize('tutor_answer_'+question_id, conf);
212 });
213
214 $(document).on('click', '.tutor_cancel_wp_editor', function(e){
215 e.preventDefault();
216 $(this).closest('.tutor_wp_editor_wrap').toggle();
217 $(this).closest('.tutor_add_answer_wrap').find('.tutor_wp_editor_show_btn_wrap').toggle();
218 var question_id = $(this).closest('.tutor_add_answer_wrap').attr('data-question-id');
219 wp.editor.remove('tutor_answer_'+question_id);
220 });
221
222 $(document).on('click', '.tutor_wp_editor_show_btn', function(e){
223 e.preventDefault();
224 $(this).closest('.tutor_add_answer_wrap').find('.tutor_wp_editor_wrap').toggle();
225 $(this).closest('.tutor_wp_editor_show_btn_wrap').toggle();
226 });
227
228 /**
229 * Quiz attempt
230 */
231 var $tutor_quiz_time_update = $('#tutor-quiz-time-update');
232 var attempt_settings = null;
233 if ($tutor_quiz_time_update.length){
234 attempt_settings = JSON.parse($tutor_quiz_time_update.attr('data-attempt-settings'));
235 var attempt_meta = JSON.parse($tutor_quiz_time_update.attr('data-attempt-meta'));
236
237 var countDownDate = new Date(attempt_settings.attempt_started_at).getTime() + (attempt_meta.time_limit.time_limit_seconds * 1000);
238 var time_now = new Date(attempt_meta.date_time_now).getTime();
239
240 var tutor_quiz_interval = setInterval(function() {
241 var distance = countDownDate - time_now;
242
243 var days = Math.floor(distance / (1000 * 60 * 60 * 24));
244 var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
245 var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
246 var seconds = Math.floor((distance % (1000 * 60)) / 1000);
247
248 var countdown_human = '';
249
250 if (days){
251 countdown_human += days + "d ";
252 }
253 if (hours){
254 countdown_human += hours + "h ";
255 }
256 if (minutes){
257 countdown_human += minutes + "m ";
258 }
259 if (seconds){
260 countdown_human += seconds + "s ";
261 }
262
263 if (distance < 0) {
264 clearInterval(tutor_quiz_interval);
265 countdown_human = "EXPIRED";
266 //Set the quiz attempt to timeout in ajax
267
268 if (_tutorobject.options.quiz_when_time_expires === 'autosubmit'){
269 /**
270 * Auto Submit
271 */
272 $('form#tutor-answering-quiz').submit();
273
274 } else if(_tutorobject.options.quiz_when_time_expires === 'autoabandon'){
275 /**
276 *
277 * @type {jQuery}
278 *
279 * Current attempt will be cancel with attempt status attempt_timeout
280 */
281
282 var quiz_id = $('#tutor_quiz_id').val();
283 var tutor_quiz_remaining_time_secs = $('#tutor_quiz_remaining_time_secs').val();
284 var quiz_timeout_data = { quiz_id : quiz_id, action : 'tutor_quiz_timeout' };
285
286 $.ajax({
287 url: _tutorobject.ajaxurl,
288 type: 'POST',
289 data: quiz_timeout_data,
290 success: function (data) {
291 if (data.success){
292 window.location.reload(true);
293 }
294 },
295 complete: function () {
296 $('#tutor-quiz-body').html('');
297 window.location.reload(true);
298 }
299 });
300
301 }
302
303 }
304 time_now = time_now + 1000;
305 $tutor_quiz_time_update.html(countdown_human);
306 }, 1000);
307 }
308
309 var $quiz_start_form = $('#tutor-quiz-body form#tutor-start-quiz');
310 if ($quiz_start_form.length){
311 if (_tutorobject.quiz_options.quiz_auto_start === '1'){
312 $quiz_start_form.submit();
313 }
314 }
315
316 // tutor course content accordion
317 $('.tutor-course-topic.tutor-active').find('.tutor-course-lessons').slideDown();
318 $('.tutor-course-title').on('click', function () {
319 var lesson = $(this).siblings('.tutor-course-lessons');
320 $(this).closest('.tutor-course-topic').toggleClass('tutor-active');
321 lesson.slideToggle();
322 });
323
324 $('.tutor-topics-title').on('click', function () {
325 $(this).siblings('.tutor-topics-summery').slideToggle();
326 });
327
328 $(document).on('click', '.tutor-course-wishlist-btn', function (e) {
329 e.preventDefault();
330
331 var $that = $(this);
332 var course_id = $that.attr('data-course-id');
333
334 $.ajax({
335 url: _tutorobject.ajaxurl,
336 type: 'POST',
337 data: {course_id : course_id, 'action': 'tutor_course_add_to_wishlist'},
338 beforeSend: function () {
339 $that.addClass('updating-icon');
340 },
341 success: function (data) {
342 if (data.success){
343 if (data.data.status === 'added'){
344 $that.addClass('has-wish-listed');
345 }else{
346 $that.removeClass('has-wish-listed');
347 }
348 }else{
349 window.location = data.data.redirect_to;
350 }
351 },
352 complete: function () {
353 $that.removeClass('updating-icon');
354 }
355 });
356 });
357
358 $(document).on('click', '.tutor-single-lesson-a', function (e) {
359 e.preventDefault();
360
361 var $that = $(this);
362 var lesson_id = $that.attr('data-lesson-id');
363 var $wrap = $('#tutor-single-entry-content');
364
365 $.ajax({
366 url: _tutorobject.ajaxurl,
367 type: 'POST',
368 data: {lesson_id : lesson_id, 'action': 'tutor_render_lesson_content'},
369 beforeSend: function () {
370 var page_title = $that.find('.lesson_title').text();
371 $('head title').text(page_title);
372 window.history.pushState('obj', page_title, $that.attr('href'));
373 $wrap.addClass('loading-lesson');
374 $('.tutor-single-lesson-items').removeClass('active');
375 $that.closest('.tutor-single-lesson-items').addClass('active');
376 },
377 success: function (data) {
378 $wrap.html(data.data.html);
379 videoPlayer.init();
380 },
381 complete: function () {
382 $wrap.removeClass('loading-lesson');
383 }
384 });
385 });
386
387 $(document).on('click', '.sidebar-single-quiz-a', function (e) {
388 e.preventDefault();
389
390 var $that = $(this);
391 var quiz_id = $that.attr('data-quiz-id');
392 var page_title = $that.find('.lesson_title').text();
393 var $wrap = $('#tutor-single-entry-content');
394
395 $.ajax({
396 url: _tutorobject.ajaxurl,
397 type: 'POST',
398 data: {quiz_id : quiz_id, 'action': 'tutor_render_quiz_content'},
399 beforeSend: function () {
400 $('head title').text(page_title);
401 window.history.pushState('obj', page_title, $that.attr('href'));
402 $wrap.addClass('loading-lesson');
403 $('.tutor-single-lesson-items').removeClass('active');
404 $that.closest('.tutor-single-lesson-items').addClass('active');
405 },
406 success: function (data) {
407 $wrap.html(data.data.html);
408 },
409 complete: function () {
410 $wrap.removeClass('loading-lesson');
411 }
412 });
413
414
415 });
416
417 /**
418 * @date 05 Feb, 2019
419 */
420
421 $(document).on('click', '.tutor-lesson-sidebar-hide-bar', function(e){
422 e.preventDefault();
423 $('.tutor-lesson-sidebar').toggle();
424 });
425
426 $(document).on('click', '.tutor-tabs-btn-group a', function (e) {
427 e.preventDefault();
428 var $that = $(this);
429
430 var tabSelector = $that.attr('href');
431 $('.tutor-lesson-sidebar-tab-item').hide();
432 $(tabSelector).show();
433
434 $('.tutor-tabs-btn-group a').removeClass('active');
435 $that.addClass('active');
436 });
437 /**
438 * @date 18 Feb, 2019
439 * @since v.1.0.0
440 */
441
442 if (jQuery().sortable) {
443 $(".tutor-quiz-answers-wrap").sortable({
444 handle: ".answer-sorting-bar",
445 start: function (e, ui) {
446 ui.placeholder.css('visibility', 'visible');
447 },
448 stop: function (e, ui) {
449
450 //Sorting Stopped...
451 },
452 }).disableSelection();;
453
454
455 $( ".quiz-draggable-rand-answers, .quiz-answer-matching-droppable" ).sortable({
456 connectWith: ".quiz-answer-matching-droppable",
457 placeholder: "drop-hover"
458
459 }).disableSelection();
460 }
461
462 /**
463 * Quiz view
464 * @date 22 Feb, 2019
465 * @since v.1.0.0
466 */
467
468 $(document).on('click', '.tutor-quiz-answer-next-btn', function (e) {
469 e.preventDefault();
470 var $that = $(this);
471 var question_id = parseInt($that.closest('.quiz-attempt-single-question').attr('id').match(/\d+/)[0], 10);
472
473 var next_question_id = $that.closest('.quiz-attempt-single-question').attr('data-next-question-id');
474
475 if (next_question_id) {
476 var $nextQuestion = $(next_question_id);
477 if ($nextQuestion && $nextQuestion.length) {
478 $('.quiz-attempt-single-question').hide();
479 $nextQuestion.show();
480
481 /**
482 * If pagination exists, set active class
483 */
484
485 if ($('.tutor-quiz-questions-pagination').length){
486 $('.tutor-quiz-question-paginate-item').removeClass('active');
487 $('.tutor-quiz-questions-pagination a[href="'+next_question_id+'"]').addClass('active');
488 }
489
490 }
491 }
492 });
493 $(document).on('click', '.tutor-quiz-question-paginate-item', function (e) {
494 e.preventDefault();
495 var $that = $(this);
496 var $question = $($that.attr('href'));
497 $('.quiz-attempt-single-question').hide();
498 $question.show();
499
500 //Active Class
501 $('.tutor-quiz-question-paginate-item').removeClass('active');
502 $that.addClass('active');
503 });
504
505 /**
506 * Limit Short Answer Question Type
507 */
508 $(document).on('keyup', 'textarea.question_type_short_answer', function (e) {
509 var $that = $(this);
510 var value = $that.val();
511 var limit = _tutorobject.quiz_options.short_answer_characters_limit;
512 var remaining = limit - value.length;
513
514 if (remaining < 1){
515 $that.val(value.substr(0, limit));
516 remaining = 0;
517 }
518 $that.closest('.tutor-quiz-answers-wrap').find('.characters_remaining').html(remaining);
519 });
520
521 /**
522 * Add to cart in guest mode, show login form
523 *
524 * @since v.1.0.4
525 */
526
527 $(document).on('submit', '.cart-required-login form', function (e) {
528 e.preventDefault();
529
530 $('.tutor-cart-box-login-form').fadeIn(100);
531 });
532
533 $('.tutor-popup-form-close').on('click', function () {
534 $('.tutor-cart-box-login-form').fadeOut(100);
535 });
536
537 $(document).on('keyup', function (e) {
538 if (e.keyCode === 27) {
539 $('.tutor-cart-box-login-form').fadeOut(100);
540 }
541 });
542 /**
543 * Share Link enable
544 *
545 * @since v.1.0.4
546 */
547 if($.fn.ShareLink){
548 var $social_share_wrap = $('.tutor-social-share-wrap');
549 if ($social_share_wrap.length) {
550 var share_config = JSON.parse($social_share_wrap.attr('data-social-share-config'));
551
552 $('.tutor_share').ShareLink({
553 title: share_config.title,
554 text: share_config.text,
555 image: share_config.image,
556 class_prefix: 's_',
557 width: 640,
558 height: 480,
559 });
560 }
561 }
562
563 });