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.