PageSourceSearch

https://www.hologic.es/sites/default/files/cohesion/scripts/youtub…/jquery.mb.YTPlayer.js?tm4wcr

js hologic.es collected 2026-10-08 20:32:19 UTC 96,978 bytes, 2,175 lines download raw bytes

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.