1/*___________________________________________________________________________________________________________________________________________________ 2 _ jquery.mb.components _ 3 _ _ 4 _ file: jquery.mb.YTPlayer.src.js _ 5 _ last modified: 01/07/15 19.35 _ 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-2015. Matteo Bicocchi (Pupunzi); _ 20 ___________________________________________________________________________________________________________________________________________________*/ 21var ytp = ytp || {}; 22 23function onYouTubeIframeAPIReady() { 24 if( ytp.YTAPIReady ) return; 25 ytp.YTAPIReady = true; 26 jQuery( document ).trigger( "YTAPIReady" ); 27} 28 29var getYTPVideoID = function( url ) { 30 var videoID, playlistID; 31 if( url.indexOf( "youtu.be" ) > 0 ) { 32 videoID = url.substr( url.lastIndexOf( "/" ) + 1, url.length ); 33 playlistID = videoID.indexOf( "?list=" ) > 0 ? videoID.substr( videoID.lastIndexOf( "=" ), videoID.length ) : null; 34 videoID = playlistID ? videoID.substr( 0, videoID.lastIndexOf( "?" ) ) : videoID; 35 } else if( url.indexOf( "http" ) > -1 ) { 36 //videoID = url.match( /([\/&]v\/([^&#]*))|([\\?&]v=([^&#]*))/ )[ 1 ]; 37 videoID = url.match( /[\\?&]v=([^&#]*)/ )[ 1 ]; 38 playlistID = url.indexOf( "list=" ) > 0 ? url.match( /[\\?&]list=([^&#]*)/ )[ 1 ] : null; 39 } else { 40 videoID = url.length > 15 ? null : url; 41 playlistID = videoID ? null : url; 42 } 43 return { 44 videoID: videoID, 45 playlistID: playlistID 46 }; 47}; 48 49( function( jQuery, ytp ) { 50 51 jQuery.mbYTPlayer = { 52 name: "jquery.mb.YTPlayer", 53 version: "2.9.7", 54 build: "5748", 55 author: "Matteo Bicocchi", 56 apiKey: "", 57 defaults: { 58 containment: "body", 59 ratio: "auto", // "auto", "16/9", "4/3" 60 videoURL: null, 61 playlistURL: null, 62 startAt: 0, 63 stopAt: 0, 64 autoPlay: true, 65 vol: 50, // 1 to 100 66 addRaster: false, 67 opacity: 1, 68 quality: "default", //or âsmallâ, âmediumâ, âlargeâ, âhd720â, âhd1080â, âhighresâ 69 mute: false, 70 loop: true, 71 showControls: true, 72 showAnnotations: false, 73 showYTLogo: true, 74 stopMovieOnBlur: true, 75 realfullscreen: true, 76 gaTrack: true, 77 optimizeDisplay: true, 78 onReady: function( player ) {} 79 }, 80 /* @fontface icons */ 81 controls: { 82 play: "P", 83 pause: "p", 84 mute: "M", 85 unmute: "A", 86 onlyYT: "O", 87 showSite: "R", 88 ytLogo: "Y" 89 }, 90 locationProtocol: "https:", 91 /** 92 * 93 * @param options 94 * @returns [players] 95 */ 96 buildPlayer: function( options ) { 97 return this.each( function() { 98 var YTPlayer = this; 99 var $YTPlayer = jQuery( YTPlayer ); 100 YTPlayer.loop = 0; 101 YTPlayer.opt = {}; 102 YTPlayer.state = {}; 103 YTPlayer.filtersEnabled = true; 104 YTPlayer.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 $YTPlayer.addClass( "mb_YTPlayer" ); 143 var property = $YTPlayer.data( "property" ) && typeof $YTPlayer.data( "property" ) == "string" ? eval( '(' + $YTPlayer.data( "property" ) + ')' ) : $YTPlayer.data( "property" ); 144 if( typeof property != "undefined" && typeof property.vol != "undefined" ) property.vol = property.vol === 0 ? property.vol = 1 : property.vol; 145 146 jQuery.extend( YTPlayer.opt, jQuery.mbYTPlayer.defaults, options, property ); 147 148 if( !YTPlayer.hasChanged ) { 149 YTPlayer.defaultOpt = {}; 150 jQuery.extend( YTPlayer.defaultOpt, jQuery.mbYTPlayer.defaults, options, property ); 151 } 152 153 if( YTPlayer.opt.loop == "true" ) 154 YTPlayer.opt.loop = 9999; 155 156 YTPlayer.isRetina = ( window.retina || window.devicePixelRatio > 1 ); 157 var isIframe = function() { 158 var isIfr = false;
159 try { 160 if( self.location.href != top.location.href ) isIfr = true; 161 } catch( e ) { 162 isIfr = true; 163 } 164 return isIfr; 165 }; 166 YTPlayer.canGoFullScreen = !( jQuery.browser.msie || jQuery.browser.opera || isIframe() ); 167 if( !YTPlayer.canGoFullScreen ) YTPlayer.opt.realfullscreen = false; 168 if( !$YTPlayer.attr( "id" ) ) $YTPlayer.attr( "id", "video_" + new Date().getTime() ); 169 var playerID = "mbYTP_" + YTPlayer.id; 170 YTPlayer.isAlone = false; 171 YTPlayer.hasFocus = true; 172 var videoID = this.opt.videoURL ? getYTPVideoID( this.opt.videoURL ).videoID : $YTPlayer.attr( "href" ) ? getYTPVideoID( $YTPlayer.attr( "href" ) ).videoID : false; 173 var playlistID = this.opt.videoURL ? getYTPVideoID( this.opt.videoURL ).playlistID : $YTPlayer.attr( "href" ) ? getYTPVideoID( $YTPlayer.attr( "href" ) ).playlistID : false; 174 YTPlayer.videoID = videoID; 175 YTPlayer.playlistID = playlistID; 176 YTPlayer.opt.showAnnotations = ( YTPlayer.opt.showAnnotations ) ? '0' : '3'; 177 var playerVars = { 178 'autoplay': 0, 179 'modestbranding': 1, 180 'controls': 0, 181 'showinfo': 0, 182 'rel': 0, 183 'enablejsapi': 1, 184 'version': 3, 185 'playerapiid': playerID, 186 'origin': '*', 187 'allowfullscreen': true, 188 'wmode': 'transparent', 189 'iv_load_policy': YTPlayer.opt.showAnnotations 190 }; 191 if( document.createElement( 'video' ).canPlayType ) jQuery.extend( playerVars, { 192 'html5': 1 193 } ); 194 if( jQuery.browser.msie && jQuery.browser.version < 9 ) this.opt.opacity = 1; 195 var playerBox = jQuery( "<div/>" ).attr( "id", playerID ).addClass( "playerBox" ); 196 var overlay = jQuery( "<div/>" ).css( { 197 position: "absolute", 198 top: 0, 199 left: 0, 200 width: "100%", 201 height: "100%" 202 } ).addClass( "YTPOverlay" ); 203 YTPlayer.isSelf = YTPlayer.opt.containment == "self"; 204 YTPlayer.defaultOpt.containment = YTPlayer.opt.containment = YTPlayer.opt.containment == "self" ? jQuery( this ) : jQuery( YTPlayer.opt.containment ); 205 YTPlayer.isBackground = YTPlayer.opt.containment.get( 0 ).tagName.toLowerCase() == "body"; 206 if( YTPlayer.isBackground && ytp.backgroundIsInited ) return; 207 var isPlayer = YTPlayer.opt.containment.is( jQuery( this ) ); 208 YTPlayer.canPlayOnMobile = isPlayer && jQuery( this ).children().length === 0; 209 if( !isPlayer ) { 210 $YTPlayer.hide(); 211 } else { 212 YTPlayer.isPlayer = true; 213 } 214 if( jQuery.browser.mobile && !YTPlayer.canPlayOnMobile ) { 215 $YTPlayer.remove(); 216 return; 217 } 218 var wrapper = jQuery( "<div/>" ).addClass( "mbYTP_wrapper" ).attr( "id", "wrapper_" + playerID ); 219 wrapper.css( { 220 position: "absolute", 221 zIndex: 0, 222 minWidth: "100%", 223 minHeight: "100%", 224 left: 0, 225 top: 0, 226 overflow: "hidden", 227 opacity: 0 228 } ); 229 230 playerBox.css( { 231 position: "absolute", 232 zIndex: 0, 233 width: "100%", 234 height: "100%", 235 top: 0, 236 left: 0, 237 overflow: "hidden" 238 } ); 239 wrapper.append( playerBox ); 240 YTPlayer.opt.containment.children().not( "script, style" ).each( function() { 241 if( jQuery( this ).css( "position" ) == "static" ) jQuery( this ).css( "position", "relative" ); 242 } ); 243 if( YTPlayer.isBackground ) { 244 jQuery( "body" ).css( { 245 boxSizing: "border-box" 246 } ); 247 wrapper.css( { 248 position: "fixed", 249 top: 0, 250 left: 0, 251 zIndex: 0 252 } ); 253 $YTPlayer.hide(); 254 } else if( YTPlayer.opt.containment.css( "position" ) == "static" ) 255 YTPlayer.opt.containment.css( { 256 position: "relative" 257 } ); 258 259 YTPlayer.opt.containment.prepend( wrapper ); 260 YTPlayer.wrapper = wrapper; 261 playerBox.css( { 262 opacity: 1 263 } ); 264 if( !jQuery.browser.mobile ) { 265 playerBox.after( overlay ); 266 YTPlayer.overlay = overlay; 267 } 268 269 if( !YTPlayer.isBackground ) { 270 overlay.on( "mouseenter", function() { 271 if( YTPlayer.controlBar ) YTPlayer.controlBar.addClass( "visible" ); 272 } ).on( "mouseleave", function() { 273 if( YTPlayer.controlBar ) YTPlayer.controlBar.removeClass( "visible" ); 274 } ); 275 } 276 if( !ytp.YTAPIReady ) { 277 jQuery( "#YTAPI" ).remove(); 278 var tag = jQuery( "<script></script>" ).attr( { 279 "src": jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/iframe_api?v=" + jQuery.mbYTPlayer.version, 280 "id": "YTAPI" 281 } ); 282 jQuery( "head" ).prepend( tag ); 283 } else { 284 setTimeout( function() { 285 jQuery( document ).trigger( "YTAPIReady" ); 286 }, 100 ) 287 } 288 289 jQuery( document ).on( "YTAPIReady", function() {
290 if( ( YTPlayer.isBackground && ytp.backgroundIsInited ) || YTPlayer.isInit ) return; 291 if( YTPlayer.isBackground ) { 292 ytp.backgroundIsInited = true; 293 } 294 295 YTPlayer.opt.autoPlay = typeof YTPlayer.opt.autoPlay == "undefined" ? ( YTPlayer.isBackground ? true : false ) : YTPlayer.opt.autoPlay; 296 YTPlayer.opt.vol = YTPlayer.opt.vol ? YTPlayer.opt.vol : 100; 297 jQuery.mbYTPlayer.getDataFromAPI( YTPlayer ); 298 jQuery( YTPlayer ).on( "YTPChanged", function() { 299 if( YTPlayer.isInit ) return; 300 YTPlayer.isInit = true; 301 //if is mobile && isPlayer fallback to the default YT player 302 if( jQuery.browser.mobile && YTPlayer.canPlayOnMobile ) { 303 // Try to adjust the player dimention 304 if( YTPlayer.opt.containment.outerWidth() > jQuery( window ).width() ) { 305 YTPlayer.opt.containment.css( { 306 maxWidth: "100%" 307 } ); 308 var h = YTPlayer.opt.containment.outerWidth() * .6; 309 YTPlayer.opt.containment.css( { 310 maxHeight: h 311 } ); 312 } 313 new YT.Player( playerID, { 314 videoId: YTPlayer.videoID.toString(), 315 height: '100%', 316 width: '100%', 317 events: { 318 'onReady': function( event ) { 319 YTPlayer.player = event.target; 320 playerBox.css( { 321 opacity: 1 322 } ); 323 YTPlayer.wrapper.css( { 324 opacity: 1 325 } ); 326 } 327 } 328 } ); 329 return; 330 } 331 new YT.Player( playerID, { 332 videoId: YTPlayer.videoID.toString(), 333 playerVars: playerVars, 334 events: { 335 'onReady': function( event ) { 336 YTPlayer.player = event.target; 337 if( YTPlayer.isReady ) return; 338 YTPlayer.isReady = YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ? false : true; 339 YTPlayer.playerEl = YTPlayer.player.getIframe(); 340 341 $( YTPlayer.playerEl ).unselectable(); 342 343 $YTPlayer.optimizeDisplay(); 344 YTPlayer.videoID = videoID; 345 jQuery( window ).on( "resize.YTP", function() { 346 $YTPlayer.optimizeDisplay(); 347 } ); 348 349 jQuery.mbYTPlayer.checkForState( YTPlayer ); 350 351 // Trigger state events 352 /* 353 var YTPEvent = jQuery.Event( "YTPUnstarted" ); 354 YTPEvent.time = YTPlayer.player.time; 355 jQuery( YTPlayer ).trigger( YTPEvent ); 356 */ 357 }, 358 /** 359 * 360 * @param event 361 * 362 * -1 (unstarted) 363 * 0 (ended) 364 * 1 (playing) 365 * 2 (paused) 366 * 3 (buffering) 367 * 5 (video cued). 368 * 369 * 370 */ 371 'onStateChange': function( event ) { 372 if( typeof event.target.getPlayerState != "function" ) return; 373 var state = event.target.getPlayerState(); 374 375 if( YTPlayer.state == state ) return; 376 377 if( YTPlayer.preventTrigger ) { 378 YTPlayer.preventTrigger = false; 379 return 380 } 381 382 YTPlayer.state = state; 383 var eventType; 384 switch( state ) { 385 case -1: //----------------------------------------------- unstarted 386 eventType = "YTPUnstarted"; 387 break; 388 case 0: //------------------------------------------------ ended 389 eventType = "YTPEnd"; 390 break; 391 case 1: //------------------------------------------------ play 392 eventType = "YTPPlay"; 393 if( YTPlayer.controlBar ) YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.pause ); 394 395 if( typeof _gaq != "undefined" && eval( YTPlayer.opt.gaTrack ) ) _gaq.push( [ '_trackEvent', 'YTPlayer', 'Play', ( YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString() ) ] ); 396 if( typeof ga != "undefined" && eval( YTPlayer.opt.gaTrack ) ) ga( 'send', 'event', 'YTPlayer', 'play', ( YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString() ) ); 397 398 break; 399 case 2: //------------------------------------------------ pause 400 eventType = "YTPPause"; 401 if( YTPlayer.controlBar ) YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play ); 402 break; 403 case 3: //------------------------------------------------ buffer 404 YTPlayer.player.setPlaybackQuality( YTPlayer.opt.quality );
405 eventType = "YTPBuffering"; 406 if( YTPlayer.controlBar ) YTPlayer.controlBar.find( ".mb_YTPPlaypause" ).html( jQuery.mbYTPlayer.controls.play ); 407 break; 408 case 5: //------------------------------------------------ cued 409 eventType = "YTPCued"; 410 break; 411 default: 412 break; 413 } 414 // Trigger state events 415 var YTPEvent = jQuery.Event( eventType ); 416 YTPEvent.time = YTPlayer.player.time; 417 if( YTPlayer.canTrigger ) jQuery( YTPlayer ).trigger( YTPEvent ); 418 }, 419 /** 420 * 421 * @param e 422 */ 423 'onPlaybackQualityChange': function( e ) { 424 var quality = e.target.getPlaybackQuality(); 425 var YTPQualityChange = jQuery.Event( "YTPQualityChange" ); 426 YTPQualityChange.quality = quality; 427 jQuery( YTPlayer ).trigger( YTPQualityChange ); 428 }, 429 /** 430 * 431 * @param err 432 */ 433 'onError': function( err ) { 434 if( err.data == 150 ) { 435 console.log( "Embedding this video is restricted by Youtube." ); 436 if( YTPlayer.isPlayList ) jQuery( YTPlayer ).playNext(); 437 } 438 if( err.data == 2 && YTPlayer.isPlayList ) jQuery( YTPlayer ).playNext(); 439 if( typeof YTPlayer.opt.onError == "function" ) YTPlayer.opt.onError( $YTPlayer, err ); 440 } 441 } 442 } ); 443 } ); 444 } ) 445 } ); 446 }, 447 /** 448 * 449 * @param YTPlayer 450 */ 451 getDataFromAPI: function( YTPlayer ) { 452 YTPlayer.videoData = jQuery.mbStorage.get( "YTPlayer_data_" + YTPlayer.videoID ); 453 jQuery( YTPlayer ).off( "YTPData.YTPlayer" ).on( "YTPData.YTPlayer", function() { 454 if( YTPlayer.hasData ) { 455 456 if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) { 457 var bgndURL = YTPlayer.videoData.thumb_max || YTPlayer.videoData.thumb_high || YTPlayer.videoData.thumb_medium; 458 YTPlayer.opt.containment.css( { 459 background: "rgba(0,0,0,0.5) url(" + bgndURL + ") center center", 460 backgroundSize: "cover" 461 } ); 462 YTPlayer.opt.backgroundUrl = bgndURL; 463 } 464 } 465 } ); 466 467 if( YTPlayer.videoData ) { 468 469 setTimeout( function() { 470 YTPlayer.opt.ratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio; 471 YTPlayer.dataReceived = true; 472 jQuery( YTPlayer ).trigger( "YTPChanged" ); 473 var YTPData = jQuery.Event( "YTPData" ); 474 YTPData.prop = {}; 475 for( var x in YTPlayer.videoData ) YTPData.prop[ x ] = YTPlayer.videoData[ x ]; 476 jQuery( YTPlayer ).trigger( YTPData ); 477 }, 500 ); 478 479 YTPlayer.hasData = true; 480 } else if( jQuery.mbYTPlayer.apiKey ) { 481 // Get video info from API3 (needs api key) 482 // snippet,player,contentDetails,statistics,status 483 jQuery.getJSON( jQuery.mbYTPlayer.locationProtocol + "//www.googleapis.com/youtube/v3/videos?id=" + YTPlayer.videoID + "&key=" + jQuery.mbYTPlayer.apiKey + "&part=snippet", function( data ) { 484 YTPlayer.dataReceived = true; 485 jQuery( YTPlayer ).trigger( "YTPChanged" ); 486 487 function parseYTPlayer_data( data ) { 488 YTPlayer.videoData = {}; 489 YTPlayer.videoData.id = YTPlayer.videoID; 490 YTPlayer.videoData.channelTitle = data.channelTitle; 491 YTPlayer.videoData.title = data.title; 492 YTPlayer.videoData.description = data.description.length < 400 ? data.description : data.description.substring( 0, 400 ) + " ..."; 493 YTPlayer.videoData.aspectratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio; 494 YTPlayer.opt.ratio = YTPlayer.videoData.aspectratio; 495 YTPlayer.videoData.thumb_max = data.thumbnails.maxres ? data.thumbnails.maxres.url : null; 496 YTPlayer.videoData.thumb_high = data.thumbnails.high ? data.thumbnails.high.url : null; 497 YTPlayer.videoData.thumb_medium = data.thumbnails.medium ? data.thumbnails.medium.url : null; 498 jQuery.mbStorage.set( "YTPlayer_data_" + YTPlayer.videoID, YTPlayer.videoData ); 499 } 500 parseYTPlayer_data( data.items[ 0 ].snippet ); 501 YTPlayer.hasData = true; 502 var YTPData = jQuery.Event( "YTPData" ); 503 YTPData.prop = {}; 504 for( var x in YTPlayer.videoData ) YTPData.prop[ x ] = YTPlayer.videoData[ x ]; 505 jQuery( YTPlayer ).trigger( YTPData ); 506 } ); 507 } else { 508 setTimeout( function() { 509 jQuery( YTPlayer ).trigger( "YTPChanged" ); 510 }, 50 ); 511 if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) { 512 var bgndURL = jQuery.mbYTPlayer.locationProtocol + "//i.ytimg.com/vi/" + YTPlayer.videoID + "/hqdefault.jpg"; 513 YTPlayer.opt.containment.css( { 514 background: "rgba(0,0,0,0.5) url(" + bgndURL + ") center center", 515 backgroundSize: "cover" 516 } ); 517 YTPlayer.opt.backgroundUrl = bgndURL; 518 } 519 YTPlayer.videoData = null; 520 YTPlayer.opt.ratio = YTPlayer.opt.ratio == "auto" ? "16/9" : YTPlayer.opt.ratio; 521 } 522 if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) { 523 YTPlayer.loading = jQuery( "<div/>" ).addClass( "loading" ).html( "Loading" ).hide(); 524 jQuery( YTPlayer ).append( YTPlayer.loading ); 525 YTPlayer.loading.fadeIn(); 526 } 527 }, 528 /** 529 * 530 */ 531 removeStoredData: function() { 532 jQuery.mbStorage.remove(); 533 }, 534 /** 535 * 536 * @returns {*|YTPlayer.videoData}
536 537 */ 538 getVideoData: function() { 539 var YTPlayer = this.get( 0 ); 540 return YTPlayer.videoData; 541 }, 542 /** 543 * 544 * @returns {*|YTPlayer.videoID|boolean} 545 */ 546 getVideoID: function() { 547 var YTPlayer = this.get( 0 ); 548 return YTPlayer.videoID || false; 549 }, 550 /** 551 * 552 * @param quality 553 */ 554 setVideoQuality: function( quality ) { 555 var YTPlayer = this.get( 0 ); 556 if( !jQuery.browser.chrome ) YTPlayer.player.setPlaybackQuality( quality ); 557 }, 558 /** 559 * @param videos 560 * @param shuffle 561 * @param callback 562 * @returns {jQuery.mbYTPlayer} 563 */ 564 565 playlist: function( videos, shuffle, callback ) { 566 var $YTPlayer = this; 567 var YTPlayer = $YTPlayer.get( 0 ); 568 YTPlayer.isPlayList = true; 569 if( shuffle ) videos = jQuery.shuffle( videos ); 570 if( !YTPlayer.videoID ) { 571 YTPlayer.videos = videos; 572 YTPlayer.videoCounter = 0; 573 YTPlayer.videoLength = videos.length; 574 jQuery( YTPlayer ).data( "property", videos[ 0 ] ); 575 jQuery( YTPlayer ).mb_YTPlayer(); 576 } 577 if( typeof callback == "function" ) jQuery( YTPlayer ).one( "YTPChanged", function() { 578 callback( YTPlayer ); 579 } ); 580 jQuery( YTPlayer ).on( "YTPEnd", function() { 581 jQuery( YTPlayer ).playNext(); 582 } ); 583 return $YTPlayer; 584 }, 585 /** 586 * 587 * @returns {jQuery.mbYTPlayer} 588 */ 589 playNext: function() { 590 var YTPlayer = this.get( 0 ); 591 YTPlayer.videoCounter++; 592 if( YTPlayer.videoCounter >= YTPlayer.videoLength ) YTPlayer.videoCounter = 0; 593 jQuery( YTPlayer ).changeMovie( YTPlayer.videos[ YTPlayer.videoCounter ] ); 594 return this; 595 }, 596 /** 597 * 598 * @returns {jQuery.mbYTPlayer} 599 */ 600 playPrev: function() { 601 var YTPlayer = this.get( 0 ); 602 YTPlayer.videoCounter--; 603 if( YTPlayer.videoCounter < 0 ) YTPlayer.videoCounter = YTPlayer.videoLength - 1; 604 jQuery( YTPlayer ).changeMovie( YTPlayer.videos[ YTPlayer.videoCounter ] ); 605 return this; 606 }, 607 /** 608 * 609 * @param opt 610 */ 611 changeMovie: function( opt ) { 612 613 var YTPlayer = this.get( 0 ); 614 YTPlayer.opt.startAt = 0; 615 YTPlayer.opt.stopAt = 0; 616 YTPlayer.opt.mute = true; 617 YTPlayer.hasData = false; 618 YTPlayer.hasChanged = true; 619 YTPlayer.player.LoopTime = undefined; 620 621 if( opt ) jQuery.extend( YTPlayer.opt, YTPlayer.defaultOpt, opt ); 622 YTPlayer.videoID = getYTPVideoID( YTPlayer.opt.videoURL ).videoID; 623 624 if( YTPlayer.opt.loop == "true" ) 625 YTPlayer.opt.loop = 9999; 626 627 jQuery( YTPlayer.playerEl ).CSSAnimate( { 628 opacity: 0 629 }, 200, function() { 630 631 var YTPChangeMovie = jQuery.Event( "YTPChangeMovie" ); 632 YTPChangeMovie.time = YTPlayer.player.time; 633 YTPChangeMovie.videoId = YTPlayer.videoID; 634 jQuery( YTPlayer ).trigger( YTPChangeMovie ); 635 636 jQuery( YTPlayer ).YTPGetPlayer().cueVideoByUrl( encodeURI( jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/v/" + YTPlayer.videoID ), 1, YTPlayer.opt.quality ); 637 jQuery.mbYTPlayer.checkForState( YTPlayer ); 638 jQuery( YTPlayer ).optimizeDisplay(); 639 jQuery.mbYTPlayer.getDataFromAPI( YTPlayer ); 640 return this; 641 } ); 642 }, 643 /** 644 * 645 * @returns {player} 646 */ 647 getPlayer: function() { 648 return jQuery( this ).get( 0 ).player; 649 }, 650 playerDestroy: function() { 651 var YTPlayer = this.get( 0 ); 652 ytp.YTAPIReady = false; 653 ytp.backgroundIsInited = false; 654 YTPlayer.isInit = false; 655 YTPlayer.videoID = null; 656 var playerBox = YTPlayer.wrapper; 657 playerBox.remove(); 658 jQuery( "#controlBar_" + YTPlayer.id ).remove(); 659 clearInterval( YTPlayer.checkForStartAt ); 660 clearInterval( YTPlayer.getState ); 661 return this; 662 }, 663 /** 664 * 665 * @param real 666 * @returns {jQuery.mbYTPlayer} 667 */ 668 fullscreen: function( real ) { 669 var YTPlayer = this.get( 0 ); 670 if( typeof real == "undefined" ) real = YTPlayer.opt.realfullscreen; 671 real = eval( real ); 672 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 673 var fullScreenBtn = controls.find( ".mb_OnlyYT" ); 674 var videoWrapper = YTPlayer.isSelf ? YTPlayer.opt.containment : YTPlayer.wrapper; 675 //var videoWrapper = YTPlayer.wrapper; 676 if( real ) { 677 var fullscreenchange = jQuery.browser.mozilla ? "mozfullscreenchange" : jQuery.browser.webkit ? "webkitfullscreenchange" : "fullscreenchange"; 678 jQuery( document ).off( fullscreenchange ).on( fullscreenchange, function() { 679 var isFullScreen = RunPrefixMethod( document, "IsFullScreen" ) || RunPrefixMethod( document, "FullScreen" ); 680 if( !isFullScreen ) { 681 YTPlayer.isAlone = false;
682 fullScreenBtn.html( jQuery.mbYTPlayer.controls.onlyYT ); 683 jQuery( YTPlayer ).YTPSetVideoQuality( YTPlayer.opt.quality ); 684 videoWrapper.removeClass( "fullscreen" ); 685 videoWrapper.CSSAnimate( { 686 opacity: YTPlayer.opt.opacity 687 }, 500 ); 688 videoWrapper.css( { 689 zIndex: 0 690 } ); 691 if( YTPlayer.isBackground ) { 692 jQuery( "body" ).after( controls ); 693 } else { 694 YTPlayer.wrapper.before( controls ); 695 } 696 jQuery( window ).resize(); 697 jQuery( YTPlayer ).trigger( "YTPFullScreenEnd" ); 698 } else { 699 jQuery( YTPlayer ).YTPSetVideoQuality( "default" ); 700 jQuery( YTPlayer ).trigger( "YTPFullScreenStart" ); 701 } 702 } ); 703 } 704 if( !YTPlayer.isAlone ) { 705 function hideMouse() { 706 YTPlayer.overlay.css( { 707 cursor: "none" 708 } ); 709 } 710 jQuery( document ).on( "mousemove.YTPlayer", function( e ) { 711 YTPlayer.overlay.css( { 712 cursor: "auto" 713 } ); 714 clearTimeout( YTPlayer.hideCursor ); 715 if( !jQuery( e.target ).parents().is( ".mb_YTPBar" ) ) YTPlayer.hideCursor = setTimeout( hideMouse, 3000 ); 716 } ); 717 hideMouse(); 718 if( real ) { 719 videoWrapper.css( { 720 opacity: 0 721 } ); 722 videoWrapper.addClass( "fullscreen" ); 723 launchFullscreen( videoWrapper.get( 0 ) ); 724 setTimeout( function() { 725 videoWrapper.CSSAnimate( { 726 opacity: 1 727 }, 1000 ); 728 YTPlayer.wrapper.append( controls ); 729 jQuery( YTPlayer ).optimizeDisplay(); 730 YTPlayer.player.seekTo( YTPlayer.player.getCurrentTime() + .1, true ); 731 }, 500 ) 732 } else videoWrapper.css( { 733 zIndex: 10000 734 } ).CSSAnimate( { 735 opacity: 1 736 }, 1000 ); 737 fullScreenBtn.html( jQuery.mbYTPlayer.controls.showSite ); 738 YTPlayer.isAlone = true; 739 } else { 740 jQuery( document ).off( "mousemove.YTPlayer" ); 741 YTPlayer.overlay.css( { 742 cursor: "auto" 743 } ); 744 if( real ) { 745 cancelFullscreen(); 746 } else { 747 videoWrapper.CSSAnimate( { 748 opacity: YTPlayer.opt.opacity 749 }, 500 ); 750 videoWrapper.css( { 751 zIndex: 0 752 } ); 753 } 754 fullScreenBtn.html( jQuery.mbYTPlayer.controls.onlyYT ); 755 YTPlayer.isAlone = false; 756 } 757 758 function RunPrefixMethod( obj, method ) { 759 var pfx = [ "webkit", "moz", "ms", "o", "" ]; 760 var p = 0, 761 m, t; 762 while( p < pfx.length && !obj[ m ] ) { 763 m = method; 764 if( pfx[ p ] == "" ) { 765 m = m.substr( 0, 1 ).toLowerCase() + m.substr( 1 ); 766 } 767 m = pfx[ p ] + m; 768 t = typeof obj[ m ]; 769 if( t != "undefined" ) { 770 pfx = [ pfx[ p ] ]; 771 return( t == "function" ? obj[ m ]() : obj[ m ] ); 772 } 773 p++; 774 } 775 } 776 777 function launchFullscreen( element ) { 778 RunPrefixMethod( element, "RequestFullScreen" ); 779 } 780 781 function cancelFullscreen() { 782 if( RunPrefixMethod( document, "FullScreen" ) || RunPrefixMethod( document, "IsFullScreen" ) ) { 783 RunPrefixMethod( document, "CancelFullScreen" ); 784 } 785 } 786 return this; 787 }, 788 /** 789 * 790 * @returns {jQuery.mbYTPlayer} 791 */ 792 toggleLoops: function() { 793 var YTPlayer = this.get( 0 ); 794 var data = YTPlayer.opt; 795 if( data.loop == 1 ) { 796 data.loop = 0; 797 } else { 798 if( data.startAt ) { 799 YTPlayer.player.seekTo( data.startAt ); 800 } else { 801 YTPlayer.player.playVideo(); 802 } 803 data.loop = 1; 804 } 805 return this; 806 }, 807 /** 808 * 809 * @returns {jQuery.mbYTPlayer} 810 */ 811 play: function() { 812 var YTPlayer = this.get( 0 ); 813 if( !YTPlayer.isReady ) return; 814 815 /* 816 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 817 var playBtn = controls.find( ".mb_YTPPlaypause" ); 818 playBtn.html( jQuery.mbYTPlayer.controls.pause ); 819 */ 820 821 YTPlayer.player.playVideo(); 822 YTPlayer.wrapper.CSSAnimate( { 823 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 824 }, 2000 ); 825 826 jQuery( YTPlayer.playerEl ).CSSAnimate( { 827 opacity: 1 828 }, 1000 ); 829 830 jQuery( YTPlayer ).css( "background-image", "none" ); 831 return this; 832 }, 833 /** 834 * 835 * @param callback 836 * @returns {jQuery.mbYTPlayer} 837 */ 838 togglePlay: function( callback ) { 839 var YTPlayer = this.get( 0 ); 840 if( YTPlayer.state == 1 ) this.YTPPause(); 841 else this.YTPPlay(); 842 if( typeof callback == "function" ) { 843 callback( YTPlayer.state ); 844 } 845 return this; 846 }, 847 /** 848 * 849 * @returns {jQuery.mbYTPlayer} 850 */ 851 stop: function() { 852 var YTPlayer = this.get( 0 ); 853 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 854 var playBtn = controls.find( ".mb_YTPPlaypause" ); 855 playBtn.html( jQuery.mbYTPlayer.controls.play ); 856 YTPlayer.player.stopVideo(); 857 return this; 858 }, 859 /** 860 * 861 * @returns {jQuery.mbYTPlayer} 862 */ 863 pause: function() { 864 var YTPlayer = this.get( 0 ); 865 /* 866 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 867 var playBtn = controls.find( ".mb_YTPPlaypause" ); 868 playBtn.html( jQuery.mbYTPlayer.controls.play ); 869 */ 870 YTPlayer.player.pauseVideo(); 871 return this; 872 }, 873 /** 874 * 875 * @param val 876 * @returns {jQuery.mbYTPlayer} 877 */ 878 seekTo: function( val ) { 879 var YTPlayer = this.get( 0 ); 880 YTPlayer.player.seekTo( val, true ); 881 return this; 882 }, 883 /** 884 * 885 * @param val 886 * @returns {jQuery.mbYTPlayer} 887 */ 888 setVolume: function( val ) { 889 var YTPlayer = this.get( 0 ); 890 if( !val && !YTPlayer.opt.vol && YTPlayer.player.getVolume() == 0 ) jQuery( YTPlayer ).YTPUnmute(); 891 else if( ( !val && YTPlayer.player.getVolume() > 0 ) || ( val && YTPlayer.opt.vol == val ) ) { 892 if( !YTPlayer.isMute ) jQuery( YTPlayer ).YTPMute(); 893 else jQuery( YTPlayer ).YTPUnmute(); 894 } else { 895 YTPlayer.opt.vol = val; 896 YTPlayer.player.setVolume( YTPlayer.opt.vol ); 897 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.updateSliderVal( val ) 898 } 899 return this; 900 }, 901 /** 902 * 903 * @returns {jQuery.mbYTPlayer} 904 */ 905 mute: function() { 906 var YTPlayer = this.get( 0 ); 907 if( YTPlayer.isMute ) return; 908 YTPlayer.player.mute(); 909 YTPlayer.isMute = true; 910 YTPlayer.player.setVolume( 0 ); 911 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length && YTPlayer.volumeBar.width() > 10 ) { 912 YTPlayer.volumeBar.updateSliderVal( 0 ); 913 } 914 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 915 var muteBtn = controls.find( ".mb_YTPMuteUnmute" ); 916 muteBtn.html( jQuery.mbYTPlayer.controls.unmute ); 917 jQuery( YTPlayer ).addClass( "isMuted" ); 918 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.addClass( "muted" ); 919 var YTPEvent = jQuery.Event( "YTPMuted" ); 920 YTPEvent.time = YTPlayer.player.time; 921 if( YTPlayer.canTrigger ) jQuery( YTPlayer ).trigger( YTPEvent ); 922 return this; 923 }, 924 /** 925 * 926 * @returns {jQuery.mbYTPlayer} 927 */ 928 unmute: function() { 929 var YTPlayer = this.get( 0 ); 930 if( !YTPlayer.isMute ) return; 931 YTPlayer.player.unMute(); 932 YTPlayer.isMute = false;
933 YTPlayer.player.setVolume( YTPlayer.opt.vol ); 934 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol > 10 ? YTPlayer.opt.vol : 10 ); 935 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 936 var muteBtn = controls.find( ".mb_YTPMuteUnmute" ); 937 muteBtn.html( jQuery.mbYTPlayer.controls.mute ); 938 jQuery( YTPlayer ).removeClass( "isMuted" ); 939 if( YTPlayer.volumeBar && YTPlayer.volumeBar.length ) YTPlayer.volumeBar.removeClass( "muted" ); 940 var YTPEvent = jQuery.Event( "YTPUnmuted" ); 941 YTPEvent.time = YTPlayer.player.time; 942 if( YTPlayer.canTrigger ) jQuery( YTPlayer ).trigger( YTPEvent ); 943 return this; 944 }, 945 /** 946 * 947 * @param filter 948 * @param value 949 * @returns {jQuery.mbYTPlayer} 950 */ 951 applyFilter: function( filter, value ) { 952 var YTPlayer = this.get( 0 ); 953 YTPlayer.filters[ filter ].value = value; 954 if( YTPlayer.filtersEnabled ) this.YTPEnableFilters(); 955 return this; 956 }, 957 /** 958 * 959 * @param filters 960 * @returns {jQuery.mbYTPlayer} 961 */ 962 applyFilters: function( filters ) { 963 var YTPlayer = this.get( 0 ); 964 this.on( "YTPReady", function() { 965 for( var key in filters ) { 966 YTPlayer.filters[ key ].value = filters[ key ]; 967 jQuery( YTPlayer ).YTPApplyFilter( key, filters[ key ] ); 968 } 969 jQuery( YTPlayer ).trigger( "YTPFiltersApplied" ); 970 } ); 971 return this; 972 }, 973 /** 974 * 975 * @param filter 976 * @param value 977 * @returns {*} 978 */ 979 toggleFilter: function( filter, value ) { 980 return this.each( function() { 981 var YTPlayer = this; 982 if( !YTPlayer.filters[ filter ].value ) YTPlayer.filters[ filter ].value = value; 983 else YTPlayer.filters[ filter ].value = 0; 984 if( YTPlayer.filtersEnabled ) jQuery( this ).YTPEnableFilters(); 985 } ) 986 return this; 987 }, 988 /** 989 * 990 * @param callback 991 * @returns {*} 992 */ 993 toggleFilters: function( callback ) { 994 return this.each( function() { 995 var YTPlayer = this; 996 if( YTPlayer.filtersEnabled ) { 997 jQuery( YTPlayer ).trigger( "YTPDisableFilters" ); 998 jQuery( YTPlayer ).YTPDisableFilters(); 999 } else { 1000 jQuery( YTPlayer ).YTPEnableFilters(); 1001 jQuery( YTPlayer ).trigger( "YTPEnableFilters" ); 1002 } 1003 if( typeof callback == "function" ) callback( YTPlayer.filtersEnabled ); 1004 } ) 1005 }, 1006 /** 1007 * 1008 * @returns {*} 1009 */ 1010 disableFilters: function() { 1011 return this.each( function() { 1012 var YTPlayer = this; 1013 var iframe = jQuery( YTPlayer.playerEl ); 1014 iframe.css( "-webkit-filter", "" ); 1015 iframe.css( "filter", "" ); 1016 YTPlayer.filtersEnabled = false; 1017 } ) 1018 }, 1019 /** 1020 * 1021 * @returns {*} 1022 */ 1023 enableFilters: function() { 1024 return this.each( function() { 1025 var YTPlayer = this; 1026 var iframe = jQuery( YTPlayer.playerEl ); 1027 var filterStyle = ""; 1028 for( var key in YTPlayer.filters ) { 1029 if( YTPlayer.filters[ key ].value ) filterStyle += key.replace( "_", "-" ) + "(" + YTPlayer.filters[ key ].value + YTPlayer.filters[ key ].unit
1029+ ") "; 1030 } 1031 iframe.css( "-webkit-filter", filterStyle ); 1032 iframe.css( "filter", filterStyle ); 1033 YTPlayer.filtersEnabled = true; 1034 } ) 1035 return this; 1036 }, 1037 /** 1038 * 1039 * @param filter 1040 * @param callback 1041 * @returns {*} 1042 */ 1043 removeFilter: function( filter, callback ) { 1044 return this.each( function() { 1045 if( typeof filter == "function" ) { 1046 callback = filter; 1047 filter = null; 1048 } 1049 var YTPlayer = this; 1050 if( !filter ) 1051 for( var key in YTPlayer.filters ) { 1052 jQuery( this ).YTPApplyFilter( key, 0 ); 1053 if( typeof callback == "function" ) callback( key ); 1054 } else { 1055 jQuery( this ).YTPApplyFilter( filter, 0 ); 1056 if( typeof callback == "function" ) callback( filter ); 1057 } 1058 } ); 1059 return this; 1060 }, 1061 /** 1062 * 1063 * @returns {{totalTime: number, currentTime: number}} 1064 */ 1065 manageProgress: function() { 1066 var YTPlayer = this.get( 0 ); 1067 var controls = jQuery( "#controlBar_" + YTPlayer.id ); 1068 var progressBar = controls.find( ".mb_YTPProgress" ); 1069 var loadedBar = controls.find( ".mb_YTPLoaded" ); 1070 var timeBar = controls.find( ".mb_YTPseekbar" ); 1071 var totW = progressBar.outerWidth(); 1072 var currentTime = Math.floor( YTPlayer.player.getCurrentTime() ); 1073 var totalTime = Math.floor( YTPlayer.player.getDuration() ); 1074 var timeW = ( currentTime * totW ) / totalTime; 1075 var startLeft = 0; 1076 var loadedW = YTPlayer.player.getVideoLoadedFraction() * 100; 1077 loadedBar.css( { 1078 left: startLeft, 1079 width: loadedW + "%" 1080 } ); 1081 timeBar.css( { 1082 left: 0, 1083 width: timeW 1084 } ); 1085 return { 1086 totalTime: totalTime, 1087 currentTime: currentTime 1088 }; 1089 }, 1090 /** 1091 * 1092 * @param YTPlayer 1093 */ 1094 buildControls: function( YTPlayer ) { 1095 var data = YTPlayer.opt; 1096 // @data.printUrl: is deprecated; use data.showYTLogo 1097 data.showYTLogo = data.showYTLogo || data.printUrl; 1098 if( jQuery( "#controlBar_" + YTPlayer.id ).length ) return; 1099 YTPlayer.controlBar = jQuery( "<span/>" ).attr( "id", "controlBar_" + YTPlayer.id ).addClass( "mb_YTPBar" ).css( { 1100 whiteSpace: "noWrap", 1101 position: YTPlayer.isBackground ? "fixed" : "absolute", 1102 zIndex: YTPlayer.isBackground ? 10000 : 1000 1103 } ).hide(); 1104 var buttonBar = jQuery( "<div/>" ).addClass( "buttonBar" ); 1105 /* play/pause button*/ 1106 var playpause = jQuery( "<span>" + jQuery.mbYTPlayer.controls.play + "</span>" ).addClass( "mb_YTPPlaypause ytpicon" ).click( function() { 1107 if( YTPlayer.player.getPlayerState() == 1 ) jQuery( YTPlayer ).YTPPause(); 1108 else jQuery( YTPlayer ).YTPPlay(); 1109 } ); 1110 /* mute/unmute button*/ 1111 var MuteUnmute = jQuery( "<span>" + jQuery.mbYTPlayer.controls.mute + "</span>" ).addClass( "mb_YTPMuteUnmute ytpicon" ).click( function() { 1112 if( YTPlayer.player.getVolume() == 0 ) { 1113 jQuery( YTPlayer ).YTPUnmute(); 1114 } else { 1115 jQuery( YTPlayer ).YTPMute(); 1116 } 1117 } ); 1118 /* volume bar*/ 1119 var volumeBar = jQuery( "<div/>" ).addClass( "mb_YTPVolumeBar" ).css( { 1120 display: "inline-block" 1121 } ); 1122 YTPlayer.volumeBar = volumeBar; 1123 /* time elapsed */ 1124 var idx = jQuery( "<span/>" ).addClass( "mb_YTPTime" ); 1125 var vURL = data.videoURL ? data.videoURL : ""; 1126 if( vURL.indexOf( "http" ) < 0 ) vURL = jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/watch?v=" + data.videoURL; 1127 var movieUrl = jQuery( "<span/>" ).html( jQuery.mbYTPlayer.controls.ytLogo ).addClass( "mb_YTPUrl ytpicon" ).attr( "title", "view on YouTube" ).on( "click", function() { 1128 window.open( vURL, "viewOnYT" ) 1129 } ); 1130 var onlyVideo = jQuery( "<span/>" ).html( jQuery.mbYTPlayer.controls.onlyYT ).addClass( "mb_OnlyYT ytpicon" ).on( "click", function() { 1131 jQuery( YTPlayer ).YTPFullscreen( data.realfullscreen ); 1132 } ); 1133 var progressBar = jQuery( "<div/>" ).addClass( "mb_YTPProgress" ).css( "position", "absolute" ).click( function( e ) { 1134 timeBar.css( { 1135 width: ( e.clientX - timeBar.offset().left ) 1136 } ); 1137 YTPlayer.timeW = e.clientX - timeBar.offset().left; 1138 YTPlayer.controlBar.find( ".mb_YTPLoaded" ).css( { 1139 width: 0 1140 } ); 1141 var totalTime = Math.floor( YTPlayer.player.getDuration() ); 1142 YTPlayer.goto = ( timeBar.outerWidth() * totalTime ) / progressBar.outerWidth(); 1143 YTPlayer.player.seekTo( parseFloat( YTPlayer.goto ), true ); 1144 YTPlayer.controlBar.find( ".mb_YTPLoaded" ).css( { 1145 width: 0 1146 } ); 1147 } ); 1148 var loadedBar = jQuery( "<div/>" ).addClass( "mb_YTPLoaded" ).css( "position", "absolute" ); 1149 var timeBar = jQuery( "<div/>" ).addClass( "mb_YTPseekbar" ).css( "position", "absolute" ); 1150 progressBar.append( loadedBar ).append( timeBar ); 1151 buttonBar.append( playpause ).append( MuteUnmute ).append( volumeBar ).append( idx ); 1152 if( data.showYTLogo ) { 1153 buttonBar.append( movieUrl ); 1154 }
1155 if( YTPlayer.isBackground || ( eval( YTPlayer.opt.realfullscreen ) && !YTPlayer.isBackground ) ) buttonBar.append( onlyVideo ); 1156 YTPlayer.controlBar.append( buttonBar ).append( progressBar ); 1157 if( !YTPlayer.isBackground ) { 1158 YTPlayer.controlBar.addClass( "inlinePlayer" ); 1159 YTPlayer.wrapper.before( YTPlayer.controlBar ); 1160 } else { 1161 jQuery( "body" ).after( YTPlayer.controlBar ); 1162 } 1163 volumeBar.simpleSlider( { 1164 initialval: YTPlayer.opt.vol, 1165 scale: 100, 1166 orientation: "h", 1167 callback: function( el ) { 1168 if( el.value == 0 ) { 1169 jQuery( YTPlayer ).YTPMute(); 1170 } else { 1171 jQuery( YTPlayer ).YTPUnmute(); 1172 } 1173 YTPlayer.player.setVolume( el.value ); 1174 if( !YTPlayer.isMute ) YTPlayer.opt.vol = el.value; 1175 } 1176 } ); 1177 }, 1178 /** 1179 * 1180 * 1181 * */ 1182 checkForState: function( YTPlayer ) { 1183 var interval = YTPlayer.opt.showControls ? 100 : 400; 1184 clearInterval( YTPlayer.getState ); 1185 //Checking if player has been removed from scene 1186 if( !jQuery.contains( document, YTPlayer ) ) { 1187 jQuery( YTPlayer ).YTPPlayerDestroy(); 1188 clearInterval( YTPlayer.getState ); 1189 clearInterval( YTPlayer.checkForStartAt ); 1190 return; 1191 } 1192 jQuery.mbYTPlayer.checkForStart( YTPlayer ); 1193 YTPlayer.getState = setInterval( function() { 1194 var prog = jQuery( YTPlayer ).YTPManageProgress(); 1195 var $YTPlayer = jQuery( YTPlayer ); 1196 var data = YTPlayer.opt; 1197 var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1; 1198 var stopAt = YTPlayer.opt.stopAt > YTPlayer.opt.startAt ? YTPlayer.opt.stopAt : 0; 1199 stopAt = stopAt < YTPlayer.player.getDuration() ? stopAt : 0; 1200 if( YTPlayer.player.time != prog.currentTime ) { 1201 var YTPEvent = jQuery.Event( "YTPTime" ); 1202 YTPEvent.time = YTPlayer.player.time; 1203 jQuery( YTPlayer ).trigger( YTPEvent ); 1204 } 1205 YTPlayer.player.time = prog.currentTime; 1206 if( YTPlayer.player.getVolume() == 0 ) $YTPlayer.addClass( "isMuted" ); 1207 else $YTPlayer.removeClass( "isMuted" ); 1208 if( YTPlayer.opt.showControls ) 1209 if( prog.totalTime ) { 1210 YTPlayer.controlBar.find( ".mb_YTPTime" ).html( jQuery.mbYTPlayer.formatTime( prog.currentTime ) + " / " + jQuery.mbYTPlayer.formatTime( prog.totalTime ) ); 1211 } else { 1212 YTPlayer.controlBar.find( ".mb_YTPTime" ).html( "-- : -- / -- : --" ); 1213 } 1214 if( eval( YTPlayer.opt.stopMovieOnBlur ) ) 1215 if( !document.hasFocus() ) { 1216 if( YTPlayer.state == 1 ) { 1217 YTPlayer.hasFocus = false; 1218 $YTPlayer.YTPPause(); 1219 } 1220 } else if( document.hasFocus() && !YTPlayer.hasFocus && !( YTPlayer.state == -1 || YTPlayer.state == 0 ) ) { 1221 YTPlayer.hasFocus = true; 1222 $YTPlayer.YTPPlay(); 1223 } 1224 if( YTPlayer.controlBar && YTPlayer.controlBar.outerWidth() <= 400 && !YTPlayer.isCompact ) { 1225 YTPlayer.controlBar.addClass( "compact" ); 1226 YTPlayer.isCompact = true; 1227 if( !YTPlayer.isMute && YTPlayer.volumeBar ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol ); 1228 } else if( YTPlayer.controlBar && YTPlayer.controlBar.outerWidth() > 400 && YTPlayer.isCompact ) { 1229 YTPlayer.controlBar.removeClass( "compact" ); 1230 YTPlayer.isCompact = false; 1231 if( !YTPlayer.isMute && YTPlayer.volumeBar ) YTPlayer.volumeBar.updateSliderVal( YTPlayer.opt.vol ); 1232 } 1233 if( YTPlayer.player.getPlayerState() == 1 && ( parseFloat( YTPlayer.player.getDuration() - 1.5 ) < YTPlayer.player.getCurrentTime() || ( stopAt > 0 && parseFloat( YTPlayer.player.getCurrentTime() ) > stopAt ) ) ) { 1234 if( YTPlayer.isEnded ) return; 1235 YTPlayer.isEnded = true; 1236 setTimeout( function() { 1237 YTPlayer.isEnded = false 1238 }, 1000 ); 1239 1240 if( YTPlayer.isPlayList ) { 1241 1242 if( !data.loop || ( data.loop > 0 && YTPlayer.player.LoopTime === data.loop - 1 ) ) { 1243 1244 YTPlayer.player.LoopTime = undefined; 1245 clearInterval( YTPlayer.getState ); 1246 var YTPEnd = jQuery.Event( "YTPEnd" ); 1247 YTPEnd.time = YTPlayer.player.time; 1248 jQuery( YTPlayer ).trigger( YTPEnd ); 1249 1250 return; 1251 } 1252 1253 } else if( !data.loop || ( data.loop > 0 && YTPlayer.player.LoopTime === data.loop - 1 ) ) { 1254 1255 YTPlayer.player.LoopTime = undefined; 1256 1257 YTPlayer.preventTrigger = true; 1258 $( YTPlayer ).YTPPause(); 1259 1260 // YTPlayer.player.pauseVideo(); 1261 1262 YTPlayer.wrapper.CSSAnimate( { 1263 opacity: 0 1264 }, 1000, function() { 1265 1266 var YTPEnd = jQuery.Event( "YTPEnd" ); 1267 YTPEnd.time = YTPlayer.player.time; 1268 jQuery( YTPlayer ).trigger( YTPEnd ); 1269 1270 YTPlayer.player.seekTo( startAt, true );
1271 if( !YTPlayer.isBackground ) { 1272 YTPlayer.opt.containment.css( { 1273 background: "rgba(0,0,0,0.5) url(" + YTPlayer.opt.backgroundUrl + ") center center", 1274 backgroundSize: "cover" 1275 } ); 1276 } 1277 } ); 1278 1279 return; 1280 1281 } 1282 1283 YTPlayer.player.LoopTime = YTPlayer.player.LoopTime ? ++YTPlayer.player.LoopTime : 1; 1284 startAt = startAt || 1; 1285 YTPlayer.player.pauseVideo(); 1286 YTPlayer.player.seekTo( startAt, true ); 1287 $YTPlayer.YTPPlay(); 1288 1289 1290 } 1291 }, interval ); 1292 }, 1293 /** 1294 * 1295 * */ 1296 checkForStart: function( YTPlayer ) { 1297 var $YTPlayer = jQuery( YTPlayer ); 1298 //Checking if player has been removed from scene 1299 if( !jQuery.contains( document, YTPlayer ) ) { 1300 jQuery( YTPlayer ).YTPPlayerDestroy(); 1301 return 1302 } 1303 if( jQuery.browser.chrome ) YTPlayer.opt.quality = "default"; 1304 //YTPlayer.player.pauseVideo(); 1305 jQuery( YTPlayer ).muteYTPVolume(); 1306 jQuery( "#controlBar_" + YTPlayer.id ).remove(); 1307 if( YTPlayer.opt.showControls ) jQuery.mbYTPlayer.buildControls( YTPlayer ); 1308 if( YTPlayer.opt.addRaster ) { 1309 var classN = YTPlayer.opt.addRaster == "dot" ? "raster-dot" : "raster"; 1310 YTPlayer.overlay.addClass( YTPlayer.isRetina ? classN + " retina" : classN ); 1311 } else { 1312 YTPlayer.overlay.removeClass( function( index, classNames ) { 1313 // change the list into an array 1314 var current_classes = classNames.split( " " ), 1315 // array of classes which are to be removed 1316 classes_to_remove = []; 1317 jQuery.each( current_classes, function( index, class_name ) { 1318 // if the classname begins with bg add it to the classes_to_remove array 1319 if( /raster.*/.test( class_name ) ) { 1320 classes_to_remove.push( class_name ); 1321 } 1322 } ); 1323 classes_to_remove.push( "retina" ); 1324 // turn the array back into a string 1325 return classes_to_remove.join( " " ); 1326 } ) 1327 } 1328 YTPlayer.checkForStartAt = setInterval( function() { 1329 jQuery( YTPlayer ).YTPMute(); 1330 var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1; 1331 var canPlayVideo = ( YTPlayer.player.getVideoLoadedFraction() > startAt / YTPlayer.player.getDuration() ); 1332 if( YTPlayer.player.getDuration() > 0 && YTPlayer.player.getCurrentTime() >= startAt && canPlayVideo ) { 1333 clearInterval( YTPlayer.checkForStartAt ); 1334 YTPlayer.isReady = true; 1335 if( typeof YTPlayer.opt.onReady == "function" ) 1336 YTPlayer.opt.onReady( YTPlayer ); 1337 1338 var YTPready = jQuery.Event( "YTPReady" ); 1339 YTPready.time = YTPlayer.player.time; 1340 jQuery( YTPlayer ).trigger( YTPready ); 1341 1342 //YTPlayer.player.pauseVideo(); 1343 1344 if( !YTPlayer.opt.mute ) jQuery( YTPlayer ).YTPUnmute(); 1345 YTPlayer.canTrigger = true; 1346 if( YTPlayer.opt.autoPlay ) { 1347 $YTPlayer.YTPPlay(); 1348 1349 var YTPStart = jQuery.Event( "YTPStart" ); 1350 YTPStart.time = YTPlayer.player.time; 1351 jQuery( YTPlayer ).trigger( YTPStart ); 1352 1353 $YTPlayer.css( "background-image", "none" ); 1354 jQuery( YTPlayer.playerEl ).CSSAnimate( { 1355 opacity: 1 1356 }, 1000 ); 1357 YTPlayer.wrapper.CSSAnimate( { 1358 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 1359 }, 1000 ); 1360 } else { 1361 YTPlayer.player.pauseVideo(); 1362 if( !YTPlayer.isPlayer ) { 1363 jQuery( YTPlayer.playerEl ).CSSAnimate( { 1364 opacity: 1 1365 }, 1000 ); 1366 YTPlayer.wrapper.CSSAnimate( { 1367 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 1368 }, 1000 ); 1369 } 1370 } 1371 1372 if( YTPlayer.isPlayer && !YTPlayer.opt.autoPlay ) { 1373 YTPlayer.loading.html( "Ready" ); 1374 setTimeout( function() { 1375 YTPlayer.loading.fadeOut(); 1376 1377 1378 }, 100 ) 1379 } 1380 if( YTPlayer.controlBar ) YTPlayer.controlBar.slideDown( 1000 ); 1381 } else { 1382 //YTPlayer.player.playVideo(); 1383 if( startAt >= 0 ) YTPlayer.player.seekTo( startAt, true ); 1384 } 1385 }, 1000 ); 1386 }, 1387 /** 1388 * 1389 * @param s 1390 * @returns {string} 1391 */ 1392 formatTime: function( s ) { 1393 var min = Math.floor( s / 60 ); 1394 var sec = Math.floor( s - ( 60 * min ) ); 1395 return( min <= 9 ? "0" + min : min ) + " : " + ( sec <= 9 ? "0" + sec : sec ); 1396 } 1397 }; 1398 /** 1399 * 1400 * @returns {boolean} 1401 */ 1402 jQuery.fn.toggleVolume = function() { 1403 var YTPlayer = this.get( 0 ); 1404 if( !YTPlayer ) return; 1405 if( YTPlayer.player.isMuted() ) { 1406 jQuery( YTPlayer ).YTPUnmute(); 1407 return true; 1408 } else { 1409 jQuery( YTPlayer ).YTPMute(); 1410 return false;
1411 } 1412 }; 1413 /** 1414 * 1415 */ 1416 jQuery.fn.optimizeDisplay = function() { 1417 var YTPlayer = this.get( 0 ); 1418 var data = YTPlayer.opt; 1419 var playerBox = jQuery( YTPlayer.playerEl ); 1420 var win = {}; 1421 var el = YTPlayer.wrapper; 1422 win.width = el.outerWidth(); 1423 win.height = el.outerHeight(); 1424 var margin = 24; 1425 var overprint = 100; 1426 var vid = {}; 1427 if( data.optimizeDisplay ) { 1428 vid.width = win.width + ( ( win.width * margin ) / 100 ); 1429 vid.height = data.ratio == "16/9" ? Math.ceil( ( 9 * win.width ) / 16 ) : Math.ceil( ( 3 * win.width ) / 4 ); 1430 vid.marginTop = -( ( vid.height - win.height ) / 2 ); 1431 vid.marginLeft = -( ( win.width * ( margin / 2 ) ) / 100 ); 1432 if( vid.height < win.height ) { 1433 vid.height = win.height + ( ( win.height * margin ) / 100 ); 1434 vid.width = data.ratio == "16/9" ? Math.floor( ( 16 * win.height ) / 9 ) : Math.floor( ( 4 * win.height ) / 3 ); 1435 vid.marginTop = -( ( win.height * ( margin / 2 ) ) / 100 ); 1436 vid.marginLeft = -( ( vid.width - win.width ) / 2 ); 1437 } 1438 vid.width += overprint; 1439 vid.height += overprint; 1440 vid.marginTop -= overprint / 2; 1441 vid.marginLeft -= overprint / 2; 1442 } else { 1443 vid.width = "100%"; 1444 vid.height = "100%"; 1445 vid.marginTop = 0; 1446 vid.marginLeft = 0; 1447 } 1448 playerBox.css( { 1449 width: vid.width, 1450 height: vid.height, 1451 marginTop: vid.marginTop, 1452 marginLeft: vid.marginLeft 1453 } ); 1454 }; 1455 /** 1456 * 1457 * @param arr 1458 * @returns {Array|string|Blob|*} 1459 * 1460 */ 1461 jQuery.shuffle = function( arr ) { 1462 var newArray = arr.slice(); 1463 var len = newArray.length; 1464 var i = len; 1465 while( i-- ) { 1466 var p = parseInt( Math.random() * len ); 1467 var t = newArray[ i ]; 1468 newArray[ i ] = newArray[ p ]; 1469 newArray[ p ] = t; 1470 } 1471 return newArray; 1472 }; 1473 1474 jQuery.fn.unselectable = function() { 1475 return this.each( function() { 1476 jQuery( this ).css( { 1477 "-moz-user-select": "none", 1478 "-webkit-user-select": "none", 1479 "user-select": "none" 1480 } ).attr( "unselectable", "on" ); 1481 } ); 1482 }; 1483 1484 1485 /* Exposed public method */ 1486 jQuery.fn.YTPlayer = jQuery.mbYTPlayer.buildPlayer; 1487 jQuery.fn.YTPGetPlayer = jQuery.mbYTPlayer.getPlayer; 1488 jQuery.fn.YTPGetVideoID = jQuery.mbYTPlayer.getVideoID; 1489 jQuery.fn.YTPChangeMovie = jQuery.mbYTPlayer.changeMovie; 1490 jQuery.fn.YTPPlayerDestroy = jQuery.mbYTPlayer.playerDestroy; 1491 1492 jQuery.fn.YTPPlay = jQuery.mbYTPlayer.play; 1493 jQuery.fn.YTPTogglePlay = jQuery.mbYTPlayer.togglePlay; 1494 jQuery.fn.YTPStop = jQuery.mbYTPlayer.stop; 1495 jQuery.fn.YTPPause = jQuery.mbYTPlayer.pause; 1496 jQuery.fn.YTPSeekTo = jQuery.mbYTPlayer.seekTo; 1497 1498 jQuery.fn.YTPlaylist = jQuery.mbYTPlayer.playlist; 1499 jQuery.fn.YTPPlayNext = jQuery.mbYTPlayer.playNext; 1500 jQuery.fn.YTPPlayPrev = jQuery.mbYTPlayer.playPrev; 1501 1502 jQuery.fn.YTPMute = jQuery.mbYTPlayer.mute; 1503 jQuery.fn.YTPUnmute = jQuery.mbYTPlayer.unmute; 1504 jQuery.fn.YTPToggleVolume = jQuery.mbYTPlayer.toggleVolume; 1505 jQuery.fn.YTPSetVolume = jQuery.mbYTPlayer.setVolume; 1506 1507 jQuery.fn.YTPGetVideoData = jQuery.mbYTPlayer.getVideoData; 1508 jQuery.fn.YTPFullscreen = jQuery.mbYTPlayer.fullscreen; 1509 jQuery.fn.YTPToggleLoops = jQuery.mbYTPlayer.toggleLoops; 1510 jQuery.fn.YTPSetVideoQuality = jQuery.mbYTPlayer.setVideoQuality; 1511 jQuery.fn.YTPManageProgress = jQuery.mbYTPlayer.manageProgress; 1512 1513 jQuery.fn.YTPApplyFilter = jQuery.mbYTPlayer.applyFilter; 1514 jQuery.fn.YTPApplyFilters = jQuery.mbYTPlayer.applyFilters; 1515 jQuery.fn.YTPToggleFilter = jQuery.mbYTPlayer.toggleFilter; 1516 jQuery.fn.YTPToggleFilters = jQuery.mbYTPlayer.toggleFilters; 1517 jQuery.fn.YTPRemoveFilter = jQuery.mbYTPlayer.removeFilter; 1518 jQuery.fn.YTPDisableFilters = jQuery.mbYTPlayer.disableFilters; 1519 jQuery.fn.YTPEnableFilters = jQuery.mbYTPlayer.enableFilters; 1520 1521 1522 /** 1523 * 1524 * @deprecated 1525 * 1526 **/ 1527 jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer; 1528 jQuery.fn.playNext = jQuery.mbYTPlayer.playNext; 1529 jQuery.fn.playPrev = jQuery.mbYTPlayer.playPrev; 1530 jQuery.fn.changeMovie = jQuery.mbYTPlayer.changeMovie; 1531 jQuery.fn.getVideoID = jQuery.mbYTPlayer.getVideoID; 1532 jQuery.fn.getPlayer = jQuery.mbYTPlayer.getPlayer; 1533 jQuery.fn.playerDestroy = jQuery.mbYTPlayer.playerDestroy; 1534 jQuery.fn.fullscreen = jQuery.mbYTPlayer.fullscreen; 1535 jQuery.fn.buildYTPControls = jQuery.mbYTPlayer.buildControls; 1536 jQuery.fn.playYTP = jQuery.mbYTPlayer.play; 1537 jQuery.fn.toggleLoops = jQuery.mbYTPlayer.toggleLoops; 1538 jQuery.fn.stopYTP = jQuery.mbYTPlayer.stop; 1539 jQuery.fn.pauseYTP = jQuery.mbYTPlayer.pause; 1540 jQuery.fn.seekToYTP = jQuery.mbYTPlayer.seekTo; 1541 jQuery.fn.muteYTPVolume = jQuery.mbYTPlayer.mute; 1542 jQuery.fn.unmuteYTPVolume = jQuery.mbYTPlayer.unmute; 1543 jQuery.fn.setYTPVolume = jQuery.mbYTPlayer.setVolume; 1544 jQuery.fn.setVideoQuality = jQuery.mbYTPlayer.setVideoQuality; 1545 jQuery.fn.manageYTPProgress = jQuery.mbYTPlayer.manageProgress; 1546 jQuery.fn.YTPGetDataFromFeed = jQuery.mbYTPlayer.getVideoData; 1547 1548 1549} )( jQuery, ytp ); 1550; 1551/* 1552 * ****************************************************************************** 1553 * jquery.mb.components 1554 * file: jquery.mb.CSSAnimate.min.js 1555 * 1556 * Copyright (c) 2001-2014. Matteo Bicocchi (Pupunzi); 1557 * Open lab srl, Firenze - Italy 1558 * email: [email protected]
vendor: 12,824 bytes, lines 1559-1601
1559 * site: http://pupunzi.com 1560 * blog: http://pupunzi.open-lab.com 1561 * http://open-lab.com 1562 * 1563 * Licences: MIT, GPL 1564 * http://www.opensource.org/licenses/mit-license.php 1565 * http://www.gnu.org/licenses/gpl.html 1566 * 1567 * last modified: 26/03/14 21.40 1568 * ***************************************************************************** 1569 */ 1570 1571function 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)",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)})}; 1572;/* 1573 * ****************************************************************************** 1574 * jquery.mb.components 1575 * file: jquery.mb.browser.min.js 1576 * 1577 * Copyright (c) 2001-2014. Matteo Bicocchi (Pupunzi); 1578 * Open lab srl, Firenze - Italy 1579 * email: [email protected] 1580 * site: http://pupunzi.com 1581 * blog: http://pupunzi.open-lab.com 1582 * http://open-lab.com 1583 * 1584 * Licences: MIT, GPL 1585 * http://www.opensource.org/licenses/mit-license.php 1586 * http://www.gnu.org/licenses/gpl.html 1587 * 1588 * last modified: 26/03/14 21.43 1589 * ***************************************************************************** 1590 */ 1591 1592var 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.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")){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)):-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.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)):(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));-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); 1593;/*___________________________________________________________________________________________________________________________________________________ 1594 _ jquery.mb.components _ 1595 _ _ 1596 _ file: jquery.mb.simpleSlider.min.js _ 1597 _ last modified: 16/05/15 23.45 _ 1598 _ _ 1599 _ Open Lab s.r.l., Florence - Italy _ 1600 _ _ 1601 _ email: [email protected] _
1602 _ site: http://pupunzi.com _ 1603 _ http://open-lab.com _ 1604 _ blog: http://pupunzi.open-lab.com _ 1605 _ Q&A: http://jquery.pupunzi.com _ 1606 _ _ 1607 _ Licences: MIT, GPL _ 1608 _ http://www.opensource.org/licenses/mit-license.php _ 1609 _ http://www.gnu.org/licenses/gpl.html _ 1610 _ _ 1611 _ Copyright (c) 2001-2015. Matteo Bicocchi (Pupunzi); _ 1612 ___________________________________________________________________________________________________________________________________________________*/ 1613 1614!function(a){/iphone|ipod|ipad|android|ie|blackberry|fennec/.test(navigator.userAgent.toLowerCase());var c="ontouchstart"in window||window.navigator&&window.navigator.msPointerEnabled&&window.MSGesture||window.DocumentTouch&&document instanceof DocumentTouch||!1;a.simpleSlider={defaults:{initialval:0,scale:100,orientation:"h",readonly:!1,callback:!1},events:{start:c?"touchstart":"mousedown",end:c?"touchend":"mouseup",move:c?"touchmove":"mousemove"},init:function(b){return this.each(function(){var d=this,e=a(d);e.addClass("simpleSlider"),d.opt={},a.extend(d.opt,a.simpleSlider.defaults,b),a.extend(d.opt,e.data());var f="h"==d.opt.orientation?"horizontal":"vertical",g=a("<div/>").addClass("level").addClass(f);e.prepend(g),d.level=g,e.css({cursor:"default"}),"auto"==d.opt.scale&&(d.opt.scale=a(d).outerWidth()),e.updateSliderVal(),d.opt.readonly||(e.on(a.simpleSlider.events.start,function(a){c&&(a=a.changedTouches[0]),d.canSlide=!0,e.updateSliderVal(a),e.css({cursor:"col-resize"}),a.preventDefault(),a.stopPropagation()}),a(document).on(a.simpleSlider.events.move,function(b){c&&(b=b.changedTouches[0]),d.canSlide&&(a(document).css({cursor:"default"}),e.updateSliderVal(b),b.preventDefault(),b.stopPropagation())}).on(a.simpleSlider.events.end,function(){a(document).css({cursor:"auto"}),d.canSlide=!1,e.css({cursor:"auto"})}))})},updateSliderVal:function(b){function g(a,b){return Math.floor(100*a/b)}var c=this,d=c.get(0);d.opt.initialval="number"==typeof d.opt.initialval?d.opt.initialval:d.opt.initialval(d);var e=a(d).outerWidth(),f=a(d).outerHeight();d.x="object"==typeof b?b.clientX+document.body.scrollLeft-c.offset().left:"number"==typeof b?b*e/d.opt.scale:d.opt.initialval*e/d.opt.scale,d.y="object"==typeof b?b.clientY+document.body.scrollTop-c.offset().top:"number"==typeof b?(d.opt.scale-d.opt.initialval-b)*f/d.opt.scale:d.opt.initialval*f/d.opt.scale,d.y=c.outerHeight()-d.y,d.scaleX=d.x*d.opt.scale/e,d.scaleY=d.y*d.opt.scale/f,d.outOfRangeX=d.scaleX>d.opt.scale?d.scaleX-d.opt.scale:d.scaleX<0?d.scaleX:0,d.outOfRangeY=d.scaleY>d.opt.scale?d.scaleY-d.opt.scale:d.scaleY<0?d.scaleY:0,d.outOfRange="h"==d.opt.orientation?d.outOfRangeX:d.outOfRangeY,d.value="undefined"!=typeof b?"h"==d.opt.orientation?d.x>=c.outerWidth()?d.opt.scale:d.x<=0?0:d.scaleX:d.y>=c.outerHeight()?d.opt.scale:d.y<=0?0:d.scaleY:"h"==d.opt.orientation?d.scaleX:d.scaleY,"h"==d.opt.orientation?d.level.width(g(d.x,e)+"%"):d.level.height(g(d.y,f)),"function"==typeof d.opt.callback&&d.opt.callback(d)}},a.fn.simpleSlider=a.simpleSlider.init,a.fn.updateSliderVal=a.simpleSlider.updateSliderVal}(jQuery); 1615;/*___________________________________________________________________________________________________________________________________________________ 1616 _ jquery.mb.components _ 1617 _ _ 1618 _ file: jquery.mb.storage.min.js _ 1619 _ last modified: 24/05/15 16.08 _ 1620 _ _ 1621 _ Open Lab s.r.l., Florence - Italy _ 1622 _ _ 1623 _ email: [email protected] _
1624 _ site: http://pupunzi.com _ 1625 _ http://open-lab.com _ 1626 _ blog: http://pupunzi.open-lab.com _ 1627 _ Q&A: http://jquery.pupunzi.com _ 1628 _ _ 1629 _ Licences: MIT, GPL _ 1630 _ http://www.opensource.org/licenses/mit-license.php _ 1631 _ http://www.gnu.org/licenses/gpl.html _ 1632 _ _ 1633 _ Copyright (c) 2001-2015. Matteo Bicocchi (Pupunzi); _ 1634 ___________________________________________________________________________________________________________________________________________________*/ 1635 1636!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.