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