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