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