PageSourceSearch

https://icicn.org/javascript/jquery.mb.YTPlayer.js

js icicn.org collected 2026-10-08 07:11:11 UTC 48,165 bytes, 1,230 lines download raw bytes

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