PageSourceSearch

https://www.aasco.co.in/assets/js/jquery.mb.YTPlayer.js

js aasco.co.in collected 2026-09-27 14:06:11 UTC 103,147 bytes, 2,064 lines download raw bytes

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

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