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