vendor: 90,480 bytes, lines 1-1243
1/*jquery.mb.YTPlayer 23-01-2021 2 _ jquery.mb.components 3 _ email: [email protected] 4 _ Copyright (c) 2001-2021. Matteo Bicocchi (Pupunzi); 5 _ blog: http://pupunzi.open-lab.com 6 _ Open Lab s.r.l., Florence - Italy 7 */ 8 9var ytp = ytp || {}; 10let YTPRndSuffix = (new Date).getTime(), 11 YTPTimerLabels = { 12 init: "YTPlayerInit_" + YTPRndSuffix, 13 startPlaying: "YTPlayerStartPlay_" + YTPRndSuffix 14 }; 15 16function onYouTubeIframeAPIReady() { 17 ytp.YTAPIReady || (ytp.YTAPIReady = !0, jQuery(document).trigger("YTAPIReady")) 18} 19let getYTPVideoID = function(e) { 20 let r, t; 21 return e.indexOf("youtu.be") > 0 || e.indexOf("youtube.com/embed") > 0 ? r = (t = (r = e.substr(e.lastIndexOf("/") + 1, e.length)).indexOf("?list=") > 0 ? r.substr(r.lastIndexOf("="), r.length) : null) ? r.substr(0, r.lastIndexOf("?")) : r : e.indexOf("http") > -1 ? (r = e.match(/[\\?&]v=([^&#]*)/)[1], t = e.indexOf("list=") > 0 ? e.match(/[\\?&]list=([^&#]*)/)[1] : null) : t = (r = e.length > 15 ? null : e) ? null : e, { 22 videoID: r, 23 playlistID: t 24 } 25}; 26! function(jQuery, ytp) { 27 jQuery.mbYTPlayer = { 28 name: "jquery.mb.YTPlayer", 29 version: "3.3.9", 30 build: "7581", 31 author: "Matteo Bicocchi (pupunzi)", 32 apiKey: "", 33 defaults: { 34 videoURL: null, 35 containment: "body", 36 ratio: "auto", 37 fadeOnStartTime: 1e3, 38 startAt: 0, 39 stopAt: 0, 40 autoPlay: !0, 41 delayAtStart: 1e3, 42 coverImage: !1, 43 loop: !0, 44 addRaster: !1, 45 mask: !1, 46 opacity: 1, 47 quality: "hd1080", 48 vol: 50, 49 mute: !1, 50 showControls: !0, 51 anchor: "center,center", 52 showAnnotations: !1, 53 cc_load_policy: !1, 54 showYTLogo: !0, 55 useOnMobile: !0, 56 playOnlyIfVisible: !1, 57 onScreenPercentage: 30, 58 goFullScreenOnPlay: !1, 59 stopMovieOnBlur: !0, 60 realFullscreen: !0, 61 optimizeDisplay: !0, 62 abundance: .3, 63 gaTrack: !0, 64 remember_last_time: !1, 65 addFilters: !1, 66 useNoCookie: !0, 67 onReady: function(e) {}, 68 onError: function(e, r) {}, 69 onEnd: function() {} 70 }, 71 controls: { 72 play: "P", 73 pause: "p", 74 mute: "M", 75 unmute: "A", 76 onlyYT: "O", 77 showSite: "R", 78 ytLogo: "Y" 79 }, 80 controlBar: null, 81 locationProtocol: "https:", 82 defaultFilters: { 83 grayscale: { 84 value: 0, 85 unit: "%" 86 }, 87 hue_rotate: { 88 value: 0, 89 unit: "deg" 90 }, 91 invert: { 92 value: 0, 93 unit: "%" 94 }, 95 opacity: { 96 value: 0, 97 unit: "%" 98 }, 99 saturate: { 100 value: 0, 101 unit: "%" 102 }, 103 sepia: { 104 value: 0, 105 unit: "%" 106 }, 107 brightness: { 108 value: 0, 109 unit: "%" 110 }, 111 contrast: { 112 value: 0, 113 unit: "%" 114 }, 115 blur: { 116 value: 0, 117 unit: "px" 118 } 119 }, 120 buildPlayer: function(options) { 121 if (ytp.YTAPIReady || void 0 !== window.YT) setTimeout(function() { 122 jQuery(document).trigger("YTAPIReady"), ytp.YTAPIReady = !0 123 }, 100); 124 else { 125 jQuery("#YTAPI").remove(); 126 let e = jQuery("<script>").attr({ 127 src: "https://www.youtube.com/iframe_api?v=" + jQuery.mbYTPlayer.version, 128 id: "YTAPI" 129 }); 130 jQuery("head").prepend(e) 131 } 132 133 function isIframe() { 134 let e = !1; 135 try { 136 self.location.href !== top.location.href && (e = !0) 137 } catch (r) { 138 e = !0 139 } 140 return e 141 } 142 return this.each(function() { 143 let YTPlayer = this, 144 $YTPlayer = jQuery(YTPlayer); 145 $YTPlayer.hide(), YTPlayer.loop = 0, YTPlayer.state = 0, YTPlayer.filters = jQuery.extend(!0, {}, jQuery.mbYTPlayer.defaultFilters), YTPlayer.filtersEnabled = !0, YTPlayer.id = YTPlayer.id || "YTP_" + (new Date).getTime(), $YTPlayer.addClass("mb_YTPlayer"); 146 let property = $YTPlayer.data("property") && "string" == typeof $YTPlayer.data("property") ? eval("(" + $YTPlayer.data("property") + ")") : $YTPlayer.data("property"); 147 "object" != typeof property && (property = {}), YTPlayer.opt = jQuery.extend(!0, {}, jQuery.mbYTPlayer.defaults, YTPlayer.opt, options, property), YTPRndSuffix = getYTPVideoID(YTPlayer.opt.videoURL).videoID, YTPTimerLabels = { 148 init: "YTPlayerInit_" + YTPRndSuffix, 149 startPlaying: "YTPlayerStartPlay_" + YTPRndSuffix 150 }, console.time(YTPTimerLabels.init), console.time(YTPTimerLabels.startPlaying), YTPlayer.opt.elementId = YTPlayer.id, 0 === YTPlayer.opt.vol && (YTPlayer.opt.vol = 1, YTPlayer.opt.mute = !0), YTPlayer.opt.loop && "boolean" == typeof YTPlayer.opt.loop && (YTPlayer.opt.loop = 9999); 151 let fullScreenAvailable = document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled; 152 YTPlayer.opt.realFullscreen = !(isIframe() || !fullScreenAvailable) && YTPlayer.opt.realFullscreen, YTPlayer.opt.showAnnotations = YTPlayer.opt.showAnnotations ? "1" : "3", YTPlayer.opt.cc_load_policy = YTPlayer.opt.cc_load_policy ? "1" : "0", YTPlayer.opt.coverImage = YTPlayer.opt.coverImage || YTPlayer.opt.backgroundImage, YTPlayer.opt.quality = "hd1080", jQuery.mbBrowser.msie && jQuery.mbBrowser.version < 9 && (YTPlayer.opt.opacity = 1), YTPlayer.opt.containment = "self" === YTPlayer.opt.containment ? $YTPlayer : jQuery(YTPlayer.opt.containment), YTPlayer.isRetina = window.retina || window.devicePixelRatio > 1, YTPlayer.opt.ratio = "auto" === YTPlayer.opt.ratio ? 16 / 9 : YTPlayer.opt.ratio, YTPlayer.opt.ratio = eval(YTPlayer.opt.ratio); 153 let origContainmentBackground = YTPlayer.opt.containment.css("background-image"); 154 origContainmentBackground = "none" === origContainmentBackground ? null : origContainmentBackground, YTPlayer.orig_containment_background = origContainmentBackground, $YTPlayer.attr("id") || $YTPlayer.attr("id", "ytp_" + (new Date).getTime()), YTPlayer.playerID = "iframe_" + YTPlayer.id, YTPlayer.isAlone = !1, YTPlayer.hasFocus = !0, YTPlayer.videoID = YTPlayer.opt.videoURL ? getYTPVideoID(YTPlayer.opt.videoURL).videoID : !!$YTPlayer.attr("href") && getYTPVideoID($YTPlayer.attr("href")).videoID, YTPlayer.playlistID = YTPlayer.opt.videoURL ? getYTPVideoID(YTPlayer.opt.videoURL).playlistID : !!$YTPlayer.attr("href") && getYTPVideoID($YTPlayer.attr("href")).playlistID; 155 let start_from_last = 0; 156 if (jQuery.mbCookie.get("YTPlayer_start_from" + YTPlayer.videoID) && (start_from_last = parseFloat(jQuery.mbCookie.get("YTPlayer_start_from" + YTPlayer.videoID))), YTPlayer.opt.remember_last_time && start_from_last && (YTPlayer.start_from_last = start_from_last, jQuery.mbCookie.remove("YTPlayer_start_from" + YTPlayer.videoID)), YTPlayer.isPlayer = $YTPlayer.is(YTPlayer.opt.containment), YTPlayer.isBackground = YTPlayer.opt.containment.is("body"), YTPlayer.isBackground && ytp.backgroundIsInited) return; 157 if (YTPlayer.isPlayer && $YTPlayer.show(), YTPlayer.overlay = jQuery("<div/>").css({ 158 position: "absolute", 159 top: 0, 160 left: 0, 161 width: "100%", 162 height: "100%" 163 }).addClass("YTPOverlay"), $YTPlayer.changeCoverImage(), YTPlayer.wrapper = jQuery("<div/>").attr("id", "wrapper_" + YTPlayer.id).css({ 164 position: "absolute", 165 zIndex: 0, 166 minWidth: "100%", 167 minHeight: "100%", 168 left: 0, 169 top: 0, 170 overflow: "hidden", 171 opacity: 0 172 }).addClass("mbYTP_wrapper"), YTPlayer.isPlayer) { 173 let e = jQuery.mbBrowser.mobile ? "inlinePlayButtonMobile" : "inlinePlayButton"; 174 YTPlayer.inlinePlayButton = jQuery("<div/>").addClass("inlinePlayButton").html(jQuery.mbYTPlayer.controls.play), $YTPlayer.append(YTPlayer.inlinePlayButton), YTPlayer.inlinePlayButton.on("click", function(e) { 175 $YTPlayer.YTPPlay(), YTPlayer.inlinePlayButton.hide(), YTPlayer.opt.goFullScreenOnPlay && $YTPlayer.YTPFullscreen(), e.stopPropagation() 176 }), YTPlayer.opt.autoPlay && YTPlayer.inlinePlayButton.hide(), YTPlayer.overlay.on("click", function() { 177 $YTPlayer.YTPTogglePlay(), YTPlayer.opt.goFullScreenOnPlay && $YTPlayer.YTPFullscreen() 178 }).css({ 179 cursor: "pointer" 180 }) 181 } 182 let playerBox = jQuery("<div/>").attr("id", YTPlayer.playerID).addClass("playerBox"); 183 if (playerBox.css({ 184 position: "absolute", 185 zIndex: 0, 186 width: "100%", 187 height: "100%", 188 top: 0, 189 left: 0, 190 overflow: "hidden", 191 opacity: 1 192 }), YTPlayer.wrapper.append(playerBox), playerBox.after(YTPlayer.overlay), YTPlayer.isPlayer && (YTPlayer.inlineWrapper = jQuery("<div/>").addClass("inline-YTPlayer"), YTPlayer.inlineWrapper.css({ 193 position: "relative", 194 maxWidth: YTPlayer.opt.containment.css("width") 195 }), YTPlayer.opt.containment.css({ 196 position: "relative", 197 paddingBottom: "56.25%", 198 overflow: "hidden", 199 height: 0 200 }), YTPlayer.opt.containment.wrap(YTPlayer.inlineWrapper)), YTPlayer.opt.containment.children().not("script, style").each(function() { 201 "static" === jQuery(this).css("position") && jQuery(this).css("position", "relative") 202 }), YTPlayer.isBackground ? (jQuery("body").css({ 203 boxSizing: "border-box" 204 }), YTPlayer.wrapper.css({ 205 position: "fixed", 206 top: 0, 207 left: 0, 208 zIndex: 0 209 })) : "static" === YTPlayer.opt.containment.css("position") && (YTPlayer.opt.containment.css({ 210 position: "relative" 211 }), $YTPlayer.show()), YTPlayer.opt.containment.prepend(YTPlayer.wrapper), YTPlayer.isBackground || YTPlayer.overlay.on("mouseenter", function() { 212 YTPlayer.controlBar && YTPlayer.controlBar.length && YTPlayer.controlBar.addClass("visible") 213 }).on("mouseleave", function() { 214 YTPlayer.controlBar && YTPlayer.controlBar.length && YTPlayer.controlBar.removeClass("visible") 215 }), jQuery.mbBrowser.mobile && !YTPlayer.opt.useOnMobile) return YTPlayer.opt.coverImage && (YTPlayer.wrapper.css({ 216 backgroundImage: "url(" + YTPlayer.opt.coverImage + ")", 217 backgroundPosition: "center center", 218 backgroundSize: "cover", 219 backgroundRepeat: "no-repeat", 220 opacity: 1 221 }), YTPlayer.wrapper.css({ 222 opacity: 1 223 })), $YTPlayer; 224 jQuery.mbBrowser.mobile && YTPlayer.opt.autoPlay && YTPlayer.opt.useOnMobile && jQuery("body").one("touchstart", function() { 225 YTPlayer.player.playVideo() 226 }), jQuery(document).one("YTAPIReady", function() { 227 $YTPlayer.trigger("YTAPIReady_" + YTPlayer.id), ytp.YTAPIReady = !0 228 }), YTPlayer.isOnScreen = jQuery.mbYTPlayer.isOnScreen(YTPlayer, YTPlayer.opt.onScreenPercentage), $YTPlayer.one("YTAPIReady_" + YTPlayer.id, function() { 229 let e = this, 230 r = jQuery(e); 231 e.isBackground && ytp.backgroundIsInited || e.isInit || (e.isBackground && (ytp.backgroundIsInited = !0), e.opt.autoPlay = void 0 === e.opt.autoPlay ? !!e.isBackground : e.opt.autoPlay, e.opt.vol = e.opt.vol ? e.opt.vol : 100, jQuery.mbYTPlayer.getDataFromAPI(e), jQuery(e).on("YTPChanged", function(t) { 232 if (e.isInit) return; 233 e.isInit = !0; 234 let a = { 235 modestbranding: 1, 236 autoplay: 0, 237 controls: 0, 238 showinfo: 0, 239 rel: 0, 240 enablejsapi: 1, 241 version: 3, 242 playerapiid: e.playerID, 243 origin: "*", 244 allowfullscreen: !0, 245 wmode: "transparent", 246 iv_load_policy: e.opt.showAnnotations, 247 cc_load_policy: e.opt.cc_load_policy, 248 playsinline: jQuery.mbBrowser.mobile && !e.isPlayer ? 1 : 0, 249 html5: document.createElement("video").canPlayType ? 1 : 0 250 }; 251 new YT.Player(e.playerID, { 252 host: e.opt.useNoCookie ? "https://www.youtube-nocookie.com" : "https://www.youtube.com", 253 playerVars: a, 254 events: { 255 onReady: function(t) { 256 e.player = t.target, e.player.loadVideoById({ 257 videoId: e.videoID.toString(), 258 suggestedQuality: e.opt.quality 259 }), r.trigger("YTPlayerIsReady_" + e.id) 260 }, 261 onStateChange: function(r) { 262 if ("function" != typeof r.target.getPlayerState) return; 263 let t, a = r.target.getPlayerState(); 264 if (e.preventTrigger || e.isStarting) return void(e.preventTrigger = !1); 265 switch (e.state = a, r.data === YT.PlayerState.PLAYING && r.target.setPlaybackQuality(e.opt.quality), a) { 266 case -1: 267 t = "YTPUnstarted"; 268 break; 269 case 0: 270 t = "YTPRealEnd"; 271 break; 272 case 1: 273 t = "YTPPlay", e.controlBar.length && e.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.pause), e.isPlayer && e.inlinePlayButton.hide(), jQuery(document).off("mousedown.YTPstart"); 274 break; 275 case 2: 276 t = "YTPPause", e.controlBar.length && e.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play), e.isPlayer && e.inlinePlayButton.show(); 277 break; 278 case 3: 279 e.player.setPlaybackQuality(e.opt.quality), t = "YTPBuffering", e.controlBar.length && e.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play); 280 break; 281 case 5: 282 t = "YTPCued" 283 } 284 let o = jQuery.Event(t); 285 o.time = e.currentTime, jQuery(e).trigger(o) 286 }, 287 onPlaybackQualityChange: function(r) { 288 let t = r.target.getPlaybackQuality(), 289 a = jQuery.Event("YTPQualityChange"); 290 a.quality = t, jQuery(e).trigger(a) 291 }, 292 onError: function(t) { 293 switch ("function" == typeof e.opt.onError && e.opt.onError(r, t), console.debug("error:", t), t.data) { 294 case 2: 295 console.error("video ID:: " + e.videoID + ": The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks."); 296 break; 297 case 5: 298 console.error("video ID:: " + e.videoID + ": The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred."); 299 break; 300 case 100: 301 console.error("video ID:: " + e.videoID + ": The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private."); 302 break; 303 case 101: 304 case 150: 305 console.error("video ID:: " + e.videoID + ": The video doesn't exist or The owner does not allow it to be played in embedded players.") 306 } 307 e.isList && jQuery(e).YTPPlayNext() 308 } 309 } 310 }), r.on("YTPlayerIsReady_" + e.id, function() { 311 if (e.isReady) return this; 312 e.playerEl = e.player.getIframe(), jQuery(e.playerEl).unselectable(), r.optimizeDisplay(), jQuery(window).off("resize.YTP_" + e.id).on("resize.YTP_" + e.id, function() { 313 r.optimizeDisplay() 314 }), jQuery(window).off("orientationchange.YTP_" + e.id).on("orientationchange.YTP_" + e.id, function() { 315 r.optimizeDisplay() 316 }), e.opt.remember_last_time && jQuery(window).on("unload.YTP_" + e.id, function() { 317 let r = e.player.getCurrentTime(); 318 jQuery.mbCookie.set("YTPlayer_start_from" + e.videoID, r, 0) 319 }), r.YTPCheckForState() 320 }) 321 })) 322 }), $YTPlayer.off("YTPTime.mask"), jQuery.mbYTPlayer.applyMask(YTPlayer), console.timeEnd(YTPTimerLabels.init), setTimeout(function() { 323 ytp.YTAPIReady || "object" != typeof window.YT || (jQuery(document).trigger("YTAPIReady"), ytp.YTAPIReady = !0, console.error("YTPlayer: More then a call to the YT API has been detected")) 324 }, YTPlayer.opt.delayAtStart) 325 }) 326 }, 327 isOnScreen: function(e, r) { 328 r = r || 10; 329 let t = e.wrapper, 330 a = jQuery(window).scrollTop(), 331 o = a + jQuery(window).height(), 332 n = t.height() * r / 100, 333 i = t.offset().top + n; 334 return t.offset().top + (t.height() - n) <= o && i >= a 335 }, 336 getDataFromAPI: function(e) { 337 e.videoData = jQuery.mbStorage.get("YTPlayer_data_" + e.videoID), e.videoData ? (setTimeout(function() { 338 e.dataReceived = !0; 339 let r = jQuery.Event("YTPChanged"); 340 r.time = e.currentTime, r.videoId = e.videoID, r.opt = e.opt, jQuery(e).trigger(r); 341 let t = jQuery.Event("YTPData"); 342 t.prop = {}; 343 for (let r in e.videoData) e.videoData.hasOwnProperty(r) && (t.prop[r] = e.videoData[r]); 344 jQuery(e).trigger(t) 345 }, e.opt.fadeOnStartTime), e.hasData = !0) : jQuery.mbYTPlayer.apiKey ? jQuery.getJSON("https://www.googleapis.com/youtube/v3/videos?id=" + e.videoID + "&key=" + jQuery.mbYTPlayer.apiKey + "&part=snippet", function(r) { 346 e.dataReceived = !0; 347 let t = jQuery.Event("YTPChanged"); 348 t.time = e.currentTime, t.videoId = e.videoID, jQuery(e).trigger(t), r.items[0] ? (! function(r) { 349 e.videoData = {}, e.videoData.id = e.videoID, e.videoData.channelTitle = r.channelTitle, e.videoData.title = r.title, e.videoData.description = r.description.length < 400 ? r.description : r.description.substring(0, 400) + " ...", e.videoData.thumb_max = r.thumbnails.maxres ? r.thumbnails.maxres.url : null, e.videoData.thumb_high = r.thumbnails.high ? r.thumbnails.high.url : null, e.videoData.thumb_medium = r.thumbnails.medium ? r.thumbnails.medium.url : null, jQuery.mbStorage.set("YTPlayer_data_" + e.videoID, e.videoData) 350 }(r.items[0].snippet), e.hasData = !0) : (e.videoData = {}, e.hasData = !1); 351 let a = jQuery.Event("YTPData"); 352 a.prop = {}; 353 for (let r in e.videoData) a.prop[r] = e.videoData[r]; 354 jQuery(e).trigger(a) 355 }).fail(function(r) { 356 console.error("YT data error:: ", r), e.hasData = !1; 357 let t = jQuery.Event("YTPChanged"); 358 t.time = e.currentTime, t.videoId = e.videoID, jQuery(e).trigger(t) 359 }) : (setTimeout(function() { 360 let r = jQuery.Event("YTPChanged"); 361 r.time = e.currentTime, r.videoId = e.videoID, jQuery(e).trigger(r) 362 }, 10), e.videoData = null), e.opt.ratio = "auto" == e.opt.ratio ? 16 / 9 : e.opt.ratio, e.isPlayer && !e.opt.autoPlay && (e.loading = jQuery("<div/>").addClass("loading").html("Loading").hide(), jQuery(e).append(e.loading), e.loading.fadeIn()) 363 }, 364 removeStoredData: function() { 365 jQuery.mbStorage.remove() 366 }, 367 getVideoData: function() { 368 return this.get(0).videoData 369 }, 370 getVideoID: function() { 371 return this.get(0).videoID || !1 372 }, 373 getPlaylistID: function() { 374 return this.get(0).playlistID || !1 375 }, 376 setVideoQuality: function(e) { 377 let r = this.get(0), 378 t = r.player.getCurrentTime(); 379 return jQuery(r).YTPPause(), r.opt.quality = e, r.player.setPlaybackQuality(e), r.player.seekTo(t), jQuery(r).YTPPlay(), this 380 }, 381 getVideoQuality: function() { 382 return this.get(0).player.getPlaybackQuality() 383 }, 384 playlist: function(e, r, t) { 385 let a = this.get(0); 386 return a.isList = !0, r && (e = jQuery.shuffle(e)), a.videoID || (a.videos = e, a.videoCounter = 1, a.videoLength = e.length, jQuery(a).data("property", e[0]), jQuery(a).YTPlayer()), "function" == typeof t && jQuery(a).on("YTPChanged", function() { 387 t(a) 388 }), jQuery(a).on("YTPEnd", function() { 389 jQuery(a).YTPPlayNext() 390 }), this 391 }, 392 playNext: function() { 393 let e = this.get(0); 394 return e.videoCounter++, e.videoCounter > e.videoLength && (e.videoCounter = 1), jQuery(e).YTPPlayIndex(e.videoCounter), this 395 }, 396 playPrev: function() { 397 let e = this.get(0); 398 return e.videoCounter--, e.videoCounter <= 0 && (e.videoCounter = e.videoLength), jQuery(e).YTPPlayIndex(e.videoCounter), this 399 }, 400 playIndex: function(e) { 401 let r = this.get(0); 402 r.checkForStartAt && (clearInterval(r.checkForStartAt), clearInterval(r.getState)), r.videoCounter = e, r.videoCounter >= r.videoLength && (r.videoCounter = r.videoLength); 403 let t = r.videos[r.videoCounter - 1]; 404 return jQuery(r).YTPChangeVideo(t), this 405 }, 406 changeVideo: function(e) { 407 let r = this, 408 t = r.get(0); 409 t.opt.startAt = 0, t.opt.stopAt = 0, t.opt.mask = !1, t.opt.mute = !0, t.opt.autoPlay = !0, t.opt.addFilters = !1, t.opt.coverImage = !1, t.hasData = !1, t.hasChanged = !0, t.player.loopTime = void 0, e && jQuery.extend(t.opt, e), t.videoID = getYTPVideoID(t.opt.videoURL).videoID, t.opt.loop && "boolean" == typeof t.opt.loop && (t.opt.loop = 9999), t.wrapper.css({ 410 background: "none" 411 }), jQuery(t.playerEl).CSSAnimate({ 412 opacity: 0 413 }, t.opt.fadeOnStartTime, function() { 414 jQuery.mbYTPlayer.getDataFromAPI(t), r.YTPGetPlayer().loadVideoById({ 415 videoId: t.videoID, 416 suggestedQuality: t.opt.quality 417 }), r.YTPPause(), r.optimizeDisplay(), t.checkForStartAt && (clearInterval(t.checkForStartAt), clearInterval(t.getState)), r.YTPCheckForState() 418 }); 419 let a = jQuery.Event("YTPChangeVideo"); 420 return a.time = t.currentTime, jQuery(t).trigger(a), jQuery.mbYTPlayer.applyMask(t), this 421 }, 422 getPlayer: function() { 423 let e = this.get(0); 424 return e.isReady ? e.player : null 425 }, 426 playerDestroy: function() { 427 let e = this.get(0); 428 return e.isReady ? (ytp.YTAPIReady = !0, ytp.backgroundIsInited = !1, e.isInit = !1, e.videoID = null, e.isReady = !1, e.wrapper.remove(), jQuery("#controlBar_" + e.id).remove(), clearInterval(e.checkForStartAt), clearInterval(e.getState), this) : this 429 }, 430 fullscreen: function(real) { 431 let YTPlayer = this.get(0); 432 void 0 === real && (real = eval(YTPlayer.opt.realFullscreen)); 433 let controls = jQuery("#controlBar_" + YTPlayer.id), 434 fullScreenBtn = controls.find(".mb_OnlyYT"), 435 videoWrapper = YTPlayer.isPlayer ? YTPlayer.opt.containment : YTPlayer.wrapper; 436 if (real) { 437 let e = jQuery.mbBrowser.mozilla ? "mozfullscreenchange" : jQuery.mbBrowser.webkit ? "webkitfullscreenchange" : "fullscreenchange"; 438 jQuery(document).off(e).on(e, function() { 439 RunPrefixMethod(document, "IsFullScreen") || RunPrefixMethod(document, "FullScreen") ? jQuery(YTPlayer).trigger("YTPFullScreenStart") : (YTPlayer.isAlone = !1, fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT), jQuery(YTPlayer).YTPSetVideoQuality(YTPlayer.opt.quality), videoWrapper.removeClass("YTPFullscreen"), videoWrapper.CSSAnimate({ 440 opacity: YTPlayer.opt.opacity 441 }, YTPlayer.opt.fadeOnStartTime), videoWrapper.css({ 442 zIndex: 0 443 }), YTPlayer.isBackground ? jQuery("body").after(controls) : YTPlayer.wrapper.before(controls), jQuery(window).resize(), jQuery(YTPlayer).trigger("YTPFullScreenEnd")) 444 }) 445 } 446 if (YTPlayer.isAlone) jQuery(document).off("mousemove.YTPlayer"), clearTimeout(YTPlayer.hideCursor), YTPlayer.overlay.css({ 447 cursor: "auto" 448 }), real ? cancelFullscreen() : (videoWrapper.CSSAnimate({ 449 opacity: YTPlayer.opt.opacity 450 }, YTPlayer.opt.fadeOnStartTime), videoWrapper.css({ 451 zIndex: 0 452 })), fullScreenBtn.html(jQuery.mbYTPlayer.controls.onlyYT), YTPlayer.isAlone = !1; 453 else { 454 function hideMouse() { 455 YTPlayer.overlay.css({ 456 cursor: "none" 457 }) 458 } 459 jQuery(document).on("mousemove.YTPlayer", function(e) { 460 YTPlayer.overlay.css({ 461 cursor: "auto" 462 }), clearTimeout(YTPlayer.hideCursor), jQuery(e.target).parents().is(".mb_YTPBar") || (YTPlayer.hideCursor = setTimeout(hideMouse, 3e3)) 463 }), hideMouse(), real ? (videoWrapper.css({ 464 opacity: 0 465 }), videoWrapper.addClass("YTPFullscreen"), launchFullscreen(videoWrapper.get(0)), setTimeout(function() { 466 videoWrapper.CSSAnimate({ 467 opacity: 1 468 }, 2 * YTPlayer.opt.fadeOnStartTime), videoWrapper.append(controls), jQuery(YTPlayer).optimizeDisplay(), YTPlayer.player.seekTo(YTPlayer.player.getCurrentTime() + .1, !0) 469 }, YTPlayer.opt.fadeOnStartTime)) : videoWrapper.css({ 470 zIndex: 1e4 471 }).CSSAnimate({ 472 opacity: 1 473 }, 2 * YTPlayer.opt.fadeOnStartTime), fullScreenBtn.html(jQuery.mbYTPlayer.controls.showSite), YTPlayer.isAlone = !0 474 } 475 476 function RunPrefixMethod(e, r) { 477 let t, a, o = ["webkit", "moz", "ms", "o", ""], 478 n = 0; 479 for (; n < o.length && !e[t];) { 480 if (t = r, "" === o[n] && (t = t.substr(0, 1).toLowerCase() + t.substr(1)), "undefined" != (a = typeof e[t = o[n] + t])) return o = [o[n]], "function" == a ? e[t]() : e[t]; 481 n++ 482 } 483 } 484 485 function launchFullscreen(e) { 486 RunPrefixMethod(e, "RequestFullScreen") 487 } 488 489 function cancelFullscreen() { 490 (RunPrefixMethod(document, "FullScreen") || RunPrefixMethod(document, "IsFullScreen")) && RunPrefixMethod(document, "CancelFullScreen") 491 } 492 return this 493 }, 494 toggleLoops: function() { 495 let e = this.get(0), 496 r = e.opt; 497 return 1 == r.loop ? r.loop = 0 : (r.startAt ? e.player.seekTo(r.startAt) : e.player.playVideo(), r.loop = 1), this 498 }, 499 play: function() { 500 let e = this.get(0), 501 r = jQuery(e); 502 return e.isReady ? (setTimeout(function() { 503 r.YTPSetAbundance(e.opt.abundance) 504 }, 300), e.player.playVideo(), jQuery(e.playerEl).css({ 505 opacity: 1 506 }), e.wrapper.css({ 507 backgroundImage: "none" 508 }), e.wrapper.CSSAnimate({ 509 opacity: e.isAlone ? 1 : e.opt.opacity 510 }, e.opt.fadeOnStartTime), jQuery("#controlBar_" + e.id).find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.pause), e.state = 1, this) : this 511 }, 512 togglePlay: function(e) { 513 let r = this.get(0); 514 return r.isReady ? (1 === r.state ? this.YTPPause() : this.YTPPlay(), "function" == typeof e && e(r.state), this) : this 515 }, 516 stop: function() { 517 let e = this.get(0); 518 return e.isReady ? (jQuery("#controlBar_" + e.id).find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play), e.player.stopVideo(), this) : this 519 }, 520 pause: function() { 521 let e = this.get(0); 522 return e.isReady ? (e.opt.abundance < .2 && this.YTPSetAbundance(.2), e.player.pauseVideo(), e.state = 2, this) : this 523 }, 524 seekTo: function(e) { 525 let r = this.get(0); 526 return r.isReady ? (r.player.seekTo(e, !0), this) : this 527 }, 528 getPlaybackRate: function() { 529 let e = this.get(0); 530 return e.isReady ? e.player.getPlaybackRate() : this 531 }, 532 setPlaybackRate: function(e) { 533 let r = this.get(0); 534 return r.isReady ? (r.player.setPlaybackRate(e), this) : this 535 }, 536 setVolume: function(e) { 537 let r = this.get(0); 538 return r.isReady ? (r.opt.vol = e, this.YTPUnmute(), r.player.setVolume(r.opt.vol), r.volumeBar && r.volumeBar.length && r.volumeBar.updateSliderVal(e), this) : this 539 }, 540 getVolume: function() { 541 let e = this.get(0); 542 return e.isReady ? e.player.getVolume() : this 543 }, 544 toggleVolume: function() { 545 let e = this.get(0); 546 return e.isReady ? (e.isMute ? (jQuery.mbBrowser.mobile || this.YTPSetVolume(e.opt.vol), this.YTPUnmute()) : this.YTPMute(), this) : this 547 }, 548 mute: function() { 549 let e = this.get(0); 550 if (!e.isReady) return this; 551 if (e.isMute) return this; 552 e.player.mute(), e.isMute = !0, e.player.setVolume(0), e.volumeBar && e.volumeBar.length && e.volumeBar.width() > 10 && e.volumeBar.updateSliderVal(0), jQuery("#controlBar_" + e.id).find(".mb_YTPMuteUnmute").html(jQuery.mbYTPlayer.controls.unmute), jQuery(e).addClass("isMuted"), e.volumeBar && e.volumeBar.length && e.volumeBar.addClass("muted"); 553 let r = jQuery.Event("YTPMuted"); 554 return r.time = e.currentTime, e.preventTrigger || jQuery(e).trigger(r), this 555 }, 556 unmute: function() { 557 let e = this.get(0); 558 if (!e.isReady) return this; 559 if (!e.isMute) return this; 560 e.player.unMute(), e.isMute = !1, jQuery(e).YTPSetVolume(e.opt.vol), e.volumeBar && e.volumeBar.length && e.volumeBar.updateSliderVal(e.opt.vol > 10 ? e.opt.vol : 10), jQuery("#controlBar_" + e.id).find(".mb_YTPMuteUnmute").html(jQuery.mbYTPlayer.controls.mute), jQuery(e).removeClass("isMuted"), e.volumeBar && e.volumeBar.length && e.volumeBar.removeClass("muted"); 561 let r = jQuery.Event("YTPUnmuted"); 562 return r.time = e.currentTime, e.preventTrigger || jQuery(e).trigger(r), this 563 }, 564 applyFilter: function(e, r) { 565 let t = this.get(0); 566 if (!t.isReady) return this; 567 t.filters[e].value = r, t.filtersEnabled && this.YTPEnableFilters() 568 }, 569 applyFilters: function(e) { 570 let r = this, 571 t = r.get(0); 572 if (!t.isReady) return jQuery(t).on("YTPReady", function() { 573 r.YTPApplyFilters(e) 574 }), this; 575 for (let t in e) r.YTPApplyFilter(t, e[t]); 576 r.trigger("YTPFiltersApplied") 577 }, 578 toggleFilter: function(e, r) { 579 let t = this.get(0); 580 return t.isReady ? (t.filters[e].value ? t.filters[e].value = 0 : t.filters[e].value = r, t.filtersEnabled && jQuery(t).YTPEnableFilters(), this) : this 581 }, 582 toggleFilters: function(e) { 583 let r = this.get(0); 584 return r.isReady ? (r.filtersEnabled ? (jQuery(r).trigger("YTPDisableFilters"), jQuery(r).YTPDisableFilters()) : (jQuery(r).YTPEnableFilters(), jQuery(r).trigger("YTPEnableFilters")), "function" == typeof e && e(r.filtersEnabled), this) : this 585 }, 586 disableFilters: function() { 587 let e = this.get(0); 588 if (!e.isReady) return this; 589 let r = jQuery(e.playerEl); 590 return r.css("-webkit-filter", ""), r.css("filter", ""), e.filtersEnabled = !1, this 591 }, 592 enableFilters: function() { 593 let e = this.get(0); 594 if (!e.isReady) return this; 595 let r = jQuery(e.playerEl), 596 t = ""; 597 for (let r in e.filters) e.filters[r].value && (t += r.replace("_", "-") + "(" + e.filters[r].value + e.filters[r].unit + ") "); 598 return r.css("-webkit-filter", t), r.css("filter", t), e.filtersEnabled = !0, this 599 }, 600 removeFilter: function(e, r) { 601 let t = this, 602 a = t.get(0); 603 if (!a.isReady) return this; 604 if ("function" == typeof e && (r = e, e = null), e) t.YTPApplyFilter(e, 0), "function" == typeof r && r(e); 605 else { 606 for (let e in a.filters) a.filters.hasOwnProperty(e) && (t.YTPApplyFilter(e, 0), "function" == typeof r && r(e)); 607 a.filters = jQuery.extend(!0, {}, jQuery.mbYTPlayer.defaultFilters) 608 } 609 let o = jQuery.Event("YTPFiltersApplied"); 610 return t.trigger(o), this 611 }, 612 getFilters: function() { 613 let e = this.get(0); 614 return e.isReady ? e.filters : this 615 }, 616 addMask: function(e) { 617 let r = this.get(0); 618 e || (e = r.actualMask); 619 let t = jQuery("<img/>").attr("src", e).on("load", function() { 620 r.overlay.CSSAnimate({ 621 opacity: 0 622 }, r.opt.fadeOnStartTime, function() { 623 r.hasMask = !0, t.remove(), r.overlay.css({ 624 backgroundImage: "url(" + e + ")", 625 backgroundRepeat: "no-repeat", 626 backgroundPosition: "center center", 627 backgroundSize: "cover" 628 }), r.overlay.CSSAnimate({ 629 opacity: 1 630 }, r.opt.fadeOnStartTime) 631 }) 632 }); 633 return this 634 }, 635 removeMask: function() { 636 let e = this.get(0); 637 return e.overlay.CSSAnimate({ 638 opacity: 0 639 }, e.opt.fadeOnStartTime, function() { 640 e.hasMask = !1, e.overlay.css({ 641 backgroundImage: "", 642 backgroundRepeat: "", 643 backgroundPosition: "", 644 backgroundSize: "" 645 }), e.overlay.CSSAnimate({ 646 opacity: 1 647 }, e.opt.fadeOnStartTime) 648 }), this 649 }, 650 applyMask: function(e) { 651 let r = jQuery(e); 652 if (r.off("YTPTime.mask"), e.opt.mask) 653 if ("string" == typeof e.opt.mask) r.YTPAddMask(e.opt.mask), e.actualMask = e.opt.mask; 654 else if ("object" == typeof e.opt.mask) { 655 for (let r in e.opt.mask) e.opt.mask[r] && (img = jQuery("<img/>").attr("src", e.opt.mask[r])); 656 e.opt.mask[0] && r.YTPAddMask(e.opt.mask[0]), r.on("YTPTime.mask", function(t) { 657 for (let a in e.opt.mask) t.time === a && (e.opt.mask[a] ? (r.YTPAddMask(e.opt.mask[a]), e.actualMask = e.opt.mask[a]) : r.YTPRemoveMask()) 658 }) 659 } 660 }, 661 toggleMask: function() { 662 let e = this.get(0), 663 r = jQuery(e); 664 return e.hasMask ? r.YTPRemoveMask() : r.YTPAddMask(), this 665 }, 666 manageProgress: function() { 667 let e = this.get(0), 668 r = jQuery("#controlBar_" + e.id), 669 t = r.find(".mb_YTPProgress"), 670 a = r.find(".mb_YTPLoaded"), 671 o = r.find(".mb_YTPseekbar"), 672 n = t.outerWidth(), 673 i = Math.floor(e.player.getCurrentTime()), 674 l = Math.floor(e.player.getDuration()), 675 s = i * n / l, 676 u = 100 * e.player.getVideoLoadedFraction(); 677 return a.css({ 678 left: 0, 679 width: u + "%" 680 }), o.css({ 681 left: 0, 682 width: s 683 }), { 684 totalTime: l, 685 currentTime: i 686 } 687 }, 688 buildControls: function(YTPlayer) { 689 if (jQuery("#controlBar_" + YTPlayer.id).remove(), !YTPlayer.opt.showControls) return void(YTPlayer.controlBar = !1); 690 if (YTPlayer.opt.showYTLogo = YTPlayer.opt.showYTLogo || YTPlayer.opt.printUrl, jQuery("#controlBar_" + YTPlayer.id).length) return; 691 YTPlayer.controlBar = jQuery("<div/>").attr("id", "controlBar_" + YTPlayer.id).addClass("mb_YTPBar").css({ 692 whiteSpace: "noWrap", 693 position: YTPlayer.isBackground ? "fixed" : "absolute", 694 zIndex: YTPlayer.isBackground ? 1e4 : 1e3 695 }).hide().on("click", function(e) { 696 e.stopPropagation() 697 }); 698 let buttonBar = jQuery("<div/>").addClass("buttonBar"), 699 playpause = jQuery("<span>" + jQuery.mbYTPlayer.controls.play + "</span>").addClass("mb_YTPPlayPause ytpicon").on("click", function(e) { 700 e.stopPropagation(), jQuery(YTPlayer).YTPTogglePlay() 701 }), 702 MuteUnmute = jQuery("<span>" + jQuery.mbYTPlayer.controls.mute + "</span>").addClass("mb_YTPMuteUnmute ytpicon").on("click", function(e) { 703 e.stopPropagation(), jQuery(YTPlayer).YTPToggleVolume() 704 }), 705 volumeBar = jQuery("<div/>").addClass("mb_YTPVolumeBar").css({ 706 display: "inline-block" 707 }); 708 YTPlayer.volumeBar = volumeBar; 709 let idx = jQuery("<span/>").addClass("mb_YTPTime"), 710 vURL = YTPlayer.opt.videoURL ? YTPlayer.opt.videoURL : ""; 711 vURL.indexOf("http") < 0 && (vURL = "https://www.youtube.com/watch?v=" + YTPlayer.opt.videoURL); 712 let movieUrl = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.ytLogo).addClass("mb_YTPUrl ytpicon").attr("title", "view on YouTube").on("click", function() { 713 window.open(vURL, "viewOnYT") 714 }), 715 onlyVideo = jQuery("<span/>").html(jQuery.mbYTPlayer.controls.onlyYT).addClass("mb_OnlyYT ytpicon").on("click", function(e) { 716 e.stopPropagation(), jQuery(YTPlayer).YTPFullscreen(YTPlayer.opt.realFullscreen) 717 }), 718 progressBar = jQuery("<div/>").addClass("mb_YTPProgress").css("position", "absolute").on("click", function(e) { 719 e.stopPropagation(), timeBar.css({ 720 width: e.clientX - timeBar.offset().left 721 }), YTPlayer.timeW = e.clientX - timeBar.offset().left, YTPlayer.controlBar.find(".mb_YTPLoaded").css({ 722 width: 0 723 }); 724 let r = Math.floor(YTPlayer.player.getDuration()); 725 YTPlayer.goto = timeBar.outerWidth() * r / progressBar.outerWidth(), YTPlayer.player.seekTo(parseFloat(YTPlayer.goto), !0), YTPlayer.controlBar.find(".mb_YTPLoaded").css({ 726 width: 0 727 }) 728 }), 729 loadedBar = jQuery("<div/>").addClass("mb_YTPLoaded").css("position", "absolute"), 730 timeBar = jQuery("<div/>").addClass("mb_YTPseekbar").css("position", "absolute"); 731 progressBar.append(loadedBar).append(timeBar), buttonBar.append(playpause).append(MuteUnmute).append(volumeBar).append(idx), YTPlayer.opt.showYTLogo && buttonBar.append(movieUrl), (YTPlayer.isBackground || eval(YTPlayer.opt.realFullscreen) && !YTPlayer.isBackground) && buttonBar.append(onlyVideo), YTPlayer.controlBar.append(buttonBar).append(progressBar), YTPlayer.isBackground ? jQuery("body").after(YTPlayer.controlBar) : (YTPlayer.controlBar.addClass("inlinePlayer"), YTPlayer.wrapper.before(YTPlayer.controlBar)), volumeBar.simpleSlider({ 732 initialval: YTPlayer.opt.vol, 733 scale: 100, 734 orientation: "h", 735 callback: function(e) { 736 0 == e.value ? jQuery(YTPlayer).YTPMute() : jQuery(YTPlayer).YTPUnmute(), YTPlayer.player.setVolume(e.value), YTPlayer.isMute || (YTPlayer.opt.vol = e.value) 737 } 738 }) 739 }, 740 changeCoverImage: function(e) { 741 let r = this.get(0); 742 if (r.opt.coverImage || r.orig_containment_background) { 743 let t = e || (r.opt.coverImage ? "url(" + r.opt.coverImage + ") center center" : r.orig_containment_background); 744 t && r.opt.containment.css({ 745 background: t, 746 backgroundSize: "cover", 747 backgroundRepeat: "no-repeat", 748 backgroundAttachment: "fixed" 749 }) 750 } 751 return this 752 }, 753 checkForState: function() { 754 let YTPlayer = this.get(0), 755 $YTPlayer = jQuery(YTPlayer); 756 clearInterval(YTPlayer.getState); 757 let interval = 100; 758 if (!jQuery.contains(document, YTPlayer)) return $YTPlayer.YTPPlayerDestroy(), clearInterval(YTPlayer.getState), void clearInterval(YTPlayer.checkForStartAt); 759 jQuery.mbYTPlayer.checkForStart(YTPlayer), YTPlayer.getState = setInterval(function() { 760 let $YTPlayer = jQuery(YTPlayer); 761 if (!YTPlayer.isReady) return; 762 let prog = jQuery(YTPlayer).YTPManageProgress(), 763 stopAt = YTPlayer.opt.stopAt > YTPlayer.opt.startAt ? YTPlayer.opt.stopAt : 0; 764 if (stopAt = stopAt < YTPlayer.player.getDuration() ? stopAt : 0, YTPlayer.currentTime != prog.currentTime) { 765 let e = jQuery.Event("YTPTime"); 766 e.time = YTPlayer.currentTime, jQuery(YTPlayer).trigger(e) 767 } 768 if (YTPlayer.currentTime = prog.currentTime, YTPlayer.totalTime = YTPlayer.player.getDuration(), 0 == YTPlayer.player.getVolume() ? $YTPlayer.addClass("isMuted") : $YTPlayer.removeClass("isMuted"), YTPlayer.opt.showControls && (prog.totalTime ? YTPlayer.controlBar.find(".mb_YTPTime").html(jQuery.mbYTPlayer.formatTime(prog.currentTime) + " / " + jQuery.mbYTPlayer.formatTime(prog.totalTime)) : YTPlayer.controlBar.find(".mb_YTPTime").html("-- : -- / -- : --")), eval(YTPlayer.opt.stopMovieOnBlur) && (document.hasFocus() ? document.hasFocus() && !YTPlayer.hasFocus && -1 != YTPlayer.state && 0 != YTPlayer.state && (YTPlayer.hasFocus = !0, YTPlayer.preventTrigger = !0, $YTPlayer.YTPPlay()) : 1 == YTPlayer.state && (YTPlayer.hasFocus = !1, YTPlayer.preventTrigger = !0, $YTPlayer.YTPPause())), YTPlayer.opt.playOnlyIfVisible) { 769 let e = jQuery.mbYTPlayer.isOnScreen(YTPlayer, YTPlayer.opt.onScreenPercentage); 770 e || 1 != YTPlayer.state ? e && !YTPlayer.isOnScreen && (YTPlayer.isOnScreen = !0, YTPlayer.player.playVideo()) : (YTPlayer.isOnScreen = !1, $YTPlayer.YTPPause()) 771 } 772 if (YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() <= 400 && !YTPlayer.isCompact ? (YTPlayer.controlBar.addClass("compact"), YTPlayer.isCompact = !0, !YTPlayer.isMute && YTPlayer.volumeBar && YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol)) : YTPlayer.controlBar.length && YTPlayer.controlBar.outerWidth() > 400 && YTPlayer.isCompact && (YTPlayer.controlBar.removeClass("compact"), YTPlayer.isCompact = !1, !YTPlayer.isMute && YTPlayer.volumeBar && YTPlayer.volumeBar.updateSliderVal(YTPlayer.opt.vol)), YTPlayer.player.getPlayerState() > 0 && (parseFloat(YTPlayer.player.getDuration() - YTPlayer.opt.fadeOnStartTime / 1e3) < YTPlayer.player.getCurrentTime() || stopAt > 0 && parseFloat(YTPlayer.player.getCurrentTime()) >= stopAt)) { 773 if (YTPlayer.isEnded) return; 774 if (YTPlayer.isEnded = !0, setTimeout(function() { 775 YTPlayer.isEnded = !1 776 }, 1e3), YTPlayer.isList) { 777 if (!YTPlayer.opt.loop || YTPlayer.opt.loop > 0 && YTPlayer.player.loopTime === YTPlayer.opt.loop - 1) { 778 YTPlayer.player.loopTime = void 0, clearInterval(YTPlayer.getState); 779 let e = jQuery.Event("YTPEnd"); 780 return e.time = YTPlayer.currentTime, void jQuery(YTPlayer).trigger(e) 781 } 782 } else if (!YTPlayer.opt.loop || YTPlayer.opt.loop > 0 && YTPlayer.player.loopTime === YTPlayer.opt.loop - 1) return YTPlayer.player.loopTime = void 0, YTPlayer.state = 2, $YTPlayer.changeCoverImage(YTPlayer), jQuery(YTPlayer).YTPPause(), void YTPlayer.wrapper.CSSAnimate({ 783 opacity: 0 784 }, YTPlayer.opt.fadeOnStartTime, function() { 785 YTPlayer.controlBar.length && YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play), $YTPlayer.changeCoverImage(); 786 let e = jQuery.Event("YTPEnd"); 787 e.time = YTPlayer.currentTime, jQuery(YTPlayer).trigger(e), YTPlayer.player.seekTo(YTPlayer.opt.startAt, !0) 788 }); 789 YTPlayer.player.loopTime = YTPlayer.player.loopTime ? ++YTPlayer.player.loopTime : 1, YTPlayer.opt.startAt = YTPlayer.opt.startAt || 1, YTPlayer.preventTrigger = !0, YTPlayer.state = 2, YTPlayer.player.seekTo(YTPlayer.opt.startAt, !0) 790 } 791 }, interval) 792 }, 793 checkForStart: function(YTPlayer) { 794 let $YTPlayer = jQuery(YTPlayer); 795 if (!jQuery.contains(document, YTPlayer)) return void $YTPlayer.YTPPlayerDestroy(); 796 if (jQuery.mbYTPlayer.buildControls(YTPlayer), YTPlayer.overlay) 797 if (YTPlayer.opt.addRaster) { 798 let e = "dot" == YTPlayer.opt.addRaster ? "raster-dot" : "raster"; 799 YTPlayer.overlay.addClass(YTPlayer.isRetina ? e + " retina" : e) 800 } else YTPlayer.overlay.removeClass(function(e, r) { 801 let t = r.split(" "), 802 a = []; 803 return jQuery.each(t, function(e, r) { 804 /raster.*/.test(r) && a.push(r) 805 }), a.push("retina"), a.join(" ") 806 }); 807 YTPlayer.preventTrigger = !0, YTPlayer.state = 2, YTPlayer.preventTrigger = !0, YTPlayer.player.mute(), YTPlayer.player.playVideo(), YTPlayer.isStarting = !0; 808 let startAt = YTPlayer.start_from_last ? YTPlayer.start_from_last : YTPlayer.opt.startAt ? YTPlayer.opt.startAt : 1; 809 return YTPlayer.preventTrigger = !0, YTPlayer.checkForStartAt = setInterval(function() { 810 YTPlayer.player.mute(), YTPlayer.player.seekTo(startAt, !0); 811 let canPlayVideo = YTPlayer.player.getVideoLoadedFraction() >= startAt / YTPlayer.player.getDuration(); 812 if (jQuery.mbBrowser.mobile && (canPlayVideo = !0), YTPlayer.player.getDuration() > 0 && YTPlayer.player.getCurrentTime() >= startAt && canPlayVideo) { 813 YTPlayer.start_from_last = null, YTPlayer.preventTrigger = !0, $YTPlayer.YTPPause(), clearInterval(YTPlayer.checkForStartAt), "function" == typeof YTPlayer.opt.onReady && YTPlayer.opt.onReady(YTPlayer), YTPlayer.isReady = !0, $YTPlayer.YTPRemoveFilter(), YTPlayer.opt.addFilters ? $YTPlayer.YTPApplyFilters(YTPlayer.opt.addFilters) : $YTPlayer.YTPApplyFilters(), $YTPlayer.YTPEnableFilters(); 814 let YTPready = jQuery.Event("YTPReady"); 815 if (YTPready.time = YTPlayer.currentTime, $YTPlayer.trigger(YTPready), YTPlayer.state = 2, YTPlayer.opt.mute ? $YTPlayer.YTPMute() : YTPlayer.opt.autoPlay ? (console.debug("We muted the audio to make the video 'auto-play' according with the latest vendor policy. The audio will unmute at the first user interaction with the page"), YTPlayer.player.mute(), YTPlayer.forcedMuted = !0, jQuery(document).on("mousedown.YTPstartAudio", function() { 816 YTPlayer.forcedMuted && (console.debug("AAAAAAA"), YTPlayer.player.unMute(), YTPlayer.forcedMuted = !1, jQuery(document).off("mousedown.YTPstartAudio")) 817 }), jQuery(window).on("scroll", function() { 818 console.debug("AAAAA") 819 })) : YTPlayer.player.unMute(), "undefined" != typeof _gaq && eval(YTPlayer.opt.gaTrack) ? _gaq.push(["_trackEvent", "YTPlayer", "Play", YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString()]) : "undefined" != typeof ga && eval(YTPlayer.opt.gaTrack) && ga("send", "event", "YTPlayer", "play", YTPlayer.hasData ? YTPlayer.videoData.title : YTPlayer.videoID.toString()), YTPlayer.opt.autoPlay) { 820 let e = jQuery.Event("YTPStart"); 821 e.time = YTPlayer.currentTime, jQuery(YTPlayer).trigger(e), YTPlayer.isStarting = !1, "mac" === jQuery.mbBrowser.os.name && jQuery.mbBrowser.safari && jQuery("body").one("mousedown.YTPstart", function() { 822 $YTPlayer.YTPPlay() 823 }), $YTPlayer.YTPPlay(), console.timeEnd(YTPTimerLabels.startPlaying) 824 } else YTPlayer.preventTrigger = !0, $YTPlayer.YTPPause(), YTPlayer.start_from_last && YTPlayer.player.seekTo(startAt, !0), setTimeout(function() { 825 YTPlayer.preventTrigger = !0, $YTPlayer.YTPPause(), YTPlayer.isPlayer || (YTPlayer.opt.coverImage ? (YTPlayer.wrapper.css({ 826 opacity: 0 827 }), setTimeout(function() { 828 $YTPlayer.changeCoverImage() 829 }, YTPlayer.opt.fadeOnStartTime)) : (jQuery(YTPlayer.playerEl).CSSAnimate({ 830 opacity: 1 831 }, YTPlayer.opt.fadeOnStartTime), YTPlayer.wrapper.CSSAnimate({ 832 opacity: YTPlayer.isAlone ? 1 : YTPlayer.opt.opacity 833 }, YTPlayer.opt.fadeOnStartTime))), YTPlayer.isStarting = !1 834 }, 500), YTPlayer.controlBar.length && YTPlayer.controlBar.find(".mb_YTPPlayPause").html(jQuery.mbYTPlayer.controls.play); 835 YTPlayer.isPlayer && !YTPlayer.opt.autoPlay && YTPlayer.loading && YTPlayer.loading.length && (YTPlayer.loading.html("Ready"), setTimeout(function() { 836 YTPlayer.loading.fadeOut() 837 }, 100)), YTPlayer.controlBar && YTPlayer.controlBar.length && YTPlayer.controlBar.slideDown(1e3) 838 } 839 "mac" === jQuery.mbBrowser.os.name && jQuery.mbBrowser.safari && (YTPlayer.player.playVideo(), startAt >= 0 && YTPlayer.player.seekTo(startAt, !0)) 840 }, 100), $YTPlayer 841 }, 842 getTime: function() { 843 let e = this.get(0); 844 return jQuery.mbYTPlayer.formatTime(e.currentTime) 845 }, 846 getTotalTime: function() { 847 let e = this.get(0); 848 return jQuery.mbYTPlayer.formatTime(e.totalTime) 849 }, 850 formatTime: function(e) { 851 let r = Math.floor(e / 60), 852 t = Math.floor(e - 60 * r); 853 return (r <= 9 ? "0" + r : r) + " : " + (t <= 9 ? "0" + t : t) 854 }, 855 setAnchor: function(e) { 856 this.optimizeDisplay(e) 857 }, 858 getAnchor: function() { 859 return this.get(0).opt.anchor 860 }, 861 setAbundance: function(e, r) { 862 let t = this.get(0); 863 return r && (t.opt.abundance = e), this.optimizeDisplay(t.opt.anchor, e), this 864 }, 865 getAbundance: function() { 866 return this.get(0).opt.abundance 867 }, 868 setOption: function(e, r) { 869 return this.get(0).opt[e] = r, this 870 } 871 }, jQuery.fn.optimizeDisplay = function(anchor, abundanceX) { 872 let YTPlayer = this.get(0), 873 vid = {}, 874 el = YTPlayer.wrapper, 875 iframe = jQuery(YTPlayer.playerEl); 876 YTPlayer.opt.anchor = anchor || YTPlayer.opt.anchor, YTPlayer.opt.anchor = "undefined " != typeof YTPlayer.opt.anchor ? YTPlayer.opt.anchor : "center,center"; 877 let YTPAlign = YTPlayer.opt.anchor.split(","), 878 ab = abundanceX || YTPlayer.opt.abundance; 879 if (YTPlayer.opt.optimizeDisplay) { 880 let abundance = el.height() * ab, 881 win = {}; 882 win.width = el.outerWidth(), win.height = el.outerHeight() + abundance, YTPlayer.opt.ratio = "auto" === YTPlayer.opt.ratio ? 16 / 9 : YTPlayer.opt.ratio, YTPlayer.opt.ratio = eval(YTPlayer.opt.ratio), vid.width = win.width + abundance, vid.height = Math.ceil(vid.width / YTPlayer.opt.ratio), vid.marginTop = Math.ceil(-(vid.height - win.height + abundance) / 2), vid.marginLeft = -abundance / 2; 883 let lowest = vid.height < win.height; 884 lowest && (vid.height = win.height + abundance, vid.width = Math.ceil(vid.height * YTPlayer.opt.ratio), vid.marginTop = -abundance / 2, vid.marginLeft = Math.ceil(-(vid.width - win.width) / 2)); 885 for (let e in YTPAlign) 886 if (YTPAlign.hasOwnProperty(e)) { 887 let r = YTPAlign[e].replace(/ /g, ""); 888 switch (r) { 889 case "top": 890 vid.marginTop = -abundance; 891 break; 892 case "bottom": 893 vid.marginTop = Math.ceil(-(vid.height - win.height) - abundance / 2); 894 break; 895 case "left": 896 vid.marginLeft = -abundance; 897 break; 898 case "right": 899 vid.marginLeft = Math.ceil(-(vid.width - win.width) + abundance / 2) 900 } 901 } 902 } else vid.width = "100%", vid.height = "100%", vid.marginTop = 0, vid.marginLeft = 0; 903 iframe.css({ 904 width: vid.width, 905 height: vid.height, 906 marginTop: vid.marginTop, 907 marginLeft: vid.marginLeft, 908 maxWidth: "initial" 909 }) 910 }, jQuery.shuffle = function(e) { 911 let r = e.slice(), 912 t = r.length, 913 a = t; 914 for (; a--;) { 915 let e = parseInt(Math.random() * t), 916 o = r[a]; 917 r[a] = r[e], r[e] = o 918 } 919 return r 920 }, jQuery.fn.unselectable = function() { 921 return this.each(function() { 922 jQuery(this).css({ 923 "-moz-user-select": "none", 924 "-webkit-user-select": "none", 925 "user-select": "none" 926 }).attr("unselectable", "on") 927 }) 928 }, jQuery.fn.YTPlayer = jQuery.mbYTPlayer.buildPlayer, jQuery.fn.mb_YTPlayer = jQuery.mbYTPlayer.buildPlayer, jQuery.fn.YTPCheckForState = jQuery.mbYTPlayer.checkForState, jQuery.fn.YTPGetPlayer = jQuery.mbYTPlayer.getPlayer, jQuery.fn.YTPGetVideoID = jQuery.mbYTPlayer.getVideoID, jQuery.fn.YTPGetPlaylistID = jQuery.mbYTPlayer.getPlaylistID, jQuery.fn.YTPChangeVideo = jQuery.fn.YTPChangeMovie = jQuery.mbYTPlayer.changeVideo, jQuery.fn.YTPPlayerDestroy = jQuery.mbYTPlayer.playerDestroy, jQuery.fn.YTPPlay = jQuery.mbYTPlayer.play, jQuery.fn.YTPTogglePlay = jQuery.mbYTPlayer.togglePlay, jQuery.fn.YTPStop = jQuery.mbYTPlayer.stop, jQuery.fn.YTPPause = jQuery.mbYTPlayer.pause, jQuery.fn.YTPSeekTo = jQuery.mbYTPlayer.seekTo, jQuery.fn.YTPGetPlaybackRate = jQuery.mbYTPlayer.getPlaybackRate, jQuery.fn.YTPSetPlaybackRate = jQuery.mbYTPlayer.setPlaybackRate, jQuery.fn.changeCoverImage = jQuery.mbYTPlayer.changeCoverImage, jQuery.fn.YTPlaylist = jQuery.mbYTPlayer.playlist, jQuery.fn.YTPPlayNext = jQuery.mbYTPlayer.playNext, jQuery.fn.YTPPlayPrev = jQuery.mbYTPlayer.playPrev, jQuery.fn.YTPPlayIndex = jQuery.mbYTPlayer.playIndex, jQuery.fn.YTPMute = jQuery.mbYTPlayer.mute, jQuery.fn.YTPUnmute = jQuery.mbYTPlayer.unmute, jQuery.fn.YTPToggleVolume = jQuery.mbYTPlayer.toggleVolume, jQuery.fn.YTPSetVolume = jQuery.mbYTPlayer.setVolume, jQuery.fn.YTPGetVolume = jQuery.mbYTPlayer.getVolume, jQuery.fn.YTPGetVideoData = jQuery.mbYTPlayer.getVideoData, jQuery.fn.YTPFullscreen = jQuery.mbYTPlayer.fullscreen, jQuery.fn.YTPToggleLoops = jQuery.mbYTPlayer.toggleLoops, jQuery.fn.YTPManageProgress = jQuery.mbYTPlayer.manageProgress, jQuery.fn.YTPSetVideoQuality = jQuery.mbYTPlayer.setVideoQuality, jQuery.fn.YTPGetVideoQuality = jQuery.mbYTPlayer.getVideoQuality, jQuery.fn.YTPApplyFilter = jQuery.mbYTPlayer.applyFilter, jQuery.fn.YTPApplyFilters = jQuery.mbYTPlayer.applyFilters, jQuery.fn.YTPToggleFilter = jQuery.mbYTPlayer.toggleFilter, jQuery.fn.YTPToggleFilters = jQuery.mbYTPlayer.toggleFilters, jQuery.fn.YTPRemoveFilter = jQuery.mbYTPlayer.removeFilter, jQuery.fn.YTPDisableFilters = jQuery.mbYTPlayer.disableFilters, jQuery.fn.YTPEnableFilters = jQuery.mbYTPlayer.enableFilters, jQuery.fn.YTPGetFilters = jQuery.mbYTPlayer.getFilters, jQuery.fn.YTPGetTime = jQuery.mbYTPlayer.getTime, jQuery.fn.YTPGetTotalTime = jQuery.mbYTPlayer.getTotalTime, jQuery.fn.YTPAddMask = jQuery.mbYTPlayer.addMask, jQuery.fn.YTPRemoveMask = jQuery.mbYTPlayer.removeMask, jQuery.fn.YTPToggleMask = jQuery.mbYTPlayer.toggleMask, jQuery.fn.YTPGetAbundance = jQuery.mbYTPlayer.getAbundance, jQuery.fn.YTPSetAbundance = jQuery.mbYTPlayer.setAbundance, jQuery.fn.YTPSetAnchor = jQuery.mbYTPlayer.setAnchor, jQuery.fn.YTPGetAnchor = jQuery.mbYTPlayer.getAnchor, jQuery.fn.YTPSetOption = jQuery.mbYTPlayer.setOption 929}(jQuery, ytp); 930var nAgt = navigator.userAgent; 931 932function isTouchSupported() { 933 var e = nAgt.msMaxTouchPoints, 934 r = "ontouchstart" in document.createElement("div"); 935 return !(!e && !r) 936} 937jQuery.browser = jQuery.browser || {}, jQuery.browser.mozilla = !1, jQuery.browser.webkit = !1, jQuery.browser.opera = !1, jQuery.browser.safari = !1, jQuery.browser.chrome = !1, jQuery.browser.androidStock = !1, jQuery.browser.msie = !1, jQuery.browser.edge = !1, jQuery.browser.ua = nAgt; 938var getOS = function() { 939 var e = { 940 version: "Unknown version", 941 name: "Unknown OS" 942 }; 943 return -1 != navigator.appVersion.indexOf("Win") && (e.name = "Windows"), -1 != navigator.appVersion.indexOf("Mac") && 0 > navigator.appVersion.indexOf("Mobile") && (e.name = "Mac"), -1 != navigator.appVersion.indexOf("Linux") && (e.name = "Linux"), /Mac OS X/.test(nAgt) && !/Mobile/.test(nAgt) && (e.version = /Mac OS X ([\._\d]+)/.exec(nAgt)[1], e.version = e.version.replace(/_/g, ".").substring(0, 5)), /Windows/.test(nAgt) && (e.version = "Unknown.Unknown"), /Windows NT 5.1/.test(nAgt) && (e.version = "5.1"), /Windows NT 6.0/.test(nAgt) && (e.version = "6.0"), /Windows NT 6.1/.test(nAgt) && (e.version = "6.1"), /Windows NT 6.2/.test(nAgt) && (e.version = "6.2"), /Windows NT 10.0/.test(nAgt) && (e.version = "10.0"), /Linux/.test(nAgt) && /Linux/.test(nAgt) && (e.version = "Unknown.Unknown"), e.name = e.name.toLowerCase(), e.major_version = "Unknown", e.minor_version = "Unknown", "Unknown.Unknown" != e.version && (e.major_version = parseFloat(e.version.split(".")[0]), e.minor_version = parseFloat(e.version.split(".")[1])), e 944 }, 945 nameOffset, verOffset, ix; 946if (jQuery.browser.os = getOS(), jQuery.browser.hasTouch = isTouchSupported(), jQuery.browser.name = navigator.appName, jQuery.browser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.browser.majorVersion = parseInt(navigator.appVersion, 10), -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)); 947else if (-1 != (verOffset = nAgt.indexOf("OPR"))) jQuery.browser.opera = !0, jQuery.browser.name = "Opera", jQuery.browser.fullVersion = nAgt.substring(verOffset + 4); 948else if (-1 != (verOffset = nAgt.indexOf("MSIE"))) jQuery.browser.msie = !0, jQuery.browser.name = "Microsoft Internet Explorer", jQuery.browser.fullVersion = nAgt.substring(verOffset + 5); 949else if (-1 != nAgt.indexOf("Trident")) { 950 jQuery.browser.msie = !0, jQuery.browser.name = "Microsoft Internet Explorer"; 951 var start = nAgt.indexOf("rv:") + 3, 952 end = start + 4; 953 jQuery.browser.fullVersion = nAgt.substring(start, end) 954} else -1 != (verOffset = nAgt.indexOf("Edge")) ? (jQuery.browser.edge = !0, jQuery.browser.name = "Microsoft Edge", jQuery.browser.fullVersion = nAgt.substring(verOffset + 5)) : -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 < nAgt.indexOf("mozilla/5.0") && -1 < nAgt.indexOf("android ") && -1 < nAgt.indexOf("applewebkit") && !(-1 < nAgt.indexOf("chrome")) ? (verOffset = nAgt.indexOf("Chrome"), jQuery.browser.webkit = !0, jQuery.browser.androidStock = !0, jQuery.browser.name = "androidStock", jQuery.browser.fullVersion = nAgt.substring(verOffset + 7)) : -1 != (verOffset = nAgt.indexOf("Safari")) ? (jQuery.browser.webkit = !0, jQuery.browser.safari = !0, jQuery.browser.name = "Safari", jQuery.browser.fullVersion = nAgt.substring(verOffset + 7), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.browser.fullVersion = nAgt.substring(verOffset + 8))) : -1 != (verOffset = nAgt.indexOf("AppleWebkit")) ? (jQuery.browser.webkit = !0, jQuery.browser.safari = !0, jQuery.browser.name = "Safari", jQuery.browser.fullVersion = nAgt.substring(verOffset + 7), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.browser.fullVersion = nAgt.substring(verOffset + 8))) : -1 != (verOffset = nAgt.indexOf("Firefox")) ? (jQuery.browser.mozilla = !0, jQuery.browser.name = "Firefox", jQuery.browser.fullVersion = nAgt.substring(verOffset + 8)) : (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)); 955 956function uncamel(e) { 957 return e.replace(/([A-Z])/g, function(e) { 958 return "-" + e.toLowerCase() 959 }) 960} 961 962function setUnit(e, r) { 963 return "string" != typeof e || e.match(/^[\-0-9\.]+jQuery/) ? "" + e + r : e 964} 965 966function setFilter(e, r, t) { 967 var a = uncamel(r), 968 o = jQuery.browser.mozilla ? "" : jQuery.CSS.sfx; 969 e[o + "filter"] = e[o + "filter"] || "", t = setUnit(t > jQuery.CSS.filters[r].max ? jQuery.CSS.filters[r].max : t, jQuery.CSS.filters[r].unit), e[o + "filter"] += a + "(" + t + ") ", delete e[r] 970} - 1 != (ix = jQuery.browser.fullVersion.indexOf(";")) && (jQuery.browser.fullVersion = jQuery.browser.fullVersion.substring(0, ix)), -1 != (ix = jQuery.browser.fullVersion.indexOf(" ")) && (jQuery.browser.fullVersion = jQuery.browser.fullVersion.substring(0, ix)), jQuery.browser.majorVersion = parseInt("" + jQuery.browser.fullVersion, 10), isNaN(jQuery.browser.majorVersion) && (jQuery.browser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.browser.majorVersion = parseInt(navigator.appVersion, 10)), jQuery.browser.version = jQuery.browser.majorVersion, jQuery.browser.android = /Android/i.test(nAgt), jQuery.browser.blackberry = /BlackBerry|BB|PlayBook/i.test(nAgt), jQuery.browser.ios = /iPhone|iPad|iPod|webOS/i.test(nAgt), jQuery.browser.operaMobile = /Opera Mini/i.test(nAgt), jQuery.browser.windowsMobile = /IEMobile|Windows Phone/i.test(nAgt), jQuery.browser.kindle = /Kindle|Silk/i.test(nAgt), jQuery.browser.mobile = jQuery.browser.android || jQuery.browser.blackberry || jQuery.browser.ios || jQuery.browser.windowsMobile || jQuery.browser.operaMobile || jQuery.browser.kindle, jQuery.isMobile = jQuery.browser.mobile, jQuery.isTablet = jQuery.browser.mobile && 765 < jQuery(window).width(), jQuery.isAndroidDefault = jQuery.browser.android && !/chrome/i.test(nAgt), jQuery.mbBrowser = jQuery.browser, jQuery.browser.versionCompare = function(e, r) { 971 if ("stringstring" != typeof e + typeof r) return !1; 972 for (var t = e.split("."), a = r.split("."), o = 0, n = Math.max(t.length, a.length); o < n; o++) { 973 if (t[o] && !a[o] && 0 < parseInt(t[o]) || parseInt(t[o]) > parseInt(a[o])) return 1; 974 if (a[o] && !t[o] && 0 < parseInt(a[o]) || parseInt(t[o]) < parseInt(a[o])) return -1 975 } 976 return 0 977 }, jQuery.support.CSStransition = function() { 978 var e = (document.body || document.documentElement).style; 979 return void 0 !== e.transition || void 0 !== e.WebkitTransition || void 0 !== e.MozTransition || void 0 !== e.MsTransition || void 0 !== e.OTransition 980 }(), jQuery.CSS = { 981 name: "mb.CSSAnimate", 982 author: "Matteo Bicocchi", 983 version: "2.0.0", 984 transitionEnd: "transitionEnd", 985 sfx: "", 986 filters: { 987 blur: { 988 min: 0, 989 max: 100, 990 unit: "px" 991 }, 992 brightness: { 993 min: 0, 994 max: 400, 995 unit: "%" 996 }, 997 contrast: { 998 min: 0, 999 max: 400, 1000 unit: "%" 1001 }, 1002 grayscale: { 1003 min: 0, 1004 max: 100, 1005 unit: "%" 1006 }, 1007 hueRotate: { 1008 min: 0, 1009 max: 360, 1010 unit: "deg" 1011 }, 1012 invert: { 1013 min: 0, 1014 max: 100, 1015 unit: "%" 1016 }, 1017 saturate: { 1018 min: 0, 1019 max: 400, 1020 unit: "%" 1021 }, 1022 sepia: { 1023 min: 0, 1024 max: 100, 1025 unit: "%" 1026 } 1027 }, 1028 normalizeCss: function(e) { 1029 var r = jQuery.extend(!0, {}, e); 1030 for (var t in jQuery.browser.webkit || jQuery.browser.opera ? jQuery.CSS.sfx = "-webkit-" : jQuery.browser.mozilla ? jQuery.CSS.sfx = "-moz-" : jQuery.browser.msie && (jQuery.CSS.sfx = "-ms-"), jQuery.CSS.sfx = "", r) { 1031 if ("transform" === t && (r[jQuery.CSS.sfx + "transform"] = r[t], delete r[t]), "transform-origin" === t && (r[jQuery.CSS.sfx + "transform-origin"] = e[t], delete r[t]), "filter" !== t || jQuery.browser.mozilla || (r[jQuery.CSS.sfx + "filter"] = e[t], delete r[t]), "blur" === t && setFilter(r, "blur", e[t]), "brightness" === t && setFilter(r, "brightness", e[t]), "contrast" === t && setFilter(r, "contrast", e[t]), "grayscale" === t && setFilter(r, "grayscale", e[t]), "hueRotate" === t && setFilter(r, "hueRotate", e[t]), "invert" === t && setFilter(r, "invert", e[t]), "saturate" === t && setFilter(r, "saturate", e[t]), "sepia" === t && setFilter(r, "sepia", e[t]), "x" === t) { 1032 var a = jQuery.CSS.sfx + "transform"; 1033 r[a] = r[a] || "", r[a] += " translateX(" + setUnit(e[t], "px") + ")", delete r[t] 1034 } 1035 "y" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " translateY(" + setUnit(e[t], "px") + ")", delete r[t]), "z" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " translateZ(" + setUnit(e[t], "px") + ")", delete r[t]), "rotate" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " rotate(" + setUnit(e[t], "deg") + ")", delete r[t]), "rotateX" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " rotateX(" + setUnit(e[t], "deg") + ")", delete r[t]), "rotateY" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " rotateY(" + setUnit(e[t], "deg") + ")", delete r[t]), "rotateZ" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " rotateZ(" + setUnit(e[t], "deg") + ")", delete r[t]), "scale" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " scale(" + setUnit(e[t], "") + ")", delete r[t]), "scaleX" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " scaleX(" + setUnit(e[t], "") + ")", delete r[t]), "scaleY" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " scaleY(" + setUnit(e[t], "") + ")", delete r[t]), "scaleZ" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " scaleZ(" + setUnit(e[t], "") + ")", delete r[t]), "skew" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " skew(" + setUnit(e[t], "deg") + ")", delete r[t]), "skewX" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " skewX(" + setUnit(e[t], "deg") + ")", delete r[t]), "skewY" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " skewY(" + setUnit(e[t], "deg") + ")", delete r[t]), "perspective" === t && (r[a = jQuery.CSS.sfx + "transform"] = r[a] || "", r[a] += " perspective(" + setUnit(e[t], "px") + ")", delete r[t]) 1036 } 1037 return r 1038 }, 1039 getProp: function(e) { 1040 var r, t = []; 1041 for (r in e) 0 > t.indexOf(r) && t.push(uncamel(r)); 1042 return t.join(",") 1043 }, 1044 animate: function(e, r, t, a, o) { 1045 return this.each(function() { 1046 function n() { 1047 i.called = !0, i.CSSAIsRunning = !1, l.off(jQuery.CSS.transitionEnd + "." + i.id), clearTimeout(i.timeout), l.css(jQuery.CSS.sfx + "transition", ""), "function" == typeof o && o.apply(i), "function" == typeof i.CSSqueue && (i.CSSqueue(), i.CSSqueue = null) 1048 } 1049 var i = this, 1050 l = jQuery(this); 1051 i.id = i.id || "CSSA_" + (new Date).getTime(); 1052 var s = s || { 1053 type: "noEvent" 1054 }; 1055 if (i.CSSAIsRunning && i.eventType == s.type && !jQuery.browser.msie && 9 >= jQuery.browser.version) i.CSSqueue = function() { 1056 l.CSSAnimate(e, r, t, a, o) 1057 }; 1058 else if (i.CSSqueue = null, i.eventType = s.type, 0 !== l.length && e) { 1059 if (e = jQuery.normalizeCss(e), i.CSSAIsRunning = !0, "function" == typeof r && (o = r, r = jQuery.fx.speeds._default), "function" == typeof t && (a = t, t = 0), "string" == typeof t && (o = t, t = 0), "function" == typeof a && (o = a, a = "cubic-bezier(0.65,0.03,0.36,0.72)"), "string" == typeof r) 1060 for (var u in jQuery.fx.speeds) { 1061 if (r == u) { 1062 r = jQuery.fx.speeds[u]; 1063 break 1064 } 1065 r = jQuery.fx.speeds._default 1066 } 1067 if (r || (r = jQuery.fx.speeds._default), "string" == typeof o && (a = o, o = null), jQuery.support.CSStransition) { 1068 var y = { 1069 default: "ease", 1070 in: "ease-in", 1071 out: "ease-out", 1072 "in-out": "ease-in-out", 1073 snap: "cubic-bezier(0,1,.5,1)", 1074 easeOutCubic: "cubic-bezier(.215,.61,.355,1)", 1075 easeInOutCubic: "cubic-bezier(.645,.045,.355,1)", 1076 easeInCirc: "cubic-bezier(.6,.04,.98,.335)", 1077 easeOutCirc: "cubic-bezier(.075,.82,.165,1)", 1078 easeInOutCirc: "cubic-bezier(.785,.135,.15,.86)", 1079 easeInExpo: "cubic-bezier(.95,.05,.795,.035)", 1080 easeOutExpo: "cubic-bezier(.19,1,.22,1)", 1081 easeInOutExpo: "cubic-bezier(1,0,0,1)", 1082 easeInQuad: "cubic-bezier(.55,.085,.68,.53)", 1083 easeOutQuad: "cubic-bezier(.25,.46,.45,.94)", 1084 easeInOutQuad: "cubic-bezier(.455,.03,.515,.955)", 1085 easeInQuart: "cubic-bezier(.895,.03,.685,.22)", 1086 easeOutQuart: "cubic-bezier(.165,.84,.44,1)", 1087 easeInOutQuart: "cubic-bezier(.77,0,.175,1)", 1088 easeInQuint: "cubic-bezier(.755,.05,.855,.06)", 1089 easeOutQuint: "cubic-bezier(.23,1,.32,1)", 1090 easeInOutQuint: "cubic-bezier(.86,0,.07,1)", 1091 easeInSine: "cubic-bezier(.47,0,.745,.715)", 1092 easeOutSine: "cubic-bezier(.39,.575,.565,1)", 1093 easeInOutSine: "cubic-bezier(.445,.05,.55,.95)", 1094 easeInBack: "cubic-bezier(.6,-.28,.735,.045)", 1095 easeOutBack: "cubic-bezier(.175, .885,.32,1.275)", 1096 easeInOutBack: "cubic-bezier(.68,-.55,.265,1.55)" 1097 }; 1098 y[a] && (a = y[a]), l.off(jQuery.CSS.transitionEnd + "." + i.id), y = jQuery.CSS.getProp(e); 1099 var d = {}; 1100 jQuery.extend(d, e), d[jQuery.CSS.sfx + "transition-property"] = y, d[jQuery.CSS.sfx + "transition-duration"] = r + "ms", d[jQuery.CSS.sfx + "transition-delay"] = t + "ms", d[jQuery.CSS.sfx + "transition-timing-function"] = a, setTimeout(function() { 1101 l.one(jQuery.CSS.transitionEnd + "." + i.id, n), l.css(d) 1102 }, 1), i.timeout = setTimeout(function() { 1103 i.called || !o ? (i.called = !1, i.CSSAIsRunning = !1) : (l.css(jQuery.CSS.sfx + "transition", ""), o.apply(i), i.CSSAIsRunning = !1, "function" == typeof i.CSSqueue && (i.CSSqueue(), i.CSSqueue = null)) 1104 }, r + t + 10) 1105 } else { 1106 for (y in e) "transform" === y && delete e[y], "filter" === y && delete e[y], "transform-origin" === y && delete e[y], "auto" === e[y] && delete e[y], "x" === y && (s = e[y], e[u = "left"] = s, delete e[y]), "y" === y && (s = e[y], e[u = "top"] = s, delete e[y]), "-ms-transform" !== y && "-ms-filter" !== y || delete e[y]; 1107 l.delay(t).animate(e, r, o) 1108 } 1109 } 1110 }) 1111 } 1112 }, jQuery.fn.CSSAnimate = jQuery.CSS.animate, jQuery.normalizeCss = jQuery.CSS.normalizeCss, jQuery.fn.css3 = function(e) { 1113 return this.each(function() { 1114 var r = jQuery(this), 1115 t = jQuery.normalizeCss(e); 1116 r.css(t) 1117 }) 1118 }, 1119 function(e) { 1120 e.simpleSlider = { 1121 defaults: { 1122 initialval: 0, 1123 maxval: 100, 1124 orientation: "h", 1125 readonly: !1, 1126 callback: !1 1127 }, 1128 events: { 1129 start: e.browser.mobile ? "touchstart" : "mousedown", 1130 end: e.browser.mobile ? "touchend" : "mouseup", 1131 move: e.browser.mobile ? "touchmove" : "mousemove" 1132 }, 1133 init: function(r) { 1134 return this.each(function() { 1135 var t = this, 1136 a = e(t); 1137 a.addClass("simpleSlider"), t.opt = {}, e.extend(t.opt, e.simpleSlider.defaults, r), e.extend(t.opt, a.data()); 1138 var o = "h" === t.opt.orientation ? "horizontal" : "vertical"; 1139 o = e("<div/>").addClass("level").addClass(o), a.prepend(o), t.level = o, a.css({ 1140 cursor: "default" 1141 }), "auto" == t.opt.maxval && (t.opt.maxval = e(t).outerWidth()), a.updateSliderVal(), t.opt.readonly || (a.on(e.simpleSlider.events.start, function(r) { 1142 e.browser.mobile && (r = r.changedTouches[0]), t.canSlide = !0, a.updateSliderVal(r), "h" === t.opt.orientation ? a.css({ 1143 cursor: "col-resize" 1144 }) : a.css({ 1145 cursor: "row-resize" 1146 }), t.lastVal = t.val, e.browser.mobile || (r.preventDefault(), r.stopPropagation()) 1147 }), e(document).on(e.simpleSlider.events.move, function(r) { 1148 e.browser.mobile && (r = r.changedTouches[0]), t.canSlide && (e(document).css({ 1149 cursor: "default" 1150 }), a.updateSliderVal(r), e.browser.mobile || (r.preventDefault(), r.stopPropagation())) 1151 }).on(e.simpleSlider.events.end, function() { 1152 e(document).css({ 1153 cursor: "auto" 1154 }), t.canSlide = !1, a.css({ 1155 cursor: "auto" 1156 }) 1157 })) 1158 }) 1159 }, 1160 updateSliderVal: function(r) { 1161 var t = this.get(0); 1162 if (t.opt) { 1163 t.opt.initialval = "number" == typeof t.opt.initialval ? t.opt.initialval : t.opt.initialval(t); 1164 var a = e(t).outerWidth(), 1165 o = e(t).outerHeight(); 1166 t.x = "object" == typeof r ? r.clientX + document.body.scrollLeft - this.offset().left : "number" == typeof r ? r * a / t.opt.maxval : t.opt.initialval * a / t.opt.maxval, t.y = "object" == typeof r ? r.clientY + document.body.scrollTop - this.offset().top : "number" == typeof r ? (t.opt.maxval - t.opt.initialval - r) * o / t.opt.maxval : t.opt.initialval * o / t.opt.maxval, t.y = this.outerHeight() - t.y, t.scaleX = t.x * t.opt.maxval / a, t.scaleY = t.y * t.opt.maxval / o, t.outOfRangeX = t.scaleX > t.opt.maxval ? t.scaleX - t.opt.maxval : 0 > t.scaleX ? t.scaleX : 0, t.outOfRangeY = t.scaleY > t.opt.maxval ? t.scaleY - t.opt.maxval : 0 > t.scaleY ? t.scaleY : 0, t.outOfRange = "h" === t.opt.orientation ? t.outOfRangeX : t.outOfRangeY, t.value = void 0 !== r ? "h" === t.opt.orientation ? t.x >= this.outerWidth() ? t.opt.maxval : 0 >= t.x ? 0 : t.scaleX : t.y >= this.outerHeight() ? t.opt.maxval : 0 >= t.y ? 0 : t.scaleY : "h" === t.opt.orientation ? t.scaleX : t.scaleY, "h" === t.opt.orientation ? t.level.width(Math.floor(100 * t.x / a) + "%") : t.level.height(Math.floor(100 * t.y / o)), t.lastVal === t.value && ("h" === t.opt.orientation && (t.x >= this.outerWidth() || 0 >= t.x) || "h" !== t.opt.orientation && (t.y >= this.outerHeight() || 0 >= t.y)) || ("function" == typeof t.opt.callback && t.opt.callback(t), t.lastVal = t.value) 1167 } 1168 } 1169 }, e.fn.simpleSlider = e.simpleSlider.init, e.fn.updateSliderVal = e.simpleSlider.updateSliderVal 1170 }(jQuery), 1171 function(e) { 1172 e.mbCookie = { 1173 set: function(e, r, t, a) { 1174 "object" == typeof r && (r = JSON.stringify(r)), a = a ? "; domain=" + a : ""; 1175 var o = new Date, 1176 n = ""; 1177 0 < t && (o.setTime(o.getTime() + 864e5 * t), n = "; expires=" + o.toGMTString()), document.cookie = e + "=" + r + n + "; path=/" + a 1178 }, 1179 get: function(e) { 1180 e += "="; 1181 for (var r = document.cookie.split(";"), t = 0; t < r.length; t++) { 1182 for (var a = r[t]; 1183 " " == a.charAt(0);) a = a.substring(1, a.length); 1184 if (0 == a.indexOf(e)) try { 1185 return JSON.parse(a.substring(e.length, a.length)) 1186 } catch (r) { 1187 return a.substring(e.length, a.length) 1188 } 1189 } 1190 return null 1191 }, 1192 remove: function(r) { 1193 e.mbCookie.set(r, "", -1) 1194 } 1195 }, e.mbStorage = { 1196 set: function(e, r) { 1197 "object" == typeof r && (r = JSON.stringify(r)), localStorage.setItem(e, r) 1198 }, 1199 get: function(e) { 1200 if (!localStorage[e]) return null; 1201 try { 1202 return JSON.parse(localStorage[e]) 1203 } catch (r) { 1204 return localStorage[e] 1205 } 1206 }, 1207 remove: function(e) { 1208 e ? localStorage.removeItem(e) : localStorage.clear() 1209 } 1210 } 1211 }(jQuery); 1212var nAgt = navigator.userAgent; 1213 1214function isTouchSupported() { 1215 var e = nAgt.msMaxTouchPoints, 1216 r = "ontouchstart" in document.createElement("div"); 1217 return !(!e && !r) 1218} 1219jQuery.mbBrowser = {}, jQuery.mbBrowser.mozilla = !1, jQuery.mbBrowser.webkit = !1, jQuery.mbBrowser.opera = !1, jQuery.mbBrowser.safari = !1, jQuery.mbBrowser.chrome = !1, jQuery.mbBrowser.androidStock = !1, jQuery.mbBrowser.msie = !1, jQuery.mbBrowser.edge = !1, jQuery.mbBrowser.ua = nAgt; 1220var getOS = function() { 1221 var e = { 1222 version: "Unknown version", 1223 name: "Unknown OS" 1224 }; 1225 return -1 != navigator.appVersion.indexOf("Win") && (e.name = "Windows"), -1 != navigator.appVersion.indexOf("Mac") && 0 > navigator.appVersion.indexOf("Mobile") && (e.name = "Mac"), -1 != navigator.appVersion.indexOf("Linux") && (e.name = "Linux"), /Mac OS X/.test(nAgt) && !/Mobile/.test(nAgt) && (e.version = /Mac OS X ([\._\d]+)/.exec(nAgt)[1], e.version = e.version.replace(/_/g, ".").substring(0, 5)), /Windows/.test(nAgt) && (e.version = "Unknown.Unknown"), /Windows NT 5.1/.test(nAgt) && (e.version = "5.1"), /Windows NT 6.0/.test(nAgt) && (e.version = "6.0"), /Windows NT 6.1/.test(nAgt) && (e.version = "6.1"), /Windows NT 6.2/.test(nAgt) && (e.version = "6.2"), /Windows NT 10.0/.test(nAgt) && (e.version = "10.0"), /Linux/.test(nAgt) && /Linux/.test(nAgt) && (e.version = "Unknown.Unknown"), e.name = e.name.toLowerCase(), e.major_version = "Unknown", e.minor_version = "Unknown", "Unknown.Unknown" != e.version && (e.major_version = parseFloat(e.version.split(".")[0]), e.minor_version = parseFloat(e.version.split(".")[1])), e 1226 }, 1227 nameOffset, verOffset, ix; 1228if (jQuery.mbBrowser.os = getOS(), jQuery.mbBrowser.hasTouch = isTouchSupported(), jQuery.mbBrowser.name = navigator.appName, jQuery.mbBrowser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.mbBrowser.majorVersion = parseInt(navigator.appVersion, 10), -1 != (verOffset = nAgt.indexOf("Opera"))) jQuery.mbBrowser.opera = !0, jQuery.mbBrowser.name = "Opera", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 6), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 8)); 1229else if (-1 != (verOffset = nAgt.indexOf("OPR"))) jQuery.mbBrowser.opera = !0, jQuery.mbBrowser.name = "Opera", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 4); 1230else if (-1 != (verOffset = nAgt.indexOf("MSIE"))) jQuery.mbBrowser.msie = !0, jQuery.mbBrowser.name = "Microsoft Internet Explorer", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 5); 1231else if (-1 != nAgt.indexOf("Trident")) { 1232 jQuery.mbBrowser.msie = !0, jQuery.mbBrowser.name = "Microsoft Internet Explorer"; 1233 var start = nAgt.indexOf("rv:") + 3, 1234 end = start + 4; 1235 jQuery.mbBrowser.fullVersion = nAgt.substring(start, end) 1236} else -1 != (verOffset = nAgt.indexOf("Edge")) ? (jQuery.mbBrowser.edge = !0, jQuery.mbBrowser.name = "Microsoft Edge", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 5)) : -1 != (verOffset = nAgt.indexOf("Chrome")) ? (jQuery.mbBrowser.webkit = !0, jQuery.mbBrowser.chrome = !0, jQuery.mbBrowser.name = "Chrome", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 7)) : -1 < nAgt.indexOf("mozilla/5.0") && -1 < nAgt.indexOf("android ") && -1 < nAgt.indexOf("applewebkit") && !(-1 < nAgt.indexOf("chrome")) ? (verOffset = nAgt.indexOf("Chrome"), jQuery.mbBrowser.webkit = !0, jQuery.mbBrowser.androidStock = !0, jQuery.mbBrowser.name = "androidStock", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 7)) : -1 != (verOffset = nAgt.indexOf("Safari")) ? (jQuery.mbBrowser.webkit = !0, jQuery.mbBrowser.safari = !0, jQuery.mbBrowser.name = "Safari", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 7), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 8))) : -1 != (verOffset = nAgt.indexOf("AppleWebkit")) ? (jQuery.mbBrowser.webkit = !0, jQuery.mbBrowser.safari = !0, jQuery.mbBrowser.name = "Safari", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 7), -1 != (verOffset = nAgt.indexOf("Version")) && (jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 8))) : -1 != (verOffset = nAgt.indexOf("Firefox")) ? (jQuery.mbBrowser.mozilla = !0, jQuery.mbBrowser.name = "Firefox", jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 8)) : (nameOffset = nAgt.lastIndexOf(" ") + 1) < (verOffset = nAgt.lastIndexOf("/")) && (jQuery.mbBrowser.name = nAgt.substring(nameOffset, verOffset), jQuery.mbBrowser.fullVersion = nAgt.substring(verOffset + 1), jQuery.mbBrowser.name.toLowerCase() == jQuery.mbBrowser.name.toUpperCase() && (jQuery.mbBrowser.name = navigator.appName)); - 1 != (ix = jQuery.mbBrowser.fullVersion.indexOf(";")) && (jQuery.mbBrowser.fullVersion = jQuery.mbBrowser.fullVersion.substring(0, ix)), -1 != (ix = jQuery.mbBrowser.fullVersion.indexOf(" ")) && (jQuery.mbBrowser.fullVersion = jQuery.mbBrowser.fullVersion.substring(0, ix)), jQuery.mbBrowser.majorVersion = parseInt("" + jQuery.mbBrowser.fullVersion, 10), isNaN(jQuery.mbBrowser.majorVersion) && (jQuery.mbBrowser.fullVersion = "" + parseFloat(navigator.appVersion), jQuery.mbBrowser.majorVersion = parseInt(navigator.appVersion, 10)), jQuery.mbBrowser.version = jQuery.mbBrowser.majorVersion, jQuery.mbBrowser.android = /Android/i.test(nAgt), jQuery.mbBrowser.blackberry = /BlackBerry|BB|PlayBook/i.test(nAgt), jQuery.mbBrowser.ios = /iPhone|iPad|iPod|webOS/i.test(nAgt), jQuery.mbBrowser.operaMobile = /Opera Mini/i.test(nAgt), jQuery.mbBrowser.windowsMobile = /IEMobile|Windows Phone/i.test(nAgt), jQuery.mbBrowser.kindle = /Kindle|Silk/i.test(nAgt), jQuery.mbBrowser.mobile = jQuery.mbBrowser.android || jQuery.mbBrowser.blackberry || jQuery.mbBrowser.ios || jQuery.mbBrowser.windowsMobile || jQuery.mbBrowser.operaMobile || jQuery.mbBrowser.kindle, jQuery.isMobile = jQuery.mbBrowser.mobile, jQuery.isTablet = jQuery.mbBrowser.mobile && 765 < jQuery(window).width(), jQuery.isAndroidDefault = jQuery.mbBrowser.android && !/chrome/i.test(nAgt), jQuery.mbBrowser = jQuery.mbBrowser, jQuery.mbBrowser.versionCompare = function(e, r) { 1237 if ("stringstring" != typeof e + typeof r) return !1; 1238 for (var t = e.split("."), a = r.split("."), o = 0, n = Math.max(t.length, a.length); o < n; o++) { 1239 if (t[o] && !a[o] && 0 < parseInt(t[o]) || parseInt(t[o]) > parseInt(a[o])) return 1; 1240 if (a[o] && !t[o] && 0 < parseInt(a[o]) || parseInt(t[o]) < parseInt(a[o])) return -1 1241 } 1242 return 0 1243};
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.