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.