PageSourceSearch

https://www.trinitycatholichs.org/wp-content/themes/invent/js/libs/jquery.mb.YTPlayer.js?ver=1.0

js trinitycatholichs.org collected 2026-10-02 12:12:12 UTC 91,371 bytes, 1,517 lines download raw bytes

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