PageSourceSearch

https://www.drjohnnydvm.com/plugins/smb/slider/components/assets/slider.js?v.1.1.64

js drjohnnydvm.com collected 2026-10-07 00:35:39 UTC 19,249 bytes, 612 lines download raw bytes

1+function ($) { "use strict";
2	var Slider = function(element, options) {
3        var self = this;
4
5        this.$element         = $(element);
6        this.$ul              = this.$element;
7        this.$videos          = $('.video-js-slider', element);
8        this.$videoOverlays   = $('.video-overlay', this.$element);
9        this.players          = [];
10        this.clones           = [];
11        this.prevDevice       = null;
12        this.loaded           = 0;
13        this.tempArrVidsPause = [];
14        this.vidsPauseClicked = [];
15        this.lastDevice       = '';
16        this.hadInteraction   = false;
17        this.firstPlayerRef   = null;
18
19        window.addEventListener('wm-defer-js', () => {
20            self.hadInteraction = true;
21            if (self.firstPlayerRef && self.firstPlayerRef.paused()) {
22                // It have to be muted, because chrome, firefox policies
23                self.$element.stopAuto();
24                self.firstPlayerRef.muted(true);
25                self.firstPlayerRef.play();
26                self.firstPlayerRef = null;
27            }
28        });
29
30        this.groupSlidesByDevice();
31
32        this.options = this.parseTrueFalseOptions(options);
33
34        this.auto = this.options.auto;
35        //this.options.auto = false;
36
37        this.muted = false;
38        // Always on autoplayvideo videos should be muted because the browsers do not allow autoplay on videos with sound.
39        if(this.options.autoplayvideo){
40            this.muted = true;
41        }
42
43        // SMBWMGR-3196 URL param to load the slide show component in a paused state
44        // @deprecated slide_show_pause
45        this.startPaused = (location.href.indexOf("slide_show_pause=1") !== -1) ||
46                           (location.href.indexOf("screenshot_mode=1")  !== -1);
47        if(this.startPaused) {
48            this.options.auto = false;
49        }
50
51        // We have to shut off auto, because maybe the slider will go to orher slide while video is loading ...
52        if(this.options.auto && this.options.firstSlideVideo && this.options.autoplayvideo){
53            this.change = true;
54            this.options.auto = false;
55        }
56
57        self.attachEvents();
58
59        self.runSlider();
60    }
61
62    Slider.prototype.runSlider = function() {
63        var self = this;
64        var device = self.getDevice();
65        var objString;
66        var bxSliderData;
67
68        if(self.lastDevice != '') {
69            if(device == self.lastDevice){
70                return
71            }
72
73            if(JSON.stringify(self[device + 'Items']) == JSON.stringify(self[self.lastDevice + 'Items'])) {
74                self.lastDevice = device;
75                return
76            }
77        }
78
79        self.lastDevice = device;
80
81        // destroy slider
82        self.destroySlider();
83
84        objString = device + 'Items';
85
86        self.options.count = self[objString].length;
87
88        if(self.options.count == 0)
89            return
90
91        self[objString].forEach(function(item){
92            self.$ul.append(item);
93        });
94
95        if(self.options.count == 1) {
96            self.options.infiniteLoop = false;
97        }
98
99        bxSliderData = self.generateBxSliderData();
100        $.extend(bxSliderData, self.options);
101        self.$bxSlider = self.$ul.bxSlider(bxSliderData);
102    }
103
104    Slider.prototype.generateBxSliderData = function(){
105        var self = this;
106
107        return {
108            onSlideAfter: function($slideElement, oldIndex, newIndex) {
109                //stop all videos
110                self.players.forEach(function(player){
111                    if(!player.paused()){
112                        if(self.tempArrVidsPause.indexOf(player.id_) == -1){
113                            self.tempArrVidsPause.push(player.id_);
114                        }
115
116                        player.pause();
117                    }
118                });
119
120
121                if($slideElement.hasClass('slider__video_type')){
122                    var itemId = $slideElement.find('[data-item-id]').data('itemId');
123                    var player = self.findPlayerByItemId(itemId);
124
125                    if(!player)
126                        player = self.returnPlayer($slideElement.find('.video-js'));
127
128                    if(self.options.autoplayvideo && (player.currentTime() < 1)){
129                        // It have to be muted, because chrome, firefox policies
130                        self.$element.stopAuto();
131                        if (self.hadInteraction) {
132                            player.muted(true);
133                            player.play();
134                        } else {
135                            self.firstPlayerRef = player;
136                        }
137                    }
138
139                    if(self.muted){
140                        player.muted(true);
141                    }
142                }
143
144                if(self.options.stopSlideshowAfterOneLoop && (self.options.count - 1 == newIndex)){
145                    self.$element.stopAuto();
146                }
147            },
148            onSliderLoad: function (currentIndex) {
149                self.$element.css("visibility", "visible");
150                self.$wrapper = self.$element.closest('.bx-wrapper');
151
152                if(self.options.easing == '')
153                    self.options.easing = null;
154
155                if(self.options.controlsHover){
156                    $(".bx-controls-direction", self.$wrapper).hide();
157
158                    self.$wrapper.hover(
159                        function () { $(".bx-controls-direction", $(this)).fadeIn(300); },
160                        function () { $(".bx-controls-direction", $(this)).fadeOut(300); }
161                    );
162                }
163
164                if(self.options.autoHoverModified){
165                    self.$wrapper.hover(
166                        function(){
167                            if(self.options.auto){
168                                self.$element.stopAuto();
169                            }
170                        },
171                        function(){
172                            if(self.options.auto){
173                                if(!self.isVideoPlaying()){
174                                    self.$element.stopAuto();
175                                    self.$element.startAuto();
176                                }
177                            }
178                        }
179                    );
180                }
181
182                if(self.change){
183                    self.options.auto = true;
184                }
185
186                if(self.options.easing != null){
187                    self.options.useCSS = false;
188                }
189
190                if(self.auto){
191                    self.makePauseSlideshowButton();
192                }
193
194                // Because of clones
195                var index;
196                if(self.options.count > 1 &&  self.options.mode != 'fade'){
197                    index = 1;
198                } else {
199                    index = 0;
200                }
201
202                var autoPlaySlideShow = function () {
203                    self.options.auto = self.auto;
204
205                    if(self.options.auto && !self.startPaused){
206                        self.$element.startAuto();
207                    }
208                };
209
210
211                var $slideElement = $('#slider').find('.bx-viewport').find('ul').children().eq(index);
212
213                if($slideElement.hasClass('slider__video_type')){
214                    var player = self.returnPlayer($slideElement.find('.video-js'));
215                    if(self.options.autoplayvideo){
216                        // It have to be muted, because chrome, firefox policies
217                        self.$element.stopAuto();
218                        if (self.hadInteraction) {
219                            player.muted(true);
220                            player.play();
221                        } else {
222                            self.firstPlayerRef = player;
223                        }
224                    }
225                    if(self.muted){
226                        player.muted(true);
227                    }
228                }
229
230                self.initializeClones();
231                self.initializeOverlays();
232
233
234                // wrap bx-slider buttons controls
235                self.$element.closest('.bx-wrapper').find('.bx-controls').wrapAll("<div class='wrap__bx-controls' />");
236                self.$element.closest('.bx-wrapper').find(".wrap_on-off, .wrap_pause-play, .bx-pager " ).wrapAll( "<div class='bx-controls-buttons' />");
237            }
238        };
239    }
240
241    Slider.prototype.destroySlider = function() {
242        var self = this;
243
244        if(self.$bxSlider) {
245            self.$bxSlider.destroySlider();
246        }
247
248        self.$ul.html('');
249    }
250
251    Slider.prototype.attachEvents = function(){
252        var self = this;
253        var player;
254
255        $('#slider').on('click', '.pause-slideshow', function(e, data){
256            $(this).hide();
257            self.$element.stopAuto();
258            self.options.auto = false;
259
260            $('#slider .play-slideshow').fadeIn("slow", function(){
261                if(typeof data != "undefined"){
262                    $(this).focus();
263                }
264            });
265
266            if(player = self.isVideoPlaying()){
267                player.pause();
268            }
269        });
270
271        $('#slider').on('click', '.play-slideshow', function(e, data){
272            $(this).hide();
273            self.$element.startAuto();
274            self.options.auto = true;
275
276            $('#slider .pause-slideshow').fadeIn("slow", function(){
277                if(typeof data != "undefined"){
278                    $(this).focus();
279                }
280            });
281        });
282
283        $('body').keypress(function(e){
284            var key = e.which;
285            if(key == 13){
286                if($('#slider').find('.play-slideshow').is(':focus')){
287                    $('#slider').find('.play-slideshow').trigger('click', { kb: true});
288                }
289
290                if($('#slider').find('.pause-slideshow').is(':focus')){
291                    $('#slider').find('.pause-slideshow').trigger('click', { kb: true});
292                }
293
294                if($('#slider').find('.sound-off').is(':focus')){
295                    $('#slider').find('.sound-off').trigger('click', { kb: true});
296                }
297
298                if($('#slider').find('.sound-on').is(':focus')){
299                    $('#slider').find('.sound-on').trigger('click', { kb: true});
300                }
301            }
302        });
303
304        var winResizeTimer;
305        $(window).resize(function () {
306            clearTimeout(winResizeTimer);
307            winResizeTimer = setTimeout(function () {
308                self.runSlider();
309            }, 250);
310        });
311    }
312
313    Slider.prototype.returnPlayer = function($video) {
314        var me = this;
315        var data = $video.data('setupRun');
316
317        if(data.techOrder != undefined && (data.techOrder[0] == 'vimeo')){
318            data.controls = false;
319        }
320
321        if(data.techOrder != undefined && (data.techOrder[0] == 'youtube')){
322            data.youtube = { ytControls: 2 };
323            data.controls = false;
324        }
325
326        // The reason why the video is paused here, its because some of the videos are autoplayed even when the sliders is not showing them.
327        // The autoplaying videos control is on line 112
328
329        var plyr = videojs($video.attr('id'), data, function(){
330            var player = this;
331            me.players.push(player);
332
333            var clone;
334            player.on("play", function(){
335                me.showCaptionWhilePlay(this.id_, false);
336
337                if(me.options.auto){
338                    me.$element.stopAuto();
339                }
340            });
341
342            player.on("pause", function(data){
343                me.showCaptionWhilePlay(this.id_, true);
344
345                if(me.options.auto){
346                    me.$element.stopAuto();
347                    me.$element.startAuto();
348                }
349
350                if(clone = me.hasClone(player)){
351                    clone.poster('');
352                    clone.bigPlayButton.hide();
353                    clone.currentTime(player.currentTime());
354                }
355            });
356
357            player.on('ended', function() {
358                me.showCaptionWhilePlay(this.id_, true);
359
360                if(me.options.auto){
361                    me.$element.stopAuto();
362                    me.$element.startAuto();
363                }
364            });
365        });
366
367        return plyr;
368    }
369
370    Slider.prototype.parseTrueFalseOptions = function(options, skip){
371        for (var key in options) {
372          if (options.hasOwnProperty(key) && Slider.BOOLEANS.indexOf(key) != -1) {
373            options[key] = !!options[key];
374          }
375        }
376
377	  	return options;
378    }
379
380    Slider.prototype.isVideoPlaying = function(){
381        var self = this;
382        var playing = false;
383
384        self.players.forEach(function(player){
385            if(!player.paused()){
386                playing = player;
387            }
388        });
389
390        return playing;
391    }
392
393    Slider.prototype.initializeOverlays = function(){
394        var self = this;
395
396        if(self.$videoOverlays.length){
397            self.$videoOverlays.on('click', function(){
398                var player = self.findPlayerByItemId($(this).data('itemId'));
399
400                if(player.paused()) {
401                    player.muted(false);
402                    player.play();
403                }
404                else{
405                    player.pause();
406                }
407            });
408        }
409    }
410
411    Slider.prototype.findPlayerByItemId = function(itemId){
412        var self = this;
413
414        for(var i = 0; i < self.players.length; i++){
415            var player = self.players[i];
416
417            if($(player.el_).data('itemId') == itemId){
418                return player;
419            }
420        }
421
422        return false;
423    }
424
425    Slider.prototype.groupSlidesByDevice = function() {
426        var self = this;
427
428        self.desktopItems = [];
429        self.tabletItems  = [];
430        self.mobileItems  = [];
431
432        var cl;
433        var isIE = navigator.userAgent.indexOf('Trident') > -1 ? true : navigator.userAgent.indexOf('MSIE') > -1 ? true : false;
434
435        self.$ul.find('li').each(function(){
436            if (isIE) {
437                cl = $(this).clone(true, true);
438            }
439            else {
440                cl = $(this);
441            }
442
443             if($(this).data('desktop')){
444                self.desktopItems.push(cl);
445             }
446
447            if($(this).data('tablet')){
448                self.tabletItems.push(cl);
449            }
450
451            if($(this).data('mobile')){
452                self.mobileItems.push(cl);
453            }
454         });
455
456    }
457
458    Slider.prototype.makePauseSlideshowButton = function(){
459        var self = this;
460
461        var stylePlay  = "";
462        var stylePause = "";
463
464        if(self.options.auto){
465            stylePlay  = 'style="display:none"';
466        } else {
467            stylePause = 'style="display:none"';
468        }
469
470        var htmlPauseSlideshow =   '<div class="wrap_pause-play">'+
471                                        '<div class="pause-slideshow" aria-label="icon pause" ' + stylePause + ' title="Pause slideshow" tabindex="0">'+
472                                            '<span class="icon icon-pause"></span>'+
473                                        '</div>'+
474                                        '<div class="play-slideshow" aria-label="icon play" ' + stylePlay + ' title="Play slideshow" tabindex="0">'+
475                                            '<span class="icon icon-play"></span>'+
476                                        '</div>'+
477                                    '</div>';
478
479        $('#slider').find('.bx-wrapper .bx-controls').prepend(htmlPauseSlideshow);
480    };
481
482    Slider.prototype.initializeClones = function(){
483        var me = this;
484        var $clones = me.$element.find('.bx-clone');
485        var $videoElement;
486
487        $clones.each(function(index){
488            var $clone = $(this);
489            $videoElement = $clone.find('video');
490
491            $videoElement.attr('id', $videoElement.attr('id') + '_clone');
492
493            if($videoElement.length){
494                var playerData = $($videoElement[0]).data('setupRun') ? $($videoElement[0]).data('setupRun') : $($videoElement[0]).data('setup');
495
496                if(playerData.techOrder != undefined && (playerData.techOrder[0] == 'vimeo')){
497                    playerData.controls = false;
498                }
499
500                if(playerData.techOrder != undefined && (playerData.techOrder[0] == 'youtube')){
501                    playerData.youtube = { ytControls: 2 };
502                    playerData.controls = false;
503                }
504
505                videojs($videoElement[0], playerData, function(){
506                    this.muted(true);
507                    me.clones.push(this);
508                });
509            }
510        });
511    }
512
513    Slider.prototype.hasClone = function(player){
514        var me = this;
515        var clonePlayer = false;
516
517        for(var i = 0; i < me.clones.length; i++){
518            var obj = me.clones[i];
519
520            if($(obj.el_).attr('id') == $(player.el_).attr('id') + '_clone'){
521                return obj
522            }
523        };
524
525        return false;
526    }
527
528    Slider.prototype.showCaptionWhilePlay = function(videoid,show){
529        var self = this,
530            $vidTextContainer = $('#'+videoid).parents('.slider__item').find("[data-vidplay]"),
531            titleoption = $vidTextContainer.data('vidplay');
532
533            show ? titleoption = 1 : titleoption ;
534            self.$element.find($vidTextContainer).css({'opacity': titleoption});
535    }
536
537    Slider.prototype.getDevice = function(){
538        var width = window.innerWidth;
539
540        if (width < 768)
541            return 'mobile';
542
543        if (width < 1025)
544            return 'tablet';
545
546        return 'desktop';
547    }
548
549    Slider.DEFAULTS = {
550        video: true,
551    	pager: true,
552    	controls: true,
553    	autoControls: false,
554        autoHoverModified: false,
555        autoHover: false,
556        auto: true,
557        infiniteLoop: true,
558        randomStart: false,
559        controlsHover: false,
560        responsive: false,
561        mode: 'horizontal',
562        speed: 500,
563        pause: 4000,
564        autoDelay: 0,
565        easing: null,
566        useCSS: false,
567        isEditor: false
568    }
569
570    Slider.BOOLEANS = [
571        'pager',
572        'controls',
573        'autoControls',
574        'auto',
575        'infiniteLoop',
576        'randomStart',
577        'controlsHover',
578        'responsive',
579        'autoHoverModified'
580    ]
581
582    var old = $.fn.Slider;
583
584    $.fn.Slider = function(option) {
585        var args = arguments,
586            result;
587
588        this.each(function() {
589            var $this = $(this);
590
591            var options = $.extend({}, Slider.DEFAULTS, $this.data(), typeof option == 'object' && option);
592            var data = '';
593
594            $this.data('bxslider', (data = new Slider(this, options)));
595
596            if (typeof result != 'undefined') return false;
597        });
598
599        return result ? result : this;
600    };
601
602    $.fn.Slider.Constructor = Slider
603
604    $.fn.Slider.noConflict = function () {
605        $.fn.Slider = old
606        return this
607    }
608
609    $(function(){
610    	$('[data-control="slider"]').Slider();
611    });
612}(window.jQuery);

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.