1/*___________________________________________________________________________________________________________________________________________________ 2 _ jquery.mb.components _ 3 _ _ 4 _ file: jquery.mb.YTPlayer.src.js _ 5 _ last modified: 11/05/17 19.54 _ 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-2017. 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 29//window.onYouTubeIframeAPIReady = onYouTubeIframeAPIReady; 30 31var getYTPVideoID = function( url ) { 32 var videoID, playlistID; 33 if( url.indexOf( "youtu.be" ) > 0 ) { 34 videoID = url.substr( url.lastIndexOf( "/" ) + 1, url.length ); 35 playlistID = videoID.indexOf( "?list=" ) > 0 ? videoID.substr( videoID.lastIndexOf( "=" ), videoID.length ) : null; 36 videoID = playlistID ? videoID.substr( 0, videoID.lastIndexOf( "?" ) ) : videoID; 37 } else if( url.indexOf( "http" ) > -1 ) { 38 //videoID = url.match( /([\/&]v\/([^&#]*))|([\\?&]v=([^&#]*))/ )[ 1 ]; 39 videoID = url.match( /[\\?&]v=([^&#]*)/ )[ 1 ]; 40 playlistID = url.indexOf( "list=" ) > 0 ? url.match( /[\\?&]list=([^&#]*)/ )[ 1 ] : null; 41 } else { 42 videoID = url.length > 15 ? null : url; 43 playlistID = videoID ? null : url; 44 } 45 return { 46 videoID: videoID, 47 playlistID: playlistID 48 }; 49}; 50 51( function( jQuery, ytp ) { 52 53 jQuery.mbYTPlayer = { 54 name: "jquery.mb.YTPlayer", 55 version: "3.0.20", 56 build: "6273", 57 author: "Matteo Bicocchi (pupunzi)", 58 apiKey: "", 59 defaults: { 60 containment: "body", 61 ratio: "auto", // "auto", "16/9", "4/3" or number: 4/3, 16/9 62 videoURL: null, 63 playlistURL: null, 64 startAt: 0, 65 stopAt: 0, 66 autoPlay: true, 67 vol: 50, // 1 to 100 68 addRaster: false, 69 mask: false, 70 opacity: 1, 71 quality: "default", //or âsmallâ, âmediumâ, âlargeâ, âhd720â, âhd1080â, âhighresâ 72 mute: false, 73 loop: true, 74 fadeOnStartTime: 500, //fade in timing at video start 75 showControls: true, 76 showAnnotations: false, 77 showYTLogo: true, 78 stopMovieOnBlur: true, 79 realfullscreen: true, 80 mobileFallbackImage: null, 81 gaTrack: true, 82 optimizeDisplay: true, 83 remember_last_time: false, 84 playOnlyIfVisible: false, 85 anchor: "center,center", // top,bottom,left,right combined in pair 86 onReady: function( player ) {}, 87 onError: function( player, err ) {} 88 }, 89 /** 90 * @fontface icons 91 * */ 92 controls: { 93 play: "P", 94 pause: "p", 95 mute: "M", 96 unmute: "A",
97 onlyYT: "O", 98 showSite: "R", 99 ytLogo: "Y" 100 }, 101 controlBar: null, 102 loading: null, 103 locationProtocol: "https:", 104 105 filters: { 106 grayscale: { 107 value: 0, 108 unit: "%" 109 }, 110 hue_rotate: { 111 value: 0, 112 unit: "deg" 113 }, 114 invert: { 115 value: 0, 116 unit: "%" 117 }, 118 opacity: { 119 value: 0, 120 unit: "%" 121 }, 122 saturate: { 123 value: 0, 124 unit: "%" 125 }, 126 sepia: { 127 value: 0, 128 unit: "%" 129 }, 130 brightness: { 131 value: 0, 132 unit: "%" 133 }, 134 contrast: { 135 value: 0, 136 unit: "%" 137 }, 138 blur: { 139 value: 0, 140 unit: "px" 141 } 142 }, 143 /** 144 * 145 * @param options 146 * @returns [players] 147 */ 148 buildPlayer: function( options ) { 149 return this.each( function() { 150 var YTPlayer = this; 151 var $YTPlayer = jQuery( YTPlayer ); 152 YTPlayer.loop = 0; 153 YTPlayer.opt = {}; 154 YTPlayer.state = 0; 155 YTPlayer.filters = jQuery.mbYTPlayer.filters; 156 YTPlayer.filtersEnabled = true; 157 YTPlayer.id = YTPlayer.id || "YTP_" + new Date().getTime(); 158 $YTPlayer.addClass( "mb_YTPlayer" ); 159 var property = $YTPlayer.data( "property" ) && typeof $YTPlayer.data( "property" ) == "string" ? eval( '(' + $YTPlayer.data( "property" ) + ')' ) : $YTPlayer.data( "property" ); 160 if( typeof property != "undefined" && typeof property.vol != "undefined" ) property.vol = property.vol === 0 ? property.vol = 1 : property.vol; 161 162 jQuery.extend( YTPlayer.opt, jQuery.mbYTPlayer.defaults, options, property ); 163 164 if( !YTPlayer.hasChanged ) { 165 YTPlayer.defaultOpt = {}; 166 jQuery.extend( YTPlayer.defaultOpt, jQuery.mbYTPlayer.defaults, options ); 167 } 168 169 if( YTPlayer.opt.loop == "true" ) 170 YTPlayer.opt.loop = 9999; 171 172 YTPlayer.isRetina = ( window.retina || window.devicePixelRatio > 1 ); 173 var isIframe = function() { 174 var isIfr = false; 175 try { 176 if( self.location.href != top.location.href ) isIfr = true; 177 } catch( e ) { 178 isIfr = true; 179 } 180 return isIfr; 181 }; 182 183 YTPlayer.canGoFullScreen = !( jQuery.mbBrowser.msie || jQuery.mbBrowser.opera || isIframe() ); 184 if( !YTPlayer.canGoFullScreen ) YTPlayer.opt.realfullscreen = false; 185 if( !$YTPlayer.attr( "id" ) ) $YTPlayer.attr( "id", "ytp_" + new Date().getTime() ); 186 var playerID = "iframe_" + YTPlayer.id; 187 YTPlayer.isAlone = false; 188 YTPlayer.hasFocus = true; 189 YTPlayer.videoID = this.opt.videoURL ? getYTPVideoID( this.opt.videoURL ).videoID : $YTPlayer.attr( "href" ) ? getYTPVideoID( $YTPlayer.attr( "href" ) ).videoID : false; 190 YTPlayer.playlistID = this.opt.videoURL ? getYTPVideoID( this.opt.videoURL ).playlistID : $YTPlayer.attr( "href" ) ? getYTPVideoID( $YTPlayer.attr( "href" ) ).playlistID : false; 191 192 YTPlayer.opt.showAnnotations = YTPlayer.opt.showAnnotations ? '1' : '3'; 193 194 var start_from_last = 0; 195 196 if( jQuery.mbCookie.get( "YTPlayer_start_from" + YTPlayer.videoID ) ) 197 start_from_last = parseFloat( jQuery.mbCookie.get( "YTPlayer_start_from" + YTPlayer.videoID ) ); 198 199 if( YTPlayer.opt.remember_last_time && start_from_last ) { 200 YTPlayer.start_from_last = start_from_last; 201 jQuery.mbCookie.remove( "YTPlayer_start_from" + YTPlayer.videoID ); 202 } 203 204 var playerVars = { 205 'modestbranding': 1, 206 'autoplay': 0, 207 'controls': 0, 208 'showinfo': 0, 209 'rel': 0, 210 'enablejsapi': 1, 211 'version': 3, 212 'playerapiid': playerID, 213 'origin': '*', 214 'allowfullscreen': true, 215 'wmode': 'transparent', 216 'iv_load_policy': YTPlayer.opt.showAnnotations 217 }; 218 219 if( document.createElement( 'video' ).canPlayType ) jQuery.extend( playerVars, { 220 'html5': 1 221 } ); 222 if( jQuery.mbBrowser.msie && jQuery.mbBrowser.version < 9 ) this.opt.opacity = 1; 223 224 YTPlayer.isSelf = YTPlayer.opt.containment == "self"; 225 YTPlayer.defaultOpt.containment = YTPlayer.opt.containment = YTPlayer.opt.containment == "self" ? jQuery( this ) : jQuery( YTPlayer.opt.containment ); 226 YTPlayer.isBackground = YTPlayer.opt.containment.is( "body" ); 227
228 if( YTPlayer.isBackground && ytp.backgroundIsInited ) 229 return; 230 231 var isPlayer = YTPlayer.opt.containment.is( jQuery( this ) ); 232 233 YTPlayer.canPlayOnMobile = isPlayer && jQuery( this ).children().length === 0; 234 YTPlayer.isPlayer = false; 235 236 /** 237 * Hide the placeholder if it's not the target of the player 238 */ 239 if( !isPlayer ) { 240 $YTPlayer.hide(); 241 } else { 242 YTPlayer.isPlayer = true; 243 } 244 245 var overlay = jQuery( "<div/>" ).css( { 246 position: "absolute", 247 top: 0, 248 left: 0, 249 width: "100%", 250 height: "100%" 251 } ).addClass( "YTPOverlay" ); 252 253 if( YTPlayer.isPlayer ) { 254 overlay.on( "click", function() { 255 $YTPlayer.YTPTogglePlay(); 256 } ) 257 } 258 259 var wrapper = jQuery( "<div/>" ).addClass( "mbYTP_wrapper" ).attr( "id", "wrapper_" + YTPlayer.id ); 260 wrapper.css( { 261 position: "absolute", 262 zIndex: 0, 263 minWidth: "100%", 264 minHeight: "100%", 265 left: 0, 266 top: 0, 267 overflow: "hidden", 268 opacity: 0 269 } ); 270 271 var playerBox = jQuery( "<div/>" ).attr( "id", playerID ).addClass( "playerBox" ); 272 playerBox.css( { 273 position: "absolute", 274 zIndex: 0, 275 width: "100%", 276 height: "100%", 277 top: 0, 278 left: 0, 279 overflow: "hidden" 280 } ); 281 282 wrapper.append( playerBox ); 283 284 YTPlayer.opt.containment.children().not( "script, style" ).each( function() { 285 if( jQuery( this ).css( "position" ) == "static" ) jQuery( this ).css( "position", "relative" ); 286 } ); 287 288 if( YTPlayer.isBackground ) { 289 jQuery( "body" ).css( { 290 boxSizing: "border-box" 291 } ); 292 293 wrapper.css( { 294 position: "fixed", 295 top: 0, 296 left: 0, 297 zIndex: 0 298 } ); 299 300 $YTPlayer.hide(); 301 302 } else if( YTPlayer.opt.containment.css( "position" ) == "static" ) 303 YTPlayer.opt.containment.css( { 304 position: "relative" 305 } ); 306 307 YTPlayer.opt.containment.prepend( wrapper ); 308 YTPlayer.wrapper = wrapper; 309 310 playerBox.css( { 311 opacity: 1 312 } ); 313 314 if( !jQuery.mbBrowser.mobile ) { 315 playerBox.after( overlay ); 316 YTPlayer.overlay = overlay; 317 } 318 319 if( !YTPlayer.isBackground ) { 320 overlay.on( "mouseenter", function() { 321 if( YTPlayer.controlBar && YTPlayer.controlBar.length ) 322 YTPlayer.controlBar.addClass( "visible" ); 323 } ).on( "mouseleave", function() { 324 if( YTPlayer.controlBar && YTPlayer.controlBar.length ) 325 YTPlayer.controlBar.removeClass( "visible" ); 326 } ); 327 } 328 329 if( !ytp.YTAPIReady ) { 330 jQuery( "#YTAPI" ).remove(); 331 var tag = jQuery( "<script></script>" ).attr( { 332 "src": jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/iframe_api?v=" + jQuery.mbYTPlayer.version, 333 "id": "YTAPI" 334 } ); 335 jQuery( "head" ).prepend( tag ); 336 } else { 337 setTimeout( function() { 338 jQuery( document ).trigger( "YTAPIReady" ); 339 }, 100 ) 340 } 341 342 if( jQuery.mbBrowser.mobile && !YTPlayer.canPlayOnMobile ) { 343 344 if( YTPlayer.opt.mobileFallbackImage ) { 345 wrapper.css( { 346 backgroundImage: "url(" + YTPlayer.opt.mobileFallbackImage + ")", 347 backgroundPosition: "center center", 348 backgroundSize: "cover", 349 backgroundRepeat: "no-repeat", 350 opacity: 1 351 } ) 352 }; 353 354 if( !YTPlayer.isPlayer ) 355 $YTPlayer.remove(); 356 357 jQuery( document ).trigger( "YTPUnavailable" ); 358 return; 359 } 360 361 jQuery( document ).on( "YTAPIReady", function() { 362 if( ( YTPlayer.isBackground && ytp.backgroundIsInited ) || YTPlayer.isInit ) return; 363 if( YTPlayer.isBackground ) { 364 ytp.backgroundIsInited = true; 365 } 366 367 YTPlayer.opt.autoPlay = typeof YTPlayer.opt.autoPlay == "undefined" ? ( YTPlayer.isBackground ? true : false ) : YTPlayer.opt.autoPlay; 368 YTPlayer.opt.vol = YTPlayer.opt.vol ? YTPlayer.opt.vol : 100; 369 jQuery.mbYTPlayer.getDataFromAPI( YTPlayer ); 370 jQuery( YTPlayer ).on( "YTPChanged", function() { 371 372 if( YTPlayer.isInit ) 373 return; 374 375 YTPlayer.isInit = true; 376 377 //if is mobile && isPlayer fallback to the default YT player 378 if( jQuery.mbBrowser.mobile && YTPlayer.canPlayOnMobile ) { 379 // Try to adjust the player dimention 380 if( YTPlayer.opt.containment.outerWidth() > jQuery( window ).width() ) { 381 YTPlayer.opt.containment.css( { 382 maxWidth: "100%" 383 } ); 384 var h = YTPlayer.opt.containment.outerWidth() * .563; 385 YTPlayer.opt.containment.css( { 386 maxHeight: h 387 } ); 388 } 389 new YT.Player( playerID, { 390 videoId: YTPlayer.videoID.toString(), 391 width: '100%', 392 height: h, 393 playerVars: playerVars, 394 events: { 395 'onReady': function( event ) { 396 YTPlayer.player = event.target; 397 playerBox.css( { 398 opacity: 1 399 } ); 400 YTPlayer.wrapper.css( { 401 opacity: 1 402 } ); 403 } 404 } 405 } ); 406 return; 407 } 408 409 new YT.Player( playerID, { 410 videoId: YTPlayer.videoID.toString(), 411 playerVars: playerVars, 412 events: { 413 'onReady': function( event ) { 414 YTPlayer.player = event.target; 415 if( YTPlayer.isReady ) return; 416 YTPlayer.isReady = YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ? false : true; 417 YTPlayer.playerEl = YTPlayer.player.getIframe(); 418 419 jQuery( YTPlayer.playerEl ).unselectable(); 420 421 $YTPlayer.optimizeDisplay(); 422 jQuery( window ).off( "resize.YTP_" + YTPlayer.id ).on( "resize.YTP_" + YTPlayer.id, function() { 423 $YTPlayer.optimizeDisplay(); 424 } ); 425 426 if( YTPlayer.opt.remember_last_time ) { 427 428 jQuery( window ).on( "unload.YTP_" + YTPlayer.id, function() { 429 var current_time = YTPlayer.player.getCurrentTime(); 430 431 jQuery.mbCookie.set( "YTPlayer_start_from" + YTPlayer.videoID, current_time, 0 ); 432 } ); 433 434 } 435 436 jQuery.mbYTPlayer.checkForState( YTPlayer ); 437 }, 438 /** 439 * 440 * @param event 441 * 442 * -1 (unstarted) 443 * 0 (ended) 444 * 1 (playing) 445 * 2 (paused) 446 * 3 (buffering) 447 * 5 (video cued). 448 * 449 * 450 */ 451 'onStateChange': function( event ) { 452 if( typeof event.target.getPlayerState != "function" ) return; 453 var state = event.target.getPlayerState(); 454 455 if( YTPlayer.preventTrigger ) { 456 YTPlayer.preventTrigger = false; 457 return 458 } 459 460 YTPlayer.state = state; 461 462 var eventType; 463 switch( state ) { 464 case -1: //----------------------------------------------- unstarted 465 eventType = "YTPUnstarted"; 466 break; 467 case 0: //------------------------------------------------ ended 468 eventType = "YTPRealEnd"; 469 break; 470 case 1: //------------------------------------------------ play 471 eventType = "YTPPlay"; 472 if( YTPlayer.controlBar.length ) 473 YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.pause ); 474 if( typeof _gaq != "undefined" && eval( YTPlayer.opt.gaTrack ) ) _gaq.push( [ '_trackEvent', 'YTPlayer', 'Play', ( YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString() ) ] ); 475 if( typeof ga != "undefined" && eval( YTPlayer.opt.gaTrack ) ) ga( 'send', 'event', 'YTPlayer', 'play', ( YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString() ) ); 476 break; 477 case 2: //------------------------------------------------ pause 478 eventType = "YTPPause"; 479 if( YTPlayer.controlBar.length ) 480 YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play ); 481 break; 482 case 3: //------------------------------------------------ buffer 483 YTPlayer.player.setPlaybackQuality( YTPlayer.opt.quality );
484 eventType = "YTPBuffering"; 485 if( YTPlayer.controlBar.length ) 486 YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play ); 487 break; 488 case 5: //------------------------------------------------ cued 489 eventType = "YTPCued"; 490 break; 491 default: 492 break; 493 } 494 495 // Trigger state events 496 var YTPEvent = jQuery.Event( eventType ); 497 YTPEvent.time = YTPlayer.currentTime; 498 if( YTPlayer.canTrigger ) 499 jQuery( YTPlayer ).trigger( YTPEvent ); 500 }, 501 /** 502 * 503 * @param e 504 */ 505 'onPlaybackQualityChange': function( e ) { 506 var quality = e.target.getPlaybackQuality(); 507 var YTPQualityChange = jQuery.Event( "YTPQualityChange" ); 508 YTPQualityChange.quality = quality; 509 jQuery( YTPlayer ).trigger( YTPQualityChange ); 510 }, 511 /** 512 * 513 * @param err 514 */ 515 'onError': function( err ) { 516 517 if( err.data == 150 ) { 518 console.log( "Embedding this video is restricted by Youtube." ); 519 if( YTPlayer.isPlayList ) 520 jQuery( YTPlayer ).playNext(); 521 } 522 523 if( err.data == 2 && YTPlayer.isPlayList ) { 524 jQuery( YTPlayer ).playNext(); 525 } 526 527 if( typeof YTPlayer.opt.onError == "function" ) 528 YTPlayer.opt.onError( $YTPlayer, err ); 529 } 530 } 531 } ); 532 } ); 533 } ); 534 535 $YTPlayer.off( "YTPTime.mask" ); 536 537 jQuery.mbYTPlayer.applyMask( YTPlayer ); 538 539 } ); 540 }, 541 542 /** 543 * Check if the YTPlayer is on screen 544 */ 545 isOnScreen: function( YTPlayer ) { 546 547 var playerBox = YTPlayer.wrapper; 548 549 var winTop = $( window ).scrollTop(); 550 var winBottom = winTop + $( window ).height(); 551 var elTop = playerBox.offset().top; 552 var elBottom = elTop + playerBox.height(); 553 return( ( elBottom <= winBottom ) && ( elTop >= winTop ) ); 554 555 }, 556 557 /** 558 * 559 * @param YTPlayer 560 */ 561 getDataFromAPI: function( YTPlayer ) { 562 YTPlayer.videoData = jQuery.mbStorage.get( "YTPlayer_data_" + YTPlayer.videoID ); 563 jQuery( YTPlayer ).off( "YTPData.YTPlayer" ).on( "YTPData.YTPlayer", function() { 564 if( YTPlayer.hasData ) { 565 566 if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) { 567 var bgndURL = YTPlayer.videoData.thumb_max || YTPlayer.videoData.thumb_high || YTPlayer.videoData.thumb_medium; 568 569 YTPlayer.opt.containment.css( { 570 background: "rgba(0,0,0,0.5) url(" + bgndURL + ") center center", 571 backgroundSize: "cover" 572 } ); 573 YTPlayer.opt.backgroundUrl = bgndURL; 574 } 575 } 576 } ); 577 578 if( YTPlayer.videoData ) { 579 580 setTimeout( function() { 581 YTPlayer.opt.ratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio; 582 YTPlayer.dataReceived = true; 583 jQuery( YTPlayer ).trigger( "YTPChanged" ); 584 var YTPData = jQuery.Event( "YTPData" ); 585 YTPData.prop = {}; 586 for( var x in YTPlayer.videoData ) YTPData.prop[ x ] = YTPlayer.videoData[ x ]; 587 jQuery( YTPlayer ).trigger( YTPData ); 588 }, YTPlayer.opt.fadeOnStartTime ); 589 590 YTPlayer.hasData = true; 591 } else if( jQuery.mbYTPlayer.apiKey ) { 592 // Get video info from API3 (needs api key) 593 // snippet,player,contentDetails,statistics,status 594 jQuery.getJSON( jQuery.mbYTPlayer.locationProtocol + "//www.googleapis.com/youtube/v3/videos?id=" + YTPlayer.videoID + "&key=" + jQuery.mbYTPlayer.apiKey + "&part=snippet", function( data ) { 595 YTPlayer.dataReceived = true; 596 jQuery( YTPlayer ).trigger( "YTPChanged" ); 597 598 function parseYTPlayer_data( data ) { 599 YTPlayer.videoData = {}; 600 YTPlayer.videoData.id = YTPlayer.videoID; 601 YTPlayer.videoData.channelTitle = data.channelTitle; 602 YTPlayer.videoData.title = data.title; 603 YTPlayer.videoData.description = data.description.length < 400 ? data.description : data.description.substring( 0, 400 ) + " ..."; 604 YTPlayer.videoData.aspectratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio; 605 YTPlayer.opt.ratio = YTPlayer.videoData.aspectratio; 606 YTPlayer.videoData.thumb_max = data.thumbnails.maxres ? data.thumbnails.maxres.url : null; 607 YTPlayer.videoData.thumb_high = data.thumbnails.high ? data.thumbnails.high.url : null; 608 YTPlayer.videoData.thumb_medium = data.thumbnails.medium ? data.thumbnails.medium.url : null; 609 jQuery.mbStorage.set( "YTPlayer_data_" + YTPlayer.videoID, YTPlayer.videoData ); 610 } 611 612 parseYTPlayer_data( data.items[ 0 ].snippet ); 613 YTPlayer.hasData = true; 614 var YTPData = jQuery.Event( "YTPData" ); 615 YTPData.prop = {}; 616 for( var x in YTPlayer.videoData ) YTPData.prop[ x ] = YTPlayer.videoData[ x ]; 617 jQuery( YTPlayer ).trigger( YTPData ); 618 } ); 619 } else { 620 setTimeout( function() { 621 jQuery( YTPlayer ).trigger( "YTPChanged" ); 622 }, 50 ); 623 if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) { 624 var bgndURL = jQuery.mbYTPlayer.locationProtocol + "//i.ytimg.com/vi/" + YTPlayer.videoID + "/hqdefault.jpg"; 625 626 if( bgndURL ) 627 YTPlayer.opt.containment.css( { 628 background: "rgba(0,0,0,0.5) url(" + bgndURL + ") center center", 629 backgroundSize: "cover" 630 } ); 631 YTPlayer.opt.backgroundUrl = bgndURL; 632 633 } 634 YTPlayer.videoData = null; 635 YTPlayer.opt.ratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio; 636 } 637 if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay && !jQuery.mbBrowser.mobile ) { 638 YTPlayer.loading = jQuery( "<div/>" ).addClass( "loading" ).html( "Loading" ).hide(); 639 jQuery( YTPlayer ).append( YTPlayer.loading ); 640 YTPlayer.loading.fadeIn(); 641 } 642 }, 643 /** 644 * 645 */ 646 removeStoredData: function() { 647 jQuery.mbStorage.remove(); 648 }, 649 /** 650 * 651 * @returns {*|YTPlayer.videoData}
651 652 */ 653 getVideoData: function() { 654 var YTPlayer = this.get( 0 ); 655 return YTPlayer.videoData; 656 }, 657 /** 658 * 659 * @returns {*|YTPlayer.videoID|boolean} 660 */ 661 getVideoID: function() { 662 var YTPlayer = this.get( 0 ); 663 return YTPlayer.videoID || false; 664 }, 665 /** 666 * 667 * @param quality 668 */ 669 setVideoQuality: function( quality ) { 670 var YTPlayer = this.get( 0 ); 671 YTPlayer.player.setPlaybackQuality( quality ); 672 }, 673 /** 674 * 675 * @param videos 676 * @param shuffle 677 * @param callback 678 * @returns {jQuery.mbYTPlayer} 679 */ 680 playlist: function( videos, shuffle, callback ) { 681 var $YTPlayer = this; 682 var YTPlayer = $YTPlayer.get( 0 ); 683 YTPlayer.isPlayList = true; 684 if( shuffle ) videos = jQuery.shuffle( videos ); 685 if( !YTPlayer.videoID ) { 686 YTPlayer.videos = videos; 687 YTPlayer.videoCounter = 0; 688 YTPlayer.videoLength = videos.length; 689 jQuery( YTPlayer ).data( "property", videos[ 0 ] ); 690 jQuery( YTPlayer ).mb_YTPlayer(); 691 } 692 if( typeof callback == "function" ) jQuery( YTPlayer ).one( "YTPChanged", function() { 693 callback( YTPlayer ); 694 } ); 695 jQuery( YTPlayer ).on( "YTPEnd", function() { 696 jQuery( YTPlayer ).playNext(); 697 } ); 698 return this; 699 }, 700 /** 701 * 702 * @returns {jQuery.mbYTPlayer} 703 */ 704 playNext: function() { 705 var YTPlayer = this.get( 0 ); 706 707 if( YTPlayer.checkForStartAt ) { 708 clearInterval( YTPlayer.checkForStartAt ); 709 clearInterval( YTPlayer.getState ); 710 } 711 712 YTPlayer.videoCounter++; 713 714 if( YTPlayer.videoCounter >= YTPlayer.videoLength ) 715 YTPlayer.videoCounter = 0; 716 717 jQuery( YTPlayer ).YTPChangeMovie( YTPlayer.videos[ YTPlayer.videoCounter ] ); 718 719 return this; 720 }, 721 /** 722 * 723 * @returns {jQuery.mbYTPlayer} 724 */ 725 playPrev: function() { 726 var YTPlayer = this.get( 0 ); 727 728 if( YTPlayer.checkForStartAt ) { 729 clearInterval( YTPlayer.checkForStartAt ); 730 clearInterval( YTPlayer.getState ); 731 } 732 733 YTPlayer.videoCounter--; 734 735 if( YTPlayer.videoCounter < 0 ) 736 YTPlayer.videoCounter = YTPlayer.videoLength - 1; 737 738 jQuery( YTPlayer ).YTPChangeMovie( YTPlayer.videos[ YTPlayer.videoCounter ] ); 739 740 return this; 741 }, 742 /** 743 * 744 * @returns {jQuery.mbYTPlayer} 745 */ 746 playIndex: function( idx ) { 747 var YTPlayer = this.get( 0 ); 748 749 idx = idx - 1; 750 751 if( YTPlayer.checkForStartAt ) { 752 clearInterval( YTPlayer.checkForStartAt ); 753 clearInterval( YTPlayer.getState ); 754 } 755 756 YTPlayer.videoCounter = idx; 757 if( YTPlayer.videoCounter >= YTPlayer.videoLength - 1 ) 758 YTPlayer.videoCounter = YTPlayer.videoLength - 1; 759 jQuery( YTPlayer ).YTPChangeMovie( YTPlayer.videos[ YTPlayer.videoCounter ] ); 760 return this; 761 }, 762 /** 763 * 764 * @param opt 765 */ 766 changeMovie: function( opt ) { 767 768 var $YTPlayer = this; 769 var YTPlayer = $YTPlayer.get( 0 ); 770 YTPlayer.opt.startAt = 0; 771 YTPlayer.opt.stopAt = 0; 772 YTPlayer.opt.mask = false; 773 YTPlayer.opt.mute = true; 774 YTPlayer.hasData = false; 775 YTPlayer.hasChanged = true; 776 YTPlayer.player.loopTime = undefined; 777 778 if( opt ) 779 jQuery.extend( YTPlayer.opt, opt ); //YTPlayer.defaultOpt, 780 YTPlayer.videoID = getYTPVideoID( YTPlayer.opt.videoURL ).videoID; 781 782 if( YTPlayer.opt.loop == "true" ) 783 YTPlayer.opt.loop = 9999; 784 785 jQuery( YTPlayer.playerEl ).CSSAnimate( { 786 opacity: 0 787 }, YTPlayer.opt.fadeOnStartTime, function() { 788 789 var YTPChangeMovie = jQuery.Event( "YTPChangeMovie" ); 790 YTPChangeMovie.time = YTPlayer.currentTime; 791 YTPChangeMovie.videoId = YTPlayer.videoID; 792 jQuery( YTPlayer ).trigger( YTPChangeMovie ); 793 794 jQuery( YTPlayer ).YTPGetPlayer().cueVideoByUrl( encodeURI( jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/v/" + YTPlayer.videoID ), 1, YTPlayer.opt.quality ); 795 jQuery( YTPlayer ).optimizeDisplay(); 796 797 jQuery.mbYTPlayer.checkForState( YTPlayer ); 798 jQuery.mbYTPlayer.getDataFromAPI( YTPlayer ); 799 800 } ); 801 802 jQuery.mbYTPlayer.applyMask( YTPlayer ); 803 }, 804 /** 805 * 806 * @returns {player} 807 */ 808 getPlayer: function() { 809 return jQuery( this ).get( 0 ).player; 810 }, 811
812 playerDestroy: function() { 813 var YTPlayer = this.get( 0 ); 814 ytp.YTAPIReady = true; 815 ytp.backgroundIsInited = false; 816 YTPlayer.isInit = false; 817 YTPlayer.videoID = null; 818 YTPlayer.isReady = false; 819 var playerBox = YTPlayer.wrapper; 820 playerBox.remove(); 821 jQuery( "#controlBar_" + YTPlayer.id ).remove(); 822 clearInterval( YTPlayer.checkForStartAt ); 823 clearInterval( YTPlayer.getState ); 824 return this; 825 }, 826 827 /** 828 * 829 * @param real 830 * @returns {jQuery.mbYTPlayer} 831 */ 832 fullscreen: function( real ) { 833 var YTPlayer = this.get( 0 ); 834 if( typeof real == "undefined" ) real = YTPlayer.opt.realfullscreen; 835 real = eval( real ); 836 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 837 var fullScreenBtn = controls.find( ".mb_OnlyYT" ); 838 var videoWrapper = YTPlayer.isSelf ? YTPlayer.opt.containment : YTPlayer.wrapper; 839 //var videoWrapper = YTPlayer.wrapper; 840 if( real ) { 841 var fullscreenchange = jQuery.mbBrowser.mozilla ? "mozfullscreenchange" : jQuery.mbBrowser.webkit ? "webkitfullscreenchange" : "fullscreenchange"; 842 jQuery( document ).off( fullscreenchange ).on( fullscreenchange, function() { 843 var isFullScreen = RunPrefixMethod( document, "IsFullScreen" ) || RunPrefixMethod( document, "FullScreen" ); 844 if( !isFullScreen ) { 845 YTPlayer.isAlone = false; 846 fullScreenBtn.html( jQuery.mbYTPlayer.controls.onlyYT ); 847 jQuery( YTPlayer ).YTPSetVideoQuality( YTPlayer.opt.quality ); 848 videoWrapper.removeClass( "YTPFullscreen" ); 849 videoWrapper.css( { 850 opacity: YTPlayer.opt.opacity 851 } ); 852 videoWrapper.css( { 853 zIndex: 0 854 } ); 855 if( YTPlayer.isBackground ) { 856 jQuery( "body" ).after( controls ); 857 } else { 858 YTPlayer.wrapper.before( controls ); 859 } 860 jQuery( window ).resize(); 861 jQuery( YTPlayer ).trigger( "YTPFullScreenEnd" ); 862 } else { 863 jQuery( YTPlayer ).YTPSetVideoQuality( "default" ); 864 jQuery( YTPlayer ).trigger( "YTPFullScreenStart" ); 865 } 866 } ); 867 } 868 if( !YTPlayer.isAlone ) { 869 function hideMouse() { 870 YTPlayer.overlay.css( { 871 cursor: "none" 872 } ); 873 } 874 875 jQuery( document ).on( "mousemove.YTPlayer", function( e ) { 876 YTPlayer.overlay.css( { 877 cursor: "auto" 878 } ); 879 clearTimeout( YTPlayer.hideCursor ); 880 if( !jQuery( e.target ).parents().is( ".mb_YTPBar" ) ) YTPlayer.hideCursor = setTimeout( hideMouse, 3000 ); 881 } ); 882 hideMouse(); 883 if( real ) { 884 videoWrapper.css( { 885 opacity: 0 886 } ); 887 videoWrapper.addClass( "YTPFullscreen" ); 888 launchFullscreen( videoWrapper.get( 0 ) ); 889 setTimeout( function() { 890 videoWrapper.css( { 891 opacity: 1 892 } ); 893 YTPlayer.wrapper.append( controls ); 894 jQuery( YTPlayer ).optimizeDisplay(); 895 YTPlayer.player.seekTo( YTPlayer.player.getCurrentTime() + .1, true ); 896 }, YTPlayer.opt.fadeOnStartTime ) 897 } else videoWrapper.css( { 898 zIndex: 10000 899 } ).css( { 900 opacity: 1 901 } ); 902 fullScreenBtn.html( jQuery.mbYTPlayer.controls.showSite ); 903 YTPlayer.isAlone = true; 904 } else { 905 jQuery( document ).off( "mousemove.YTPlayer" ); 906 clearTimeout( YTPlayer.hideCursor ); 907 YTPlayer.overlay.css( { 908 cursor: "auto" 909 } ); 910 if( real ) { 911 cancelFullscreen(); 912 } else { 913 videoWrapper.CSSAnimate( { 914 opacity: YTPlayer.opt.opacity 915 }, YTPlayer.opt.fadeOnStartTime ); 916 videoWrapper.css( { 917 zIndex: 0 918 } ); 919 } 920 fullScreenBtn.html( jQuery.mbYTPlayer.controls.onlyYT ); 921 YTPlayer.isAlone = false; 922 } 923 924 function RunPrefixMethod( obj, method ) { 925 var pfx = [ "webkit", "moz", "ms", "o", "" ]; 926 var p = 0, 927 m, t; 928 while( p < pfx.length && !obj[ m ] ) { 929 m = method; 930 if( pfx[ p ] == "" ) { 931 m = m.substr( 0, 1 ).toLowerCase() + m.substr( 1 ); 932 } 933 m = pfx[ p ] + m; 934 t = typeof obj[ m ]; 935 if( t != "undefined" ) { 936 pfx = [ pfx[ p ] ]; 937 return( t == "function" ? obj[ m ]() : obj[ m ] ); 938 } 939 p++; 940 } 941 } 942 943 function launchFullscreen( element ) { 944 RunPrefixMethod( element, "RequestFullScreen" ); 945 } 946 947 function cancelFullscreen() { 948 if( RunPrefixMethod( document, "FullScreen" ) || RunPrefixMethod( document, "IsFullScreen" ) ) { 949 RunPrefixMethod( document, "CancelFullScreen" ); 950 } 951 } 952 953 return this; 954 }, 955 /** 956 * 957 * @returns {jQuery.mbYTPlayer} 958 */ 959 toggleLoops: function() { 960 var YTPlayer = this.get( 0 ); 961 var data = YTPlayer.opt; 962 if( data.loop == 1 ) { 963 data.loop = 0; 964 } else { 965 if( data.startAt ) { 966 YTPlayer.player.seekTo( data.startAt ); 967 } else { 968 YTPlayer.player.playVideo(); 969 } 970 data.loop = 1; 971 } 972 return this; 973 }, 974 /** 975 * 976 * @returns {jQuery.mbYTPlayer} 977 */ 978 play: function() { 979 var YTPlayer = this.get( 0 ); 980 if( !YTPlayer.isReady ) 981 return this; 982 983 YTPlayer.player.playVideo(); 984 YTPlayer.wrapper.css( { 985 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 986 } ); 987 988 jQuery( YTPlayer.playerEl ).css( { 989 opacity: 1 990 } ); 991 992 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 993 var playBtn = controls.find( ".mb_YTPPlaypause" ); 994 playBtn.html( jQuery.mbYTPlayer.controls.pause ); 995 YTPlayer.state = 1; 996 YTPlayer.orig_background = jQuery( YTPlayer ).css( "background-image" ); 997 998 return this; 999 }, 1000 /** 1001 * 1002 * @param callback 1003 * @returns {jQuery.mbYTPlayer} 1004 */ 1005 togglePlay: function( callback ) { 1006 var YTPlayer = this.get( 0 ); 1007 if( YTPlayer.state == 1 ) 1008 this.YTPPause(); 1009 else 1010 this.YTPPlay(); 1011 1012 if( typeof callback == "function" ) 1013 callback( YTPlayer.state ); 1014 1015 return this; 1016 }, 1017 /** 1018 * 1019 * @returns {jQuery.mbYTPlayer} 1020 */ 1021 stop: function() { 1022 var YTPlayer = this.get( 0 ); 1023 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 1024 var playBtn = controls.find( ".mb_YTPPlaypause" ); 1025 playBtn.html( jQuery.mbYTPlayer.controls.play ); 1026 YTPlayer.player.stopVideo(); 1027 return this; 1028 }, 1029 /** 1030 * 1031 * @returns {jQuery.mbYTPlayer} 1032 */ 1033 pause: function() { 1034 var YTPlayer = this.get( 0 ); 1035 YTPlayer.player.pauseVideo(); 1036 YTPlayer.state = 2; 1037 return this; 1038 }, 1039 /** 1040 * 1041 * @param val 1042 * @returns {jQuery.mbYTPlayer} 1043 */ 1044 seekTo: function( val ) { 1045 var YTPlayer = this.get( 0 ); 1046 YTPlayer.player.seekTo( val, true ); 1047 return this; 1048 }, 1049 /** 1050 * 1051 * @param val 1052 * @returns {jQuery.mbYTPlayer} 1053 */ 1054 setVolume: function( val ) { 1055 var YTPlayer = this.get( 0 ); 1056 if( !val && !YTPlayer.opt.vol && YTPlayer.player.getVolume() == 0 ) jQuery( YTPlayer ).YTPUnmute(); 1057 else if( ( !val && YTPlayer.player.getVolume() > 0 ) || ( val && YTPlayer.opt.vol == val ) ) { 1058 if( !YTPlayer.isMute ) jQuery( YTPlayer ).YTPMute(); 1059 else jQuery( YTPlayer ).YTPUnmute(); 1060 } else { 1061 YTPlayer.opt.vol = val; 1062 YTPlayer.player.setVolume( YTPlayer.opt.vol ); 1063 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.updateSliderVal( val ) 1064 } 1065 return this; 1066 }, 1067 /** 1068 * 1069 * @returns {boolean} 1070 */ 1071 toggleVolume: function() { 1072 var YTPlayer = this.get( 0 ); 1073 if( !YTPlayer ) return; 1074 if( YTPlayer.player.isMuted() ) { 1075 jQuery( YTPlayer ).YTPUnmute(); 1076 return true; 1077 } else { 1078 jQuery( YTPlayer ).YTPMute(); 1079 return false; 1080 } 1081 }, 1082 /** 1083 * 1084 * @returns {jQuery.mbYTPlayer} 1085 */ 1086 mute: function() { 1087 var YTPlayer = this.get( 0 ); 1088 if( YTPlayer.isMute ) return; 1089 YTPlayer.player.mute(); 1090 YTPlayer.isMute = true; 1091 YTPlayer.player.setVolume( 0 ); 1092 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length && YTPlayer.volumeBar.width() > 10 ) { 1093 YTPlayer.volumeBar.updateSliderVal( 0 ); 1094 } 1095 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 1096 var muteBtn = controls.find( ".mb_YTPMuteUnmute" ); 1097 muteBtn.html( jQuery.mbYTPlayer.controls.unmute ); 1098 jQuery( YTPlayer ).addClass( "isMuted" ); 1099 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.addClass( "muted" ); 1100 var YTPEvent = jQuery.Event( "YTPMuted" ); 1101 YTPEvent.time = YTPlayer.currentTime; 1102 if( YTPlayer.canTrigger ) jQuery( YTPlayer ).trigger( YTPEvent ); 1103 return this; 1104 }, 1105 /** 1106 * 1107 * @returns {jQuery.mbYTPlayer} 1108 */ 1109 unmute: function() { 1110 var YTPlayer = this.get( 0 ); 1111 if( !YTPlayer.isMute ) return; 1112 YTPlayer.player.unMute(); 1113 YTPlayer.isMute = false; 1114 YTPlayer.player.setVolume( YTPlayer.opt.vol ); 1115 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol > 10 ? YTPlayer.opt.vol : 10 ); 1116 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 1117 var muteBtn = controls.find( ".mb_YTPMuteUnmute" ); 1118 muteBtn.html( jQuery.mbYTPlayer.controls.mute ); 1119 jQuery( YTPlayer ).removeClass( "isMuted" ); 1120 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.removeClass( "muted" ); 1121 var YTPEvent = jQuery.Event( "YTPUnmuted" ); 1122 YTPEvent.time = YTPlayer.currentTime; 1123 if( YTPlayer.canTrigger ) jQuery( YTPlayer ).trigger( YTPEvent ); 1124 return this; 1125 }, 1126 /** 1127 * FILTERS 1128 * 1129 * 1130 * @param filter 1131 * @param value 1132 * @returns {jQuery.mbYTPlayer} 1133 */ 1134 applyFilter: function( filter, value ) { 1135 return this.each( function() { 1136 var YTPlayer = this; 1137 YTPlayer.filters[ filter ].value = value; 1138 if( YTPlayer.filtersEnabled ) 1139 jQuery( YTPlayer ).YTPEnableFilters(); 1140 } ); 1141 }, 1142 /** 1143 * 1144 * @param filters 1145 * @returns {jQuery.mbYTPlayer} 1146 */ 1147 applyFilters: function( filters ) { 1148 return this.each( function() { 1149 var YTPlayer = this; 1150 if( !YTPlayer.isReady ) { 1151 jQuery( YTPlayer ).on( "YTPReady", function() { 1152 jQuery( YTPlayer ).YTPApplyFilters( filters ); 1153 } ); 1154 return; 1155 } 1156 1157 for( var key in filters ) 1158 jQuery( YTPlayer ).YTPApplyFilter( key, filters[ key ] ); 1159 1160 jQuery( YTPlayer ).trigger( "YTPFiltersApplied" ); 1161 } ); 1162 }, 1163 /** 1164 * 1165 * @param filter 1166 * @param value 1167 * @returns {*} 1168 */ 1169 toggleFilter: function( filter, value ) { 1170 return this.each( function() { 1171 var YTPlayer = this; 1172 if( !YTPlayer.filters[ filter ].value ) YTPlayer.filters[ filter ].value = value; 1173 else YTPlayer.filters[ filter ].value = 0; 1174 if( YTPlayer.filtersEnabled ) jQuery( this ).YTPEnableFilters(); 1175 } ); 1176 }, 1177 /** 1178 * 1179 * @param callback 1180 * @returns {*} 1181 */ 1182 toggleFilters: function( callback ) { 1183 return this.each( function() { 1184 var YTPlayer = this; 1185 if( YTPlayer.filtersEnabled ) { 1186 jQuery( YTPlayer ).trigger( "YTPDisableFilters" ); 1187 jQuery( YTPlayer ).YTPDisableFilters(); 1188 } else { 1189 jQuery( YTPlayer ).YTPEnableFilters(); 1190 jQuery( YTPlayer ).trigger( "YTPEnableFilters" ); 1191 } 1192 if( typeof callback == "function" ) 1193 callback( YTPlayer.filtersEnabled ); 1194 } ) 1195 }, 1196 /** 1197 * 1198 * @returns {*} 1199 */ 1200 disableFilters: function() { 1201 return this.each( function() { 1202 var YTPlayer = this; 1203 var iframe = jQuery( YTPlayer.playerEl ); 1204 iframe.css( "-webkit-filter", "" ); 1205 iframe.css( "filter", "" ); 1206 YTPlayer.filtersEnabled = false; 1207 } ) 1208 }, 1209 /** 1210 * 1211 * @returns {*} 1212 */ 1213 enableFilters: function() { 1214 return this.each( function() { 1215 var YTPlayer = this; 1216 var iframe = jQuery( YTPlayer.playerEl ); 1217 var filterStyle = ""; 1218 for( var key in YTPlayer.filters ) { 1219 if( YTPlayer.filters[ key ].value ) 1220 filterStyle += key.replace( "_", "-" ) + "(" + YTPlayer.filters[ key ].value + YTPlayer.filters[ key ].unit
1220+ ") "; 1221 } 1222 iframe.css( "-webkit-filter", filterStyle ); 1223 iframe.css( "filter", filterStyle ); 1224 YTPlayer.filtersEnabled = true; 1225 } ); 1226 }, 1227 /** 1228 * 1229 * @param filter 1230 * @param callback 1231 * @returns {*} 1232 */ 1233 removeFilter: function( filter, callback ) { 1234 return this.each( function() { 1235 var YTPlayer = this; 1236 if( typeof filter == "function" ) { 1237 callback = filter; 1238 filter = null; 1239 } 1240 if( !filter ) 1241 for( var key in YTPlayer.filters ) { 1242 jQuery( this ).YTPApplyFilter( key, 0 ); 1243 if( typeof callback == "function" ) callback( key ); 1244 } else { 1245 jQuery( this ).YTPApplyFilter( filter, 0 ); 1246 if( typeof callback == "function" ) callback( filter ); 1247 } 1248 } ); 1249 1250 }, 1251 /** 1252 * 1253 * @returns {*} 1254 */ 1255 getFilters: function() { 1256 var YTPlayer = this.get( 0 ); 1257 return YTPlayer.filters; 1258 }, 1259 /** 1260 * MASK 1261 * 1262 * 1263 * @param mask 1264 * @returns {jQuery.mbYTPlayer} 1265 */ 1266 addMask: function( mask ) { 1267 var YTPlayer = this.get( 0 ); 1268 var overlay = YTPlayer.overlay; 1269 1270 if( !mask ) { 1271 mask = YTPlayer.actualMask; 1272 } 1273 1274 var tempImg = jQuery( "<img/>" ).attr( "src", mask ).on( "load", function() { 1275 1276 overlay.CSSAnimate( { 1277 opacity: 0 1278 }, YTPlayer.opt.fadeOnStartTime, function() { 1279 1280 YTPlayer.hasMask = true; 1281 1282 tempImg.remove(); 1283 1284 overlay.css( { 1285 backgroundImage: "url(" + mask + ")", 1286 backgroundRepeat: "no-repeat", 1287 backgroundPosition: "center center", 1288 backgroundSize: "cover" 1289 } ); 1290 1291 overlay.css( { 1292 opacity: 1 1293 } ); 1294 1295 } ); 1296 1297 } ); 1298 1299 return this; 1300 1301 }, 1302 /** 1303 * 1304 * @returns {jQuery.mbYTPlayer} 1305 */ 1306 removeMask: function() { 1307 var YTPlayer = this.get( 0 ); 1308 var overlay = YTPlayer.overlay; 1309 overlay.CSSAnimate( { 1310 opacity: 0 1311 }, YTPlayer.opt.fadeOnStartTime, function() { 1312 1313 YTPlayer.hasMask = false; 1314 1315 overlay.css( { 1316 backgroundImage: "", 1317 backgroundRepeat: "", 1318 backgroundPosition: "", 1319 backgroundSize: "" 1320 } ); 1321 overlay.css( { 1322 opacity: 1 1323 } ); 1324 1325 } ); 1326 1327 return this; 1328 1329 }, 1330 /** 1331 * 1332 * @param YTPlayer 1333 */ 1334 applyMask: function( YTPlayer ) { 1335 var $YTPlayer = jQuery( YTPlayer ); 1336 $YTPlayer.off( "YTPTime.mask" ); 1337 1338 if( YTPlayer.opt.mask ) { 1339 1340 if( typeof YTPlayer.opt.mask == "string" ) { 1341 $YTPlayer.YTPAddMask( YTPlayer.opt.mask ); 1342 1343 YTPlayer.actualMask = YTPlayer.opt.mask; 1344 1345 } else if( typeof YTPlayer.opt.mask == "object" ) { 1346 1347 for( var time in YTPlayer.opt.mask ) { 1348 if( YTPlayer.opt.mask[ time ] ) 1349 var img = jQuery( "<img/>" ).attr( "src", YTPlayer.opt.mask[ time ] ); 1350 } 1351 1352 if( YTPlayer.opt.mask[ 0 ] ) 1353 $YTPlayer.YTPAddMask( YTPlayer.opt.mask[ 0 ] ); 1354 1355 $YTPlayer.on( "YTPTime.mask", function( e ) { 1356 for( var time in YTPlayer.opt.mask ) { 1357 if( e.time == time ) 1358 if( !YTPlayer.opt.mask[ time ] ) { 1359 $YTPlayer.YTPRemoveMask(); 1360 } else { 1361 1362 $YTPlayer.YTPAddMask( YTPlayer.opt.mask[ time ] ); 1363 YTPlayer.actualMask = YTPlayer.opt.mask[ time ]; 1364 } 1365 1366 } 1367 } ); 1368 1369 } 1370 1371 1372 } 1373 }, 1374 /** 1375 * 1376 */ 1377 toggleMask: function() { 1378 var YTPlayer = this.get( 0 ); 1379 var $YTPlayer = $( YTPlayer ); 1380 if( YTPlayer.hasMask ) 1381 $YTPlayer.YTPRemoveMask(); 1382 else 1383 $YTPlayer.YTPAddMask(); 1384 1385 return this; 1386 }, 1387 /** 1388 * 1389 * @returns {{totalTime: number, currentTime: number}} 1390 */ 1391 manageProgress: function() { 1392 var YTPlayer = this.get( 0 ); 1393 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 1394 var progressBar = controls.find( ".mb_YTPProgress" ); 1395 var loadedBar = controls.find( ".mb_YTPLoaded" ); 1396 var timeBar = controls.find( ".mb_YTPseekbar" ); 1397 var totW = progressBar.outerWidth(); 1398 var currentTime = Math.floor( YTPlayer.player.getCurrentTime() ); 1399 var totalTime = Math.floor( YTPlayer.player.getDuration() ); 1400 var timeW = ( currentTime * totW ) / totalTime; 1401 var startLeft = 0; 1402 var loadedW = YTPlayer.player.getVideoLoadedFraction() * 100; 1403 loadedBar.css( { 1404 left: startLeft, 1405 width: loadedW + "%" 1406 } ); 1407 timeBar.css( { 1408 left: 0, 1409 width: timeW 1410 } ); 1411 return { 1412 totalTime: totalTime, 1413 currentTime: currentTime 1414 }; 1415 }, 1416 /** 1417 * 1418 * @param YTPlayer 1419 */ 1420 buildControls: function( YTPlayer ) { 1421 var data = YTPlayer.opt; 1422 // @data.printUrl: is deprecated; use data.showYTLogo 1423 data.showYTLogo = data.showYTLogo || data.printUrl; 1424 1425 if( jQuery( "#controlBar_" + YTPlayer.id ).length ) 1426 return; 1427 YTPlayer.controlBar = jQuery( "<span/>" ).attr( "id", "controlBar_" + YTPlayer.id ).addClass( "mb_YTPBar" ).css( { 1428 whiteSpace: "noWrap",
1429 position: YTPlayer.isBackground ? "fixed" : "absolute", 1430 zIndex: YTPlayer.isBackground ? 10000 : 1000 1431 } ).hide(); 1432 var buttonBar = jQuery( "<div/>" ).addClass( "buttonBar" ); 1433 /* play/pause button*/ 1434 var playpause = jQuery( "<span>" + jQuery.mbYTPlayer.controls.play + "</span>" ).addClass( "mb_YTPPlaypause ytpicon" ).click( function() { 1435 if( YTPlayer.player.getPlayerState() == 1 ) jQuery( YTPlayer ).YTPPause(); 1436 else jQuery( YTPlayer ).YTPPlay(); 1437 } ); 1438 /* mute/unmute button*/ 1439 var MuteUnmute = jQuery( "<span>" + jQuery.mbYTPlayer.controls.mute + "</span>" ).addClass( "mb_YTPMuteUnmute ytpicon" ).click( function() { 1440 if( YTPlayer.player.getVolume() == 0 ) { 1441 jQuery( YTPlayer ).YTPUnmute(); 1442 } else { 1443 jQuery( YTPlayer ).YTPMute(); 1444 } 1445 } ); 1446 /* volume bar*/ 1447 var volumeBar = jQuery( "<div/>" ).addClass( "mb_YTPVolumeBar" ).css( { 1448 display: "inline-block" 1449 } ); 1450 YTPlayer.volumeBar = volumeBar; 1451 /* time elapsed */ 1452 var idx = jQuery( "<span/>" ).addClass( "mb_YTPTime" ); 1453 var vURL = data.videoURL ? data.videoURL : ""; 1454 if( vURL.indexOf( "http" ) < 0 ) vURL = jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/watch?v=" + data.videoURL; 1455 var movieUrl = jQuery( "<span/>" ).html( jQuery.mbYTPlayer.controls.ytLogo ).addClass( "mb_YTPUrl ytpicon" ).attr( "title", "view on YouTube" ).on( "click", function() { 1456 window.open( vURL, "viewOnYT" ) 1457 } ); 1458 var onlyVideo = jQuery( "<span/>" ).html( jQuery.mbYTPlayer.controls.onlyYT ).addClass( "mb_OnlyYT ytpicon" ).on( "click", function() { 1459 jQuery( YTPlayer ).YTPFullscreen( data.realfullscreen ); 1460 } ); 1461 var progressBar = jQuery( "<div/>" ).addClass( "mb_YTPProgress" ).css( "position", "absolute" ).click( function( e ) { 1462 timeBar.css( { 1463 width: ( e.clientX - timeBar.offset().left ) 1464 } ); 1465 YTPlayer.timeW = e.clientX - timeBar.offset().left; 1466 YTPlayer.controlBar.find( ".mb_YTPLoaded" ).css( { 1467 width: 0 1468 } ); 1469 var totalTime = Math.floor( YTPlayer.player.getDuration() ); 1470 YTPlayer.goto = ( timeBar.outerWidth() * totalTime ) / progressBar.outerWidth(); 1471 YTPlayer.player.seekTo( parseFloat( YTPlayer.goto ), true ); 1472 YTPlayer.controlBar.find( ".mb_YTPLoaded" ).css( { 1473 width: 0 1474 } ); 1475 } ); 1476 var loadedBar = jQuery( "<div/>" ).addClass( "mb_YTPLoaded" ).css( "position", "absolute" ); 1477 var timeBar = jQuery( "<div/>" ).addClass( "mb_YTPseekbar" ).css( "position", "absolute" ); 1478 progressBar.append( loadedBar ).append( timeBar ); 1479 buttonBar.append( playpause ).append( MuteUnmute ).append( volumeBar ).append( idx ); 1480 if( data.showYTLogo ) { 1481 buttonBar.append( movieUrl ); 1482 } 1483 if( YTPlayer.isBackground || ( eval( YTPlayer.opt.realfullscreen ) && !YTPlayer.isBackground ) ) buttonBar.append( onlyVideo ); 1484 YTPlayer.controlBar.append( buttonBar ).append( progressBar ); 1485 if( !YTPlayer.isBackground ) { 1486 YTPlayer.controlBar.addClass( "inlinePlayer" ); 1487 YTPlayer.wrapper.before( YTPlayer.controlBar ); 1488 } else { 1489 jQuery( "body" ).after( YTPlayer.controlBar ); 1490 } 1491 volumeBar.simpleSlider( { 1492 initialval: YTPlayer.opt.vol, 1493 scale: 100, 1494 orientation: "h", 1495 callback: function( el ) { 1496 if( el.value == 0 ) { 1497 jQuery( YTPlayer ).YTPMute(); 1498 } else { 1499 jQuery( YTPlayer ).YTPUnmute(); 1500 } 1501 YTPlayer.player.setVolume( el.value ); 1502 if( !YTPlayer.isMute ) YTPlayer.opt.vol = el.value; 1503 } 1504 } ); 1505 }, 1506 /** 1507 * 1508 * @param YTPlayer 1509 */ 1510 checkForState: function( YTPlayer ) { 1511 var interval = YTPlayer.opt.showControls ? 100 : 400; 1512 clearInterval( YTPlayer.getState ); 1513 //Checking if player has been removed from scene 1514 if( !jQuery.contains( document, YTPlayer ) ) { 1515 jQuery( YTPlayer ).YTPPlayerDestroy(); 1516 clearInterval( YTPlayer.getState ); 1517 clearInterval( YTPlayer.checkForStartAt ); 1518 return; 1519 } 1520 1521 jQuery.mbYTPlayer.checkForStart( YTPlayer ); 1522 1523 YTPlayer.getState = setInterval( function() { 1524 1525 var prog = jQuery( YTPlayer ).YTPManageProgress(); 1526 var $YTPlayer = jQuery( YTPlayer ); 1527 var data = YTPlayer.opt; 1528 1529 var startAt = YTPlayer.start_from_last ? YTPlayer.start_from_last : YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1; 1530 1531 YTPlayer.start_from_last = null; 1532 1533 var stopAt = YTPlayer.opt.stopAt > YTPlayer.opt.startAt ? YTPlayer.opt.stopAt : 0; 1534 stopAt = stopAt < YTPlayer.player.getDuration() ? stopAt : 0; 1535 if( YTPlayer.currentTime != prog.currentTime ) { 1536 1537 var YTPEvent = jQuery.Event( "YTPTime" ); 1538 YTPEvent.time = YTPlayer.currentTime; 1539 jQuery( YTPlayer ).trigger( YTPEvent ); 1540 1541 } 1542 YTPlayer.currentTime = prog.currentTime; 1543 YTPlayer.totalTime = YTPlayer.player.getDuration(); 1544 if( YTPlayer.player.getVolume() == 0 ) $YTPlayer.addClass( "isMuted" ); 1545 else $YTPlayer.removeClass( "isMuted" ); 1546 1547 if( YTPlayer.opt.showControls ) 1548 if( prog.totalTime ) { 1549 YTPlayer.controlBar.find( ".mb_YTPTime" ).html( jQuery.mbYTPlayer.formatTime( prog.currentTime ) + " / " + jQuery.mbYTPlayer.formatTime( prog.totalTime ) ); 1550 } else { 1551 YTPlayer.controlBar.find( ".mb_YTPTime" ).html( "-- : -- / -- : --" ); 1552 } 1553 1554 1555 if( eval( YTPlayer.opt.stopMovieOnBlur ) ) { 1556 if( !document.hasFocus() ) { 1557 if( YTPlayer.state == 1 ) { 1558 YTPlayer.hasFocus = false; 1559 $YTPlayer.YTPPause(); 1560 } 1561 } else if( document.hasFocus() && !YTPlayer.hasFocus && !( YTPlayer.state == -1 || YTPlayer.state == 0 ) ) { 1562 YTPlayer.hasFocus = true; 1563 $YTPlayer.YTPPlay(); 1564 } 1565 } 1566 1567 if( YTPlayer.opt.playOnlyIfVisible ) { 1568 1569 var isOnScreen = jQuery.mbYTPlayer.isOnScreen( YTPlayer ); 1570 1571 if( !isOnScreen && YTPlayer.state == 1 ) { 1572 1573 YTPlayer.hasFocus = false; 1574 $YTPlayer.YTPPause(); 1575 1576 console.debug( YTPlayer.id, isOnScreen ) 1577 console.debug( YTPlayer.state ) 1578 1579 } else if( !YTPlayer.hasFocus && !( YTPlayer.state == -1 || YTPlayer.state == 0 ) ) { 1580 1581 YTPlayer.hasFocus = true; 1582 $YTPlayer.YTPPlay(); 1583 1584 } 1585 } 1586 1587 1588 if( YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() <= 400 && !YTPlayer.isCompact ) { 1589 YTPlayer.controlBar.addClass( "compact" ); 1590 YTPlayer.isCompact = true; 1591 if( !YTPlayer.isMute && YTPlayer.volumeBar ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol ); 1592 } else if( YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() > 400 && YTPlayer.isCompact ) { 1593 YTPlayer.controlBar.removeClass( "compact" ); 1594 YTPlayer.isCompact = false; 1595 if( !YTPlayer.isMute && YTPlayer.volumeBar ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol ); 1596 } 1597 1598 if( YTPlayer.player.getPlayerState() == 1 && ( parseFloat( YTPlayer.player.getDuration() - .5 ) < YTPlayer.player.getCurrentTime() || ( stopAt > 0 && parseFloat( YTPlayer.player.getCurrentTime() ) > stopAt ) ) ) { 1599 if( YTPlayer.isEnded ) return; 1600 YTPlayer.isEnded = true; 1601 setTimeout( function() { 1602 YTPlayer.isEnded = false 1603 }, 1000 ); 1604 1605 if( YTPlayer.isPlayList ) { 1606 1607 if( !data.loop || ( data.loop > 0 && YTPlayer.player.loopTime === data.loop - 1 ) ) { 1608 1609 YTPlayer.player.loopTime = undefined; 1610 clearInterval( YTPlayer.getState ); 1611 var YTPEnd = jQuery.Event( "YTPEnd" ); 1612 YTPEnd.time = YTPlayer.currentTime; 1613 jQuery( YTPlayer ).trigger( YTPEnd ); 1614 //YTPlayer.state = 0; 1615 1616 return; 1617 } 1618 1619 }
1619 else if( !data.loop || ( data.loop > 0 && YTPlayer.player.loopTime === data.loop - 1 ) ) { 1620 1621 YTPlayer.player.loopTime = undefined; 1622 YTPlayer.preventTrigger = true; 1623 YTPlayer.state = 2; 1624 jQuery( YTPlayer ).YTPPause(); 1625 1626 YTPlayer.wrapper.CSSAnimate( { 1627 opacity: 0 1628 }, YTPlayer.opt.fadeOnStartTime, function() { 1629 1630 if( YTPlayer.controlBar.length ) 1631 YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play ); 1632 1633 var YTPEnd = jQuery.Event( "YTPEnd" ); 1634 YTPEnd.time = YTPlayer.currentTime; 1635 jQuery( YTPlayer ).trigger( YTPEnd ); 1636 1637 YTPlayer.player.seekTo( startAt, true ); 1638 if( !YTPlayer.isBackground ) { 1639 if( YTPlayer.opt.backgroundUrl && YTPlayer.isPlayer ) { 1640 YTPlayer.opt.backgroundUrl = YTPlayer.opt.backgroundUrl || YTPlayer.orig_background; 1641 YTPlayer.opt.containment.css( { 1642 background: "url(" + YTPlayer.opt.backgroundUrl + ") center center", 1643 backgroundSize: "cover" 1644 } ); 1645 } 1646 } else { 1647 if( YTPlayer.orig_background ) 1648 jQuery( YTPlayer ).css( "background-image", YTPlayer.orig_background ); 1649 } 1650 } ); 1651 1652 return; 1653 1654 } 1655 1656 YTPlayer.player.loopTime = YTPlayer.player.loopTime ? ++YTPlayer.player.loopTime : 1; 1657 startAt = startAt || 1; 1658 YTPlayer.preventTrigger = true; 1659 YTPlayer.state = 2; 1660 jQuery( YTPlayer ).YTPPause(); 1661 YTPlayer.player.seekTo( startAt, true ); 1662 $YTPlayer.YTPPlay(); 1663 1664 1665 } 1666 }, interval ); 1667 }, 1668 /** 1669 * 1670 * @returns {string} time 1671 */ 1672 getTime: function() { 1673 var YTPlayer = this.get( 0 ); 1674 return jQuery.mbYTPlayer.formatTime( YTPlayer.currentTime ); 1675 }, 1676 /** 1677 * 1678 * @returns {string} total time 1679 */ 1680 getTotalTime: function() { 1681 var YTPlayer = this.get( 0 ); 1682 return jQuery.mbYTPlayer.formatTime( YTPlayer.totalTime ); 1683 }, 1684 /** 1685 * 1686 * @param YTPlayer 1687 */ 1688 checkForStart: function( YTPlayer ) { 1689 1690 var $YTPlayer = jQuery( YTPlayer ); 1691 1692 //Checking if player has been removed from scene 1693 if( !jQuery.contains( document, YTPlayer ) ) { 1694 jQuery( YTPlayer ).YTPPlayerDestroy(); 1695 return 1696 } 1697 1698 YTPlayer.preventTrigger = true; 1699 YTPlayer.state = 2; 1700 jQuery( YTPlayer ).YTPPause(); 1701 1702 jQuery( YTPlayer ).muteYTPVolume(); 1703 jQuery( "#controlBar_" + YTPlayer.id ).remove(); 1704 1705 YTPlayer.controlBar = false; 1706 1707 if( YTPlayer.opt.showControls ) 1708 jQuery.mbYTPlayer.buildControls( YTPlayer ); 1709 1710 if( YTPlayer.opt.addRaster ) { 1711 1712 var classN = YTPlayer.opt.addRaster == "dot" ? "raster-dot" : "raster"; 1713 YTPlayer.overlay.addClass( YTPlayer.isRetina ? classN + " retina" : classN ); 1714 1715 } else { 1716 1717 YTPlayer.overlay.removeClass( function( index, classNames ) { 1718 // change the list into an array 1719 var current_classes = classNames.split( " " ), 1720 // array of classes which are to be removed 1721 classes_to_remove = []; 1722 jQuery.each( current_classes, function( index, class_name ) { 1723 // if the classname begins with bg add it to the classes_to_remove array 1724 if( /raster.*/.test( class_name ) ) { 1725 classes_to_remove.push( class_name ); 1726 } 1727 } ); 1728 classes_to_remove.push( "retina" ); 1729 // turn the array back into a string 1730 return classes_to_remove.join( " " ); 1731 } ) 1732 1733 } 1734 1735 var startAt = YTPlayer.start_from_last ? YTPlayer.start_from_last : YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1; 1736 1737 YTPlayer.start_from_last = null; 1738 1739 YTPlayer.player.playVideo(); 1740 YTPlayer.player.seekTo( startAt, true ); 1741 1742 clearInterval( YTPlayer.checkForStartAt ); 1743 YTPlayer.checkForStartAt = setInterval( function() { 1744 1745 jQuery( YTPlayer ).YTPMute(); 1746 1747 var canPlayVideo = YTPlayer.player.getVideoLoadedFraction() >= startAt / YTPlayer.player.getDuration(); 1748 1749 if( YTPlayer.player.getDuration() > 0 && YTPlayer.player.getCurrentTime() >= startAt && canPlayVideo ) { 1750 1751 clearInterval( YTPlayer.checkForStartAt ); 1752 1753 if( typeof YTPlayer.opt.onReady == "function" ) 1754 YTPlayer.opt.onReady( YTPlayer ); 1755 1756 YTPlayer.isReady = true; 1757 1758 var YTPready = jQuery.Event( "YTPReady" ); 1759 YTPready.time = YTPlayer.currentTime; 1760 jQuery( YTPlayer ).trigger( YTPready ); 1761 1762 YTPlayer.preventTrigger = true; 1763 YTPlayer.state = 2; 1764 jQuery( YTPlayer ).YTPPause(); 1765 1766 if( !YTPlayer.opt.mute ) 1767 jQuery( YTPlayer ).YTPUnmute(); 1768 YTPlayer.canTrigger = true; 1769 1770 if( YTPlayer.opt.autoPlay ) { 1771 1772 var YTPStart = jQuery.Event( "YTPStart" ); 1773 YTPStart.time = YTPlayer.currentTime; 1774 jQuery( YTPlayer ).trigger( YTPStart ); 1775 1776 jQuery( YTPlayer.playerEl ).css( { 1777 opacity: 1 1778 } ); 1779 1780 $YTPlayer.YTPPlay(); 1781 1782 YTPlayer.wrapper.css( { 1783 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 1784 });
1785 1786 /* Fix for Safari freeze */ 1787 1788 if( jQuery.mbBrowser.os.name == "mac" && jQuery.mbBrowser.safari && jQuery.mbBrowser.versionCompare( jQuery.mbBrowser.fullVersion, "10.1" ) < 0 ) { //jQuery.mbBrowser.os.minor_version < 11 1789 1790 YTPlayer.safariPlay = setInterval( function() { 1791 if( YTPlayer.state != 1 ) 1792 $YTPlayer.YTPPlay(); 1793 else 1794 clearInterval( YTPlayer.safariPlay ) 1795 }, 10 ) 1796 } 1797 $YTPlayer.one( "YTPReady", function() { 1798 $YTPlayer.YTPPlay(); 1799 } ); 1800 1801 } else { 1802 1803 //$YTPlayer.YTPPause(); 1804 YTPlayer.player.pauseVideo(); 1805 if( !YTPlayer.isPlayer ) { 1806 jQuery( YTPlayer.playerEl ).css( { 1807 opacity: 1 1808 } ); 1809 1810 YTPlayer.wrapper.css( { 1811 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 1812 }); 1813 } 1814 1815 if( YTPlayer.controlBar.length ) 1816 YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play ); 1817 } 1818 1819 if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay && ( YTPlayer.loading && YTPlayer.loading.length ) ) { 1820 YTPlayer.loading.html( "Ready" ); 1821 setTimeout( function() { 1822 YTPlayer.loading.fadeOut(); 1823 }, 100 ) 1824 } 1825 1826 if( YTPlayer.controlBar && YTPlayer.controlBar.length ) 1827 YTPlayer.controlBar.slideDown( 1000 ); 1828 1829 } else if( jQuery.mbBrowser.os.name == "mac" && jQuery.mbBrowser.safari && jQuery.mbBrowser.fullVersion && jQuery.mbBrowser.versionCompare( jQuery.mbBrowser.fullVersion, "10.1" ) < 0 ) { //jQuery.mbBrowser.os.minor_version < 11 1830 YTPlayer.player.playVideo(); 1831 if( startAt >= 0 ) 1832 YTPlayer.player.seekTo( startAt, true ); 1833 } 1834 1835 }, 10 ); 1836 1837 }, 1838 /** 1839 * 1840 * @param anchor 1841 */ 1842 setAnchor: function( anchor ) { 1843 var $YTplayer = this; 1844 $YTplayer.optimizeDisplay( anchor ); 1845 }, 1846 /** 1847 * 1848 * @param anchor 1849 */ 1850 getAnchor: function() { 1851 var YTPlayer = this.get( 0 ); 1852 return YTPlayer.opt.anchor; 1853 }, 1854 /** 1855 * 1856 * @param s 1857 * @returns {string} 1858 */ 1859 formatTime: function( s ) { 1860 var min = Math.floor( s / 60 ); 1861 var sec = Math.floor( s - ( 60 * min ) ); 1862 return( min <= 9 ? "0" + min : min ) + " : " + ( sec <= 9 ? "0" + sec : sec ); 1863 } 1864 }; 1865 1866 /** 1867 * 1868 * @param anchor 1869 * can be center, top, bottom, right, left; (default is center,center) 1870 */ 1871 jQuery.fn.optimizeDisplay = function( anchor ) { 1872 var YTPlayer = this.get( 0 ); 1873 var playerBox = jQuery( YTPlayer.playerEl ); 1874 var vid = {}; 1875 1876 YTPlayer.opt.anchor = anchor || YTPlayer.opt.anchor; 1877 1878 YTPlayer.opt.anchor = typeof YTPlayer.opt.anchor != "undefined " ? YTPlayer.opt.anchor : "center,center"; 1879 var YTPAlign = YTPlayer.opt.anchor.split( "," ); 1880 1881 //data.optimizeDisplay = YTPlayer.isPlayer ? false : data.optimizeDisplay; 1882 1883 if( YTPlayer.opt.optimizeDisplay ) { 1884 var abundance = YTPlayer.isPlayer ? 0 : 80; 1885 var win = {}; 1886 var el = YTPlayer.wrapper; 1887 1888 win.width = el.outerWidth(); 1889 win.height = el.outerHeight() + abundance; 1890 1891 YTPlayer.opt.ratio = eval( YTPlayer.opt.ratio ); 1892 1893 vid.width = win.width; 1894 // vid.height = YTPlayer.opt.ratio == "16/9" ? Math.ceil( vid.width * ( 9 / 16 ) ) : Math.ceil( vid.width * ( 3 / 4 ) ); 1895 vid.height = Math.ceil( vid.width / YTPlayer.opt.ratio ); 1896 1897 vid.marginTop = Math.ceil( -( ( vid.height - win.height ) / 2 ) ); 1898 vid.marginLeft = 0; 1899 1900 var lowest = vid.height < win.height; 1901 1902 if( lowest ) { 1903 1904 vid.height = win.height; 1905 // vid.width = YTPlayer.opt.ratio == "16/9" ? Math.floor( vid.height * ( 16 / 9 ) ) : Math.floor( vid.height * ( 4 / 3 ) ); 1906 vid.width = Math.ceil( vid.height * YTPlayer.opt.ratio ); 1907 1908 vid.marginTop = 0; 1909 vid.marginLeft = Math.ceil( -( ( vid.width - win.width ) / 2 ) ); 1910 1911 } 1912 1913 for( var a in YTPAlign ) { 1914 1915 if( YTPAlign.hasOwnProperty( a ) ) { 1916 1917 var al = YTPAlign[ a ].replace( / /g, "" ); 1918 1919 switch( al ) { 1920 1921 case "top": 1922 vid.marginTop = lowest ? -( ( vid.height - win.height ) / 2 ) : 0; 1923 break; 1924 1925 case "bottom": 1926 vid.marginTop = lowest ? 0 : -( vid.height - ( win.height ) ); 1927 break; 1928
1929 case "left": 1930 vid.marginLeft = 0; 1931 break; 1932 1933 case "right": 1934 vid.marginLeft = lowest ? -( vid.width - win.width ) : 0; 1935 break; 1936 1937 default: 1938 if( vid.width > win.width ) 1939 vid.marginLeft = -( ( vid.width - win.width ) / 2 ); 1940 break; 1941 } 1942 1943 } 1944 1945 } 1946 1947 } else { 1948 vid.width = "100%"; 1949 vid.height = "100%"; 1950 vid.marginTop = 0; 1951 vid.marginLeft = 0; 1952 } 1953 1954 playerBox.css( { 1955 width: vid.width, 1956 height: vid.height, 1957 marginTop: vid.marginTop, 1958 marginLeft: vid.marginLeft, 1959 maxWidth: "initial" 1960 } ); 1961 1962 }; 1963 /** 1964 * 1965 * @param arr 1966 * @returns {Array|string|Blob|*} 1967 * 1968 */ 1969 jQuery.shuffle = function( arr ) { 1970 var newArray = arr.slice(); 1971 var len = newArray.length; 1972 var i = len; 1973 while( i-- ) { 1974 var p = parseInt( Math.random() * len ); 1975 var t = newArray[ i ]; 1976 newArray[ i ] = newArray[ p ]; 1977 newArray[ p ] = t; 1978 } 1979 return newArray; 1980 }; 1981 1982 jQuery.fn.unselectable = function() { 1983 return this.each( function() { 1984 jQuery( this ).css( { 1985 "-moz-user-select": "none", 1986 "-webkit-user-select": "none", 1987 "user-select": "none" 1988 } ).attr( "unselectable", "on" ); 1989 } ); 1990 }; 1991 1992 /* Exposed public method */ 1993 jQuery.fn.YTPlayer = jQuery.mbYTPlayer.buildPlayer; 1994 jQuery.fn.YTPGetPlayer = jQuery.mbYTPlayer.getPlayer; 1995 jQuery.fn.YTPGetVideoID = jQuery.mbYTPlayer.getVideoID; 1996 jQuery.fn.YTPChangeMovie = jQuery.mbYTPlayer.changeMovie; 1997 jQuery.fn.YTPPlayerDestroy = jQuery.mbYTPlayer.playerDestroy; 1998 1999 jQuery.fn.YTPPlay = jQuery.mbYTPlayer.play; 2000 jQuery.fn.YTPTogglePlay = jQuery.mbYTPlayer.togglePlay; 2001 jQuery.fn.YTPStop = jQuery.mbYTPlayer.stop; 2002 jQuery.fn.YTPPause = jQuery.mbYTPlayer.pause; 2003 jQuery.fn.YTPSeekTo = jQuery.mbYTPlayer.seekTo; 2004 2005 jQuery.fn.YTPlaylist = jQuery.mbYTPlayer.playlist; 2006 jQuery.fn.YTPPlayNext = jQuery.mbYTPlayer.playNext; 2007 jQuery.fn.YTPPlayPrev = jQuery.mbYTPlayer.playPrev; 2008 jQuery.fn.YTPPlayIndex = jQuery.mbYTPlayer.playIndex; 2009 2010 jQuery.fn.YTPMute = jQuery.mbYTPlayer.mute; 2011 jQuery.fn.YTPUnmute = jQuery.mbYTPlayer.unmute; 2012 jQuery.fn.YTPToggleVolume = jQuery.mbYTPlayer.toggleVolume; 2013 jQuery.fn.YTPSetVolume = jQuery.mbYTPlayer.setVolume; 2014 2015 jQuery.fn.YTPGetVideoData = jQuery.mbYTPlayer.getVideoData; 2016 jQuery.fn.YTPFullscreen = jQuery.mbYTPlayer.fullscreen;
2017 jQuery.fn.YTPToggleLoops = jQuery.mbYTPlayer.toggleLoops; 2018 jQuery.fn.YTPSetVideoQuality = jQuery.mbYTPlayer.setVideoQuality; 2019 jQuery.fn.YTPManageProgress = jQuery.mbYTPlayer.manageProgress; 2020 2021 jQuery.fn.YTPApplyFilter = jQuery.mbYTPlayer.applyFilter; 2022 jQuery.fn.YTPApplyFilters = jQuery.mbYTPlayer.applyFilters; 2023 jQuery.fn.YTPToggleFilter = jQuery.mbYTPlayer.toggleFilter; 2024 jQuery.fn.YTPToggleFilters = jQuery.mbYTPlayer.toggleFilters; 2025 jQuery.fn.YTPRemoveFilter = jQuery.mbYTPlayer.removeFilter; 2026 jQuery.fn.YTPDisableFilters = jQuery.mbYTPlayer.disableFilters; 2027 jQuery.fn.YTPEnableFilters = jQuery.mbYTPlayer.enableFilters; 2028 jQuery.fn.YTPGetFilters = jQuery.mbYTPlayer.getFilters; 2029 2030 jQuery.fn.YTPGetTime = jQuery.mbYTPlayer.getTime; 2031 jQuery.fn.YTPGetTotalTime = jQuery.mbYTPlayer.getTotalTime; 2032 2033 jQuery.fn.YTPAddMask = jQuery.mbYTPlayer.addMask; 2034 jQuery.fn.YTPRemoveMask = jQuery.mbYTPlayer.removeMask; 2035 jQuery.fn.YTPToggleMask = jQuery.mbYTPlayer.toggleMask; 2036 2037 jQuery.fn.YTPSetAnchor = jQuery.mbYTPlayer.setAnchor; 2038 jQuery.fn.YTPGetAnchor = jQuery.mbYTPlayer.getAnchor; 2039 2040 /** 2041 * 2042 * @deprecated 2043 * todo: Above methods will be removed with version 3.5.0 2044 * 2045 **/ 2046 jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer; 2047 jQuery.fn.playNext = jQuery.mbYTPlayer.playNext; 2048 jQuery.fn.playPrev = jQuery.mbYTPlayer.playPrev; 2049 jQuery.fn.changeMovie = jQuery.mbYTPlayer.changeMovie; 2050 jQuery.fn.getVideoID = jQuery.mbYTPlayer.getVideoID; 2051 jQuery.fn.getPlayer = jQuery.mbYTPlayer.getPlayer; 2052 jQuery.fn.playerDestroy = jQuery.mbYTPlayer.playerDestroy; 2053 jQuery.fn.fullscreen = jQuery.mbYTPlayer.fullscreen;
vendor: 5,513 bytes, lines 2054-2090
2054 jQuery.fn.buildYTPControls = jQuery.mbYTPlayer.buildControls; 2055 jQuery.fn.playYTP = jQuery.mbYTPlayer.play; 2056 jQuery.fn.toggleLoops = jQuery.mbYTPlayer.toggleLoops; 2057 jQuery.fn.stopYTP = jQuery.mbYTPlayer.stop; 2058 jQuery.fn.pauseYTP = jQuery.mbYTPlayer.pause; 2059 jQuery.fn.seekToYTP = jQuery.mbYTPlayer.seekTo; 2060 jQuery.fn.muteYTPVolume = jQuery.mbYTPlayer.mute; 2061 jQuery.fn.unmuteYTPVolume = jQuery.mbYTPlayer.unmute; 2062 jQuery.fn.setYTPVolume = jQuery.mbYTPlayer.setVolume; 2063 jQuery.fn.setVideoQuality = jQuery.mbYTPlayer.setVideoQuality; 2064 jQuery.fn.manageYTPProgress = jQuery.mbYTPlayer.manageProgress; 2065 jQuery.fn.YTPGetDataFromFeed = jQuery.mbYTPlayer.getVideoData; 2066 2067 2068} )( jQuery, ytp ); 2069; 2070/* 2071 * ****************************************************************************** 2072 * jquery.mb.components 2073 * file: jquery.mb.CSSAnimate.min.js 2074 * 2075 * Copyright (c) 2001-2014. Matteo Bicocchi (Pupunzi); 2076 * Open lab srl, Firenze - Italy 2077 * email: [email protected] 2078 * site: http://pupunzi.com 2079 * blog: http://pupunzi.open-lab.com 2080 * http://open-lab.com 2081 * 2082 * Licences: MIT, GPL 2083 * http://www.opensource.org/licenses/mit-license.php 2084 * http://www.gnu.org/licenses/gpl.html 2085 * 2086 * last modified: 26/03/14 21.40 2087 * ***************************************************************************** 2088 */ 2089 2090function uncamel(e){return e.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}function setUnit(e,t){return"string"!=typeof e||e.match(/^[\-0-9\.]+jQuery/)?""+e+t:e}function setFilter(e,t,r){var i=uncamel(t),n=jQuery.browser.mozilla?"":jQuery.CSS.sfx;e[n+"filter"]=e[n+"filter"]||"",r=setUnit(r>jQuery.CSS.filters[t].max?jQuery.CSS.filters[t].max:r,jQuery.CSS.filters[t].unit),e[n+"filter"]+=i+"("+r+") ",delete e[t]}jQuery.support.CSStransition=function(){var e=document.body||document.documentElement,t=e.style;return void 0!==t.transition||void 0!==t.WebkitTransition||void 0!==t.MozTransition||void 0!==t.MsTransition||void 0!==t.OTransition}(),jQuery.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(e){var t=jQuery.extend(!0,{},e);jQuery.browser.webkit||jQuery.browser.opera?jQuery.CSS.sfx="-webkit-":jQuery.browser.mozilla?jQuery.CSS.sfx="-moz-":jQuery.browser.msie&&(jQuery.CSS.sfx="-ms-");for(var r in t){"transform"===r&&(t[jQuery.CSS.sfx+"transform"]=t[r],delete t[r]),"transform-origin"===r&&(t[jQuery.CSS.sfx+"transform-origin"]=e[r],delete t[r]),"filter"!==r||jQuery.browser.mozilla||(t[jQuery.CSS.sfx+"filter"]=e[r],delete t[r]),"blur"===r&&setFilter(t,"blur",e[r]),"brightness"===r&&setFilter(t,"brightness",e[r]),"contrast"===r&&setFilter(t,"contrast",e[r]),"grayscale"===r&&setFilter(t,"grayscale",e[r]),"hueRotate"===r&&setFilter(t,"hueRotate",e[r]),"invert"===r&&setFilter(t,"invert",e[r]),"saturate"===r&&setFilter(t,"saturate",e[r]),"sepia"===r&&setFilter(t,"sepia",e[r]);var i="";"x"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" translateX("+setUnit(e[r],"px")+")",delete t[r]),"y"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" translateY("+setUnit(e[r],"px")+")",delete t[r]),"z"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" translateZ("+setUnit(e[r],"px")+")",delete t[r]),"rotate"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" rotate("+setUnit(e[r],"deg")+")",delete t[r]),"rotateX"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" rotateX("+setUnit(e[r],"deg")+")",delete t[r]),"rotateY"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" rotateY("+setUnit(e[r],"deg")+")",delete t[r]),"rotateZ"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" rotateZ("+setUnit(e[r],"deg")+")",delete t[r]),"scale"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" scale("+setUnit(e[r],"")+")",delete t[r]),"scaleX"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" scaleX("+setUnit(e[r],"")+")",delete t[r]),"scaleY"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" scaleY("+setUnit(e[r],"")+")",delete t[r]),"scaleZ"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" scaleZ("+setUnit(e[r],"")+")",delete t[r]),"skew"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" skew("+setUnit(e[r],"deg")+")",delete t[r]),"skewX"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" skewX("+setUnit(e[r],"deg")+")",delete t[r]),"skewY"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" skewY("+setUnit(e[r],"deg")+")",delete t[r]),"perspective"===r&&(i=jQuery.CSS.sfx+"transform",t[i]=t[i]||"",t[i]+=" perspective("+setUnit(e[r],"px")+")",delete t[r])}return t},getProp:function(e){var t=[];for(var r in e)t.indexOf(r)<0&&t.push(uncamel(r));return t.join(",")},animate:function(e,t,r,i,n){return this.each(function(){function s(){u.called=!0,u.CSSAIsRunning=!1,a.off(jQuery.CSS.transitionEnd+"."+u.id),clearTimeout(u.timeout),a.css(jQuery.CSS.sfx+"transition",""),"function"==typeof n&&n.apply(u),"function"==typeof u.CSSqueue&&(u.CSSqueue(),u.CSSqueue=null)}var u=this,a=jQuery(this);u.id=u.id||"CSSA_"+(new Date).getTime();var o=o||{type:"noEvent"};if(u.CSSAIsRunning&&u.eventType==o.type&&!jQuery.browser.msie&&jQuery.browser.version<=9)return void(u.CSSqueue=function(){a.CSSAnimate(e,t,r,i,n)});
2090if(u.CSSqueue=null,u.eventType=o.type,0!==a.length&&e){if(e=jQuery.normalizeCss(e),u.CSSAIsRunning=!0,"function"==typeof t&&(n=t,t=jQuery.fx.speeds._default),"function"==typeof r&&(i=r,r=0),"string"==typeof r&&(n=r,r=0),"function"==typeof i&&(n=i,i="cubic-bezier(0.65,0.03,0.36,0.72)"),"string"==typeof t)for(var f in jQuery.fx.speeds){if(t==f){t=jQuery.fx.speeds[f];break}t=jQuery.fx.speeds._default}if(t||(t=jQuery.fx.speeds._default),"string"==typeof n&&(i=n,n=null),!jQuery.support.CSStransition){for(var c in e){if("transform"===c&&delete e[c],"filter"===c&&delete e[c],"transform-origin"===c&&delete e[c],"auto"===e[c]&&delete e[c],"x"===c){var S=e[c],l="left";e[l]=S,delete e[c]}if("y"===c){var S=e[c],l="top";e[l]=S,delete e[c]}("-ms-transform"===c||"-ms-filter"===c)&&delete e[c]}return void a.delay(r).animate(e,t,n)}var y={"default":"ease","in":"ease-in",out:"ease-out","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)",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)"};y[i]&&(i=y[i]),a.off(jQuery.CSS.transitionEnd+"."+u.id);var m=jQuery.CSS.getProp(e),d={};jQuery.extend(d,e),d[jQuery.CSS.sfx+"transition-property"]=m,d[jQuery.CSS.sfx+"transition-duration"]=t+"ms",d[jQuery.CSS.sfx+"transition-delay"]=r+"ms",d[jQuery.CSS.sfx+"transition-timing-function"]=i,setTimeout(function(){a.one(jQuery.CSS.transitionEnd+"."+u.id,s),a.css(d)},1),u.timeout=setTimeout(function(){return u.called||!n?(u.called=!1,void(u.CSSAIsRunning=!1)):(a.css(jQuery.CSS.sfx+"transition",""),n.apply(u),u.CSSAIsRunning=!1,void("function"==typeof u.CSSqueue&&(u.CSSqueue(),u.CSSqueue=null)))},t+r+10)}})}},jQuery.fn.CSSAnimate=jQuery.CSS.animate,jQuery.normalizeCss=jQuery.CSS.normalizeCss,jQuery.fn.css3=function(e){return this.each(function(){var t=jQuery(this),r=jQuery.normalizeCss(e);t.css(r)})}; 2091;/*___________________________________________________________________________________________________________________________________________________ 2092 _ jquery.mb.components _ 2093 _ _ 2094 _ file: jquery.mb.browser.min.js _ 2095 _ last modified: 24/05/17 19.56 _ 2096 _ _ 2097 _ Open Lab s.r.l., Florence - Italy _ 2098 _ _ 2099 _ email: [email protected] _
vendor: 16,789 bytes, lines 2100-2173
2100 _ site: http://pupunzi.com _ 2101 _ http://open-lab.com _ 2102 _ blog: http://pupunzi.open-lab.com _ 2103 _ Q&A: http://jquery.pupunzi.com _ 2104 _ _ 2105 _ Licences: MIT, GPL _ 2106 _ http://www.opensource.org/licenses/mit-license.php _ 2107 _ http://www.gnu.org/licenses/gpl.html _ 2108 _ _ 2109 _ Copyright (c) 2001-2017. Matteo Bicocchi (Pupunzi); _ 2110 ___________________________________________________________________________________________________________________________________________________*/ 2111 2112var 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} 2113var 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)&& 2114(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}; 2115jQuery.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; 2116if(-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", 2117 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= 2118 !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= 2119 "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= 2120 !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)); 2121-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)); 2122jQuery.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); 2123jQuery.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; 2124jQuery.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}; 2125;/*___________________________________________________________________________________________________________________________________________________ 2126 _ jquery.mb.components _ 2127 _ _ 2128 _ file: jquery.mb.simpleSlider.min.js _ 2129 _ last modified: 09/05/17 19.31 _ 2130 _ _ 2131 _ Open Lab s.r.l., Florence - Italy _ 2132 _ _ 2133 _ email: [email protected] _ 2134 _ site: http://pupunzi.com _ 2135 _ http://open-lab.com _ 2136 _ blog: http://pupunzi.open-lab.com _ 2137 _ Q&A: http://jquery.pupunzi.com _ 2138 _ _ 2139 _ Licences: MIT, GPL _ 2140 _ http://www.opensource.org/licenses/mit-license.php _ 2141 _ http://www.gnu.org/licenses/gpl.html _ 2142 _ _ 2143 _ Copyright (c) 2001-2017. Matteo Bicocchi (Pupunzi); _ 2144 ___________________________________________________________________________________________________________________________________________________*/ 2145 2146(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); 2147 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"});c.preventDefault();c.stopPropagation()}),b(document).on(b.simpleSlider.events.move,function(c){b.browser.mobile&&(c=c.changedTouches[0]);a.canSlide&&(b(document).css({cursor:"default"}), 2148 d.updateSliderVal(c),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:"number"==typeof c?c*d/a.opt.scale:a.opt.initialval*d/a.opt.scale; 2149 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?a.outOfRangeX:a.outOfRangeY;a.value="undefined"!=typeof c? 2150 "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); 2151;/*___________________________________________________________________________________________________________________________________________________ 2152 _ jquery.mb.components _ 2153 _ _ 2154 _ file: jquery.mb.storage.min.js _ 2155 _ last modified: 24/05/15 16.08 _ 2156 _ _ 2157 _ Open Lab s.r.l., Florence - Italy _ 2158 _ _ 2159 _ email: [email protected] _ 2160 _ site: http://pupunzi.com _ 2161 _ http://open-lab.com _ 2162 _ blog: http://pupunzi.open-lab.com _ 2163 _ Q&A: http://jquery.pupunzi.com _ 2164 _ _ 2165 _ Licences: MIT, GPL _ 2166 _ http://www.opensource.org/licenses/mit-license.php _ 2167 _ http://www.gnu.org/licenses/gpl.html _ 2168 _ _ 2169 _ Copyright (c) 2001-2015. Matteo Bicocchi (Pupunzi); _ 2170 ___________________________________________________________________________________________________________________________________________________*/ 2171 2172(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}, 2173 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.