1/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 2 jquery.mb.components 3 4 file: jquery.mb.YTPlayer.src.js 5 last modified: 11/2/18 7:23 PM 6 Version: 3.2.8 7 Build: 7398 8 9 Open Lab s.r.l., Florence - Italy 10 email: [email protected] 11 blog: http://pupunzi.open-lab.com 12 site: http://pupunzi.com 13 http://open-lab.com 14 15 Licences: MIT, GPL 16 http://www.opensource.org/licenses/mit-license.php 17 http://www.gnu.org/licenses/gpl.html 18 19 Copyright (c) 2001-2018. Matteo Bicocchi (Pupunzi) 20 :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ 21 22 23 24var ytp = ytp || {}; 25 26function onYouTubeIframeAPIReady() { 27 if (ytp.YTAPIReady) return; 28 ytp.YTAPIReady = true; 29 jQuery(document).trigger("YTAPIReady"); 30} 31 32var getYTPVideoID = function (url) { 33 var videoID, playlistID; 34 if (url.indexOf("youtu.be") > 0 || url.indexOf("youtube.com/embed") > 0) { 35 videoID = url.substr(url.lastIndexOf("/") + 1, url.length); 36 playlistID = videoID.indexOf("?list=") > 0 ? videoID.substr(videoID.lastIndexOf("="), videoID.length) : null; 37 videoID = playlistID ? videoID.substr(0, videoID.lastIndexOf("?")) : videoID; 38 } else if (url.indexOf("http") > -1) { 39 //videoID = url.match( /([\/&]v\/([^&#]*))|([\\?&]v=([^&#]*))/ )[ 1 ]; 40 videoID = url.match(/[\\?&]v=([^&#]*)/)[1]; 41 playlistID = url.indexOf("list=") > 0 ? url.match(/[\\?&]list=([^&#]*)/)[1] : null; 42 } else { 43 videoID = url.length > 15 ? null : url; 44 playlistID = videoID ? null : url; 45 } 46 return { 47 videoID : videoID, 48 playlistID: playlistID 49 }; 50}; 51 52function iOSversion() { 53 if (/iP(hone|od|ad)/.test(navigator.platform)) { 54 var v = (navigator.appVersion).match(/OS (\d+)_(\d+)_?(\d+)?/); 55 return [parseInt(v[1], 10), parseInt(v[2], 10), parseInt(v[3] || 0, 10)]; 56 } 57} 58 59(function (jQuery, ytp) { 60 61 jQuery.mbYTPlayer = { 62 name : "jquery.mb.YTPlayer", 63 version: "3.2.8", 64 build : "7398", 65 author : "Matteo Bicocchi (pupunzi)", 66 apiKey : "", 67 68 /* 69 * Default options for the player 70 */ 71 defaults : { 72 /** 73 videoURL (string) 74 the complete Youtube video URL or the short url or the videoID 75 */ 76 videoURL: null, 77 78 /** 79 containment (string) 80 default containment for the player 81 */ 82 containment: "body", 83 84 /** 85 ratio (string or number) 86 "auto", "16/9", "4/3" or number: 4/3, 16/9 87 */ 88 ratio: "auto", 89 90 /** 91 fadeOnStartTime (int) 92 fade in timing at video start 93 */ 94 fadeOnStartTime: 1500, 95 96 /** 97 startAt (int) 98 start second 99 */ 100 startAt: 0, 101 102 /** 103 stopAt (int) 104 stop second 105 */ 106 stopAt: 0, 107 108 /** 109 autoPlay (bool) 110 on page load video should start or pause 111 */ 112 autoPlay: true, 113 114 /** 115 coverImage (string) 116 The path to the image to be used as cover if the autoPlay option is set to false 117 */ 118 coverImage: false, 119 120 /** 121 loop (bool or int) 122 video should loop or not; if number it will loop for the specified times 123 */ 124 loop: true, 125 126 /** 127 addRaster (bool) 128 shows a raster image over the video (added via CSS) 129 You can change the raster image via CSS: 130 .YTPOverlay.raster { background: url(images/raster.png)} 131 */ 132 addRaster: false, 133 134 /** 135 mask (bool or object) the key is the second and the value is the path to the image 136 Ex: mask:{ 0:'assets/mask-1.png', 5:'assets/mask-2.png', 30: false, 50:'assets/mask-3.png'} 137 */ 138 mask: false, 139 140 /** 141 opacity (int) 142 0 to 1 143 */ 144 opacity: 1, 145 146 /** 147 quality (string) 148 âsmallâ, âmediumâ, âlargeâ, âhd720â, âhd1080â, âhighresâ, "default" 149 */ 150 quality: "default", 151 152 /** 153 vol (int) 154 0 to 100 155 */ 156 vol: 50, 157 158 /** 159 mute (bool) 160 mute the video at start 161 */ 162 mute: false, 163 164 /** 165 showControls (bool) 166 shows the control bar at the bottom of the containment 167 */ 168 showControls: true, 169 170 /** 171 anchor (string) 172 center,top,bottom,left,right combined in pair
173 */ 174 anchor: "center,center", 175 176 /** 177 showAnnotations (bool) 178 display the annotations on video 179 */ 180 showAnnotations: false, 181 182 /** 183 cc_load_policy (bool) 184 display the subtitles 185 */ 186 cc_load_policy: false, 187 188 /** 189 showYTLogo (bool) 190 display the Youtube logotype inside the button bar 191 */ 192 showYTLogo: true, 193 194 /** 195 useOnMobile (bool) 196 activate the player also on mobile 197 */ 198 useOnMobile: true, 199 200 /** 201 mobileFallbackImage (bool) 202 mobile fallback image if useOnMobile is set to false 203 */ 204 mobileFallbackImage: null, 205 206 /** 207 playOnlyIfVisible (bool) 208 play the video only if the containment is on screen 209 */ 210 playOnlyIfVisible: false, 211 212 /** 213 onScreenPercentage (bool) 214 percentage of the player height the video should stop or start when visible 215 */ 216 onScreenPercentage: 30, 217 218 /** 219 stopMovieOnBlur (bool) 220 stop the video if the window loose the focus 221 */ 222 stopMovieOnBlur: true, 223 224 /** 225 realfullscreen (bool) 226 the video when in full screen covers all the display 227 */ 228 realfullscreen: true, 229 230 /** 231 optimizeDisplay (bool) 232 The video always fit the containment without displaying the black strips 233 */ 234 optimizeDisplay: true, 235 236 /** 237 abundance (bool) 238 the abudance of the video size 239 */ 240 abundance: 0.3, 241 242 /** 243 gaTrack (bool) 244 track the video plays on GA 245 */ 246 gaTrack: true, 247 248 /** 249 remember_last_time (bool) 250 when the page is reloaded the video will start from the last position 251 */ 252 remember_last_time: false, 253 254 /** 255 addFilters (bool or string) 256 add one or more CSS filters as object to the video 257 Ex: {sepia: 50, hue_rotate : 220} 258 */ 259 addFilters: false, 260 261 /** 262 onReady (function) 263 a callback function fired once the player is ready 264 */ 265 onReady: function (player) { 266 }, 267 268 /** 269 onReady (function) 270 a callback function fired if there's an error 271 */ 272 onError: function (player, err) { 273 } 274 }, 275 /** 276 * @fontface icons 277 * */ 278 controls : { 279 play : "P", 280 pause : "p", 281 mute : "M", 282 unmute : "A", 283 onlyYT : "O", 284 showSite: "R", 285 ytLogo : "Y" 286 }, 287 controlBar : null, 288 locationProtocol: "https:", 289 290 /** 291 * Applicable filters 292 */ 293 defaultFilters: { 294 grayscale : {value: 0, unit: "%"}, 295 hue_rotate: {value: 0, unit: "deg"}, 296 invert : {value: 0, unit: "%"}, 297 opacity : {value: 0, unit: "%"}, 298 saturate : {value: 0, unit: "%"}, 299 sepia : {value: 0, unit: "%"}, 300 brightness: {value: 0, unit: "%"}, 301 contrast : {value: 0, unit: "%"}, 302 blur : {value: 0, unit: "px"} 303 }, 304 305 /** 306 * build the player 307 * @param options 308 * @returns [players] 309 */ 310 buildPlayer: function (options) { 311 312 if (!ytp.YTAPIReady && typeof window.YT === 'undefined') { 313 jQuery("#YTAPI").remove(); 314 var tag = jQuery("<script></script>").attr({ 315 "src": jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/iframe_api?v=" + jQuery.mbYTPlayer.version, 316 "id" : "YTAPI" 317 }); 318 jQuery("head").prepend(tag); 319 } else { 320 setTimeout(function () { 321 jQuery(document).trigger("YTAPIReady"); 322 ytp.YTAPIReady = true; 323 }, 100); 324 } 325 326 function isIframe() { 327 var isIfr = false; 328 try { 329 if (self.location.href != top.location.href) isIfr = true; 330 } catch (e) { 331 isIfr = true; 332 } 333 return isIfr; 334 }; 335 336 //console.time( "YTPlayerInit" ); 337 338 return this.each(function () { 339 var YTPlayer = this; 340 var $YTPlayer = jQuery(YTPlayer); 341 $YTPlayer.hide(); 342 YTPlayer.loop = 0; 343 YTPlayer.state = 0; 344 YTPlayer.filters = jQuery.extend(true, {}, jQuery.mbYTPlayer.defaultFilters); 345 YTPlayer.filtersEnabled = true; 346 YTPlayer.id = YTPlayer.id || "YTP_" + new Date().getTime(); 347 $YTPlayer.addClass("mb_YTPlayer"); 348 349 /** 350 Set properties 351 */ 352 var property = $YTPlayer.data("property") && typeof $YTPlayer.data("property") == "string" ? 353 eval('(' + $YTPlayer.data("property") + ')') : 354 $YTPlayer.data("property"); 355 356 if (typeof property !== "object") 357 property = {}; 358 359 YTPlayer.opt = jQuery.extend(true, {}, jQuery.mbYTPlayer.defaults, YTPlayer.opt, options, property); 360 361 YTPlayer.opt.elementId = YTPlayer.id; 362 363 if (YTPlayer.opt.vol === 0) { 364 YTPlayer.opt.vol = 1; 365 YTPlayer.opt.mute = true; 366 } 367 368 /** 369 * If autoPlay is set to true and mute is set to false 370 * Webkit browser will not auto-play 371 * Start playing after the first click 372 */ 373 if (YTPlayer.opt.autoPlay && YTPlayer.opt.mute == false && jQuery.mbBrowser.chrome) { 374 //YTPlayer.opt.mute = true; 375 jQuery(document).one("mousedown.YTPstart", function () { 376 $YTPlayer.YTPPlay(); 377 }); 378 console.info("YTPlayer info: On Webkit browsers you can not autoplay the video if the audio is on.") 379 } 380 381 if (YTPlayer.opt.loop && typeof YTPlayer.opt.loop === "boolean") { 382 YTPlayer.opt.loop = 9999; 383 } 384 385 /** 386 Disable fullScreen if is in an iframe or full-screen API is not available 387 */ 388 var fullScreenAvailable = document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled; 389 YTPlayer.opt.realfullscreen = isIframe() || !fullScreenAvailable ? false : YTPlayer.opt.realfullscreen; 390 391 /** 392 Manage annotations 393 */ 394 YTPlayer.opt.showAnnotations = YTPlayer.opt.showAnnotations ? '1' : '3'; 395 396 /** 397 Manage show subtitle and caption 398 */ 399 YTPlayer.opt.cc_load_policy = YTPlayer.opt.cc_load_policy ? '1' : '0'; 400 401 /** 402 Manage cover image 403 */ 404 YTPlayer.opt.coverImage = YTPlayer.opt.coverImage || YTPlayer.opt.backgroundImage; 405 406 /** 407 Manage Opacity for IE < 10 408 */ 409 if (jQuery.mbBrowser.msie && jQuery.mbBrowser.version < 9) 410 YTPlayer.opt.opacity = 1; 411 412 YTPlayer.opt.containment = YTPlayer.opt.containment === "self" ? $YTPlayer : jQuery(YTPlayer.opt.containment); 413 YTPlayer.isRetina = (window.retina || window.devicePixelRatio > 1); 414 415 YTPlayer.opt.ratio = YTPlayer.opt.ratio === "auto" ? 16 / 9 : YTPlayer.opt.ratio; 416 YTPlayer.opt.ratio = eval(YTPlayer.opt.ratio); 417 418 YTPlayer.orig_containment_background = YTPlayer.opt.containment.css("background-image"); 419 420 if (!$YTPlayer.attr("id")) 421 $YTPlayer.attr("id", "ytp_" + new Date().getTime()); 422 423 YTPlayer.playerID = "iframe_" + YTPlayer.id; 424 425 YTPlayer.isAlone = false;
426 YTPlayer.hasFocus = true; 427 YTPlayer.videoID = YTPlayer.opt.videoURL ? 428 getYTPVideoID(YTPlayer.opt.videoURL).videoID : $YTPlayer.attr("href") ? 429 getYTPVideoID($YTPlayer.attr("href")).videoID : 430 false; 431 432 /** 433 Check if it is a video list 434 */ 435 YTPlayer.playlistID = YTPlayer.opt.videoURL ? 436 getYTPVideoID(YTPlayer.opt.videoURL).playlistID : $YTPlayer.attr("href") ? 437 getYTPVideoID($YTPlayer.attr("href")).playlistID : 438 false; 439 440 var start_from_last = 0; 441 if (jQuery.mbCookie.get("YTPlayer_start_from" + YTPlayer.videoID)) 442 start_from_last = parseFloat(jQuery.mbCookie.get("YTPlayer_start_from" + YTPlayer.videoID)); 443 if (YTPlayer.opt.remember_last_time && start_from_last) { 444 YTPlayer.start_from_last = start_from_last; 445 jQuery.mbCookie.remove("YTPlayer_start_from" + YTPlayer.videoID); 446 } 447 448 YTPlayer.isPlayer = $YTPlayer.is(YTPlayer.opt.containment); 449 YTPlayer.isBackground = YTPlayer.opt.containment.is("body"); 450 451 if (YTPlayer.isBackground && ytp.backgroundIsInited) 452 return; 453 454 /** 455 Hide the placeholder if it's not the target of the player 456 */ 457 if (YTPlayer.isPlayer) 458 $YTPlayer.show(); 459 460 /** 461 create the overlay 462 */ 463 YTPlayer.overlay = jQuery("<div/>").css({ 464 position: "absolute", 465 top : 0, 466 left : 0, 467 width : "100%", 468 height : "100%" 469 }).addClass("YTPOverlay"); 470 471 if (YTPlayer.opt.coverImage || YTPlayer.orig_containment_background != "none") { 472 // if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay) { 473 var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background; 474 475 YTPlayer.opt.containment.css({ 476 background : bgndURL, 477 backgroundColor : "#000", 478 backgroundSize : "cover", 479 backgroundRepeat: "no-repeat" 480 }); 481 482 } 483 484 /** 485 create the wrapper 486 */ 487 YTPlayer.wrapper = jQuery("<div/>").attr("id", "wrapper_" + YTPlayer.id).css({ 488 position : "absolute", 489 zIndex : 0, 490 minWidth : "100%", 491 minHeight: "100%", 492 left : 0, 493 top : 0, 494 overflow : "hidden", 495 opacity : 0 496 }).addClass("mbYTP_wrapper"); 497 498 /** 499 If is an inline player toggle play if the overlay is clicked 500 */ 501 if (YTPlayer.isPlayer) { 502 YTPlayer.inlinePlayButton = jQuery("<div/>").addClass("inlinePlayButton").html(jQuery.mbYTPlayer.controls.play); 503 $YTPlayer.append(YTPlayer.inlinePlayButton); 504 YTPlayer.inlinePlayButton.on("click", function (e) { 505 $YTPlayer.YTPPlay(); 506 e.stopPropagation(); 507 }); 508 509 if (YTPlayer.opt.autoPlay) 510 YTPlayer.inlinePlayButton.hide(); 511 512 YTPlayer.overlay.on("click", function () { 513 $YTPlayer.YTPTogglePlay(); 514 }).css({cursor: "pointer"}) 515 } 516 517 /** 518 create the playerBox where the YT iframe will be placed 519 */ 520 var playerBox = jQuery("<div/>").attr("id", YTPlayer.playerID).addClass("playerBox"); 521 playerBox.css({ 522 position: "absolute", 523 zIndex : 0, 524 width : "100%", 525 height : "100%", 526 top : 0, 527 left : 0, 528 overflow: "hidden", 529 opacity : 1 530 }); 531 532 YTPlayer.wrapper.append(playerBox); 533 playerBox.after(YTPlayer.overlay); 534 535 if (YTPlayer.isPlayer) { 536 YTPlayer.inlineWrapper = jQuery("<div/>").addClass("inline-YTPlayer"); 537 538 YTPlayer.inlineWrapper.css({ 539 position: "relative", 540 maxWidth: YTPlayer.opt.containment.css("width") 541 }); 542 543 YTPlayer.opt.containment.css({ 544 position : "relative", 545 paddingBottom: "56.25%", 546 overflow : "hidden", 547 height : 0 548 }); 549 YTPlayer.opt.containment.wrap(YTPlayer.inlineWrapper); 550 } 551 552 /** 553 Loop all the elements inside the container and check if their position is not "static" 554 */ 555 YTPlayer.opt.containment.children().not("script, style").each(function () { 556 if (jQuery(this).css("position") == "static") 557 jQuery(this).css("position", "relative"); 558 }); 559
560 if (YTPlayer.isBackground) { 561 jQuery("body").css({ 562 boxSizing: "border-box" 563 }); 564 565 YTPlayer.wrapper.css({ 566 position: "fixed", 567 top : 0, 568 left : 0, 569 zIndex : 0 570 }); 571 572 } else if (YTPlayer.opt.containment.css("position") == "static") { 573 574 YTPlayer.opt.containment.css({ 575 position: "relative" 576 }); 577 $YTPlayer.show(); 578 } 579 YTPlayer.opt.containment.prepend(YTPlayer.wrapper); 580 581 if (!YTPlayer.isBackground) { 582 YTPlayer.overlay.on("mouseenter", function () { 583 if (YTPlayer.controlBar && YTPlayer.controlBar.length) 584 YTPlayer.controlBar.addClass("visible"); 585 }).on("mouseleave", function () { 586 if (YTPlayer.controlBar && YTPlayer.controlBar.length) 587 YTPlayer.controlBar.removeClass("visible"); 588 }); 589 } 590 591 if (jQuery.mbBrowser.mobile && !YTPlayer.opt.useOnMobile) { 592 if (YTPlayer.opt.mobileFallbackImage) { 593 YTPlayer.wrapper.css({ 594 backgroundImage : "url(" + YTPlayer.opt.mobileFallbackImage + ")", 595 backgroundPosition: "center center", 596 backgroundSize : "cover", 597 backgroundRepeat : "no-repeat", 598 opacity : 1 599 }); 600 YTPlayer.wrapper.css({opacity: 1}) 601 } 602 return $YTPlayer; 603 } 604 605 /** 606 If is on device start playing on first touch 607 */ 608 if (jQuery.mbBrowser.mobile && YTPlayer.opt.autoPlay && YTPlayer.opt.useOnMobile) 609 jQuery("body").one("touchstart", function () { 610 YTPlayer.player.playVideo(); 611 }); 612 613 jQuery(document).one("YTAPIReady", function () { 614 $YTPlayer.trigger("YTAPIReady_" + YTPlayer.id); 615 ytp.YTAPIReady = true; 616 }); 617 618 YTPlayer.isOnScreen = jQuery.mbYTPlayer.isOnScreen(YTPlayer, YTPlayer.opt.onScreenPercentage); 619 620 $YTPlayer.one("YTAPIReady_" + YTPlayer.id, function () { 621 622 var YTPlayer = this; 623 var $YTPlayer = jQuery(YTPlayer); 624 625 if ((YTPlayer.isBackground && ytp.backgroundIsInited) || YTPlayer.isInit) 626 return; 627 628 if (YTPlayer.isBackground) 629 ytp.backgroundIsInited = true; 630 631 YTPlayer.opt.autoPlay = typeof YTPlayer.opt.autoPlay == "undefined" ? (YTPlayer.isBackground ? true : false) : YTPlayer.opt.autoPlay; 632 YTPlayer.opt.vol = YTPlayer.opt.vol ? YTPlayer.opt.vol : 100; 633 634 jQuery.mbYTPlayer.getDataFromAPI(YTPlayer); 635 636 jQuery(YTPlayer).on("YTPChanged", function (e) { 637 638 if (YTPlayer.isInit) 639 return; 640 641 YTPlayer.isInit = true; 642 643 /** Initialize the YT player ------------------------------------ 644 * Youtube player variables 645 * @type {{modestbranding: number, autoplay: number, controls: number, showinfo: number, rel: number, enablejsapi: number, version: number, playerapiid: string, origin: string, allowfullscreen: boolean, iv_load_policy: (string|*|jQuery.mbYTPlayer.opt.showAnnotations), playsinline: number}} 646 */ 647 var playerVars = { 648 'modestbranding' : 1, 649 'autoplay' : 0, 650 'controls' : 0, 651 'showinfo' : 0, 652 'rel' : 0, 653 'enablejsapi' : 1, 654 'version' : 3, 655 'playerapiid' : YTPlayer.playerID, 656 'origin' : '*', 657 'allowfullscreen': true, 658 'wmode' : 'transparent', 659 'iv_load_policy' : YTPlayer.opt.showAnnotations, 660 'cc_load_policy' : YTPlayer.opt.cc_load_policy, 661 'playsinline' : jQuery.mbBrowser.mobile ? 1 : 0, 662 663 /** 664 Check if the browser can play HTML5 videos 665 */ 666 'html5': document.createElement('video').canPlayType ? 1 : 0 667 }; 668 669 new YT.Player(YTPlayer.playerID, { 670 //videoId: YTPlayer.videoID.toString(), 671 playerVars: playerVars, 672 events : { 673 'onReady' : function (event) { 674 675 YTPlayer.player = event.target; 676 677 //todo: make playlist works 678 /* if (YTPlayer.playlistID && YTPlayer.apiKey) { 679 YTPlayer.isList = true; 680 YTPlayer.videos = []; 681 YTPlayer.player.cuePlaylist({ 682 listType: 'playlist', 683 list: YTPlayer.playlistID.toString(), 684 startSeconds: YTPlayer.opt.startAt, 685 endSeconds: YTPlayer.opt.stopAt, 686 suggestedQuality: YTPlayer.opt.quality 687 }); 688 } 689 else { */ 690 691 YTPlayer.player.loadVideoById({ 692 videoId : YTPlayer.videoID.toString(), 693 // startSeconds: YTPlayer.start_from_last || YTPlayer.opt.startAt, 694 // endSeconds: YTPlayer.opt.stopAt, 695 suggestedQuality: YTPlayer.opt.quality 696 }); 697 698 /*}*/ 699 700 $YTPlayer.trigger("YTPlayerIsReady_" + YTPlayer.id); 701 }, 702 /** 703 * on State Change 704 * @param event 705 * 706 * -1 (unstarted) 707 * 0 (ended) 708 * 1 (playing) 709 * 2 (paused) 710 * 3 (buffering) 711 * 5 (video cued) 712 */ 713 'onStateChange' : function (event) { 714 715 if (typeof event.target.getPlayerState != "function") 716 return; 717 718 var state = event.target.getPlayerState(); 719 720 if (YTPlayer.preventTrigger || YTPlayer.isStarting) { 721 YTPlayer.preventTrigger = false;
vendor: 4,224 bytes, lines 722-814
722 return 723 } 724 725 YTPlayer.state = state; 726 // console.debug(YTPlayer.state); 727 728 var eventType; 729 switch (state) { 730 731 /** unstarted */ 732 case -1: 733 eventType = "YTPUnstarted"; 734 break; 735 736 /** unstarted */ 737 case 0: 738 eventType = "YTPRealEnd"; 739 break; 740 741 /** play */ 742 case 1: 743 eventType = "YTPPlay"; 744 if (YTPlayer.controlBar.length) 745 YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.pause); 746 747 if (YTPlayer.isPlayer) 748 YTPlayer.inlinePlayButton.hide(); 749 750 jQuery(document).off("mousedown.YTPstart"); 751 break; 752 753 /** pause */ 754 case 2: 755 eventType = "YTPPause"; 756 if (YTPlayer.controlBar.length) 757 YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play); 758 759 if (YTPlayer.isPlayer) 760 YTPlayer.inlinePlayButton.show(); 761 break; 762 763 /** buffer */ 764 case 3: 765 YTPlayer.player.setPlaybackQuality(YTPlayer.opt.quality); 766 eventType = "YTPBuffering"; 767 if (YTPlayer.controlBar.length) 768 YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play); 769 break; 770 771 /** cued */ 772 case 5: 773 eventType = "YTPCued"; 774 break; 775 776 default: 777 break; 778 } 779 780 /** 781 Trigger state events 782 */ 783 var YTPEvent = jQuery.Event(eventType); 784 YTPEvent.time = YTPlayer.currentTime; 785 jQuery(YTPlayer).trigger(YTPEvent); 786 }, 787 /** 788 * onPlaybackQualityChange 789 * @param e 790 */ 791 'onPlaybackQualityChange': function (e) { 792 var quality = e.target.getPlaybackQuality(); 793 var YTPQualityChange = jQuery.Event("YTPQualityChange"); 794 YTPQualityChange.quality = quality; 795 jQuery(YTPlayer).trigger(YTPQualityChange); 796 }, 797 /** 798 * onError 799 * @param err 800 * 801 2 â The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks. 802 5 â The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred. 803 100 â The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private. 804 101 â The owner of the requested video does not allow it to be played in embedded players. 805 150 â This error is the same as 101. It's just a 101 error in disguise! 806 */ 807 'onError' : function (err) { 808 809 if (typeof YTPlayer.opt.onError == "function") 810 YTPlayer.opt.onError($YTPlayer, err); 811 812 switch (err.data) { 813 case 2: 814 console.error("video ID:: " + YTPlayer.videoID + ": The request contains an invali
814d parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks."); 815 break; 816 case 5: 817 console.error("video ID:: " + YTPlayer.videoID + ": The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred."); 818 break; 819 case 100: 820 console.error("video ID:: " + YTPlayer.videoID + ": The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private."); 821 break; 822 case 101: 823 case 150: 824 console.error("video ID:: " + YTPlayer.videoID + ": The owner of the requested video does not allow it to be played in embedded players."); 825 break; 826 } 827 828 if (YTPlayer.isList) 829 jQuery(YTPlayer).YTPPlayNext(); 830 831 } 832 } 833 }); 834 835 $YTPlayer.on("YTPlayerIsReady_" + YTPlayer.id, function () { 836 837 if (YTPlayer.isReady) 838 return this; 839 840 YTPlayer.playerEl = YTPlayer.player.getIframe(); 841 jQuery(YTPlayer.playerEl).unselectable(); 842 $YTPlayer.optimizeDisplay(); 843 844 /** 845 * Optimize display on resize 846 */ 847 jQuery(window).off("resize.YTP_" + YTPlayer.id).on("resize.YTP_" + YTPlayer.id, function () { 848 $YTPlayer.optimizeDisplay(); 849 }); 850 851 /** 852 * Set the time of the last visit progress 853 */ 854 if (YTPlayer.opt.remember_last_time) { 855 jQuery(window).on("unload.YTP_" + YTPlayer.id, function () { 856 var current_time = YTPlayer.player.getCurrentTime(); 857 jQuery.mbCookie.set("YTPlayer_start_from" + YTPlayer.videoID, current_time, 0); 858 }); 859 } 860 861 $YTPlayer.YTPCheckForState(); 862 863 }); 864 }); 865 }); 866 867 $YTPlayer.off("YTPTime.mask"); 868 jQuery.mbYTPlayer.applyMask(YTPlayer); 869 870 // console.timeEnd( "YTPlayerInit" ); 871 }); 872 }, 873 874 /** 875 * isOnScreen 876 * Check if the YTPlayer is on screen 877 * @param YTPlayer 878 * @returns {boolean} 879 */ 880 isOnScreen: function (YTPlayer, perc) { 881 perc = perc || 10; 882 var playerBox = YTPlayer.wrapper; 883 var winTop = jQuery(window).scrollTop(); 884 var winBottom = winTop + jQuery(window).height(); 885 886 var margin = (playerBox.height() * perc) / 100; 887 var elTop = playerBox.offset().top + margin; 888 var elBottom = playerBox.offset().top + (playerBox.height() - margin); 889 890 return ((elBottom <= winBottom) && (elTop >= winTop)); 891 }, 892 893 /** 894 * getDataFromAPI 895 * @param YTPlayer 896 */ 897 getDataFromAPI: function (YTPlayer) { 898 899 //console.debug("getDataFromAPI", YTPlayer.id, YTPlayer.videoID) 900 901 YTPlayer.videoData = jQuery.mbStorage.get("YTPlayer_data_" + YTPlayer.videoID); 902 /* 903 jQuery(YTPlayer).off("YTPData.YTPlayer").on("YTPData.YTPlayer", function () { 904 if (YTPlayer.hasData) { 905 if (YTPlayer.opt.coverImage || YTPlayer.orig_containment_background != "none") { 906 // if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay) { 907 var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background; 908 YTPlayer.opt.containment.css({ 909 background: bgndURL, 910 backgroundColor: "#000", 911 backgroundSize: "cover", 912 backgroundRepeat: "no-repeat" 913 }); 914 } 915 } 916 }); 917 */ 918 919 if (YTPlayer.videoData) { 920 921 setTimeout(function () { 922 YTPlayer.dataReceived = true; 923 924 var YTPChanged = jQuery.Event("YTPChanged"); 925 YTPChanged.time = YTPlayer.currentTime; 926 YTPChanged.videoId = YTPlayer.videoID; 927 YTPChanged.opt = YTPlayer.opt; 928 jQuery(YTPlayer).trigger(YTPChanged); 929 930 var YTPData = jQuery.Event("YTPData"); 931 YTPData.prop = {}; 932 for (var x in YTPlayer.videoData) 933 YTPData.prop[x] = YTPlayer.videoData[x]; 934 jQuery(YTPlayer).trigger(YTPData); 935 936 }, YTPlayer.opt.fadeOnStartTime); 937 938 YTPlayer.hasData = true; 939 940 } else if (jQuery.mbYTPlayer.apiKey) { 941 942 /** 943 * Get video info from API3 (needs api key) 944 * snippet,player,contentDetails,statistics,status 945 */ 946 jQuery.getJSON(jQuery.mbYTPlayer.locationProtocol + "//www.googleapis.com/youtube/v3/videos?id=" + YTPlayer.videoID + "&key=" + jQuery.mbYTPlayer.apiKey + "&part=snippet", function (data) { 947 YTPlayer.dataReceived = true; 948 949 var YTPChanged = jQuery.Event("YTPChanged"); 950 YTPChanged.time = YTPlayer.currentTime; 951 YTPChanged.videoId = YTPlayer.videoID; 952 jQuery(YTPlayer).trigger(YTPChanged); 953 954 function parseYTPlayer_data(data) { 955 YTPlayer.videoData = {}; 956 YTPlayer.videoData.id = YTPlayer.videoID; 957 YTPlayer.videoData.channelTitle = data.channelTitle; 958 YTPlayer.videoData.title = data.title; 959 YTPlayer.videoData.description = data.description.length < 400 ? data.description : data.description.substring(0, 400) + " ..."; 960 YTPlayer.videoData.thumb_max = data.thumbnails.maxres ? data.thumbnails.maxres.url : null; 961 YTPlayer.videoData.thumb_high = data.thumbnails.high ? data.thumbnails.high.url : null; 962 YTPlayer.videoData.thumb_medium = data.thumbnails.medium ? data.thumbnails.medium.url : null; 963 jQuery.mbStorage.set("YTPlayer_data_" + YTPlayer.videoID, YTPlayer.videoData); 964 } 965 966 if (!data.items[0]) { 967 YTPlayer.videoData = {}; 968 YTPlayer.hasData = false;
969 } else { 970 parseYTPlayer_data(data.items[0].snippet); 971 YTPlayer.hasData = true; 972 } 973 974 var YTPData = jQuery.Event("YTPData"); 975 YTPData.prop = {}; 976 for (var x in YTPlayer.videoData) YTPData.prop[x] = YTPlayer.videoData[x]; 977 jQuery(YTPlayer).trigger(YTPData); 978 }); 979 980 } else { 981 982 setTimeout(function () { 983 var YTPChanged = jQuery.Event("YTPChanged"); 984 YTPChanged.time = YTPlayer.currentTime; 985 YTPChanged.videoId = YTPlayer.videoID; 986 jQuery(YTPlayer).trigger(YTPChanged); 987 }, 10); 988 989 /* 990 if (!YTPlayer.opt.autoPlay) { 991 // if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay) { 992 var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background; 993 994 if (bgndURL) { 995 996 YTPlayer.opt.containment.css({ 997 background: bgndURL, 998 backgroundSize: "cover" 999 }); 1000 } 1001 } 1002 */ 1003 YTPlayer.videoData = null; 1004 1005 } 1006 1007 YTPlayer.opt.ratio = YTPlayer.opt.ratio == "auto" ? 16 / 9 : YTPlayer.opt.ratio; 1008 1009 if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay) { //&& ( !jQuery.mbBrowser.mobile && !jQuery.isTablet ) 1010 YTPlayer.loading = jQuery("<div/>").addClass("loading").html("Loading").hide(); 1011 jQuery(YTPlayer).append(YTPlayer.loading); 1012 YTPlayer.loading.fadeIn(); 1013 } 1014 }, 1015 1016 /** 1017 * removeStoredData 1018 */ 1019 removeStoredData: function () { 1020 jQuery.mbStorage.remove(); 1021 }, 1022 1023 /** 1024 * getVideoData 1025 * @returns {*|YTPlayer.videoData} 1026 */ 1027 getVideoData: function () { 1028 var YTPlayer = this.get(0); 1029 return YTPlayer.videoData; 1030 }, 1031 1032 /** 1033 * getVideoID 1034 * @returns {*|YTPlayer.videoID|boolean} 1035 */ 1036 getVideoID: function () { 1037 var YTPlayer = this.get(0); 1038 return YTPlayer.videoID || false; 1039 }, 1040 1041 /** 1042 * getPlaylistID 1043 * @returns {*|YTPlayer.videoID|boolean} 1044 */ 1045 getPlaylistID : function () { 1046 var YTPlayer = this.get(0); 1047 return YTPlayer.playlistID || false; 1048 }, 1049 /** 1050 * setVideoQuality 1051 * @param quality 1052 * @returns {jQuery.mbYTPlayer} 1053 */ 1054 setVideoQuality: function (quality) { 1055 var YTPlayer = this.get(0); 1056 YTPlayer.player.setPlaybackQuality(quality); 1057 return this; 1058 }, 1059 1060 /** 1061 * playlist 1062 * @param videos -> Array or String (videoList ID) 1063 * @param shuffle 1064 * @param callback 1065 * @returns {jQuery.mbYTPlayer} 1066 * 1067 * To retrieve a Youtube playlist the Youtube API key is required: 1068 * https://console.developers.google.com/ 1069 * jQuery.mbYTPlayer.apiKey 1070 */ 1071 playlist: function (videos, shuffle, callback) { 1072 1073 var $YTPlayer = this; 1074 var YTPlayer = $YTPlayer.get(0); 1075 1076 /* 1077 if (typeof videos == "String" && jQuery.mbYTPlayer.apiKey != "") { 1078 function getVideoListFromYoutube(playListID, page) { 1079 page = page || ''; 1080 var youtubeAPI = "https://www.googleapis.com/youtube/v3/playlistItems"; 1081 jQuery.getJSON(youtubeAPI, { 1082 part : "snippet,contentDetails", 1083 playlistId: playListID, //You have to enter the PlaylistID 1084 maxResults: 50, 1085 pageToken : page, 1086 key : jQuery.mbYTPlayer.apiKey //You have to enter your own YoutubeAPIKey 1087 }).done(function (response) { 1088 CreateVideosArray(response); 1089 if (response.nextPageToken) { 1090 page = response.nextPageToken; 1091 getVideoListFromYoutube(plID, page, videos); 1092 } else { 1093 $YTPlayer.YTPlaylist(YTPlayer.videos, shuffle, callback) 1094 } 1095 ; 1096 }); 1097 }; 1098 1099 function CreateVideosArray(response) { 1100 var k = response.items.length; 1101 for (var i = 0; i < k; i++) { 1102 YTPlayer.videos.push({ 1103 "videoURL": response.items[i].contentDetails.videoId 1104 }); 1105 } 1106 ; 1107 }; 1108 1109 getVideoListFromYoutube(videos); 1110 return this; 1111 } 1112 */ 1113 1114 YTPlayer.isList = true; 1115 1116 if (shuffle) 1117 videos = jQuery.shuffle(videos); 1118 1119 if (!YTPlayer.videoID) { 1120 YTPlayer.videos = videos; 1121 YTPlayer.videoCounter = 1;
vendor: 4,143 bytes, lines 1122-1275
1122 YTPlayer.videoLength = videos.length; 1123 jQuery(YTPlayer).data("property", videos[0]); 1124 jQuery(YTPlayer).YTPlayer(); 1125 } 1126 1127 if (typeof callback == "function") 1128 jQuery(YTPlayer).one("YTPChanged", function () { 1129 callback(YTPlayer); 1130 }); 1131 1132 jQuery(YTPlayer).on("YTPEnd", function () { 1133 jQuery(YTPlayer).YTPPlayNext(); 1134 }); 1135 return this; 1136 }, 1137 1138 /** 1139 * playNext 1140 * @returns {jQuery.mbYTPlayer} 1141 */ 1142 playNext: function () { 1143 var YTPlayer = this.get(0); 1144 YTPlayer.videoCounter++; 1145 if (YTPlayer.videoCounter > YTPlayer.videoLength) 1146 YTPlayer.videoCounter = 1; 1147 jQuery(YTPlayer).YTPPlayIndex(YTPlayer.videoCounter); 1148 return this; 1149 }, 1150 1151 /** 1152 * playPrev 1153 * @returns {jQuery.mbYTPlayer} 1154 */ 1155 playPrev: function () { 1156 var YTPlayer = this.get(0); 1157 YTPlayer.videoCounter--; 1158 if (YTPlayer.videoCounter <= 0) 1159 YTPlayer.videoCounter = YTPlayer.videoLength; 1160 jQuery(YTPlayer).YTPPlayIndex(YTPlayer.videoCounter); 1161 return this; 1162 }, 1163 1164 /** 1165 * playIndex 1166 * @param idx 1167 * @returns {jQuery.mbYTPlayer} 1168 */ 1169 playIndex: function (idx) { 1170 var YTPlayer = this.get(0); 1171 if (YTPlayer.checkForStartAt) { 1172 clearInterval(YTPlayer.checkForStartAt); 1173 clearInterval(YTPlayer.getState); 1174 } 1175 YTPlayer.videoCounter = idx; 1176 1177 if (YTPlayer.videoCounter >= YTPlayer.videoLength) 1178 YTPlayer.videoCounter = YTPlayer.videoLength; 1179 1180 var video = YTPlayer.videos[YTPlayer.videoCounter - 1]; 1181 1182 jQuery(YTPlayer).YTPChangeVideo(video); 1183 return this; 1184 }, 1185 1186 /** 1187 * changeVideo 1188 * @param opt 1189 * @returns {jQuery.mbYTPlayer} 1190 */ 1191 changeVideo: function (opt) { 1192 var $YTPlayer = this; 1193 var YTPlayer = $YTPlayer.get(0); 1194 1195 YTPlayer.opt.startAt = 0; 1196 YTPlayer.opt.stopAt = 0; 1197 YTPlayer.opt.mask = false; 1198 YTPlayer.opt.mute = true; 1199 YTPlayer.opt.autoPlay = true; 1200 YTPlayer.opt.addFilters = false; 1201 YTPlayer.opt.coverImage = false; 1202 1203 YTPlayer.hasData = false; 1204 YTPlayer.hasChanged = true; 1205 1206 YTPlayer.player.loopTime = undefined; 1207 1208 if (opt) 1209 jQuery.extend(YTPlayer.opt, opt); 1210 1211 //console.debug("changeVideo::", YTPlayer.opt); 1212 1213 YTPlayer.videoID = getYTPVideoID(YTPlayer.opt.videoURL).videoID; 1214 1215 if (YTPlayer.opt.loop && typeof YTPlayer.opt.loop == "boolean") 1216 YTPlayer.opt.loop = 9999; 1217 1218 YTPlayer.wrapper.css({ 1219 background: "none" 1220 }); 1221 1222 jQuery(YTPlayer.playerEl).CSSAnimate({ 1223 opacity: 0 1224 }, YTPlayer.opt.fadeOnStartTime, function () { 1225 1226 jQuery.mbYTPlayer.getDataFromAPI(YTPlayer); 1227 1228 //console.debug("YTPGetPlayer::", $YTPlayer.YTPGetPlayer()); 1229 1230 $YTPlayer.YTPGetPlayer().loadVideoById({ 1231 videoId : YTPlayer.videoID, 1232 // startSeconds: YTPlayer.opt.startAt, 1233 // endSeconds: YTPlayer.opt.stopAt, 1234 suggestedQuality: YTPlayer.opt.quality 1235 }); 1236 $YTPlayer.YTPPause(); 1237 $YTPlayer.optimizeDisplay(); 1238 1239 $YTPlayer.YTPCheckForState(); 1240 }); 1241 1242 var YTPChangeVideo = jQuery.Event("YTPChangeVideo"); 1243 YTPChangeVideo.time = YTPlayer.currentTime; 1244 jQuery(YTPlayer).trigger(YTPChangeVideo); 1245 1246 jQuery.mbYTPlayer.applyMask(YTPlayer); 1247 1248 return this; 1249 }, 1250 1251 /** 1252 * getPlayer 1253 * @returns {player} 1254 */ 1255 getPlayer: function () { 1256 var YTPlayer = this.get(0); 1257 if (!YTPlayer.isReady) 1258 return null; 1259 return YTPlayer.player || null; 1260 }, 1261 1262 /** 1263 * playerDestroy 1264 * @returns {jQuery.mbYTPlayer} 1265 */ 1266 playerDestroy: function () { 1267 var YTPlayer = this.get(0); 1268 if (!YTPlayer.isReady) 1269 return this; 1270 1271 ytp.YTAPIReady = true; 1272 ytp.backgroundIsInited = false; 1273 YTPlayer.isInit = false; 1274 YTPlayer.videoID = null; 1275 YTPlayer.isReady = false;
1276 YTPlayer.wrapper.remove(); 1277 jQuery("#controlBar_" + YTPlayer.id).remove(); 1278 clearInterval(YTPlayer.checkForStartAt); 1279 clearInterval(YTPlayer.getState); 1280 return this; 1281 }, 1282 1283 /** 1284 * fullscreen 1285 * @param real 1286 * @returns {jQuery.mbYTPlayer} 1287 */ 1288 fullscreen: function (real) { 1289 var YTPlayer = this.get(0); 1290 1291 if (typeof real == "undefined") 1292 real = eval(YTPlayer.opt.realfullscreen); 1293 1294 var controls = jQuery("#controlBar_" + YTPlayer.id); 1295 var fullScreenBtn = controls.find(".mb_OnlyYT"); 1296 var videoWrapper = YTPlayer.isPlayer ? YTPlayer.opt.containment : YTPlayer.wrapper; 1297 1298 if (real) { 1299 var fullscreenchange = jQuery.mbBrowser.mozilla ? "mozfullscreenchange" : jQuery.mbBrowser.webkit ? "webkitfullscreenchange" : "fullscreenchange"; 1300 jQuery(document).off(fullscreenchange).on(fullscreenchange, function () { 1301 var isFullScreen = RunPrefixMethod(document, "IsFullScreen") || RunPrefixMethod(document, "FullScreen"); 1302 if (!isFullScreen) { 1303 YTPlayer.isAlone = false; 1304 fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT); 1305 jQuery(YTPlayer).YTPSetVideoQuality(YTPlayer.opt.quality); 1306 videoWrapper.removeClass("YTPFullscreen"); 1307 videoWrapper.CSSAnimate({ 1308 opacity: YTPlayer.opt.opacity 1309 }, YTPlayer.opt.fadeOnStartTime); 1310 1311 videoWrapper.css({ 1312 zIndex: 0 1313 }); 1314 1315 if (YTPlayer.isBackground) { 1316 jQuery("body").after(controls); 1317 } else { 1318 YTPlayer.wrapper.before(controls); 1319 } 1320 jQuery(window).resize(); 1321 jQuery(YTPlayer).trigger("YTPFullScreenEnd"); 1322 1323 } else { 1324 1325 jQuery(YTPlayer).YTPSetVideoQuality("default"); 1326 jQuery(YTPlayer).trigger("YTPFullScreenStart"); 1327 1328 } 1329 }); 1330 } 1331 if (!YTPlayer.isAlone) { 1332 function hideMouse() { 1333 YTPlayer.overlay.css({ 1334 cursor: "none" 1335 }); 1336 } 1337 1338 jQuery(document).on("mousemove.YTPlayer", function (e) { 1339 YTPlayer.overlay.css({ 1340 cursor: "auto" 1341 }); 1342 clearTimeout(YTPlayer.hideCursor); 1343 if (!jQuery(e.target).parents().is(".mb_YTPBar")) 1344 YTPlayer.hideCursor = setTimeout(hideMouse, 3000); 1345 }); 1346 1347 hideMouse(); 1348 1349 if (real) { 1350 videoWrapper.css({ 1351 opacity: 0 1352 }); 1353 videoWrapper.addClass("YTPFullscreen"); 1354 launchFullscreen(videoWrapper.get(0)); 1355 1356 setTimeout(function () { 1357 videoWrapper.CSSAnimate({ 1358 opacity: 1 1359 }, YTPlayer.opt.fadeOnStartTime * 2); 1360 1361 videoWrapper.append(controls); 1362 jQuery(YTPlayer).optimizeDisplay(); 1363 YTPlayer.player.seekTo(YTPlayer.player.getCurrentTime() + .1, true); 1364 1365 }, YTPlayer.opt.fadeOnStartTime) 1366 } else 1367 videoWrapper.css({ 1368 zIndex: 10000 1369 }).CSSAnimate({ 1370 opacity: 1 1371 }, YTPlayer.opt.fadeOnStartTime * 2); 1372 fullScreenBtn.html(jQuery.mbYTPlayer.controls.showSite); 1373 YTPlayer.isAlone = true; 1374 } else { 1375 jQuery(document).off("mousemove.YTPlayer"); 1376 clearTimeout(YTPlayer.hideCursor); 1377 YTPlayer.overlay.css({ 1378 cursor: "auto" 1379 }); 1380 if (real) { 1381 cancelFullscreen(); 1382 } else { 1383 videoWrapper.CSSAnimate({ 1384 opacity: YTPlayer.opt.opacity 1385 }, YTPlayer.opt.fadeOnStartTime); 1386 videoWrapper.css({ 1387 zIndex: 0 1388 }); 1389 } 1390 fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT); 1391 YTPlayer.isAlone = false; 1392 } 1393 1394 function RunPrefixMethod(obj, method) { 1395 var pfx = ["webkit", "moz", "ms", "o", ""]; 1396 var p = 0, 1397 m, t; 1398 while (p < pfx.length && !obj[m]) { 1399 m = method; 1400 if (pfx[p] == "") { 1401 m = m.substr(0, 1).toLowerCase() + m.substr(1); 1402 } 1403 m = pfx[p] + m; 1404 t = typeof obj[m]; 1405 if (t != "undefined") { 1406 pfx = [pfx[p]]; 1407 return (t == "function" ? obj[m]() : obj[m]); 1408 } 1409 p++; 1410 } 1411 } 1412 1413 function launchFullscreen(element) { 1414 RunPrefixMethod(element, "RequestFullScreen"); 1415 } 1416 1417 function cancelFullscreen() { 1418 if (RunPrefixMethod(document, "FullScreen") || RunPrefixMethod(document, "IsFullScreen")) { 1419 RunPrefixMethod(document, "CancelFullScreen"); 1420 } 1421 } 1422 1423 return this; 1424 }, 1425 1426 /** 1427 * toggleLoops 1428 * @returns {jQuery.mbYTPlayer} 1429 */ 1430 toggleLoops: function () { 1431 var YTPlayer = this.get(0); 1432 var data = YTPlayer.opt; 1433 if (data.loop == 1) { 1434 data.loop = 0; 1435 } else { 1436 if (data.startAt) { 1437 YTPlayer.player.seekTo(data.startAt); 1438 } else { 1439 YTPlayer.player.playVideo(); 1440 } 1441 data.loop = 1; 1442 } 1443 return this; 1444 }, 1445 1446 /** 1447 * play 1448 * @returns {jQuery.mbYTPlayer} 1449 */ 1450 play: function () { 1451 var YTPlayer = this.get(0); 1452 var $YTPlayer = jQuery(YTPlayer); 1453 1454 if (!YTPlayer.isReady) 1455 return this; 1456 1457 setTimeout(function () { 1458 $YTPlayer.YTPSetAbundance(YTPlayer.opt.abundance); 1459 }, 300) 1460 1461 YTPlayer.player.playVideo(); 1462 1463 jQuery(YTPlayer.playerEl).css({ 1464 opacity: 1 1465 }); 1466 1467 YTPlayer.wrapper.css({ 1468 backgroundImage: "none" 1469 }); 1470 1471 YTPlayer.wrapper.CSSAnimate({ 1472 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 1473 }, YTPlayer.opt.fadeOnStartTime); 1474 1475 var controls = jQuery("#controlBar_" + YTPlayer.id); 1476 var playBtn = controls.find(".mb_YTPPlayPause"); 1477 playBtn.html(jQuery.mbYTPlayer.controls.pause); 1478 YTPlayer.state = 1; 1479 1480 return this; 1481 }, 1482 1483 /** 1484 * togglePlay 1485 * @param callback 1486 * @returns {jQuery.mbYTPlayer} 1487 */ 1488 togglePlay: function (callback) { 1489 var YTPlayer = this.get(0); 1490 if (!YTPlayer.isReady) 1491 return this; 1492 1493 if (YTPlayer.state == 1) 1494 this.YTPPause(); 1495 else 1496 this.YTPPlay(); 1497 1498 if (typeof callback == "function") 1499 callback(YTPlayer.state); 1500 1501 return this; 1502 }, 1503 1504 /** 1505 * stop 1506 * @returns {jQuery.mbYTPlayer} 1507 */ 1508 stop: function () { 1509 var YTPlayer = this.get(0); 1510 if (!YTPlayer.isReady) 1511 return this; 1512 1513 var controls = jQuery("#controlBar_" + YTPlayer.id); 1514 var playBtn = controls.find(".mb_YTPPlayPause"); 1515 playBtn.html(jQuery.mbYTPlayer.controls.play); 1516 YTPlayer.player.stopVideo(); 1517 return this; 1518 }, 1519 1520 /** 1521 * pause 1522 * @returns {jQuery.mbYTPlayer} 1523 */ 1524 pause: function () { 1525 var YTPlayer = this.get(0); 1526 if (!YTPlayer.isReady) 1527 return this; 1528 1529 if (YTPlayer.opt.abundance < .2) 1530 this.YTPSetAbundance(.2); 1531 1532 YTPlayer.player.pauseVideo(); 1533 YTPlayer.state = 2; 1534 return this; 1535 }, 1536 1537 /** 1538 * seekTo 1539 * @param sec 1540 * @returns {jQuery.mbYTPlayer} 1541 */ 1542 seekTo: function (sec) { 1543 var YTPlayer = this.get(0); 1544 if (!YTPlayer.isReady) 1545 return this; 1546 1547 YTPlayer.player.seekTo(sec, true); 1548 return this; 1549 }, 1550 1551 /** 1552 * setVolume 1553 * @param val 1554 * @returns {jQuery.mbYTPlayer} 1555 */ 1556 setVolume: function (val) { 1557 var YTPlayer = this.get(0); 1558 if (!YTPlayer.isReady) 1559 return this; 1560 1561 YTPlayer.opt.vol = val; 1562 YTPlayer.player.setVolume(YTPlayer.opt.vol); 1563 1564 if (YTPlayer.volumeBar && YTPlayer.volumeBar.length) 1565 YTPlayer.volumeBar.updateSliderVal(val); 1566 1567 return this; 1568 }, 1569 /** 1570 * getVolume 1571 * @returns {*} 1572 */ 1573 getVolume: function () { 1574 var YTPlayer = this.get(0); 1575 if (!YTPlayer.isReady) 1576 return this; 1577 1578 return YTPlayer.player.getVolume(); 1579 }, 1580 1581 /** 1582 * toggleVolume 1583 * @returns {jQuery.mbYTPlayer} 1584 */ 1585 toggleVolume: function () { 1586 1587 var YTPlayer = this.get(0); 1588 if (!YTPlayer.isReady) 1589 return this; 1590 1591 if (YTPlayer.isMute) { 1592 if (!jQuery.mbBrowser.mobile) 1593 this.YTPSetVolume(YTPlayer.opt.vol) 1594 this.YTPUnmute(); 1595 } else { 1596 this.YTPMute(); 1597 } 1598 return this; 1599 }, 1600 1601 /** 1602 * mute 1603 * @returns {jQuery.mbYTPlayer} 1604 */ 1605 mute: function () { 1606 var YTPlayer = this.get(0); 1607 if (!YTPlayer.isReady) 1608 return this; 1609 1610 if (YTPlayer.isMute) 1611 return this; 1612 YTPlayer.player.mute(); 1613 YTPlayer.isMute = true; 1614 YTPlayer.player.setVolume(0); 1615 if (YTPlayer.volumeBar && YTPlayer.volumeBar.length && YTPlayer.volumeBar.width() > 10) { 1616 YTPlayer.volumeBar.updateSliderVal(0); 1617 } 1618 var controls = jQuery("#controlBar_" + YTPlayer.id); 1619 var muteBtn = controls.find(".mb_YTPMuteUnmute"); 1620 muteBtn.html(jQuery.mbYTPlayer.controls.unmute); 1621 jQuery(YTPlayer).addClass("isMuted"); 1622 if (YTPlayer.volumeBar && YTPlayer.volumeBar.length) YTPlayer.volumeBar.addClass("muted"); 1623 var YTPEvent = jQuery.Event("YTPMuted"); 1624 YTPEvent.time = YTPlayer.currentTime; 1625 1626 if (!YTPlayer.preventTrigger) 1627 jQuery(YTPlayer).trigger(YTPEvent); 1628 1629 return this; 1630 }, 1631 1632 /** 1633 * unmute 1634 * @returns {jQuery.mbYTPlayer} 1635 */ 1636 unmute: function () { 1637 var YTPlayer = this.get(0); 1638 if (!YTPlayer.isReady) 1639 return this; 1640 1641 if (!YTPlayer.isMute) 1642 return this; 1643 1644 YTPlayer.player.unMute(); 1645 YTPlayer.isMute = false;
1646 jQuery(YTPlayer).YTPSetVolume(YTPlayer.opt.vol); 1647 if (YTPlayer.volumeBar && YTPlayer.volumeBar.length) YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol > 10 ? YTPlayer.opt.vol : 10); 1648 var controls = jQuery("#controlBar_" + YTPlayer.id); 1649 var muteBtn = controls.find(".mb_YTPMuteUnmute"); 1650 muteBtn.html(jQuery.mbYTPlayer.controls.mute); 1651 jQuery(YTPlayer).removeClass("isMuted"); 1652 if (YTPlayer.volumeBar && YTPlayer.volumeBar.length) YTPlayer.volumeBar.removeClass("muted"); 1653 var YTPEvent = jQuery.Event("YTPUnmuted"); 1654 YTPEvent.time = YTPlayer.currentTime; 1655 1656 if (!YTPlayer.preventTrigger) 1657 jQuery(YTPlayer).trigger(YTPEvent); 1658 1659 return this; 1660 }, 1661 1662 /* FILTERS ---------------------------------------------------------------------------------------------------------*/ 1663 1664 /** 1665 * applyFilter 1666 * @param filter 1667 * @param value 1668 * @returns {jQuery.mbYTPlayer} 1669 */ 1670 applyFilter: function (filter, value) { 1671 var $YTPlayer = this; 1672 var YTPlayer = $YTPlayer.get(0); 1673 if (!YTPlayer.isReady) 1674 return this; 1675 1676 YTPlayer.filters[filter].value = value; 1677 if (YTPlayer.filtersEnabled) 1678 $YTPlayer.YTPEnableFilters(); 1679 }, 1680 1681 /** 1682 * applyFilters 1683 * @param filters 1684 * @returns {jQuery.mbYTPlayer} 1685 */ 1686 applyFilters: function (filters) { 1687 var $YTPlayer = this; 1688 var YTPlayer = $YTPlayer.get(0); 1689 if (!YTPlayer.isReady) 1690 return this; 1691 1692 if (!YTPlayer.isReady) { 1693 jQuery(YTPlayer).on("YTPReady", function () { 1694 $YTPlayer.YTPApplyFilters(filters); 1695 }); 1696 return this; 1697 } 1698 1699 for (var key in filters) { 1700 $YTPlayer.YTPApplyFilter(key, filters[key]); 1701 } 1702 1703 $YTPlayer.trigger("YTPFiltersApplied"); 1704 }, 1705 1706 /** 1707 * toggleFilter 1708 * @param filter 1709 * @param value 1710 * @returns {jQuery.mbYTPlayer} 1711 */ 1712 toggleFilter: function (filter, value) { 1713 var $YTPlayer = this; 1714 var YTPlayer = $YTPlayer.get(0); 1715 if (!YTPlayer.isReady) 1716 return this; 1717 1718 if (!YTPlayer.filters[filter].value) 1719 YTPlayer.filters[filter].value = value; 1720 else 1721 YTPlayer.filters[filter].value = 0; 1722 1723 if (YTPlayer.filtersEnabled) 1724 jQuery(YTPlayer).YTPEnableFilters(); 1725 1726 return this; 1727 }, 1728 1729 /** 1730 * toggleFilters 1731 * @param callback 1732 * @returns {jQuery.mbYTPlayer} 1733 */ 1734 toggleFilters: function (callback) { 1735 var $YTPlayer = this; 1736 var YTPlayer = $YTPlayer.get(0); 1737 if (!YTPlayer.isReady) 1738 return this; 1739 1740 if (YTPlayer.filtersEnabled) { 1741 jQuery(YTPlayer).trigger("YTPDisableFilters"); 1742 jQuery(YTPlayer).YTPDisableFilters(); 1743 } else { 1744 jQuery(YTPlayer).YTPEnableFilters(); 1745 jQuery(YTPlayer).trigger("YTPEnableFilters"); 1746 } 1747 if (typeof callback == "function") 1748 callback(YTPlayer.filtersEnabled); 1749 1750 return this; 1751 }, 1752 1753 /** 1754 * disableFilters 1755 * @returns {jQuery.mbYTPlayer} 1756 */ 1757 disableFilters: function () { 1758 var $YTPlayer = this; 1759 var YTPlayer = $YTPlayer.get(0); 1760 if (!YTPlayer.isReady) 1761 return this; 1762 1763 var iframe = jQuery(YTPlayer.playerEl); 1764 iframe.css("-webkit-filter", ""); 1765 iframe.css("filter", ""); 1766 YTPlayer.filtersEnabled = false; 1767 1768 return this; 1769 }, 1770 1771 /** 1772 * enableFilters 1773 * @returns {jQuery.mbYTPlayer} 1774 */ 1775 enableFilters: function () { 1776 var $YTPlayer = this; 1777 var YTPlayer = $YTPlayer.get(0); 1778 if (!YTPlayer.isReady) 1779 return this; 1780 1781 var iframe = jQuery(YTPlayer.playerEl); 1782 var filterStyle = ""; 1783 for (var key in YTPlayer.filters) { 1784 if (YTPlayer.filters[key].value) 1785 filterStyle += key.replace("_", "-") + "(" + YTPlayer.filters[key].value + YTPlayer.filters[key].unit + ") "; 1786 } 1787 iframe.css("-webkit-filter", filterStyle); 1788 iframe.css("filter", filterStyle); 1789 YTPlayer.filtersEnabled = true; 1790 1791 return this; 1792 }, 1793 1794 /** 1795 * removeFilter 1796 * @param filter 1797 * @param callback 1798 * @returns {jQuery.mbYTPlayer} 1799 */ 1800 removeFilter: function (filter, callback) { 1801 var $YTPlayer = this; 1802 var YTPlayer = $YTPlayer.get(0); 1803 if (!YTPlayer.isReady) 1804 return this; 1805 1806 if (typeof filter == "function") { 1807 callback = filter; 1808 filter = null; 1809 } 1810 1811 if (!filter) { 1812 for (var key in YTPlayer.filters) { 1813 $YTPlayer.YTPApplyFilter(key, 0); 1814 } 1815 1816 if (typeof callback == "function") 1817 callback(key); 1818 1819 YTPlayer.filters = jQuery.extend(true, {}, jQuery.mbYTPlayer.defaultFilters); 1820 1821 } else { 1822 $YTPlayer.YTPApplyFilter(filter, 0); 1823 if (typeof callback == "function") callback(filter); 1824 } 1825 1826 var YTPEvent = jQuery.Event("YTPFiltersApplied"); 1827 $YTPlayer.trigger(YTPEvent); 1828 1829 return this; 1830 }, 1831 1832 /** 1833 * getFilters 1834 * @returns {filters} 1835 */ 1836 getFilters: function () { 1837 var YTPlayer = this.get(0); 1838 if (!YTPlayer.isReady) 1839 return this; 1840 1841 return YTPlayer.filters; 1842 }, 1843 1844 /* MASK ---------------------------------------------------------------------------------------------------------*/ 1845 1846 /** 1847 * addMask 1848 * @param mask 1849 * @returns {jQuery.mbYTPlayer} 1850 */ 1851 addMask: function (mask) { 1852 var YTPlayer = this.get(0); 1853 if (!YTPlayer.isReady) 1854 return this; 1855 1856 if (!mask) 1857 mask = YTPlayer.actualMask; 1858 1859 var tempImg = jQuery("<img/>").attr("src", mask).on("load", function () { 1860 YTPlayer.overlay.CSSAnimate({ 1861 opacity: 0 1862 }, YTPlayer.opt.fadeOnStartTime, function () { 1863 YTPlayer.hasMask = true; 1864 tempImg.remove(); 1865 YTPlayer.overlay.css({ 1866 backgroundImage : "url(" + mask + ")", 1867 backgroundRepeat : "no-repeat", 1868 backgroundPosition: "center center", 1869 backgroundSize : "cover" 1870 }); 1871 YTPlayer.overlay.CSSAnimate({ 1872 opacity: 1 1873 }, YTPlayer.opt.fadeOnStartTime); 1874 }); 1875 }); 1876 1877 return this; 1878 }, 1879 1880 /** 1881 * removeMask 1882 * @returns {jQuery.mbYTPlayer} 1883 */ 1884 removeMask: function () { 1885 var YTPlayer = this.get(0); 1886 if (!YTPlayer.isReady) 1887 return this; 1888 1889 YTPlayer.overlay.CSSAnimate({ 1890 opacity: 0 1891 }, YTPlayer.opt.fadeOnStartTime, function () { 1892 YTPlayer.hasMask = false;
1893 YTPlayer.overlay.css({ 1894 backgroundImage : "", 1895 backgroundRepeat : "", 1896 backgroundPosition: "", 1897 backgroundSize : "" 1898 }); 1899 YTPlayer.overlay.CSSAnimate({ 1900 opacity: 1 1901 }, YTPlayer.opt.fadeOnStartTime); 1902 }); 1903 1904 return this; 1905 }, 1906 1907 /** 1908 * Apply mask 1909 * @param YTPlayer 1910 */ 1911 applyMask: function (YTPlayer) { 1912 var $YTPlayer = jQuery(YTPlayer); 1913 if (!YTPlayer.isReady) 1914 return this; 1915 1916 $YTPlayer.off("YTPTime.mask"); 1917 1918 if (YTPlayer.opt.mask) { 1919 if (typeof YTPlayer.opt.mask == "string") { 1920 $YTPlayer.YTPAddMask(YTPlayer.opt.mask); 1921 YTPlayer.actualMask = YTPlayer.opt.mask; 1922 } else if (typeof YTPlayer.opt.mask == "object") { 1923 for (var time in YTPlayer.opt.mask) { 1924 if (YTPlayer.opt.mask[time]) 1925 var img = jQuery("<img/>").attr("src", YTPlayer.opt.mask[time]); 1926 } 1927 if (YTPlayer.opt.mask[0]) 1928 $YTPlayer.YTPAddMask(YTPlayer.opt.mask[0]); 1929 $YTPlayer.on("YTPTime.mask", function (e) { 1930 for (var time in YTPlayer.opt.mask) { 1931 if (e.time == time) 1932 if (!YTPlayer.opt.mask[time]) { 1933 $YTPlayer.YTPRemoveMask(); 1934 } else { 1935 $YTPlayer.YTPAddMask(YTPlayer.opt.mask[time]); 1936 YTPlayer.actualMask = YTPlayer.opt.mask[time]; 1937 } 1938 } 1939 }); 1940 } 1941 } 1942 }, 1943 1944 /** 1945 * toggleMask 1946 * @returns {jQuery.mbYTPlayer} 1947 */ 1948 toggleMask: function () { 1949 var YTPlayer = this.get(0); 1950 if (!YTPlayer.isReady) 1951 return this; 1952 1953 var $YTPlayer = jQuery(YTPlayer); 1954 if (YTPlayer.hasMask) 1955 $YTPlayer.YTPRemoveMask(); 1956 else 1957 $YTPlayer.YTPAddMask(); 1958 return this; 1959 }, 1960 1961 /* CONTROLS --------------------------------------------------------------------------------------------------------*/ 1962 1963 /** 1964 * manageProgress 1965 * @returns {{totalTime: number, currentTime: number}} 1966 */ 1967 manageProgress: function () { 1968 var YTPlayer = this.get(0); 1969 var controls = jQuery("#controlBar_" + YTPlayer.id); 1970 var progressBar = controls.find(".mb_YTPProgress"); 1971 var loadedBar = controls.find(".mb_YTPLoaded"); 1972 var timeBar = controls.find(".mb_YTPseekbar"); 1973 var totW = progressBar.outerWidth(); 1974 var currentTime = Math.floor(YTPlayer.player.getCurrentTime()); 1975 var totalTime = Math.floor(YTPlayer.player.getDuration()); 1976 var timeW = (currentTime * totW) / totalTime; 1977 var startLeft = 0; 1978 var loadedW = YTPlayer.player.getVideoLoadedFraction() * 100; 1979 loadedBar.css({ 1980 left : startLeft, 1981 width: loadedW + "%" 1982 }); 1983 timeBar.css({ 1984 left : 0, 1985 width: timeW 1986 }); 1987 return { 1988 totalTime : totalTime, 1989 currentTime: currentTime 1990 }; 1991 }, 1992 1993 /** 1994 * buildControls 1995 * @param YTPlayer 1996 */ 1997 buildControls: function (YTPlayer) { 1998 1999 jQuery("#controlBar_" + YTPlayer.id).remove(); 2000 if (!YTPlayer.opt.showControls) { 2001 YTPlayer.controlBar = false; 2002 return; 2003 } 2004 2005 // @YTPlayer.opt.printUrl: is deprecated; use YTPlayer.opt.showYTLogo 2006 YTPlayer.opt.showYTLogo = YTPlayer.opt.showYTLogo || YTPlayer.opt.printUrl; 2007 if (jQuery("#controlBar_" + YTPlayer.id).length) 2008 return; 2009 YTPlayer.controlBar = jQuery("<span/>").attr("id", "controlBar_" + YTPlayer.id).addClass("mb_YTPBar").css({ 2010 whiteSpace: "noWrap", 2011 position : YTPlayer.isBackground ? "fixed" : "absolute", 2012 zIndex : YTPlayer.isBackground ? 10000 : 1000 2013 }).hide().on("click", function (e) { 2014 e.stopPropagation(); 2015 }); 2016 var buttonBar = jQuery("<div/>").addClass("buttonBar"); 2017 /** 2018 * play/pause button 2019 * */ 2020 var playpause = jQuery("<span>" + jQuery.mbYTPlayer.controls.play + "</span>").addClass("mb_YTPPlayPause ytpicon").on("click", function (e) { 2021 e.stopPropagation(); 2022 jQuery(YTPlayer).YTPTogglePlay(); 2023 }); 2024 /** 2025 * mute/unmute button 2026 * */
2027 var MuteUnmute = jQuery("<span>" + jQuery.mbYTPlayer.controls.mute + "</span>").addClass("mb_YTPMuteUnmute ytpicon").on("click", function (e) { 2028 e.stopPropagation(); 2029 jQuery(YTPlayer).YTPToggleVolume(); 2030 }); 2031 /** 2032 * volume bar 2033 * */ 2034 var volumeBar = jQuery("<div/>").addClass("mb_YTPVolumeBar").css({ 2035 display: "inline-block" 2036 }); 2037 YTPlayer.volumeBar = volumeBar; 2038 2039 /** 2040 * time elapsed 2041 * */ 2042 var idx = jQuery("<span/>").addClass("mb_YTPTime"); 2043 var vURL = YTPlayer.opt.videoURL ? YTPlayer.opt.videoURL : ""; 2044 if (vURL.indexOf("http") < 0) vURL = jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/watch?v=" + YTPlayer.opt.videoURL; 2045 var movieUrl = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.ytLogo).addClass("mb_YTPUrl ytpicon").attr("title", "view on YouTube").on("click", function () { 2046 window.open(vURL, "viewOnYT") 2047 }); 2048 var onlyVideo = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.onlyYT).addClass("mb_OnlyYT ytpicon").on("click", function (e) { 2049 e.stopPropagation(); 2050 jQuery(YTPlayer).YTPFullscreen(YTPlayer.opt.realfullscreen); 2051 }); 2052 var progressBar = jQuery("<div/>").addClass("mb_YTPProgress").css("position", "absolute").on("click", function (e) { 2053 e.stopPropagation(); 2054 timeBar.css({ 2055 width: (e.clientX - timeBar.offset().left) 2056 }); 2057 YTPlayer.timeW = e.clientX - timeBar.offset().left; 2058 YTPlayer.controlBar.find(".mb_YTPLoaded").css({ 2059 width: 0 2060 }); 2061 var totalTime = Math.floor(YTPlayer.player.getDuration()); 2062 YTPlayer.goto = (timeBar.outerWidth() * totalTime) / progressBar.outerWidth(); 2063 YTPlayer.player.seekTo(parseFloat(YTPlayer.goto), true); 2064 YTPlayer.controlBar.find(".mb_YTPLoaded").css({ 2065 width: 0 2066 }); 2067 }); 2068 var loadedBar = jQuery("<div/>").addClass("mb_YTPLoaded").css("position", "absolute"); 2069 var timeBar = jQuery("<div/>").addClass("mb_YTPseekbar").css("position", "absolute"); 2070 progressBar.append(loadedBar).append(timeBar); 2071 buttonBar.append(playpause).append(MuteUnmute).append(volumeBar).append(idx); 2072 2073 if (YTPlayer.opt.showYTLogo) { 2074 buttonBar.append(movieUrl); 2075 } 2076 2077 /** 2078 * Full screen button 2079 */ 2080 if (YTPlayer.isBackground || (eval(YTPlayer.opt.realfullscreen) && !YTPlayer.isBackground)) 2081 buttonBar.append(onlyVideo); 2082 2083 YTPlayer.controlBar.append(buttonBar).append(progressBar); 2084 2085 if (!YTPlayer.isBackground) { 2086 YTPlayer.controlBar.addClass("inlinePlayer"); 2087 YTPlayer.wrapper.before(YTPlayer.controlBar); 2088 } else { 2089 jQuery("body").after(YTPlayer.controlBar); 2090 } 2091 2092 /** 2093 * Volume slider 2094 */ 2095 volumeBar.simpleSlider({ 2096 initialval : YTPlayer.opt.vol, 2097 scale : 100, 2098 orientation: "h", 2099 callback : function (el) { 2100 if (el.value == 0) { 2101 jQuery(YTPlayer).YTPMute(); 2102 } else { 2103 jQuery(YTPlayer).YTPUnmute(); 2104 } 2105 YTPlayer.player.setVolume(el.value); 2106 if (!YTPlayer.isMute) 2107 YTPlayer.opt.vol = el.value; 2108 } 2109 }); 2110 }, 2111 2112 /* MANAGE PLAYER STATE ------------------------------------------------------------------------------------------*/ 2113 2114 /** 2115 * checkForState 2116 */ 2117 checkForState: function () { 2118 var YTPlayer = this.get(0); 2119 var $YTPlayer = jQuery(YTPlayer); 2120 2121 clearInterval(YTPlayer.getState); 2122 var interval = 100; 2123 //Checking if player has been removed from the scene 2124 if (!jQuery.contains(document, YTPlayer)) { 2125 $YTPlayer.YTPPlayerDestroy(); 2126 clearInterval(YTPlayer.getState); 2127 clearInterval(YTPlayer.checkForStartAt); 2128 return; 2129 } 2130 2131 jQuery.mbYTPlayer.checkForStart(YTPlayer); 2132 2133 YTPlayer.getState = setInterval(function () { 2134 var $YTPlayer = jQuery(YTPlayer); 2135 2136 if (!YTPlayer.isReady) 2137 return; 2138 2139 var prog = jQuery(YTPlayer).YTPManageProgress(); 2140 2141 var stopAt = YTPlayer.opt.stopAt > YTPlayer.opt.startAt ? YTPlayer.opt.stopAt : 0; 2142 stopAt = stopAt < YTPlayer.player.getDuration() ? stopAt : 0; 2143 if (YTPlayer.currentTime != prog.currentTime) { 2144 var YTPEvent = jQuery.Event("YTPTime"); 2145 YTPEvent.time = YTPlayer.currentTime; 2146 jQuery(YTPlayer).trigger(YTPEvent); 2147 } 2148 2149 YTPlayer.currentTime = prog.currentTime; 2150 YTPlayer.totalTime = YTPlayer.player.getDuration(); 2151 if (YTPlayer.player.getVolume() == 0) $YTPlayer.addClass("isMuted"); 2152 else $YTPlayer.removeClass("isMuted"); 2153 2154 if (YTPlayer.opt.showControls) 2155 if (prog.totalTime) { 2156 YTPlayer.controlBar.find(".mb_YTPTime").html(jQuery.mbYTPlayer.formatTime(prog.currentTime) + " / " + jQuery.mbYTPlayer.formatTime(prog.totalTime)); 2157 } else { 2158 YTPlayer.controlBar.find(".mb_YTPTime").html("-- : -- / -- : --"); 2159 } 2160 2161 /** 2162 * Manage video pause on window blur 2163 */ 2164 if (eval(YTPlayer.opt.stopMovieOnBlur)) { 2165 if (!document.hasFocus()) { 2166 if (YTPlayer.state == 1) { 2167 YTPlayer.hasFocus = false;
2168 YTPlayer.preventTrigger = true; 2169 $YTPlayer.YTPPause(); 2170 } 2171 } else if (document.hasFocus() && !YTPlayer.hasFocus && !(YTPlayer.state == -1 || YTPlayer.state == 0)) { 2172 YTPlayer.hasFocus = true; 2173 YTPlayer.preventTrigger = true; 2174 $YTPlayer.YTPPlay(); 2175 } 2176 } 2177 2178 /** 2179 * Manage video pause if not on screen 2180 */ 2181 if (YTPlayer.opt.playOnlyIfVisible) { 2182 var isOnScreen = jQuery.mbYTPlayer.isOnScreen(YTPlayer, YTPlayer.opt.onScreenPercentage); 2183 if (!isOnScreen && YTPlayer.state == 1) { 2184 YTPlayer.isOnScreen = false; 2185 $YTPlayer.YTPPause(); 2186 } else if (isOnScreen && !YTPlayer.isOnScreen) { 2187 YTPlayer.isOnScreen = true; 2188 YTPlayer.player.playVideo(); 2189 } 2190 } 2191 2192 if (YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() <= 400 && !YTPlayer.isCompact) { 2193 YTPlayer.controlBar.addClass("compact"); 2194 YTPlayer.isCompact = true; 2195 if (!YTPlayer.isMute && YTPlayer.volumeBar) YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol); 2196 } else if (YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() > 400 && YTPlayer.isCompact) { 2197 YTPlayer.controlBar.removeClass("compact"); 2198 YTPlayer.isCompact = false; 2199 2200 if (!YTPlayer.isMute && YTPlayer.volumeBar) 2201 YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol); 2202 } 2203 // the video is ended 2204 if (YTPlayer.player.getPlayerState() > 0 && ((parseFloat(YTPlayer.player.getDuration() - .5) < YTPlayer.player.getCurrentTime()) || (stopAt > 0 && parseFloat(YTPlayer.player.getCurrentTime()) > stopAt))) { 2205 2206 if (YTPlayer.isEnded) 2207 return; 2208 2209 YTPlayer.isEnded = true; 2210 setTimeout(function () { 2211 YTPlayer.isEnded = false 2212 }, 1000); 2213 2214 if (YTPlayer.isList) { 2215 if (!YTPlayer.opt.loop || (YTPlayer.opt.loop > 0 && YTPlayer.player.loopTime === YTPlayer.opt.loop - 1)) { 2216 YTPlayer.player.loopTime = undefined; 2217 clearInterval(YTPlayer.getState); 2218 var YTPEnd = jQuery.Event("YTPEnd"); 2219 YTPEnd.time = YTPlayer.currentTime; 2220 jQuery(YTPlayer).trigger(YTPEnd); 2221 return; 2222 } 2223 } else if (!YTPlayer.opt.loop || (YTPlayer.opt.loop > 0 && YTPlayer.player.loopTime === YTPlayer.opt.loop - 1)) { 2224 YTPlayer.player.loopTime = undefined; 2225 2226 YTPlayer.state = 2; 2227 2228 var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background; 2229 2230 YTPlayer.opt.containment.css({ 2231 background : bgndURL, 2232 backgroundSize: "cover" 2233 }); 2234 2235 jQuery(YTPlayer).YTPPause(); 2236 YTPlayer.wrapper.CSSAnimate({ 2237 opacity: 0 2238 }, YTPlayer.opt.fadeOnStartTime, function () { 2239 2240 if (YTPlayer.controlBar.length) 2241 YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play); 2242 2243 var YTPEnd = jQuery.Event("YTPEnd"); 2244 YTPEnd.time = YTPlayer.currentTime; 2245 jQuery(YTPlayer).trigger(YTPEnd); 2246 YTPlayer.player.seekTo(YTPlayer.opt.startAt, true); 2247 2248 var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background; 2249 YTPlayer.opt.containment.css({ 2250 background : bgndURL, 2251 backgroundSize: "cover" 2252 }); 2253 2254 }); 2255 return; 2256 } 2257 2258 YTPlayer.player.loopTime = YTPlayer.player.loopTime ? ++YTPlayer.player.loopTime : 1; 2259 YTPlayer.opt.startAt = YTPlayer.opt.startAt || 1; 2260 YTPlayer.preventTrigger = true; 2261 YTPlayer.state = 2; 2262 //YTPlayer.player.pauseVideo(); 2263 YTPlayer.player.seekTo(YTPlayer.opt.startAt, true); 2264 //YTPlayer.player.playVideo(); 2265 } 2266 }, interval); 2267 }, 2268 2269 /** 2270 * checkForStart 2271 * @param YTPlayer 2272 */ 2273 checkForStart: function (YTPlayer) { 2274 var $YTPlayer = jQuery(YTPlayer); 2275 2276 /* If the player has been removed from scene destroy it */ 2277 if (!jQuery.contains(document, YTPlayer)) { 2278 $YTPlayer.YTPPlayerDestroy(); 2279 return; 2280 } 2281 2282 /* CREATE CONTROL BAR */ 2283 jQuery.mbYTPlayer.buildControls(YTPlayer); 2284 2285 if (YTPlayer.overlay) 2286 if (YTPlayer.opt.addRaster) { 2287 var classN = YTPlayer.opt.addRaster == "dot" ? "raster-dot" : "raster"; 2288 YTPlayer.overlay.addClass(YTPlayer.isRetina ? classN + " retina" : classN); 2289 } else { 2290 YTPlayer.overlay.removeClass(function (index, classNames) { 2291 // change the list into an array 2292 var current_classes = classNames.split(" "), 2293 // array of classes which are to be removed 2294 classes_to_remove = []; 2295 jQuery.each(current_classes, function (index, class_name) { 2296 // if the classname begins with bg add it to the classes_to_remove array 2297 if (/raster.*/.test(class_name)) { 2298 classes_to_remove.push(class_name); 2299 } 2300 }); 2301 classes_to_remove.push("retina"); 2302 // turn the array back into a string 2303 return classes_to_remove.join(" "); 2304 }) 2305 } 2306 2307 YTPlayer.preventTrigger = true; 2308 YTPlayer.state = 2; 2309 YTPlayer.preventTrigger = true; 2310 2311 YTPlayer.player.mute(); 2312 YTPlayer.player.playVideo(); 2313 YTPlayer.isStarting = true; 2314 2315 var startAt = YTPlayer.start_from_last ? YTPlayer.start_from_last : YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1; 2316 2317 YTPlayer.preventTrigger = true; 2318 YTPlayer.checkForStartAt = setInterval(function () { 2319 2320 YTPlayer.player.mute(); 2321 YTPlayer.player.seekTo(startAt, true); 2322 2323 var canPlayVideo = YTPlayer.player.getVideoLoadedFraction() >= startAt / YTPlayer.player.getDuration(); 2324 if (YTPlayer.player.getDuration() > 0 && YTPlayer.player.getCurrentTime() >= startAt && canPlayVideo) { 2325 YTPlayer.start_from_last = null; 2326 2327 YTPlayer.preventTrigger = true; 2328 $YTPlayer.YTPPause(); 2329 2330 clearInterval(YTPlayer.checkForStartAt); 2331 2332 if (typeof YTPlayer.opt.onReady == "function") 2333 YTPlayer.opt.onReady(YTPlayer); 2334 2335 YTPlayer.isReady = true; 2336 2337 $YTPlayer.YTPRemoveFilter(); 2338 2339 if (YTPlayer.opt.addFilters) { 2340 $YTPlayer.YTPApplyFilters(YTPlayer.opt.addFilters); 2341 } else { 2342 $YTPlayer.YTPApplyFilters(); 2343 } 2344 $YTPlayer.YTPEnableFilters(); 2345 var YTPready = jQuery.Event("YTPReady"); 2346 YTPready.time = YTPlayer.currentTime; 2347 $YTPlayer.trigger(YTPready); 2348 2349 YTPlayer.state = 2; 2350 2351 if (!YTPlayer.opt.mute) { 2352 YTPlayer.player.unMute(); 2353 if (YTPlayer.opt.autoPlay) 2354 console.debug("To make the video 'auto-play' you must mute the audio according with the new vend
2354or policy"); 2355 } 2356 else 2357 YTPlayer.player.mute(); 2358 2359 if (typeof _gaq != "undefined" && eval(YTPlayer.opt.gaTrack)) 2360 _gaq.push(['_trackEvent', 'YTPlayer', 'Play', (YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString())]); 2361 else if (typeof ga != "undefined" && eval(YTPlayer.opt.gaTrack)) 2362 ga('send', 'event', 'YTPlayer', 'play', (YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString())); 2363 2364 if (YTPlayer.opt.autoPlay) { 2365 2366 var YTPStart = jQuery.Event("YTPStart"); 2367 YTPStart.time = YTPlayer.currentTime; 2368 jQuery(YTPlayer).trigger(YTPStart); 2369 2370 YTPlayer.isStarting = false; 2371 2372 /* Fix for Safari freeze */ 2373 if (jQuery.mbBrowser.os.name == "mac" && jQuery.mbBrowser.safari) { 2374 jQuery("body").one("mousedown.YTPstart", function () { 2375 $YTPlayer.YTPPlay(); 2376 }); 2377 } 2378 2379 $YTPlayer.YTPPlay(); 2380 2381 } else { 2382 2383 YTPlayer.preventTrigger = true; 2384 $YTPlayer.YTPPause(); 2385 2386 if (YTPlayer.start_from_last) 2387 YTPlayer.player.seekTo(startAt, true); 2388 2389 2390 setTimeout(function () { 2391 YTPlayer.preventTrigger = true; 2392 $YTPlayer.YTPPause(); 2393 2394 console.debug("YTPPause"); 2395 2396 if (!YTPlayer.isPlayer) { 2397 if (!YTPlayer.opt.coverImage) { 2398 jQuery(YTPlayer.playerEl).CSSAnimate({ 2399 opacity: 1 2400 }, YTPlayer.opt.fadeOnStartTime); 2401 YTPlayer.wrapper.CSSAnimate({ 2402 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 2403 }, YTPlayer.opt.fadeOnStartTime); 2404 } else { 2405 YTPlayer.wrapper.css({opacity: 0}); 2406 setTimeout(function () { 2407 var bgndURL = YTPlayer.opt.coverImage ? "url(" + YTPlayer.opt.coverImage + ") center center" : YTPlayer.orig_containment_background; 2408 YTPlayer.wrapper.css({ 2409 background : bgndURL, 2410 backgroundSize : "cover", 2411 backgroundRepeat: "no-repeat" 2412 }) 2413 }, YTPlayer.opt.fadeOnStartTime) 2414 } 2415 } 2416 YTPlayer.isStarting = false; 2417 }, 500); 2418 2419 if (YTPlayer.controlBar.length) 2420 YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play); 2421 } 2422 2423 if (YTPlayer.isPlayer && !YTPlayer.opt.autoPlay && (YTPlayer.loading && YTPlayer.loading.length)) { 2424 YTPlayer.loading.html("Ready"); 2425 setTimeout(function () { 2426 YTPlayer.loading.fadeOut(); 2427 }, 100) 2428 } 2429 2430 if (YTPlayer.controlBar && YTPlayer.controlBar.length) 2431 YTPlayer.controlBar.slideDown(1000); 2432 } 2433 2434 if (jQuery.mbBrowser.os.name == "mac" && jQuery.mbBrowser.safari) { 2435 2436 YTPlayer.player.playVideo(); 2437 if (startAt >= 0) 2438 YTPlayer.player.seekTo(startAt, true); 2439 2440 } 2441 2442 }, 100); 2443 2444 return $YTPlayer; 2445 }, 2446 2447 /* TIME METHODS -------------------------------------------------------------------------------------------*/ 2448 2449 /** 2450 * getTime 2451 * @returns {string} time 2452 */ 2453 getTime: function () { 2454 var YTPlayer = this.get(0); 2455 return jQuery.mbYTPlayer.formatTime(YTPlayer.currentTime); 2456 }, 2457 2458 /** 2459 * getTotalTime 2460 * @returns {string} total time 2461 */ 2462 getTotalTime: function (format) { 2463 var YTPlayer = this.get(0); 2464 return jQuery.mbYTPlayer.formatTime(YTPlayer.totalTime); 2465 }, 2466 2467 /** 2468 * formatTime 2469 * @param s 2470 * @returns {string} 2471 */ 2472 formatTime: function (s) { 2473 var min = Math.floor(s / 60); 2474 var sec = Math.floor(s - (60 * min)); 2475 return (min <= 9 ? "0" + min : min) + " : " + (sec <= 9 ? "0" + sec : sec); 2476 }, 2477 2478 /* PLAYER POSITION AND SIZE OPTIMIZATION-------------------------------------------------------------------------------------------*/ 2479 2480 /** 2481 * setAnchor 2482 * @param anchor 2483 */ 2484 setAnchor: function (anchor) { 2485 var $YTplayer = this; 2486 $YTplayer.optimizeDisplay(anchor); 2487 }, 2488 2489 /** 2490 * getAnchor 2491 * @param anchor 2492 */ 2493 getAnchor: function () { 2494 var YTPlayer = this.get(0); 2495 return YTPlayer.opt.anchor; 2496 }, 2497 2498 /** 2499 * setAbundance 2500 * @param val 2501 * @returns {jQuery.mbYTPlayer} 2502 */ 2503 setAbundance: function (val, updateOptions) { 2504 var YTPlayer = this.get(0); 2505 var $YTPlayer = this; 2506 if (updateOptions) 2507 YTPlayer.opt.abundance = val; 2508 $YTPlayer.optimizeDisplay(YTPlayer.opt.anchor, val); 2509 return $YTPlayer; 2510 }, 2511 2512 /** 2513 * getAbundance 2514 * @returns {*} 2515 */ 2516 getAbundance: function () { 2517 var YTPlayer = this.get(0); 2518 return YTPlayer.opt.abundance; 2519 }, 2520 2521 /** 2522 * 2523 * @param opt 2524 * @param val 2525 * @returns {jQuery.mbYTPlayer} 2526 */ 2527 setOption: function (opt, val) { 2528 var YTPlayer = this.get(0); 2529 var $YTPlayer = this; 2530 YTPlayer.opt[opt] = val; 2531 return $YTPlayer; 2532 } 2533 }; 2534 2535 /** 2536 * optimizeDisplay 2537 * @param anchor 2538 * can be center, top, bottom, right, left; (default is center,center) 2539 */ 2540 jQuery.fn.optimizeDisplay = function (anchor, abundanceX) { 2541 var YTPlayer = this.get(0); 2542 var vid = {}; 2543 var el = YTPlayer.wrapper; 2544 var iframe = jQuery(YTPlayer.playerEl); 2545 2546 YTPlayer.opt.anchor = anchor || YTPlayer.opt.anchor; 2547 YTPlayer.opt.anchor = typeof YTPlayer.opt.anchor != "undefined " ? YTPlayer.opt.anchor : "center,center"; 2548 var YTPAlign = YTPlayer.opt.anchor.split(","); 2549 var ab = abundanceX ? abundanceX : YTPlayer.opt.abundance; 2550 if (YTPlayer.opt.optimizeDisplay) { 2551 var abundance = el.height() * ab; 2552 var win = {}; 2553 win.width = el.outerWidth(); 2554 win.height = el.outerHeight() + abundance; 2555 2556 YTPlayer.opt.ratio = YTPlayer.opt.ratio === "auto" ? 16 / 9 : YTPlayer.opt.ratio; 2557 YTPlayer.opt.ratio = eval(YTPlayer.opt.ratio); 2558 2559 vid.width = win.width + abundance;
2560 vid.height = Math.ceil(vid.width / YTPlayer.opt.ratio); 2561 vid.marginTop = Math.ceil(-((vid.height - win.height) / 2)); 2562 vid.marginLeft = -(abundance / 2); 2563 var lowest = vid.height < win.height; 2564 2565 if (lowest) { 2566 vid.height = win.height + abundance; 2567 vid.width = Math.ceil(vid.height * YTPlayer.opt.ratio); 2568 vid.marginTop = -(abundance / 2); 2569 vid.marginLeft = Math.ceil(-((vid.width - win.width) / 2)); 2570 } 2571 2572 for (var a in YTPAlign) { 2573 if (YTPAlign.hasOwnProperty(a)) { 2574 var al = YTPAlign[a].replace(/ /g, ""); 2575 switch (al) { 2576 case "top": 2577 vid.marginTop = -(abundance / 2); 2578 break; 2579 case "bottom": 2580 vid.marginTop = Math.ceil(-(vid.height - (win.height)) - (abundance / 2)); 2581 break; 2582 case "left": 2583 vid.marginLeft = -(abundance / 2); 2584 break; 2585 case "right": 2586 vid.marginLeft = Math.ceil(-(vid.width - win.width) + (abundance / 2)); 2587 break; 2588 default: 2589 if (vid.width > win.width) 2590 vid.marginLeft = -((vid.width - win.width) / 2) + (abundance / 2); 2591 break; 2592 } 2593 } 2594 } 2595 2596 } else { 2597 vid.width = "100%"; 2598 vid.height = "100%"; 2599 vid.marginTop = 0; 2600 vid.marginLeft = 0; 2601 } 2602 2603 2604 /* 2605 console.debug("YTPAlign", YTPAlign) 2606 console.debug("lowest", lowest) 2607 console.debug("abundance", abundance) 2608 console.debug("----------------------------") 2609 console.debug("vid.width", vid.width) 2610 console.debug("vid.height", vid.height) 2611 console.debug("----------------------------") 2612 console.debug("win.width", win.width) 2613 console.debug("win.height", win.height) 2614 console.debug("----------------------------") 2615 console.debug("vid.marginTop", vid.marginTop) 2616 console.debug("vid.marginLeft", vid.marginLeft) 2617 */ 2618 2619 2620 iframe.css({ 2621 width : vid.width, 2622 height : vid.height, 2623 marginTop : vid.marginTop, 2624 marginLeft: vid.marginLeft, 2625 maxWidth : "initial" 2626 }); 2627 }; 2628 2629 2630 /* UTILITIES -----------------------------------------------------------------------------------------------------------------------*/ 2631 2632 /** 2633 * shuffle 2634 * @param arr 2635 * @returns {Array|string|Blob|*} 2636 * 2637 */ 2638 jQuery.shuffle = function (arr) { 2639 var newArray = arr.slice(); 2640 var len = newArray.length; 2641 var i = len; 2642 while (i--) { 2643 var p = parseInt(Math.random() * len); 2644 var t = newArray[i]; 2645 newArray[i] = newArray[p]; 2646 newArray[p] = t; 2647 } 2648 return newArray; 2649 }; 2650 2651 /** 2652 * Unselectable 2653 * @returns {*} 2654 */ 2655 jQuery.fn.unselectable = function () { 2656 return this.each(function () { 2657 jQuery(this).css({ 2658 "-moz-user-select" : "none", 2659 "-webkit-user-select": "none", 2660 "user-select" : "none" 2661 }).attr("unselectable", "on"); 2662 }); 2663 }; 2664 2665 /* EXTERNAL METHODS -----------------------------------------------------------------------------------------------------------------------*/ 2666 2667 jQuery.fn.YTPlayer = jQuery.mbYTPlayer.buildPlayer; 2668 jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer; 2669 2670 jQuery.fn.YTPCheckForState = jQuery.mbYTPlayer.checkForState; 2671 2672 jQuery.fn.YTPGetPlayer = jQuery.mbYTPlayer.getPlayer; 2673 jQuery.fn.YTPGetVideoID = jQuery.mbYTPlayer.getVideoID; 2674 jQuery.fn.YTPGetPlaylistID = jQuery.mbYTPlayer.getPlaylistID; 2675 jQuery.fn.YTPChangeVideo = jQuery.fn.YTPChangeMovie = jQuery.mbYTPlayer.changeVideo; 2676 jQuery.fn.YTPPlayerDestroy = jQuery.mbYTPlayer.playerDestroy; 2677 2678 jQuery.fn.YTPPlay = jQuery.mbYTPlayer.play; 2679 jQuery.fn.YTPTogglePlay = jQuery.mbYTPlayer.togglePlay; 2680 jQuery.fn.YTPStop = jQuery.mbYTPlayer.stop; 2681 jQuery.fn.YTPPause = jQuery.mbYTPlayer.pause; 2682 jQuery.fn.YTPSeekTo = jQuery.mbYTPlayer.seekTo; 2683 2684 jQuery.fn.YTPlaylist = jQuery.mbYTPlayer.playlist; 2685 jQuery.fn.YTPPlayNext = jQuery.mbYTPlayer.playNext; 2686 jQuery.fn.YTPPlayPrev = jQuery.mbYTPlayer.playPrev; 2687 jQuery.fn.YTPPlayIndex = jQuery.mbYTPlayer.playIndex; 2688 2689 jQuery.fn.YTPMute = jQuery.mbYTPlayer.mute; 2690 jQuery.fn.YTPUnmute = jQuery.mbYTPlayer.unmute; 2691 jQuery.fn.YTPToggleVolume = jQuery.mbYTPlayer.toggleVolume; 2692 jQuery.fn.YTPSetVolume = jQuery.mbYTPlayer.setVolume; 2693 jQuery.fn.YTPGetVolume = jQuery.mbYTPlayer.getVolume; 2694 2695 jQuery.fn.YTPGetVideoData = jQuery.mbYTPlayer.getVideoData; 2696 jQuery.fn.YTPFullscreen = jQuery.mbYTPlayer.fullscreen; 2697 jQuery.fn.YTPToggleLoops = jQuery.mbYTPlayer.toggleLoops; 2698 jQuery.fn.YTPSetVideoQuality = jQuery.mbYTPlayer.setVideoQuality; 2699 jQuery.fn.YTPManageProgress = jQuery.mbYTPlayer.manageProgress; 2700 2701 jQuery.fn.YTPApplyFilter = jQuery.mbYTPlayer.applyFilter; 2702 jQuery.fn.YTPApplyFilters = jQuery.mbYTPlayer.applyFilters; 2703 jQuery.fn.YTPToggleFilter = jQuery.mbYTPlayer.toggleFilter; 2704 jQuery.fn.YTPToggleFilters = jQuery.mbYTPlayer.toggleFilters; 2705 jQuery.fn.YTPRemoveFilter = jQuery.mbYTPlayer.removeFilter; 2706 jQuery.fn.YTPDisableFilters = jQuery.mbYTPlayer.disableFilters; 2707 jQuery.fn.YTPEnableFilters = jQuery.mbYTPlayer.enableFilters; 2708 jQuery.fn.YTPGetFilters = jQuery.mbYTPlayer.getFilters; 2709 2710 jQuery.fn.YTPGetTime = jQuery.mbYTPlayer.getTime; 2711 jQuery.fn.YTPGetTotalTime = jQuery.mbYTPlayer.getTotalTime; 2712 2713 jQuery.fn.YTPAddMask = jQuery.mbYTPlayer.addMask; 2714 jQuery.fn.YTPRemoveMask = jQuery.mbYTPlayer.removeMask; 2715 jQuery.fn.YTPToggleMask = jQuery.mbYTPlayer.toggleMask; 2716 2717 jQuery.fn.YTPGetAbundance = jQuery.mbYTPlayer.getAbundance; 2718 jQuery.fn.YTPSetAbundance = jQuery.mbYTPlayer.setAbundance; 2719 2720 jQuery.fn.YTPSetAnchor = jQuery.mbYTPlayer.setAnchor; 2721 jQuery.fn.YTPGetAnchor = jQuery.mbYTPlayer.getAnchor; 2722 2723 jQuery.fn.YTPSetOption = jQuery.mbYTPlayer.setOption; 2724 2725})(jQuery, ytp); 2726;/*___________________________________________________________________________________________________________________________________________________ 2727 _ jquery.mb.components _ 2728 _ _ 2729 _ file: jquery.mb.browser.min.js _ 2730 _ last modified: 24/05/17 19.56 _ 2731 _ _ 2732 _ Open Lab s.r.l., Florence - Italy _ 2733 _ _ 2734 _ email: [email protected] _
vendor: 30,011 bytes, lines 2735-2859
2735 _ site: http://pupunzi.com _ 2736 _ http://open-lab.com _ 2737 _ blog: http://pupunzi.open-lab.com _ 2738 _ Q&A: http://jquery.pupunzi.com _ 2739 _ _ 2740 _ Licences: MIT, GPL _ 2741 _ http://www.opensource.org/licenses/mit-license.php _ 2742 _ http://www.gnu.org/licenses/gpl.html _ 2743 _ _ 2744 _ Copyright (c) 2001-2017. Matteo Bicocchi (Pupunzi); _ 2745 ___________________________________________________________________________________________________________________________________________________*/ 2746 2747var nAgt=navigator.userAgent;jQuery.browser=jQuery.browser||{};jQuery.browser.mozilla=!1;jQuery.browser.webkit=!1;jQuery.browser.opera=!1;jQuery.browser.safari=!1;jQuery.browser.chrome=!1;jQuery.browser.androidStock=!1;jQuery.browser.msie=!1;jQuery.browser.edge=!1;jQuery.browser.ua=nAgt;function isTouchSupported(){var a=nAgt.msMaxTouchPoints,e="ontouchstart"in document.createElement("div");return a||e?!0:!1} 2748var getOS=function(){var a={version:"Unknown version",name:"Unknown OS"};-1!=navigator.appVersion.indexOf("Win")&&(a.name="Windows");-1!=navigator.appVersion.indexOf("Mac")&&0>navigator.appVersion.indexOf("Mobile")&&(a.name="Mac");-1!=navigator.appVersion.indexOf("Linux")&&(a.name="Linux");/Mac OS X/.test(nAgt)&&!/Mobile/.test(nAgt)&&(a.version=/Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1],a.version=a.version.replace(/_/g,".").substring(0,5));/Windows/.test(nAgt)&&(a.version="Unknown.Unknown");/Windows NT 5.1/.test(nAgt)&& 2749(a.version="5.1");/Windows NT 6.0/.test(nAgt)&&(a.version="6.0");/Windows NT 6.1/.test(nAgt)&&(a.version="6.1");/Windows NT 6.2/.test(nAgt)&&(a.version="6.2");/Windows NT 10.0/.test(nAgt)&&(a.version="10.0");/Linux/.test(nAgt)&&/Linux/.test(nAgt)&&(a.version="Unknown.Unknown");a.name=a.name.toLowerCase();a.major_version="Unknown";a.minor_version="Unknown";"Unknown.Unknown"!=a.version&&(a.major_version=parseFloat(a.version.split(".")[0]),a.minor_version=parseFloat(a.version.split(".")[1]));return a}; 2750jQuery.browser.os=getOS();jQuery.browser.hasTouch=isTouchSupported();jQuery.browser.name=navigator.appName;jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion);jQuery.browser.majorVersion=parseInt(navigator.appVersion,10);var nameOffset,verOffset,ix; 2751if(-1!=(verOffset=nAgt.indexOf("Opera")))jQuery.browser.opera=!0,jQuery.browser.name="Opera",jQuery.browser.fullVersion=nAgt.substring(verOffset+6),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8));else if(-1!=(verOffset=nAgt.indexOf("OPR")))jQuery.browser.opera=!0,jQuery.browser.name="Opera",jQuery.browser.fullVersion=nAgt.substring(verOffset+4);else if(-1!=(verOffset=nAgt.indexOf("MSIE")))jQuery.browser.msie=!0,jQuery.browser.name="Microsoft Internet Explorer", 2752 jQuery.browser.fullVersion=nAgt.substring(verOffset+5);else if(-1!=nAgt.indexOf("Trident")){jQuery.browser.msie=!0;jQuery.browser.name="Microsoft Internet Explorer";var start=nAgt.indexOf("rv:")+3,end=start+4;jQuery.browser.fullVersion=nAgt.substring(start,end)}else-1!=(verOffset=nAgt.indexOf("Edge"))?(jQuery.browser.edge=!0,jQuery.browser.name="Microsoft Edge",jQuery.browser.fullVersion=nAgt.substring(verOffset+5)):-1!=(verOffset=nAgt.indexOf("Chrome"))?(jQuery.browser.webkit=!0,jQuery.browser.chrome= 2753 !0,jQuery.browser.name="Chrome",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1<nAgt.indexOf("mozilla/5.0")&&-1<nAgt.indexOf("android ")&&-1<nAgt.indexOf("applewebkit")&&!(-1<nAgt.indexOf("chrome"))?(verOffset=nAgt.indexOf("Chrome"),jQuery.browser.webkit=!0,jQuery.browser.androidStock=!0,jQuery.browser.name="androidStock",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1!=(verOffset=nAgt.indexOf("Safari"))?(jQuery.browser.webkit=!0,jQuery.browser.safari=!0,jQuery.browser.name= 2754 "Safari",jQuery.browser.fullVersion=nAgt.substring(verOffset+7),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8))):-1!=(verOffset=nAgt.indexOf("AppleWebkit"))?(jQuery.browser.webkit=!0,jQuery.browser.safari=!0,jQuery.browser.name="Safari",jQuery.browser.fullVersion=nAgt.substring(verOffset+7),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8))):-1!=(verOffset=nAgt.indexOf("Firefox"))?(jQuery.browser.mozilla= 2755 !0,jQuery.browser.name="Firefox",jQuery.browser.fullVersion=nAgt.substring(verOffset+8)):(nameOffset=nAgt.lastIndexOf(" ")+1)<(verOffset=nAgt.lastIndexOf("/"))&&(jQuery.browser.name=nAgt.substring(nameOffset,verOffset),jQuery.browser.fullVersion=nAgt.substring(verOffset+1),jQuery.browser.name.toLowerCase()==jQuery.browser.name.toUpperCase()&&(jQuery.browser.name=navigator.appName)); 2756-1!=(ix=jQuery.browser.fullVersion.indexOf(";"))&&(jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix));-1!=(ix=jQuery.browser.fullVersion.indexOf(" "))&&(jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix));jQuery.browser.majorVersion=parseInt(""+jQuery.browser.fullVersion,10);isNaN(jQuery.browser.majorVersion)&&(jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion),jQuery.browser.majorVersion=parseInt(navigator.appVersion,10)); 2757jQuery.browser.version=jQuery.browser.majorVersion;jQuery.browser.android=/Android/i.test(nAgt);jQuery.browser.blackberry=/BlackBerry|BB|PlayBook/i.test(nAgt);jQuery.browser.ios=/iPhone|iPad|iPod|webOS/i.test(nAgt);jQuery.browser.operaMobile=/Opera Mini/i.test(nAgt);jQuery.browser.windowsMobile=/IEMobile|Windows Phone/i.test(nAgt);jQuery.browser.kindle=/Kindle|Silk/i.test(nAgt); 2758jQuery.browser.mobile=jQuery.browser.android||jQuery.browser.blackberry||jQuery.browser.ios||jQuery.browser.windowsMobile||jQuery.browser.operaMobile||jQuery.browser.kindle;jQuery.isMobile=jQuery.browser.mobile;jQuery.isTablet=jQuery.browser.mobile&&765<jQuery(window).width();jQuery.isAndroidDefault=jQuery.browser.android&&!/chrome/i.test(nAgt);jQuery.mbBrowser=jQuery.browser; 2759jQuery.browser.versionCompare=function(a,e){if("stringstring"!=typeof a+typeof e)return!1;for(var c=a.split("."),d=e.split("."),b=0,f=Math.max(c.length,d.length);b<f;b++){if(c[b]&&!d[b]&&0<parseInt(c[b])||parseInt(c[b])>parseInt(d[b]))return 1;if(d[b]&&!c[b]&&0<parseInt(d[b])||parseInt(c[b])<parseInt(d[b]))return-1}return 0}; 2760; 2761/* 2762 * ****************************************************************************** 2763 * jquery.mb.components 2764 * file: jquery.mb.CSSAnimate.min.js 2765 * 2766 * Copyright (c) 2001-2014. Matteo Bicocchi (Pupunzi); 2767 * Open lab srl, Firenze - Italy 2768 * email: [email protected] 2769 * site: http://pupunzi.com 2770 * blog: http://pupunzi.open-lab.com 2771 * http://open-lab.com 2772 * 2773 * Licences: MIT, GPL 2774 * http://www.opensource.org/licenses/mit-license.php 2775 * http://www.gnu.org/licenses/gpl.html 2776 * 2777 * last modified: 26/03/14 21.40 2778 * ***************************************************************************** 2779 */ 2780 2781jQuery.support.CSStransition=function(){var d=(document.body||document.documentElement).style;return void 0!==d.transition||void 0!==d.WebkitTransition||void 0!==d.MozTransition||void 0!==d.MsTransition||void 0!==d.OTransition}();function uncamel(d){return d.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function setUnit(d,a){return"string"!==typeof d||d.match(/^[\-0-9\.]+jQuery/)?""+d+a:d} 2782function setFilter(d,a,b){var c=uncamel(a),g=jQuery.browser.mozilla?"":jQuery.CSS.sfx;d[g+"filter"]=d[g+"filter"]||"";b=setUnit(b>jQuery.CSS.filters[a].max?jQuery.CSS.filters[a].max:b,jQuery.CSS.filters[a].unit);d[g+"filter"]+=c+"("+b+") ";delete d[a]} 2783jQuery.CSS={name:"mb.CSSAnimate",author:"Matteo Bicocchi",version:"2.0.0",transitionEnd:"transitionEnd",sfx:"",filters:{blur:{min:0,max:100,unit:"px"},brightness:{min:0,max:400,unit:"%"},contrast:{min:0,max:400,unit:"%"},grayscale:{min:0,max:100,unit:"%"},hueRotate:{min:0,max:360,unit:"deg"},invert:{min:0,max:100,unit:"%"},saturate:{min:0,max:400,unit:"%"},sepia:{min:0,max:100,unit:"%"}},normalizeCss:function(d){var a=jQuery.extend(!0,{},d);jQuery.browser.webkit||jQuery.browser.opera?jQuery.CSS.sfx= 2784 "-webkit-":jQuery.browser.mozilla?jQuery.CSS.sfx="-moz-":jQuery.browser.msie&&(jQuery.CSS.sfx="-ms-");jQuery.CSS.sfx="";for(var b in a){"transform"===b&&(a[jQuery.CSS.sfx+"transform"]=a[b],delete a[b]);"transform-origin"===b&&(a[jQuery.CSS.sfx+"transform-origin"]=d[b],delete a[b]);"filter"!==b||jQuery.browser.mozilla||(a[jQuery.CSS.sfx+"filter"]=d[b],delete a[b]);"blur"===b&&setFilter(a,"blur",d[b]);"brightness"===b&&setFilter(a,"brightness",d[b]);"contrast"===b&&setFilter(a,"contrast",d[b]);"grayscale"=== 2785b&&setFilter(a,"grayscale",d[b]);"hueRotate"===b&&setFilter(a,"hueRotate",d[b]);"invert"===b&&setFilter(a,"invert",d[b]);"saturate"===b&&setFilter(a,"saturate",d[b]);"sepia"===b&&setFilter(a,"sepia",d[b]);if("x"===b){var c=jQuery.CSS.sfx+"transform";a[c]=a[c]||"";a[c]+=" translateX("+setUnit(d[b],"px")+")";delete a[b]}"y"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" translateY("+setUnit(d[b],"px")+")",delete a[b]);"z"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" translateZ("+ 2786 setUnit(d[b],"px")+")",delete a[b]);"rotate"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" rotate("+setUnit(d[b],"deg")+")",delete a[b]);"rotateX"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" rotateX("+setUnit(d[b],"deg")+")",delete a[b]);"rotateY"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" rotateY("+setUnit(d[b],"deg")+")",delete a[b]);"rotateZ"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" rotateZ("+setUnit(d[b],"deg")+")",delete a[b]);"scale"===b&& 2787(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" scale("+setUnit(d[b],"")+")",delete a[b]);"scaleX"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" scaleX("+setUnit(d[b],"")+")",delete a[b]);"scaleY"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" scaleY("+setUnit(d[b],"")+")",delete a[b]);"scaleZ"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" scaleZ("+setUnit(d[b],"")+")",delete a[b]);"skew"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" skew("+setUnit(d[b], 2788 "deg")+")",delete a[b]);"skewX"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" skewX("+setUnit(d[b],"deg")+")",delete a[b]);"skewY"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" skewY("+setUnit(d[b],"deg")+")",delete a[b]);"perspective"===b&&(c=jQuery.CSS.sfx+"transform",a[c]=a[c]||"",a[c]+=" perspective("+setUnit(d[b],"px")+")",delete a[b])}return a},getProp:function(d){var a=[],b;for(b in d)0>a.indexOf(b)&&a.push(uncamel(b));return a.join(",")},animate:function(d,a,b,c,g){return this.each(function(){function n(){e.called= 2789 !0;e.CSSAIsRunning=!1;h.off(jQuery.CSS.transitionEnd+"."+e.id);clearTimeout(e.timeout);h.css(jQuery.CSS.sfx+"transition","");"function"==typeof g&&g.apply(e);"function"==typeof e.CSSqueue&&(e.CSSqueue(),e.CSSqueue=null)}var e=this,h=jQuery(this);e.id=e.id||"CSSA_"+(new Date).getTime();var k=k||{type:"noEvent"};if(e.CSSAIsRunning&&e.eventType==k.type&&!jQuery.browser.msie&&9>=jQuery.browser.version)e.CSSqueue=function(){h.CSSAnimate(d,a,b,c,g)};else if(e.CSSqueue=null,e.eventType=k.type,0!==h.length&& 2790 d){d=jQuery.normalizeCss(d);e.CSSAIsRunning=!0;"function"==typeof a&&(g=a,a=jQuery.fx.speeds._default);"function"==typeof b&&(c=b,b=0);"string"==typeof b&&(g=b,b=0);"function"==typeof c&&(g=c,c="cubic-bezier(0.65,0.03,0.36,0.72)");if("string"==typeof a)for(var l in jQuery.fx.speeds)if(a==l){a=jQuery.fx.speeds[l];break}else a=jQuery.fx.speeds._default;a||(a=jQuery.fx.speeds._default);"string"===typeof g&&(c=g,g=null);if(jQuery.support.CSStransition){var f={"default":"ease","in":"ease-in",out:"ease-out", 2791 "in-out":"ease-in-out",snap:"cubic-bezier(0,1,.5,1)",easeOutCubic:"cubic-bezier(.215,.61,.355,1)",easeInOutCubic:"cubic-bezier(.645,.045,.355,1)",easeInCirc:"cubic-bezier(.6,.04,.98,.335)",easeOutCirc:"cubic-bezier(.075,.82,.165,1)",easeInOutCirc:"cubic-bezier(.785,.135,.15,.86)",easeInExpo:"cubic-bezier(.95,.05,.795,.035)",easeOutExpo:"cubic-bezier(.19,1,.22,1)",easeInOutExpo:"cubic-bezier(1,0,0,1)",easeInQuad:"cubic-bezier(.55,.085,.68,.53)",easeOutQuad:"cubic-bezier(.25,.46,.45,.94)",easeInOutQuad:"cubic-bezier(.455,.03,.515,.955)", 2792 easeInQuart:"cubic-bezier(.895,.03,.685,.22)",easeOutQuart:"cubic-bezier(.165,.84,.44,1)",easeInOutQuart:"cubic-bezier(.77,0,.175,1)",easeInQuint:"cubic-bezier(.755,.05,.855,.06)",easeOutQuint:"cubic-bezier(.23,1,.32,1)",easeInOutQuint:"cubic-bezier(.86,0,.07,1)",easeInSine:"cubic-bezier(.47,0,.745,.715)",easeOutSine:"cubic-bezier(.39,.575,.565,1)",easeInOutSine:"cubic-bezier(.445,.05,.55,.95)",easeInBack:"cubic-bezier(.6,-.28,.735,.045)",easeOutBack:"cubic-bezier(.175, .885,.32,1.275)",easeInOutBack:"cubic-bezier(.68,-.55,.265,1.55)"}; 2793 f[c]&&(c=f[c]);h.off(jQuery.CSS.transitionEnd+"."+e.id);f=jQuery.CSS.getProp(d);var m={};jQuery.extend(m,d);m[jQuery.CSS.sfx+"transition-property"]=f;m[jQuery.CSS.sfx+"transition-duration"]=a+"ms";m[jQuery.CSS.sfx+"transition-delay"]=b+"ms";m[jQuery.CSS.sfx+"transition-timing-function"]=c;setTimeout(function(){h.one(jQuery.CSS.transitionEnd+"."+e.id,n);h.css(m)},1);e.timeout=setTimeout(function(){e.called||!g?(e.called=!1,e.CSSAIsRunning=!1):(h.css(jQuery.CSS.sfx+"transition",""),g.apply(e),e.CSSAIsRunning= 2794 !1,"function"==typeof e.CSSqueue&&(e.CSSqueue(),e.CSSqueue=null))},a+b+10)}else{for(f in d)"transform"===f&&delete d[f],"filter"===f&&delete d[f],"transform-origin"===f&&delete d[f],"auto"===d[f]&&delete d[f],"x"===f&&(k=d[f],l="left",d[l]=k,delete d[f]),"y"===f&&(k=d[f],l="top",d[l]=k,delete d[f]),"-ms-transform"!==f&&"-ms-filter"!==f||delete d[f];h.delay(b).animate(d,a,g)}}})}};jQuery.fn.CSSAnimate=jQuery.CSS.animate;jQuery.normalizeCss=jQuery.CSS.normalizeCss; 2795jQuery.fn.css3=function(d){return this.each(function(){var a=jQuery(this),b=jQuery.normalizeCss(d);a.css(b)})}; 2796;/*___________________________________________________________________________________________________________________________________________________ 2797 _ jquery.mb.components _ 2798 _ _ 2799 _ file: jquery.mb.simpleSlider.min.js _ 2800 _ last modified: 09/05/17 19.31 _ 2801 _ _ 2802 _ Open Lab s.r.l., Florence - Italy _ 2803 _ _ 2804 _ email: [email protected] _ 2805 _ site: http://pupunzi.com _ 2806 _ http://open-lab.com _ 2807 _ blog: http://pupunzi.open-lab.com _ 2808 _ Q&A: http://jquery.pupunzi.com _ 2809 _ _ 2810 _ Licences: MIT, GPL _ 2811 _ http://www.opensource.org/licenses/mit-license.php _ 2812 _ http://www.gnu.org/licenses/gpl.html _ 2813 _ _ 2814 _ Copyright (c) 2001-2017. Matteo Bicocchi (Pupunzi); _ 2815 ___________________________________________________________________________________________________________________________________________________*/ 2816 2817 2818var nAgt=navigator.userAgent;jQuery.browser=jQuery.browser||{};jQuery.browser.mozilla=!1;jQuery.browser.webkit=!1;jQuery.browser.opera=!1;jQuery.browser.safari=!1;jQuery.browser.chrome=!1;jQuery.browser.androidStock=!1;jQuery.browser.msie=!1;jQuery.browser.edge=!1;jQuery.browser.ua=nAgt;function isTouchSupported(){var a=nAgt.msMaxTouchPoints,e="ontouchstart"in document.createElement("div");return a||e?!0:!1} 2819var getOS=function(){var a={version:"Unknown version",name:"Unknown OS"};-1!=navigator.appVersion.indexOf("Win")&&(a.name="Windows");-1!=navigator.appVersion.indexOf("Mac")&&0>navigator.appVersion.indexOf("Mobile")&&(a.name="Mac");-1!=navigator.appVersion.indexOf("Linux")&&(a.name="Linux");/Mac OS X/.test(nAgt)&&!/Mobile/.test(nAgt)&&(a.version=/Mac OS X (10[\.\_\d]+)/.exec(nAgt)[1],a.version=a.version.replace(/_/g,".").substring(0,5));/Windows/.test(nAgt)&&(a.version="Unknown.Unknown");/Windows NT 5.1/.test(nAgt)&& 2820(a.version="5.1");/Windows NT 6.0/.test(nAgt)&&(a.version="6.0");/Windows NT 6.1/.test(nAgt)&&(a.version="6.1");/Windows NT 6.2/.test(nAgt)&&(a.version="6.2");/Windows NT 10.0/.test(nAgt)&&(a.version="10.0");/Linux/.test(nAgt)&&/Linux/.test(nAgt)&&(a.version="Unknown.Unknown");a.name=a.name.toLowerCase();a.major_version="Unknown";a.minor_version="Unknown";"Unknown.Unknown"!=a.version&&(a.major_version=parseFloat(a.version.split(".")[0]),a.minor_version=parseFloat(a.version.split(".")[1]));return a}; 2821jQuery.browser.os=getOS();jQuery.browser.hasTouch=isTouchSupported();jQuery.browser.name=navigator.appName;jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion);jQuery.browser.majorVersion=parseInt(navigator.appVersion,10);var nameOffset,verOffset,ix; 2822if(-1!=(verOffset=nAgt.indexOf("Opera")))jQuery.browser.opera=!0,jQuery.browser.name="Opera",jQuery.browser.fullVersion=nAgt.substring(verOffset+6),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8));else if(-1!=(verOffset=nAgt.indexOf("OPR")))jQuery.browser.opera=!0,jQuery.browser.name="Opera",jQuery.browser.fullVersion=nAgt.substring(verOffset+4);else if(-1!=(verOffset=nAgt.indexOf("MSIE")))jQuery.browser.msie=!0,jQuery.browser.name="Microsoft Internet Explorer", 2823 jQuery.browser.fullVersion=nAgt.substring(verOffset+5);else if(-1!=nAgt.indexOf("Trident")){jQuery.browser.msie=!0;jQuery.browser.name="Microsoft Internet Explorer";var start=nAgt.indexOf("rv:")+3,end=start+4;jQuery.browser.fullVersion=nAgt.substring(start,end)}else-1!=(verOffset=nAgt.indexOf("Edge"))?(jQuery.browser.edge=!0,jQuery.browser.name="Microsoft Edge",jQuery.browser.fullVersion=nAgt.substring(verOffset+5)):-1!=(verOffset=nAgt.indexOf("Chrome"))?(jQuery.browser.webkit=!0,jQuery.browser.chrome= 2824 !0,jQuery.browser.name="Chrome",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1<nAgt.indexOf("mozilla/5.0")&&-1<nAgt.indexOf("android ")&&-1<nAgt.indexOf("applewebkit")&&!(-1<nAgt.indexOf("chrome"))?(verOffset=nAgt.indexOf("Chrome"),jQuery.browser.webkit=!0,jQuery.browser.androidStock=!0,jQuery.browser.name="androidStock",jQuery.browser.fullVersion=nAgt.substring(verOffset+7)):-1!=(verOffset=nAgt.indexOf("Safari"))?(jQuery.browser.webkit=!0,jQuery.browser.safari=!0,jQuery.browser.name= 2825 "Safari",jQuery.browser.fullVersion=nAgt.substring(verOffset+7),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8))):-1!=(verOffset=nAgt.indexOf("AppleWebkit"))?(jQuery.browser.webkit=!0,jQuery.browser.safari=!0,jQuery.browser.name="Safari",jQuery.browser.fullVersion=nAgt.substring(verOffset+7),-1!=(verOffset=nAgt.indexOf("Version"))&&(jQuery.browser.fullVersion=nAgt.substring(verOffset+8))):-1!=(verOffset=nAgt.indexOf("Firefox"))?(jQuery.browser.mozilla= 2826 !0,jQuery.browser.name="Firefox",jQuery.browser.fullVersion=nAgt.substring(verOffset+8)):(nameOffset=nAgt.lastIndexOf(" ")+1)<(verOffset=nAgt.lastIndexOf("/"))&&(jQuery.browser.name=nAgt.substring(nameOffset,verOffset),jQuery.browser.fullVersion=nAgt.substring(verOffset+1),jQuery.browser.name.toLowerCase()==jQuery.browser.name.toUpperCase()&&(jQuery.browser.name=navigator.appName)); 2827-1!=(ix=jQuery.browser.fullVersion.indexOf(";"))&&(jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix));-1!=(ix=jQuery.browser.fullVersion.indexOf(" "))&&(jQuery.browser.fullVersion=jQuery.browser.fullVersion.substring(0,ix));jQuery.browser.majorVersion=parseInt(""+jQuery.browser.fullVersion,10);isNaN(jQuery.browser.majorVersion)&&(jQuery.browser.fullVersion=""+parseFloat(navigator.appVersion),jQuery.browser.majorVersion=parseInt(navigator.appVersion,10)); 2828jQuery.browser.version=jQuery.browser.majorVersion;jQuery.browser.android=/Android/i.test(nAgt);jQuery.browser.blackberry=/BlackBerry|BB|PlayBook/i.test(nAgt);jQuery.browser.ios=/iPhone|iPad|iPod|webOS/i.test(nAgt);jQuery.browser.operaMobile=/Opera Mini/i.test(nAgt);jQuery.browser.windowsMobile=/IEMobile|Windows Phone/i.test(nAgt);jQuery.browser.kindle=/Kindle|Silk/i.test(nAgt); 2829jQuery.browser.mobile=jQuery.browser.android||jQuery.browser.blackberry||jQuery.browser.ios||jQuery.browser.windowsMobile||jQuery.browser.operaMobile||jQuery.browser.kindle;jQuery.isMobile=jQuery.browser.mobile;jQuery.isTablet=jQuery.browser.mobile&&765<jQuery(window).width();jQuery.isAndroidDefault=jQuery.browser.android&&!/chrome/i.test(nAgt);jQuery.mbBrowser=jQuery.browser; 2830jQuery.browser.versionCompare=function(a,e){if("stringstring"!=typeof a+typeof e)return!1;for(var c=a.split("."),d=e.split("."),b=0,f=Math.max(c.length,d.length);b<f;b++){if(c[b]&&!d[b]&&0<parseInt(c[b])||parseInt(c[b])>parseInt(d[b]))return 1;if(d[b]&&!c[b]&&0<parseInt(d[b])||parseInt(c[b])<parseInt(d[b]))return-1}return 0}; 2831 2832(function(b){b.simpleSlider={defaults:{initialval:0,scale:100,orientation:"h",readonly:!1,callback:!1},events:{start:b.browser.mobile?"touchstart":"mousedown",end:b.browser.mobile?"touchend":"mouseup",move:b.browser.mobile?"touchmove":"mousemove"},init:function(c){return this.each(function(){var a=this,d=b(a);d.addClass("simpleSlider");a.opt={};b.extend(a.opt,b.simpleSlider.defaults,c);b.extend(a.opt,d.data());var e="h"==a.opt.orientation?"horizontal":"vertical";e=b("<div/>").addClass("level").addClass(e); 2833 d.prepend(e);a.level=e;d.css({cursor:"default"});"auto"==a.opt.scale&&(a.opt.scale=b(a).outerWidth());d.updateSliderVal();a.opt.readonly||(d.on(b.simpleSlider.events.start,function(c){b.browser.mobile&&(c=c.changedTouches[0]);a.canSlide=!0;d.updateSliderVal(c);"h"==a.opt.orientation?d.css({cursor:"col-resize"}):d.css({cursor:"row-resize"});b.browser.mobile||(c.preventDefault(),c.stopPropagation())}),b(document).on(b.simpleSlider.events.move,function(c){b.browser.mobile&&(c=c.changedTouches[0]);a.canSlide&& 2834 (b(document).css({cursor:"default"}),d.updateSliderVal(c),b.browser.mobile||(c.preventDefault(),c.stopPropagation()))}).on(b.simpleSlider.events.end,function(){b(document).css({cursor:"auto"});a.canSlide=!1;d.css({cursor:"auto"})}))})},updateSliderVal:function(c){var a=this.get(0);if(a.opt){a.opt.initialval="number"==typeof a.opt.initialval?a.opt.initialval:a.opt.initialval(a);var d=b(a).outerWidth(),e=b(a).outerHeight();a.x="object"==typeof c?c.clientX+document.body.scrollLeft-this.offset().left: 2835 "number"==typeof c?c*d/a.opt.scale:a.opt.initialval*d/a.opt.scale;a.y="object"==typeof c?c.clientY+document.body.scrollTop-this.offset().top:"number"==typeof c?(a.opt.scale-a.opt.initialval-c)*e/a.opt.scale:a.opt.initialval*e/a.opt.scale;a.y=this.outerHeight()-a.y;a.scaleX=a.x*a.opt.scale/d;a.scaleY=a.y*a.opt.scale/e;a.outOfRangeX=a.scaleX>a.opt.scale?a.scaleX-a.opt.scale:0>a.scaleX?a.scaleX:0;a.outOfRangeY=a.scaleY>a.opt.scale?a.scaleY-a.opt.scale:0>a.scaleY?a.scaleY:0;a.outOfRange="h"==a.opt.orientation? 2836 a.outOfRangeX:a.outOfRangeY;a.value="undefined"!=typeof c?"h"==a.opt.orientation?a.x>=this.outerWidth()?a.opt.scale:0>=a.x?0:a.scaleX:a.y>=this.outerHeight()?a.opt.scale:0>=a.y?0:a.scaleY:"h"==a.opt.orientation?a.scaleX:a.scaleY;"h"==a.opt.orientation?a.level.width(Math.floor(100*a.x/d)+"%"):a.level.height(Math.floor(100*a.y/e));"function"==typeof a.opt.callback&&a.opt.callback(a)}}};b.fn.simpleSlider=b.simpleSlider.init;b.fn.updateSliderVal=b.simpleSlider.updateSliderVal})(jQuery); 2837;/*___________________________________________________________________________________________________________________________________________________ 2838 _ jquery.mb.components _ 2839 _ _ 2840 _ file: jquery.mb.storage.min.js _ 2841 _ last modified: 24/05/15 16.08 _ 2842 _ _ 2843 _ Open Lab s.r.l., Florence - Italy _ 2844 _ _ 2845 _ email: [email protected] _ 2846 _ site: http://pupunzi.com _ 2847 _ http://open-lab.com _ 2848 _ blog: http://pupunzi.open-lab.com _ 2849 _ Q&A: http://jquery.pupunzi.com _ 2850 _ _ 2851 _ Licences: MIT, GPL _ 2852 _ http://www.opensource.org/licenses/mit-license.php _ 2853 _ http://www.gnu.org/licenses/gpl.html _ 2854 _ _ 2855 _ Copyright (c) 2001-2015. Matteo Bicocchi (Pupunzi); _ 2856 ___________________________________________________________________________________________________________________________________________________*/ 2857 2858(function(d){d.mbCookie={set:function(a,c,f,b){"object"==typeof c&&(c=JSON.stringify(c));b=b?"; domain="+b:"";var e=new Date,d="";0<f&&(e.setTime(e.getTime()+864E5*f),d="; expires="+e.toGMTString());document.cookie=a+"="+c+d+"; path=/"+b},get:function(a){a+="=";for(var c=document.cookie.split(";"),d=0;d<c.length;d++){for(var b=c[d];" "==b.charAt(0);)b=b.substring(1,b.length);if(0==b.indexOf(a))try{return JSON.parse(b.substring(a.length,b.length))}catch(e){return b.substring(a.length,b.length)}}return null}, 2859 remove:function(a){d.mbCookie.set(a,"",-1)}};d.mbStorage={set:function(a,c){"object"==typeof c&&(c=JSON.stringify(c));localStorage.setItem(a,c)},get:function(a){if(localStorage[a])try{return JSON.parse(localStorage[a])}catch(c){return localStorage[a]}else return null},remove:function(a){a?localStorage.removeItem(a):localStorage.clear()}}})(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.