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