PageSourceSearch

http://hotelgiottotorino.com/template/vision/js/jquery.mb.YTPlayer.js

js hotelgiottotorino.com collected 2026-10-09 03:42:35 UTC 54,666 bytes, 1,108 lines download raw bytes

vendor: 5,963 bytes, lines 1-54
1
2
3var ytp = ytp || {};
4
5function onYouTubePlayerAPIReady() {
6    if(ytp.YTAPIReady)
7        return;
8
9    ytp.YTAPIReady=true;
10    jQuery(document).trigger("YTAPIReady");
11}
12
13(function (jQuery, ytp) {
14
15    /*Browser detection patch*/
16    var nAgt = navigator.userAgent;
17    if (!jQuery.browser) {
18        jQuery.browser = {};
19        jQuery.browser.mozilla = !1;
20        jQuery.browser.webkit = !1;
21        jQuery.browser.opera = !1;
22        jQuery.browser.safari = !1;
23        jQuery.browser.chrome = !1;
24        jQuery.browser.msie = !1;
25        jQuery.browser.ua = nAgt;
26        jQuery.browser.name = navigator.appName;
27        jQuery.browser.fullVersion = "" + parseFloat(navigator.appVersion);
28        jQuery.browser.majorVersion = parseInt(navigator.appVersion, 10);
29        var nameOffset, verOffset, ix;
30        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("MSIE")))jQuery.browser.msie = !0, jQuery.browser.name = "Microsoft Internet Explorer", jQuery.browser.fullVersion = nAgt.substring(verOffset + 5); else if (-1 != nAgt.indexOf("Trident")) {
31            jQuery.browser.msie = !0;
32            jQuery.browser.name = "Microsoft Internet Explorer";
33            var start = nAgt.indexOf("rv:") + 3, end = start + 4;
34            jQuery.browser.fullVersion = nAgt.substring(start, end)
35        } 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));
36        -1 != (ix = jQuery.browser.fullVersion.indexOf(";")) && (jQuery.browser.fullVersion = jQuery.browser.fullVersion.substring(0, ix));
37        -1 != (ix = jQuery.browser.fullVersion.indexOf(" ")) && (jQuery.browser.fullVersion = jQuery.browser.fullVersion.substring(0, ix));
38        jQuery.browser.majorVersion = parseInt("" + jQuery.browser.fullVersion, 10);
39        isNaN(jQuery.browser.majorVersion) && (jQuery.browser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.browser.majorVersion = parseInt(navigator.appVersion, 10));
40        jQuery.browser.version = jQuery.browser.majorVersion
41    }
42    jQuery.browser.android = /Android/i.test(nAgt);
43    jQuery.browser.blackberry = /BlackBerry/i.test(nAgt);
44    jQuery.browser.ios = /iPhone|iPad|iPod/i.test(nAgt);
45    jQuery.browser.operaMobile = /Opera Mini/i.test(nAgt);
46    jQuery.browser.windowsMobile = /IEMobile/i.test(nAgt);
47    jQuery.browser.mobile = jQuery.browser.android || jQuery.browser.blackberry || jQuery.browser.ios || jQuery.browser.windowsMobile || jQuery.browser.operaMobile;
48
49    ytp.isDevice = jQuery.browser.mobile;
50    /*******************************************************************************
51     * jQuery.mb.components: jquery.mb.CSSAnimate
52     ******************************************************************************/
53
54    jQuery.fn.CSSAnimate=function(a,g,p,m,h){function r(a){return a.replace(/([A-Z])/g,function(a){return"-"+a.toLowerCase()})}function f(a,f){return"string"!==typeof a||a.match(/^[\-0-9\.]+$/)?""+a+f:a}jQuery.support.CSStransition=function(){var a=(document.body||document.documentElement).style;return void 0!==a.transition||void 0!==a.WebkitTransition||void 0!==a.MozTransition||void 0!==a.MsTransition||void 0!==a.OTransition}();return this.each(function(){var e=this,k=jQuery(this);e.id=e.id||"CSSA_"+ (new Date).getTime();var l=l||{type:"noEvent"};if(e.CSSAIsRunning&&e.eventType==l.type)e.CSSqueue=function(){k.CSSAnimate(a,g,p,m,h)};else if(e.CSSqueue=null,e.eventType=l.type,0!==k.length&&a){e.CSSAIsRunning=!0;"function"==typeof g&&(h=g,g=jQuery.fx.speeds._default);"function"==typeof p&&(h=p,p=0);"function"==typeof m&&(h=m,m="cubic-bezier(0.65,0.03,0.36,0.72)");if("string"==typeof g)for(var b in jQuery.fx.speeds)if(g==b){g=jQuery.fx.speeds[b];break}else g=jQuery.fx.speeds._default;g||(g=jQuery.fx.speeds._default); if(jQuery.support.CSStransition){l={"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
54)",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)"};l[m]&&(m=l[m]);var d="",q="transitionEnd";jQuery.browser.webkit?(d="-webkit-",q="webkitTransitionEnd"):jQuery.browser.mozilla?(d="-moz-",q="transitionend"):jQuery.browser.opera?(d="-o-",q="otransitionend"):jQuery.browser.msie&&(d="-ms-",q="msTransitionEnd");l=[];for(c in a){b=c;"transform"===b&&(b=d+"transform",a[b]=a[c],delete a[c]);"filter"===b&&(b=d+"filter",a[b]=a[c],delete a[c]);if("transform-origin"=== b||"origin"===b)b=d+"transform-origin",a[b]=a[c],delete a[c];"x"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" translateX("+f(a[c],"px")+")",delete a[c]);"y"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" translateY("+f(a[c],"px")+")",delete a[c]);"z"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" translateZ("+f(a[c],"px")+")",delete a[c]);"rotate"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" rotate("+f(a[c],"deg")+")",delete a[c]);"rotateX"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" rotateX("+f(a[c],"deg")+ ")",delete a[c]);"rotateY"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" rotateY("+f(a[c],"deg")+")",delete a[c]);"rotateZ"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" rotateZ("+f(a[c],"deg")+")",delete a[c]);"scale"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" scale("+f(a[c],"")+")",delete a[c]);"scaleX"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" scaleX("+f(a[c],"")+")",delete a[c]);"scaleY"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" scaleY("+f(a[c],"")+")",delete a[c]);"scaleZ"===b&&(b=d+"transform", a[b]=a[b]||"",a[b]+=" scaleZ("+f(a[c],"")+")",delete a[c]);"skew"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" skew("+f(a[c],"deg")+")",delete a[c]);"skewX"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" skewX("+f(a[c],"deg")+")",delete a[c]);"skewY"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" skewY("+f(a[c],"deg")+")",delete a[c]);"perspective"===b&&(b=d+"transform",a[b]=a[b]||"",a[b]+=" perspective("+f(a[c],"px")+")",delete a[c]);0>l.indexOf(b)&&l.push(r(b))}var c=l.join(","),s=function(){k.off(q+"."+ e.id);clearTimeout(e.timeout);k.css(d+"transition","");"function"==typeof h&&h(k);e.called=!0;e.CSSAIsRunning=!1;"function"==typeof e.CSSqueue&&(e.CSSqueue(),e.CSSqueue=null)},n={};jQuery.extend(n,a);n[d+"transition-property"]=c;n[d+"transition-duration"]=g+"ms";n[d+"transition-delay"]=p+"ms";n[d+"transition-style"]="preserve-3d";n[d+"transition-timing-function"]=m;setTimeout(function(){k.one(q+"."+e.id,s);k.css(n)},1);e.timeout=setTimeout(function(){k.called||!h?(k.called=!1,e.CSSAIsRunning=!1):(k.css(d+ "transition",""),h(k),e.CSSAIsRunning=!1,"function"==typeof e.CSSqueue&&(e.CSSqueue(),e.CSSqueue=null))},g+p+100)}else{for(var c in a)"transform"===c&&delete a[c],"filter"===c&&delete a[c],"transform-origin"===c&&delete a[c],"auto"===a[c]&&delete a[c];h&&"string"!==typeof h||(h="linear");k.animate(a,g,h)}}})};
55
56    /******************************************************************************/
57
58    var getYTPVideoID=function(url){
59        var movieURL;
60        if(url.substr(0,16)=="http://youtu.be/"){
61            movieURL= url.replace("http://youtu.be/","");
62        }else if(url.indexOf("http")>-1){
63            movieURL = url.match(/[\\?&]v=([^&#]*)/)[1];
64        }else{
65            movieURL = url
66        }
67        return movieURL;
68    };
69
70
71    jQuery.mbYTPlayer = {
72        name            : "jquery.mb.YTPlayer",
73        version         : "2.7.2",
74        author          : "Matteo Bicocchi",
75        defaults        : {
76            containment            : "body",
77            ratio                  : "16/9",
78            videoURL               : null,
79            startAt                : 0,
80            stopAt                 : 0,
81            autoPlay               : true,
82            vol                    : 100, // 1 to 100
83            addRaster              : false,
84            opacity                : 1,
85            quality                : "default", //or “small”, “medium”, “large”, “hd720”, “hd1080”, “highres”
86            mute                   : false,
87            loop                   : true,
88            showControls           : true,
89            showAnnotations        : false,
90            showYTLogo             : true,
91            stopMovieOnClick       : true,
92            realfullscreen         : true,
93            gaTrack                : true,
94            onReady                : function (player) {},
95            onStateChange          : function (player) {},
96            onPlaybackQualityChange: function (player) {},
97            onError                : function (player) {}
98        },
99
100        /*@fontface icons*/
101        controls        : {
102            play    : "P",
103            pause   : "p",
104            mute    : "M",
105            unmute  : "A",
106            onlyYT  : "O",
107            showSite: "R",
108            ytLogo  : "Y"
109        },
110        rasterImg       : "images/raster.png",
111        rasterImgRetina : "images/[email protected]",
112        locationProtocol: "https:",
113
114        buildPlayer: function (options) {
115            return this.each(function () {
116                var YTPlayer = this;
117                var $YTPlayer = jQuery(YTPlayer);
118
119                YTPlayer.loop = 0;
120                YTPlayer.opt = {};
121
122                $YTPlayer.addClass("mb_YTVPlayer");
123
124                var property = $YTPlayer.data("property") && typeof $YTPlayer.data("property") == "string" ? eval('(' + $YTPlayer.data("property") + ')') : $YTPlayer.data("property");
125
126                if(typeof property.vol != "undefined")
127                    property.vol = property.vol == 0 ? property.vol = 1: property.vol;
128
129                jQuery.extend(YTPlayer.opt, jQuery.mbYTPlayer.defaults, options, property);
130
131                var canGoFullscreen = !(jQuery.browser.msie || jQuery.browser.opera || self.location.href != top.location.href);
132
133                if (!canGoFullscreen)
134                    YTPlayer.opt.realfullscreen = false;
135
136                if (!$YTPlayer.attr("id"))
137                    $YTPlayer.attr("id", "YTP_" + new Date().getTime());
138
139                YTPlayer.opt.id = YTPlayer.id;
140                YTPlayer.isAlone = false;
141
142                var playerID = "mbYTP_" + YTPlayer.id;
143                var videoID = this.opt.videoURL ? getYTPVideoID(this.opt.videoURL) : $YTPlayer.attr("href") ? getYTPVideoID($YTPlayer.attr("href")) : false;
144                YTPlayer.videoID = videoID;
145
146                YTPlayer.opt.showAnnotations = (YTPlayer.opt.showAnnotations) ? '0' : '3';
147                var playerVars = { 'autoplay': 0, 'modestbranding': 1, 'controls': 0, 'showinfo': 0, 'rel': 0, 'enablejsapi': 1, 'version': 3, 'playerapiid': playerID, 'origin': '*', 'allowfullscreen': true, 'wmode': 'transparent', 'iv_load_policy': YTPlayer.opt.showAnnotations};
148
149                var canPlayHTML5 = false;
150                var v = document.createElement('video');
151                if (v.canPlayType) {
152                    canPlayHTML5 = true;
153                }
154
155                if (canPlayHTML5)
156                    jQuery.extend(playerVars, {'html5': 1});
157
158                if (jQuery.browser.msie && jQuery.browser.version < 9) {
159                    this.opt.opacity = 1;
160                }
161
162                var playerBox = jQuery("<div/>").attr("id", playerID).addClass("playerBox");
163                var overlay = jQuery("<div/>").css({position: "absolute", top: 0, left: 0, width: "100%", height: "100%"}).addClass("YTPOverlay"); //YTPlayer.isBackground ? "fixed" :
164
165                YTPlayer.isSelf = YTPlayer.opt.containment == "self";
166                YTPlayer.opt.containment = YTPlayer.opt.containment == "self" ? jQuery(this) : jQuery(YTPlayer.opt.containment);
167                YTPlayer.isBackground = YTPlayer.opt.containment.get(0).tagName.toLowerCase() == "body";
168
169                if (YTPlayer.isBackground && ytp.backgroundIsInited)
170                    return;
171
172                if (!YTPlayer.opt.containment.is(jQuery(this))) {
173                    $YTPlayer.hide();
174                } else {
175                    YTPlayer.isPlayer = true;
176                }
177
178                if (ytp.isDevice && YTPlayer.isBackground) {
179                    $YTPlayer.remove();
180                    return;
181                }
182
183                if (YTPlayer.opt.addRaster) {
184                    var retina = (window.retina || window.devicePixelRatio > 1);
185                    overlay.addClass(retina ? "raster retina" : "raster");
186                } else {
187                    overlay.removeClass("raster retina");
188                }
189
190                var wrapper = jQuery("<div/>").addClass("mbYTP_wrapper").attr("id", "wrapper_" + playerID);
191                wrapper.css({position: "absolute", zIndex: 0, minWidth: "100%", minHeight: "100%", left: 0, top: 0, overflow: "hidden", opacity: 0});
192                playerBox.css({position: "absolute", zIndex: 0, width: "100%", height: "100%", top: 0, left: 0, overflow: "hidden", opacity: this.opt.opacity});
193                wrapper.append(playerBox);
194
195
196                YTPlayer.opt.containment.children().not("script, style").each(function () {
197                    if (jQuery(this).css("position") == "static")
198                        jQuery(this).css("position", "relative");
199                });
200
201                if (YTPlayer.isBackground) {
202                    jQuery("body").css({position: "relative", minWidth: "100%", minHeight: "100%", zIndex: 1, boxSizing: "border-box"});
203                    wrapper.css({position: "fixed", top: 0, left: 0, zIndex: 0, webkitTransform: "translateZ(0)"});
204                    $YTPlayer.hide();
205                } else if (YTPlayer.opt.containment.css("position") == "static")
206                    YTPlayer.opt.containment.css({position: "relative"});
207
208
209                YTPlayer.opt.containment.prepend(wrapper);
210                YTPlayer.wrapper = wrapper;
211
212                playerBox.css({opacity: 1});
213
214                if (!ytp.isDevice) {
215                    playerBox.after(overlay);
216                    YTPlayer.overlay = overlay;
217                }
218
219                if (!YTPlayer.isBackground) {
220                    overlay.on("mouseenter", function () {
221                        $YTPlayer.find(".mb_YTVPBar").addClass("visible");
222                    }).on("mouseleave", function () {
223                        $YTPlayer.find(".mb_YTVPBar").removeClass("visible");
224                    })
225                }
226
227                if (!ytp.YTAPIReady) {
228
229                    jQuery("#YTAPI").remove();
230                    var tag = jQuery("<script></script>").attr({"src": jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/player_api?v=" + jQuery.mbYTPlayer.version, "id": "YTAPI"});
231                    jQuery("head title").after(tag);
232
233                } else {
234
235                    setTimeout(function () {
236                        jQuery(document).trigger("YTAPIReady");
237                    }, 100)
238
239                }
240
241                jQuery(document).on("YTAPIReady", function () {
242
243                    if ((YTPlayer.isBackground && ytp.backgroundIsInited) || YTPlayer.isInit)
244                        return;
245
246                    if (YTPlayer.isBackground && YTPlayer.opt.stopMovieOnClick)
247                        jQuery(document).off("mousedown.ytplayer").on("mousedown,.ytplayer", function (e) {
248                            var target = jQuery(e.target);
249                            if (target.is("a") || target.parents().is("a")) {
250                                $YTPlayer.pauseYTP();
251                            }
252                        });
253
254                    if (YTPlayer.isBackground){
255                        ytp.backgroundIsInited = true;
256                    }
257
258                    YTPlayer.opt.autoPlay = typeof YTPlayer.opt.autoPlay == "undefined" ? (YTPlayer.isBackground ? true : false) : YTPlayer.opt.autoPlay;
259
260                    YTPlayer.opt.vol = YTPlayer.opt.vol ? YTPlayer.opt.vol : 100;
261
262                    jQuery.mbYTPlayer.getDataFromFeed(YTPlayer.videoID, YTPlayer);
263
264                    jQuery(YTPlayer).on("YTPChanged", function () {
265
266                        if (YTPlayer.isInit)
267                            return;
268
269                        YTPlayer.isInit = true;
270
271                        if (ytp.isDevice && !YTPlayer.isBackground) {
272                            new YT.Player(playerID, {
273                                videoId: YTPlayer.videoID.toString(),
274                                height : '100%',
275                                width  : '100%',
276                                videoId: YTPlayer.videoID,
277                                events : {
278                                    'onReady'      : function (event) {
279                                        YTPlayer.player = event.target;
280                                        playerBox.css({opacity: 1});
281                                        YTPlayer.wrapper.css({opacity: 1});
282                                        $YTPlayer.optimizeDisplay();
283                                    },
284                                    'onStateChange': function () {}
285                                }
286                            });
287                            return;
288                        }
289
290                        new YT.Player(playerID, {
291                            videoId   : YTPlayer.videoID.toString(),
292                            playerVars: playerVars,
293                            events    : {
294                                'onReady': function (event) {
295
296                                    YTPlayer.player = event.target;
297
298                                    if (YTPlayer.isReady)
299                                        return;
300
301                                    YTPlayer.isReady = true;
302
303                                    YTPlayer.playerEl = YTPlayer.player.getIframe();
304                                    $YTPlayer.optimizeDisplay();
305
306                                    YTPlayer.videoID = videoID;
307
308                                    jQuery(window).on("resize.YTP", function () {
309                                        $YTPlayer.optimizeDisplay();
310                                    });
311
312                                    if (YTPlayer.opt.showControls)
313                                        jQuery(YTPlayer).buildYTPControls();
314
315                                    var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
316
317                                    YTPlayer.player.setVolume(0);
318                                    jQuery(YTPlayer).muteYTPVolume();
319
320                                    jQuery.mbYTPlayer.checkForState(YTPlayer);
321
322                                    YTPlayer.checkForStartAt = setInterval(function () {
323
324                                        var canPlayVideo = (YTPlayer.player.getVideoLoadedFraction() > startAt/YTPlayer.player.getDuration());
325
326                                        if (YTPlayer.player.getDuration() > 0 && YTPlayer.player.getCurrentTime() >= startAt &&  canPlayVideo) {
327
328                                            clearInterval(YTPlayer.checkForStartAt);
329
330                                            YTPlayer.player.setVolume(0);
331                                            jQuery(YTPlayer).muteYTPVolume();
332
333                                            if (typeof YTPlayer.opt.onReady == "function")
334                                                YTPlayer.opt.onReady($YTPlayer);
335
336                                            if (!YTPlayer.opt.mute)
337                                                jQuery(YTPlayer).unmuteYTPVolume();
338
339                                            jQuery.mbYTPlayer.checkForState(YTPlayer);
340
341                                            YTPlayer.player.pauseVideo();
342
343                                            setTimeout(function(){
344                                                if (YTPlayer.opt.autoPlay){
345                                                    $YTPlayer.playYTP();
346                                                    $YTPlayer.css("background-image", "none");
347                                                } else  {
348                                                    YTPlayer.player.pauseVideo();
349                                                }
350                                                YTPlayer.wrapper.CSSAnimate({opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity}, 2000);
351                                            },100)
352
353                                        }else{
354                                            YTPlayer.player.playVideo();
355                                            YTPlayer.player.seekTo(startAt, true);
356                                        }
357                                    }, $.browser.chrome ? 1000 : 1);
358                                },
359
360                                'onStateChange'          : function (event) {
361
362                                    /*
363                                     -1 (unstarted)
364                                     0 (ended)
365                                     1 (playing)
366                                     2 (paused)
367                                     3 (buffering)
368                                     5 (video cued).
369                                     */
370
371                                    if (typeof event.target.getPlayerState != "function")
372                                        return;
373                                    var state = event.target.getPlayerState();
374
375                                    if (typeof YTPlayer.opt.onStateChange == "function")
376                                        YTPlayer.opt.onStateChange($YTPlayer, state);
377
378                                    var controls = jQuery("#controlBar_" + YTPlayer.id);
379
380                                    var data = YTPlayer.opt;
381//------------------------------------------------------------------ ended
382                                    if (state == 0) {
383                                        if (YTPlayer.state == state)
384                                            return;
385
386                                        YTPlayer.state = state;
387                                        YTPlayer.player.pauseVideo();
388                                        var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
389
390                                        if (data.loop) {
391                                            YTPlayer.wrapper.css({opacity: 0});
392                                            $YTPlayer.playYTP();
393                                            YTPlayer.player.seekTo(startAt, true);
394
395                                        }
395 else if (!YTPlayer.isBackground) {
396                                            YTPlayer.player.seekTo(startAt, true);
397                                            $YTPlayer.playYTP();
398                                            setTimeout(function () {
399                                                $YTPlayer.pauseYTP();
400                                            }, 10);
401                                        }
402
403                                        if (!data.loop && YTPlayer.isBackground)
404                                            YTPlayer.wrapper.CSSAnimate({opacity: 0}, 2000);
405                                        else if (data.loop) {
406                                            YTPlayer.wrapper.css({opacity: 0});
407                                            YTPlayer.loop++;
408                                        }
409
410                                        controls.find(".mb_YTVPPlaypause").html(jQuery.mbYTPlayer.controls.play);
411                                        jQuery(YTPlayer).trigger("YTPEnd");
412                                    }
413//------------------------------------------------------------------ buffering
414                                    if (state == 3) {
415                                        if (YTPlayer.state == state)
416                                            return;
417
418                                        YTPlayer.state = state;
419                                        YTPlayer.player.setPlaybackQuality(YTPlayer.opt.quality);
420                                        controls.find(".mb_YTVPPlaypause").html(jQuery.mbYTPlayer.controls.play);
421                                        jQuery(YTPlayer).trigger("YTPBuffering");
422                                    }
423//------------------------------------------------------------------ unstarted
424                                    if (state == -1) {
425                                        if (YTPlayer.state == state)
426                                            return;
427                                        YTPlayer.state = state;
428                                        jQuery(YTPlayer).trigger("YTPUnstarted");
429                                    }
430//------------------------------------------------------------------ playing
431                                    if (state == 1) {
432                                        if (YTPlayer.state == state)
433                                            return;
434                                        YTPlayer.state = state;
435                                        YTPlayer.player.setPlaybackQuality(YTPlayer.opt.quality);
436
437                                        controls.find(".mb_YTVPPlaypause").html(jQuery.mbYTPlayer.controls.pause);
438
439                                        jQuery(YTPlayer).trigger("YTPStart");
440
441                                        if (typeof _gaq != "undefined" && eval(YTPlayer.opt.gaTrack))
442                                            _gaq.push(['_trackEvent', 'YTPlayer', 'Play', (YTPlayer.title || YTPlayer.videoID.toString())]);
443
444                                        if (typeof ga != "undefined" && eval(YTPlayer.opt.gaTrack))
445                                            ga('send', 'event', 'YTPlayer', 'play', (YTPlayer.title || YTPlayer.videoID.toString()));
446                                    }
447//------------------------------------------------------------------ paused
448                                    if (state == 2) {
449                                        if (YTPlayer.state == state)
450                                            return;
451                                        YTPlayer.state = state;
452                                        controls.find(".mb_YTVPPlaypause").html(jQuery.mbYTPlayer.controls.play);
453                                        jQuery(YTPlayer).trigger("YTPPause");
454                                    }
455
456                                },
457                                'onPlaybackQualityChange': function (e) {
458                                    if (typeof YTPlayer.opt.onPlaybackQualityChange == "function")
459                                        YTPlayer.opt.onPlaybackQualityChange($YTPlayer);
460                                },
461                                'onError'                : function (err) {
462
463                                    if (err.data == 150)
464                                    {
465                                        console.log("Embedding this video is restricted by Youtube.");
466                                        if (YTPlayer.isPlayList)
467                                            jQuery(YTPlayer).playNext();
468                                    }
469
470                                    if (err.data == 2 && YTPlayer.isPlayList)
471                                        jQuery(YTPlayer).playNext();
472
473                                    if (typeof YTPlayer.opt.onError == "function")
474                                        YTPlayer.opt.onError($YTPlayer, err);
475                                }
476                            }
477                        });
478                    });
479                })
480            });
481        },
482
483        getDataFromFeed: function (videoID, YTPlayer) {
484            //Get video info from FEEDS API
485
486            YTPlayer.videoID = videoID;
487            if (!jQuery.browser.msie) { //!(jQuery.browser.msie && jQuery.browser.version<9)
488
489                jQuery.getJSON(jQuery.mbYTPlayer.locationProtocol + '//gdata.youtube.com/feeds/api/videos/' + videoID + '?v=2&alt=jsonc', function (data, status, xhr) {
490
491                    YTPlayer.dataReceived = true;
492
493                    var videoData = data.data;
494
495                    YTPlayer.title = videoData.title;
496                    YTPlayer.videoData = videoData;
497
498                    if (YTPlayer.opt.ratio == "auto")
499                        if (videoData.aspectRatio && videoData.aspectRatio === "widescreen")
500                            YTPlayer.opt.ratio = "16/9";
501                        else
502                            YTPlayer.opt.ratio = "4/3";
503
504                    if (!YTPlayer.hasData) {
505                        YTPlayer.hasData = true;
506
507                        if (YTPlayer.isPlayer) {
508                            var bgndURL = YTPlayer.videoData.thumbnail.hqDefault;
509                            YTPlayer.opt.containment.css({background: "rgba(0,0,0,0.5) url(" + bgndURL + ") center center", backgroundSize: "cover"});
510                        }
511                    }
512                    jQuery(YTPlayer).trigger("YTPChanged");
513
514                });
515
516                setTimeout(function () {
517                    if (!YTPlayer.dataReceived && !YTPlayer.hasData) {
518                        YTPlayer.hasData = true;
519                        jQuery(YTPlayer).trigger("YTPChanged");
520                    }
521                }, 1500)
522
523            } else {
524                YTPlayer.opt.ratio == "auto" ? YTPlayer.opt.ratio = "16/9" : YTPlayer.opt.ratio;
525
526                if (!YTPlayer.hasData) {
527                    YTPlayer.hasData = true;
528                    setTimeout(function () {
529                        jQuery(YTPlayer).trigger("YTPChanged");
530                    }, 100)
531                }
532            }
533        },
534
535        getVideoID: function () {
536            var YTPlayer = this.get(0);
537            return YTPlayer.videoID || false;
538        },
539
540        setVideoQuality: function (quality) {
541            var YTPlayer = this.get(0);
542            YTPlayer.player.setPlaybackQuality(quality);
543        },
544
545        YTPlaylist: function (videos, shuffle, callback) {
546            var YTPlayer = this.get(0);
547
548            YTPlayer.isPlayList = true;
549
550            if (shuffle)
551                videos = jQuery.shuffle(videos);
552
553            if (!YTPlayer.videoID) {
554                YTPlayer.videos = videos;
555                YTPlayer.videoCounter = 0;
556                YTPlayer.videoLength = videos.length;
557
558                jQuery(YTPlayer).data("property", videos[0]);
559                jQuery(YTPlayer).mb_YTPlayer();
560            }
561
562            if (typeof callback == "function")
563                jQuery(YTPlayer).on("YTPChanged", function () {
564                    callback(YTPlayer);
565                });
566
567            jQuery(YTPlayer).on("YTPEnd", function () {
568                jQuery(YTPlayer).playNext();
569            });
570        },
571
572        playNext: function () {
573            var YTPlayer = this.get(0);
574            YTPlayer.videoCounter++;
575            if (YTPlayer.videoCounter >= YTPlayer.videoLength)
576                YTPlayer.videoCounter = 0;
577            jQuery(YTPlayer.playerEl).css({opacity: 0});
578            jQuery(YTPlayer).changeMovie(YTPlayer.videos[YTPlayer.videoCounter]);
579        },
580
581        playPrev: function () {
582            var YTPlayer = this.get(0);
583            YTPlayer.videoCounter--;
584            if (YTPlayer.videoCounter < 0)
585                YTPlayer.videoCounter = YTPlayer.videoLength - 1;
586            jQuery(YTPlayer.playerEl).css({opacity: 0});
587            jQuery(YTPlayer).changeMovie(YTPlayer.videos[YTPlayer.videoCounter]);
588        },
589
590        changeMovie: function (opt) {
591            var YTPlayer = this.get(0);
592
593            YTPlayer.opt.startAt = 0;
594            YTPlayer.opt.stopAt = 0;
595            YTPlayer.opt.mute = true;
596
597            if (opt) {
598                jQuery.extend(YTPlayer.opt, opt);
599            }
600
601            YTPlayer.videoID = getYTPVideoID(YTPlayer.opt.videoURL);
602
603            jQuery(YTPlayer).pauseYTP();
604            var timer = jQuery.browser.msie ? 1000 : 0;
605            jQuery(YTPlayer.playerEl).CSSAnimate({opacity: 0}, timer);
606
607
608            setTimeout(function () {
609                jQuery(YTPlayer).getPlayer().cueVideoByUrl(encodeURI(jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/v/" + YTPlayer.videoID), 1, YTPlayer.opt.quality);
610
611                jQuery(YTPlayer).playYTP();
612
613
614                jQuery(YTPlayer).one("YTPStart", function () {
615                    YTPlayer.wrapper.CSSAnimate({opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity}, 1000);
616                    jQuery(YTPlayer.playerEl).CSSAnimate({opacity: 1}, timer);
617
618                    if (YTPlayer.opt.startAt) {
619                        YTPlayer.player.seekTo(YTPlayer.opt.startAt);
620                    }
621                    jQuery.mbYTPlayer.checkForState(YTPlayer);
622
623                    if(!YTPlayer.opt.autoPlay)
624                        jQuery(YTPlayer).pauseYTP();
625
626                });
627
628
629
630                if (YTPlayer.opt.mute) {
631                    jQuery(YTPlayer).muteYTPVolume();
632                } else {
633                    jQuery(YTPlayer).unmuteYTPVolume();
634                }
635
636            }, timer);
637
638            if (YTPlayer.opt.addRaster) {
639                var retina = (window.retina || window.devicePixelRatio > 1);
640                YTPlayer.overlay.addClass(retina ? "raster retina" : "raster");
641            } else {
642                YTPlayer.overlay.removeClass("raster");
643                YTPlayer.overlay.removeClass("retina");
644            }
645
646            jQuery("#controlBar_" + YTPlayer.id).remove();
647
648            if (YTPlayer.opt.showControls)
649                jQuery(YTPlayer).buildYTPControls();
650
651            jQuery.mbYTPlayer.getDataFromFeed(YTPlayer.videoID, YTPlayer);
652            jQuery(YTPlayer).optimizeDisplay();
653        },
654
655        getPlayer: function () {
656            return jQuery(this).get(0).player;
657        },
658
659        playerDestroy: function () {
660            var YTPlayer = this.get(0);
661            ytp.YTAPIReady = false;
662            ytp.backgroundIsInited = false;
663            YTPlayer.isInit = false;
664            YTPlayer.videoID = null;
665
666            var playerBox = YTPlayer.wrapper;
667            playerBox.remove();
668            jQuery("#controlBar_" + YTPlayer.id).remove();
669        },
670
671        fullscreen: function (real) {
672
673            var YTPlayer = this.get(0);
674
675            if (typeof real == "undefined")
676                real = YTPlayer.opt.realfullscreen;
677
678            real = eval(real);
679
680            var controls = jQuery("#controlBar_" + YTPlayer.id);
681            var fullScreenBtn = controls.find(".mb_OnlyYT");
682            var videoWrapper = YTPlayer.isSelf ? YTPlayer.opt.containment : YTPlayer.wrapper;
683            //var videoWrapper = YTPlayer.wrapper;
684
685            if (real) {
686                var fullscreenchange = jQuery.browser.mozilla ? "mozfullscreenchange" : jQuery.browser.webkit ? "webkitfullscreenchange" : "fullscreenchange";
687                jQuery(document).off(fullscreenchange).on(fullscreenchange, function () {
688                    var isFullScreen = RunPrefixMethod(document, "IsFullScreen") || RunPrefixMethod(document, "FullScreen");
689
690                    if (!isFullScreen) {
691                        YTPlayer.isAlone = false;
692                        fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT);
693                        jQuery(YTPlayer).setVideoQuality(YTPlayer.opt.quality);
694                        videoWrapper.removeClass("fullscreen");
695
696                        videoWrapper.CSSAnimate({opacity: YTPlayer.opt.opacity}, 500);
697                        videoWrapper.css({zIndex: 0});
698
699                        if (YTPlayer.isBackground) {
700                            jQuery("body").after(controls);
701                        } else {
702                            YTPlayer.wrapper.before(controls);
703                        }
704                        jQuery(window).resize();
705                        jQuery(YTPlayer).trigger("YTPFullScreenEnd");
706
707                    } else {
708                        jQuery(YTPlayer).setVideoQuality("default");
709                        jQuery(YTPlayer).trigger("YTPFullScreenStart");
710                    }
711                });
712            }
713
714            if (!YTPlayer.isAlone) {
715
716                if (real) {
717
718                    var playerState = YTPlayer.player.getPlayerState();
719                    videoWrapper.css({opacity: 0});
720                    videoWrapper.addClass("fullscreen");
721                    launchFullscreen(videoWrapper.get(0));
722                    setTimeout(function () {
723                        videoWrapper.CSSAnimate({opacity: 1}, 1000);
724                        YTPlayer.wrapper.append(controls);
725                        jQuery(YTPlayer).optimizeDisplay();
726
727                        YTPlayer.player.seekTo(YTPlayer.player.getCurrentTime() + .1, true);
728                    }, 500)
729                } else
730                    videoWrapper.css({zIndex: 10000}).CSSAnimate({opacity: 1}, 1000);
731
732
733                fullScreenBtn.html(jQuery.mbYTPlayer.controls.showSite);
734                YTPlayer.isAlone = true;
735
736            } else {
737
738                if (real) {
739                    cancelFullscreen();
740                } else {
741                    videoWrapper.CSSAnimate({opacity: YTPlayer.opt.opacity}, 500);
742                    videoWrapper.css({zIndex: 0});
743                }
744
745
746                fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT)
747                YTPlayer.isAlone = false;
748            }
749
750            function RunPrefixMethod(obj, method) {
751                var pfx = ["webkit", "moz", "ms", "o", ""];
752                var p = 0, m, t;
753                while (p < pfx.length && !obj[m]) {
754                    m = method;
755                    if (pfx[p] == "") {
756                        m = m.substr(0, 1).toLowerCase() + m.substr(1);
757                    }
758                    m = pfx[p] + m;
759                    t = typeof obj[m];
760                    if (t != "undefined") {
761                        pfx = [pfx[p]];
762                        return (t == "function" ? obj[m]() : obj[m]);
763                    }
764                    p++;
765                }
766            }
767
768            function launchFullscreen(element) {
769                RunPrefixMethod(element, "RequestFullScreen");
770            }
771
772            function cancelFullscreen() {
773                if (RunPrefixMethod(document, "FullScreen") || RunPrefixMethod(document, "IsFullScreen")) {
774                    RunPrefixMethod(document, "CancelFullScreen");
775                }
776            }
777        },
778
779        playYTP: function () {
780            var YTPlayer = this.get(0);
781
782            if (typeof YTPlayer.player === "undefined")
783                return;
784
785            var controls = jQuery("#controlBar_" + YTPlayer.id);
786            var playBtn = controls.find(".mb_YTVPPlaypause");
787            playBtn.html(jQuery.mbYTPlayer.controls.pause);
788            YTPlayer.player.playVideo();
789
790            YTPlayer.wrapper.CSSAnimate({opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity}, 2000);
791            jQuery(YTPlayer).on("YTPStart", function () {
792                jQuery(YTPlayer).css("background-image", "none");
793            })
794        },
795
796        toggleLoops: function () {
797            var YTPlayer = this.get(0);
798            var data = YTPlayer.opt;
799            if (data.loop == 1) {
800                data.loop = 0;
801            } else {
802                if (data.startAt) {
803                    YTPlayer.player.seekTo(data.startAt);
804                } else {
805                    YTPlayer.player.playVideo();
806                }
807                data.loop = 1;
808            }
809        },
810
811        stopYTP: function () {
812            var YTPlayer = this.get(0);
813            var controls = jQuery("#controlBar_" + YTPlayer.id);
814            var playBtn = controls.find(".mb_YTVPPlaypause");
815            playBtn.html(jQuery.mbYTPlayer.controls.play);
816            YTPlayer.player.stopVideo();
817        },
818
819        pauseYTP: function () {
820            var YTPlayer = this.get(0);
821            var data = YTPlayer.opt;
822            var controls = jQuery("#controlBar_" + YTPlayer.id);
823            var playBtn = controls.find(".mb_YTVPPlaypause");
824            playBtn.html(jQuery.mbYTPlayer.controls.play);
825            YTPlayer.player.pauseVideo();
826        },
827
828        seekToYTP: function (val) {
829            var YTPlayer = this.get(0);
830            YTPlayer.player.seekTo(val, true);
831        },
832
833        setYTPVolume: function (val) {
834            var YTPlayer = this.get(0);
835            if (!val && !YTPlayer.opt.vol && YTPlayer.player.getVolume() == 0)
836                jQuery(YTPlayer).unmuteYTPVolume();
837            else if ((!val && YTPlayer.player.getVolume() > 0) || (val && YTPlayer.player.getVolume() == val))
838                jQuery(YTPlayer).muteYTPVolume();
839            else
840                YTPlayer.opt.vol = val;
841            YTPlayer.player.setVolume(YTPlayer.opt.vol);
842        },
843
844        muteYTPVolume: function () {
845            var YTPlayer = this.get(0);
846            YTPlayer.player.mute();
847            YTPlayer.player.setVolume(0);
848
849            var controls = jQuery("#controlBar_" + YTPlayer.id);
850            var muteBtn = controls.find(".mb_YTVPMuteUnmute");
851            muteBtn.html(jQuery.mbYTPlayer.controls.unmute);
852            jQuery(YTPlayer).addClass("isMuted");
853            jQuery(YTPlayer).trigger("YTPMuted");
854        },
855
856        unmuteYTPVolume: function () {
857            var YTPlayer = this.get(0);
858
859            YTPlayer.player.unMute();
860            YTPlayer.player.setVolume(YTPlayer.opt.vol);
861
862            var controls = jQuery("#controlBar_" + YTPlayer.id);
863            var muteBtn = controls.find(".mb_YTVPMuteUnmute");
864            muteBtn.html(jQuery.mbYTPlayer.controls.mute);
865
866            jQuery(YTPlayer).removeClass("isMuted");
867            jQuery(YTPlayer).trigger("YTPUnmuted");
868
869        },
870
871        manageYTPProgress: function () {
872
873            var YTPlayer = this.get(0);
874            var controls = jQuery("#controlBar_" + YTPlayer.id);
875            var progressBar = controls.find(".mb_YTVPProgress");
876            var loadedBar = controls.find(".mb_YTVPLoaded");
877            var timeBar = controls.find(".mb_YTVTime");
878            var totW = progressBar.outerWidth();
879
880            var currentTime = Math.floor(YTPlayer.player.getCurrentTime());
881            var totalTime = Math.floor(YTPlayer.player.getDuration());
882            var timeW = (currentTime * totW) / totalTime;
883            var startLeft = 0;
884
885            var loadedW = YTPlayer.player.getVideoLoadedFraction() * 100;
886
887            loadedBar.css({left: startLeft, width: loadedW + "%"});
888            timeBar.css({left: 0, width: timeW});
889            return {totalTime: totalTime, currentTime: currentTime};
890        },
891
892        buildYTPControls: function () {
893            var YTPlayer = this.get(0);
894            var data = YTPlayer.opt;
895
896            /** @data.printUrl is deprecated; use data.showYTLogo */
897            data.showYTLogo = data.showYTLogo || data.printUrl;
898
899            if (jQuery("#controlBar_" + YTPlayer.id).length)
900                return;
901
902            var controlBar = jQuery("<span/>").attr("id", "controlBar_" + YTPlayer.id).addClass("mb_YTVPBar").css({whiteSpace: "noWrap", position: YTPlayer.isBackground ? "fixed" : "absolute", zIndex: YTPlayer.isBackground ? 10000 : 1000}).hide();
903            var buttonBar = jQuery("<div/>").addClass("buttonBar");
904
905            var playpause = jQuery("<span>" + jQuery.mbYTPlayer.controls.play + "</span>").addClass("mb_YTVPPlaypause ytpicon").click(function () {
906                if (YTPlayer.player.getPlayerState() == 1)
907                    jQuery(YTPlayer).pauseYTP();
908                else
909                    jQuery(YTPlayer).playYTP();
910            });
911
912            var MuteUnmute = jQuery("<span>" + jQuery.mbYTPlayer.controls.mute + "</span>").addClass("mb_YTVPMuteUnmute ytpicon").click(function () {
913                if (YTPlayer.player.getVolume() == 0) {
914                    jQuery(YTPlayer).unmuteYTPVolume();
915                } else {
916                    jQuery(YTPlayer).muteYTPVolume();
917                }
918            });
919
920            var idx = jQuery("<span/>").addClass("mb_YTVPTime");
921
922            var vURL = data.videoURL;
923            if (vURL.indexOf("http") < 0)
924                vURL = jQuery.mbYTPlayer.locationProtocol + "//www.youtube.com/watch?v=" + data.videoURL;
925            var movieUrl = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.ytLogo).addClass("mb_YTVPUrl ytpicon").attr("title", "view on YouTube").on("click", function () {window.open(vURL, "viewOnYT")});
926            var onlyVideo = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.onlyYT).addClass("mb_OnlyYT ytpicon").on("click", function () {jQuery(YTPlayer).fullscreen(data.realfullscreen);});
927
928            var progressBar = jQuery("<div/>").addClass("mb_YTVPProgress").css("position", "absolute").click(function (e) {
929                timeBar.css({width: (e.clientX - timeBar.offset().left)});
930                YTPlayer.timeW = e.clientX - timeBar.offset().left;
931                controlBar.find(".mb_YTVPLoaded").css({width: 0});
932                var totalTime = Math.floor(YTPlayer.player.getDuration());
933                YTPlayer.goto = (timeBar.outerWidth() * totalTime) / progressBar.outerWidth();
934
935                YTPlayer.player.seekTo(parseFloat(YTPlayer.goto), true);
936                controlBar.find(".mb_YTVPLoaded").css({width: 0});
937            });
938
939            var loadedBar = jQuery("<div/>").addClass("mb_YTVPLoaded").css("position", "absolute");
940            var timeBar = jQuery("<div/>").addClass("mb_YTVTime").css("position", "absolute");
941
942            progressBar.append(loadedBar).append(timeBar);
943            buttonBar.append(playpause).append(MuteUnmute).append(idx);
944
945            if (data.showYTLogo) {
946                buttonBar.append(movieUrl);
947            }
948
949            if (YTPlayer.isBackground || (eval(YTPlayer.opt.realfullscreen) && !YTPlayer.isBackground))
950                buttonBar.append(onlyVideo);
951
952            controlBar.append(buttonBar).append(progressBar);
953
954            if (!YTPlayer.isBackground) {
955                controlBar.addClass("inlinePlayer");
956                YTPlayer.wrapper.before(controlBar);
957            } else {
958                jQuery("body").after(controlBar);
959            }
960            controlBar.fadeIn();
961        },
962
963        checkForState: function (YTPlayer) {
964            clearInterval(YTPlayer.getState);
965            YTPlayer.getState = setInterval(function () {
966                var prog = jQuery(YTPlayer).manageYTPProgress();
967                var $YTPlayer = jQuery(YTPlayer);
968                var controlBar = jQuery("#controlBar_" + YTPlayer.id);
969                var data = YTPlayer.opt;
970                var startAt = YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1;
971                var stopAt = YTPlayer.opt.stopAt > YTPlayer.opt.startAt ? YTPlayer.opt.stopAt : 0;
972                stopAt = stopAt < YTPlayer.player.getDuration() ? stopAt : 0;
973
974                if (YTPlayer.player.getVolume() == 0)
975                    $YTPlayer.addClass("isMuted");
976                else
977                    $YTPlayer.removeClass("isMuted");
978
979                if (prog.totalTime) {
980                    controlBar.find(".mb_YTVPTime").html(jQuery.mbYTPlayer.formatTime(prog.currentTime) + " / " + jQuery.mbYTPlayer.formatTime(prog.totalTime));
981                } else {
982//					clearInterval(YTPlayer.getState);
983                    controlBar.find(".mb_YTVPTime").html("-- : -- / -- : --");
984                }
985
986                if (YTPlayer.player.getPlayerState() == 1 && (parseFloat(YTPlayer.player.getDuration() - 3) < YTPlayer.player.getCurrentTime() || (stopAt > 0 && parseFloat(YTPlayer.player.getCurrentTime()) > stopAt))) {
987
988                    if(YTPlayer.isEnded)
989                        return;
990
991                    YTPlayer.isEnded = true;
992                    setTimeout(function(){YTPlayer.isEnded = false},2000);
993
994                    if (YTPlayer.isPlayList) {
995                        clearInterval(YTPlayer.getState);
996                        jQuery(YTPlayer).trigger("YTPEnd");
997                        return;
998                    } else if (!data.loop) {
999                        YTPlayer.player.pauseVideo();
1000                        YTPlayer.wrapper.CSSAnimate({opacity: 0}, 1000, function () {
1001                            jQuery(YTPlayer).trigger("YTPEnd");
1002                            YTPlayer.player.seekTo(startAt, true);
1003
1004                            if (!YTPlayer.isBackground) {
1005                                var bgndURL = YTPlayer.videoData.thumbnail.hqDefault;
1006                                jQuery(YTPlayer).css({background: "rgba(0,0,0,0.5) url(" + bgndURL + ") center center", backgroundSize: "cover"});
1007                            }
1008
1009                        });
1010                    } else
1011                        YTPlayer.player.seekTo(startAt, true);
1012
1013                }
1014            }, 1);
1015        },
1016
1017        formatTime: function (s) {
1018            var min = Math.floor(s / 60);
1019            var sec = Math.floor(s - (60 * min));
1020            return (min <= 9 ? "0" + min : min) + " : " + (sec <= 9 ? "0" + sec : sec);
1021        }
1022    };
1023
1024    jQuery.fn.toggleVolume = function () {
1025        var YTPlayer = this.get(0);
1026        if (!YTPlayer)
1027            return;
1028
1029        if (YTPlayer.player.isMuted()) {
1030            jQuery(YTPlayer).unmuteYTPVolume();
1031            return true;
1032        } else {
1033            jQuery(YTPlayer).muteYTPVolume();
1034            return false;
1035        }
1036    };
1037
1038    jQuery.fn.optimizeDisplay = function () {
1039
1040        var YTPlayer = this.get(0);
1041        var data = YTPlayer.opt;
1042        var playerBox = jQuery(YTPlayer.playerEl);
1043        var win = {};
1044//		var el = !YTPlayer.isBackground ? data.containment : jQuery(window);
1045        var el = YTPlayer.wrapper;
1046
1047        win.width = el.outerWidth();
1048        win.height = el.outerHeight();
1049
1050        var margin = 24;
1051        var overprint = 100;
1052        var vid = {};
1053        vid.width = win.width + ((win.width * margin) / 100);
1054        vid.height = data.ratio == "16/9" ? Math.ceil((9 * win.width) / 16) : Math.ceil((3 * win.width) / 4);
1055        vid.marginTop = -((vid.height - win.height) / 2);
1056        vid.marginLeft = -((win.width * (margin / 2)) / 100);
1057
1058        if (vid.height < win.height) {
1059            vid.height = win.height + ((win.height * margin) / 100);
1060            vid.width = data.ratio == "16/9" ? Math.floor((16 * win.height) / 9) : Math.floor((4 * win.height) / 3);
1061            vid.marginTop = -((win.height * (margin / 2)) / 100);
1062            vid.marginLeft = -((vid.width - win.width) / 2);
1063        }
1064
1065        vid.width += overprint;
1066        vid.height += overprint;
1067        vid.marginTop -= overprint / 2;
1068        vid.marginLeft -= overprint / 2;
1069
1070        playerBox.css({width: vid.width, height: vid.height, marginTop: vid.marginTop, marginLeft: vid.marginLeft});
1071    };
1072
1073    jQuery.shuffle = function (arr) {
1074        var newArray = arr.slice();
1075        var len = newArray.length;
1076        var i = len;
1077        while (i--) {
1078            var p = parseInt(Math.random() * len);
1079            var t = newArray[i];
1080            newArray[i] = newArray[p];
1081            newArray[p] = t;
1082        }
1083        return newArray;
1084    };
1085
1086    /*Exposed method for external use*/
1087    jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer;
1088    jQuery.fn.YTPlaylist = jQuery.mbYTPlayer.YTPlaylist;
1089    jQuery.fn.playNext = jQuery.mbYTPlayer.playNext;
1090    jQuery.fn.playPrev = jQuery.mbYTPlayer.playPrev;
1091    jQuery.fn.changeMovie = jQuery.mbYTPlayer.changeMovie;
1092    jQuery.fn.getVideoID = jQuery.mbYTPlayer.getVideoID;
1093    jQuery.fn.getPlayer = jQuery.mbYTPlayer.getPlayer;
1094    jQuery.fn.playerDestroy = jQuery.mbYTPlayer.playerDestroy;
1095    jQuery.fn.fullscreen = jQuery.mbYTPlayer.fullscreen;
1096    jQuery.fn.buildYTPControls = jQuery.mbYTPlayer.buildYTPControls;
1097    jQuery.fn.playYTP = jQuery.mbYTPlayer.playYTP;
1098    jQuery.fn.toggleLoops = jQuery.mbYTPlayer.toggleLoops;
1099    jQuery.fn.stopYTP = jQuery.mbYTPlayer.stopYTP;
1100    jQuery.fn.pauseYTP = jQuery.mbYTPlayer.pauseYTP;
1101    jQuery.fn.seekToYTP = jQuery.mbYTPlayer.seekToYTP;
1102    jQuery.fn.muteYTPVolume = jQuery.mbYTPlayer.muteYTPVolume;
1103    jQuery.fn.unmuteYTPVolume = jQuery.mbYTPlayer.unmuteYTPVolume;
1104    jQuery.fn.setYTPVolume = jQuery.mbYTPlayer.setYTPVolume;
1105    jQuery.fn.setVideoQuality = jQuery.mbYTPlayer.setVideoQuality;
1106    jQuery.fn.manageYTPProgress = jQuery.mbYTPlayer.manageYTPProgress;
1107
1108})(jQuery, ytp);

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.