jPlayer events that have occurred over the past 1 second:'
- + ' (Backgrounds: Never occurredOccurred beforeOccurredMultiple occurrencesreset)
';
-
- // MJP: Would use the next 3 lines for ease, but the events are just slapped on the page.
- // $.each($.jPlayer.event, function(eventName,eventType) {
- // structure += '
' + eventName + '
';
- // });
-
- var eventStyle = "float:left;margin:0 5px 5px 0;padding:0 5px;border:1px dotted #000;";
- // MJP: Doing it longhand so order and layout easier to control.
- structure +=
- ''
- + ''
- + ''
- + ''
- + ''
- + ''
- + ''
-
- + ''
- + ''
- + ''
- + ''
- + ''
-
- + ''
- + ''
- + ''
- + ''
- + ''
- + ''
- + ''
-
- + ''
- + ''
- + ''
- + ''
-
- + ''
- + ''
- + ''
- + ''
- + ''
- + ''
-
- + '';
-
- // MJP: Would like a check here in case we missed an event.
-
- // MJP: Check fails, since it is not on the page yet.
-/* $.each($.jPlayer.event, function(eventName,eventType) {
- if($("#" + config.eventId[eventType])[0] === undefined) {
- structure += '
";
- $(this).data("jPlayerInspector").configJq.html(jPlayerInfo);
- return this;
- },
- updateStatus: function() { // This displays information about jPlayer's status in the inspector
- $(this).data("jPlayerInspector").statusJq.html(
- "
"
- );
- return this;
- }
- };
- $.fn.jPlayerInspector = function( method ) {
- // Method calling logic
- if ( methods[method] ) {
- return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
- } else if ( typeof method === 'object' || ! method ) {
- return methods.init.apply( this, arguments );
- } else {
- $.error( 'Method ' + method + ' does not exist on jQuery.jPlayerInspector' );
- }
- };
-})(jQuery);
diff --git a/10.大屏音乐/js/jPlayer/demo.js b/10.大屏音乐/js/jPlayer/demo.js
deleted file mode 100644
index 41b30b1..0000000
--- a/10.大屏音乐/js/jPlayer/demo.js
+++ /dev/null
@@ -1,125 +0,0 @@
-$(document).ready(function () {
- var myPlaylist = new jPlayerPlaylist({
- jPlayer: "#jplayer_N",
- cssSelectorAncestor: "#jp_container_N"
- }, [
- { title: "樱子小姐的脚下埋着尸体", artist: "大竹佑季", mp3: "http://music.163.com/song/media/outer/url?id=36271375.mp3", poster: "http://p1.music.126.net/Q4Dg5QXwft213TBKMv26_A==/3276544653004159.jpg?param=130y130" },
- { title: "非科学的表裏一体", artist: "豚乙女", mp3: "http://music.163.com/song/media/outer/url?id=30870899.mp3", poster: "http://p1.music.126.net/84dpde0vkfsDAVsNNjulXg==/7906588115750467.jpg?param=130y130" },
- { title: "You're the Shine", artist: ":FELT", mp3: "http://music.163.com/song/media/outer/url?id=26260757.mp3", poster: "http://p1.music.126.net/b04i7LFbHLJkmkzwhwRLMA==/2343059278838229.jpg?param=130y130" },
- { title: "旅の途中", artist: "清浦夏実", mp3: "http://music.163.com/song/media/outer/url?id=26220167.mp3", poster: "http://p1.music.126.net/4BgAnUbCDFex3m4z-hWULA==/2509085534622060.jpg?param=130y130" },
- { title: "夏祭り", artist: "東山奈央", mp3: "http://music.163.com/song/media/outer/url?id=488388729.mp3", poster: "http://p1.music.126.net/3eyBH8RjxjXG-EqWShU1wg==/18887410742154555.jpg?param=130y130" },
- { title: "Sway", artist: "Nevve", mp3: "http://music.163.com/song/media/outer/url?id=475073464.mp3", poster: "http://p1.music.126.net/KmPcFcxxg61d15R8yu5x_A==/18681802069425034.jpg?param=130y130" },
- { title: "Vanish", artist: " Breathe Carolina", mp3: "http://music.163.com/song/media/outer/url?id=427542077.mp3", poster: "http://p1.music.126.net/xaX_RkkW0cT4f38k62N8yg==/3413983630702236.jpg?param=130y130" },
- { title: "It's Over", artist: "MEIDEN", mp3: "http://music.163.com/song/media/outer/url?id=477933011.mp3", poster: "http://p1.music.126.net/foJM2P9nq8pXHnCZjcf75w==/19047939439716625.jpg?param=130y130" }
- ],
- {
- playlistOptions: {
- enableRemoveControls: true,
- autoPlay: false
- },
- swfPath: "js/jPlayer",
- supplied: "webmv, ogv, m4v, oga, mp3",
- useStateClassSkin: true,
- autoBlur: false,
- smoothPlayBar: true,
- keyEnabled: true,
- audioFullScreen: false
- });
- var latest = [
- { title: "The wheel of fortune", artist: "Yang Bingyin", mp3: "http://music.163.com/song/media/outer/url?id=476515941.mp3", poster: "http://p1.music.126.net/4xHOkSVWH-n6p5pB3Jf0yQ==/109951162922204274.jpg?param=130y130" },
- { title: "you are my king", artist: "梶浦由記", mp3: "http://music.163.com/song/media/outer/url?id=22731459.mp3", poster: "http://p1.music.126.net/Xy8iaLLLVT21Mr9wDDJBNQ==/792747883650465.jpg?param=130y130" },
- { title: "初恋的小美好", artist: "Sunny是个小太阳", mp3: "http://music.163.com/song/media/outer/url?id=529823229.mp3", poster: "http://p1.music.126.net/7DvTdaOADAw7KiKVkcMcag==/109951163105691071.jpg?param=130y130" },
- { title: "Lilac", artist: "MANYO", mp3: "http://music.163.com/song/media/outer/url?id=28466087.mp3", poster: "http://p1.music.126.net/scAe3f-GkQvo2h91Gpb0Bg==/1729531800492601.jpg?param=130y130" },
- { title: "一人静", artist: "姫神", mp3: "http://music.163.com/song/media/outer/url?id=25917069.mp3", poster: "http://p1.music.126.net/FnElEjsh00iuHWtHXrcY9g==/5638295627307829.jpg?param=130y130" },
- { title: "Through My Blood", artist: "Aimer", mp3: "http://music.163.com/song/media/outer/url?id=409872505.mp3", poster: "http://p1.music.126.net/45Qck88DR58FGgdHdDqfBw==/18181524277717113.jpg?param=130y130" },
- { title: "Too Late To Say", artist: "Sayulee", mp3: "http://music.163.com/song/media/outer/url?id=486194219.mp3", poster: "http://p1.music.126.net/Oa_1_y0a8NCmxB1zYKAFpw==/19187577416516096.jpg?param=130y130" },
- { title: "琥珀色の海へ", artist: "40㍍P", mp3: "http://music.163.com/song/media/outer/url?id=836411.mp3", poster: "http://p1.music.126.net/80iknoJfJHHLUSjz_EiSDw==/18736777650906624.jpg?param=130y130" },
- { title: "からくりピエロ (instrumental)", artist: "MUSIRISCA", mp3: "http://music.163.com/song/media/outer/url?id=33004714.mp3", poster: "http://p1.music.126.net/9kAx7AtyLbLop_XhJy3y5w==/3415083117091737.jpg?param=130y130" },
- { title: "M04", artist: "梶浦由記", mp3: "http://music.163.com/song/media/outer/url?id=591901.mp3", poster: "http://p1.music.126.net/Rm8d72Gom9BZcDOmPBPPkA==/2923601420858492.jpg?param=130y130" },
- { title: "M35", artist: "梶浦由記", mp3: "http://music.163.com/song/media/outer/url?id=28267707.mp3", poster: "http://p1.music.126.net/a-fgC2MhmKzNNOrmrQ_CMA==/5972547162126209.jpg?param=130y130" },
- { title: "哈尔的移动城堡", artist: "久石譲", mp3: "http://music.163.com/song/media/outer/url?id=481390254.mp3", poster: "http://p1.music.126.net/BmJ2bUsQwinDU2KiDsKkEQ==/5998935441331080.jpg?param=130y130" },
- { title: "流れ星 ", artist: "久石譲", mp3: "http://music.163.com/song/media/outer/url?id=26902975.mp3", poster: "http://p1.music.126.net/cJrHNkktHNG62uKdYvGahg==/4453022092508799.jpg?param=130y130" },
- { title: "Memories", artist: "Within Temptation", mp3: "http://music.163.com/song/media/outer/url?id=407002778.mp3", poster: "http://p1.music.126.net/cqNHhKOTcfkwIM8_YIaT1w==/3275445150564990.jpg?param=130y130" },
- { title: "それがあなたの幸せとしても", artist: "rairu", mp3: "http://music.163.com/song/media/outer/url?id=41654821.mp3", poster: "http://p1.music.126.net/SpovasHBud2A1qXXADXsBg==/109951163167455610.jpg?param=130y130" },
- { title: "Angel", artist: "阿桑", mp3: "http://music.163.com/song/media/outer/url?id=205276.mp3", poster: "http://p1.music.126.net/8cSVJulJa2tiLydRxyXuTg==/109951162938339077.jpg?param=130y130" },
- { title: "兰若词", artist: "刘亦菲", mp3: "http://music.163.com/song/media/outer/url?id=255739.mp3", poster: "http://p1.music.126.net/L4Sah2hA5QYBPUnpjjUQ0Q==/26388279081790.jpg?param=130y130" },
- { title: "Pieces Of My Words-言の花-", artist: "刘亦菲", mp3: "http://music.163.com/song/media/outer/url?id=255805.mp3", poster: "http://p1.music.126.net/L4Sah2hA5QYBPUnpjjUQ0Q==/26388279081790.jpg?param=130y130" }
- ];
-
- var spirit = [
- { title: "M19+20", artist: "梶浦由記", mp3: "http://music.163.com/song/media/outer/url?id=591753.mp3 ", poster: "http://p1.music.126.net/lW4YKD6cMgm32nI66CzWVg==/5702067301704441.jpg?param=130y130" },
- { title: "Sis puella magica!", artist: "梶浦由記", mp3: "http://music.163.com/song/media/outer/url?id=496902072.mp3", poster: "http://p1.music.126.net/tFTRt1H87rReNTyO1K9IDQ==/18498183627713149.jpg?param=130y130" },
- { title: "月は优しく (月)", artist: "梶浦由記", mp3: "http://music.163.com/song/media/outer/url?id=590623.mp3", poster: "http://p1.music.126.net/7xaV2qB-T1d9m8b1XZC6tQ==/725677674344222.jpg?param=130y130" },
- { title: "Euterpe エウテルペ ", artist: "染音若蔡", mp3: "http://music.163.com/song/media/outer/url?id=452654214.mp3", poster: "http://p1.music.126.net/Iqckrd2sOB1ztqrSOw4XzA==/109951162841140691.jpg?param=130y130" },
- { title: "幻光", artist: "杨秉音", mp3: "http://music.163.com/song/media/outer/url?id=526989692.mp3", poster: "http://p1.music.126.net/4xHOkSVWH-n6p5pB3Jf0yQ==/109951162922204274.jpg" },
- { title: "世界の約束", artist: "神罗Shinra", mp3: "http://music.163.com/song/media/outer/url?id=429460870.mp3", poster: "http://p1.music.126.net/rkJSVKRZkfLXOoVwXtiB4w==/18283778858733705.jpg?param=130y130" },
- { title: "Cave OF Mind", artist: "久石譲", mp3: "http://music.163.com/song/media/outer/url?id=28457572.mp3", poster: "http://p1.music.126.net/HdmtedPRZEEBduHcmUnk3w==/853221023209311.jpg?param=130y130" },
- { title: "幽灵公主", artist: "K. Williams", mp3: "http://music.163.com/song/media/outer/url?id=22812274.mp3", poster: "http://p1.music.126.net/GNKtRK8w7edPw3jAsavL2A==/5980243743832365.jpg?param=130y130" },
- { title: "心之逆鳞", artist: "魏小涵", mp3: "http://music.163.com/song/media/outer/url?id=591753.mp3", poster: "http://p1.music.126.net/k_WRxDY1qQ4ztB5uFFrvoA==/17907745881679448.jpg?param=130y130" },
- { title: "愛を教えてくれた君へ", artist: "Qaijff", mp3: "http://music.163.com/song/media/outer/url?id=521416051.mp3", poster: "http://p1.music.126.net/-c3qURPNRNLe-YJMbiZoKA==/109951163072509863.jpg?param=130y130" },
- { title: "群雄疾走", artist: "川井憲次", mp3: "http://music.163.com/song/media/outer/url?id=448153.mp3", poster: "http://p1.music.126.net/r4TK33y6f8cwlntVidXZbQ==/931286348726555.jpg?param=130y130" },
- { title: "Ghost of a smile", artist: "EGOIST", mp3: "http://music.163.com/song/media/outer/url?id=35955908.mp3", poster: "http://p1.music.126.net/ivONokvElv9ZCzyrZp84FQ==/3297435373557125.jpg?param=130y130" },
-
- ];
- $(document).on($.jPlayer.event.pause, myPlaylist.cssSelector.jPlayer, function () {//$(document).on('click','要选择的元素',function(){}) on方法包含很多事件,点击,双击等等事件。
- $('.musicbar').removeClass('animate'); //look this class and remove it
- $('.jp-play-me').removeClass('active');
- $('.jp-play-me').parent('li').removeClass('active');
- }); 28718070
-
- $(document).on($.jPlayer.event.play, myPlaylist.cssSelector.jPlayer, function () {
- $('.musicbar').addClass('animate');// when the player add a animate
- });
- $("#before,#after").addClass("set_imd");
-
- $(document).on('click', '.jp-play-me', function (e) {
- e && e.preventDefault();
- var $this = $(e.target);
- if (!$this.is('a')) $this = $this.closest('a');//closest() 方法获得匹配选择器的第一个祖先元素,从当前元素开始沿 DOM 树向上。
- $('.jp-play-me').not($this).removeClass('active');
- $('.jp-play-me').parent('li').not($this.parent('li')).removeClass('active');
-
- $this.toggleClass('active');
- $this.parent('li').toggleClass('active');
- if (!$this.hasClass('active')) {
- myPlaylist.pause();
- } else {
- var k = $(this).parent("li").index();
-
- $(".poster-img").attr("src", latest[k].poster);//此方法返回一个函数改变src $('a.cover1').html(' b ? "0" + b : b;
- a = this.options.timeFormat.padMin && 10 > a ? "0" + a : a;
- c = this.options.timeFormat.padSec && 10 > c ? "0" + c : c;
- b = "" + (this.options.timeFormat.showHour ? b + this.options.timeFormat.sepHour : "");
- b += this.options.timeFormat.showMin ? a + this.options.timeFormat.sepMin : "";
- return b += this.options.timeFormat.showSec ? c + this.options.timeFormat.sepSec : ""
- }
- };
- var n = new l;
- b.jPlayer.convertTime = function (a) {
- return n.time(a)
- };
- b.jPlayer.uaBrowser = function (a) {
- a = a.toLowerCase();
- var c = /(opera)(?:.*version)?[ \/]([\w.]+)/,
- b = /(msie) ([\w.]+)/,
- e = /(mozilla)(?:.*? rv:([\w.]+))?/;
- a = /(webkit)[ \/]([\w.]+)/.exec(a) || c.exec(a) || b.exec(a) || 0 > a.indexOf("compatible") && e.exec(a) || [];
- return {
- browser: a[1] || "",
- version: a[2] || "0"
- }
- };
- b.jPlayer.uaPlatform = function (a) {
- var c = a.toLowerCase(),
- b = /(android)/,
- e = /(mobile)/;
- a = /(ipad|iphone|ipod|android|blackberry|playbook|windows ce|webos)/.exec(c) || [];
- c = /(ipad|playbook)/.exec(c) || !e.exec(c) && b.exec(c) || [];
- a[1] && (a[1] = a[1].replace(/\s/g, "_"));
- return {
- platform: a[1] || "",
- tablet: c[1] || ""
- }
- };
- b.jPlayer.browser = {};
- b.jPlayer.platform = {};
- var k = b.jPlayer.uaBrowser(navigator.userAgent);
- k.browser && (b.jPlayer.browser[k.browser] = !0, b.jPlayer.browser.version = k.version);
- k = b.jPlayer.uaPlatform(navigator.userAgent);
- k.platform && (b.jPlayer.platform[k.platform] = !0, b.jPlayer.platform.mobile = !k.tablet, b.jPlayer.platform.tablet = !!k.tablet);
- b.jPlayer.getDocMode = function () {
- var a;
- b.jPlayer.browser.msie && (document.documentMode ?
- a = document.documentMode : (a = 5, document.compatMode && "CSS1Compat" === document.compatMode && (a = 7)));
- return a
- };
- b.jPlayer.browser.documentMode = b.jPlayer.getDocMode();
- b.jPlayer.nativeFeatures = {
- init: function () {
- var a = document,
- c = a.createElement("video"),
- b = {
- w3c: "fullscreenEnabled fullscreenElement requestFullscreen exitFullscreen fullscreenchange fullscreenerror".split(" "),
- moz: "mozFullScreenEnabled mozFullScreenElement mozRequestFullScreen mozCancelFullScreen mozfullscreenchange mozfullscreenerror".split(" "),
- webkit: " webkitCurrentFullScreenElement webkitRequestFullScreen webkitCancelFullScreen webkitfullscreenchange ".split(" "),
- webkitVideo: "webkitSupportsFullscreen webkitDisplayingFullscreen webkitEnterFullscreen webkitExitFullscreen ".split(" ")
- },
- e = ["w3c", "moz", "webkit", "webkitVideo"],
- g, h;
- this.fullscreen = c = {
- support: {
- w3c: !!a[b.w3c[0]],
- moz: !!a[b.moz[0]],
- webkit: "function" === typeof a[b.webkit[3]],
- webkitVideo: "function" === typeof c[b.webkitVideo[2]]
- },
- used: {}
- };
- g = 0;
- for (h = e.length; g < h; g++) {
- var f = e[g];
- if (c.support[f]) {
- c.spec =
- f;
- c.used[f] = !0;
- break
- }
- }
- if (c.spec) {
- var m = b[c.spec];
- c.api = {
- fullscreenEnabled: !0,
- fullscreenElement: function (c) {
- c = c ? c : a;
- return c[m[1]]
- },
- requestFullscreen: function (a) {
- return a[m[2]]()
- },
- exitFullscreen: function (c) {
- c = c ? c : a;
- return c[m[3]]()
- }
- };
- c.event = {
- fullscreenchange: m[4],
- fullscreenerror: m[5]
- }
- } else c.api = {
- fullscreenEnabled: !1,
- fullscreenElement: function () {
- return null
- },
- requestFullscreen: function () {},
- exitFullscreen: function () {}
- }, c.event = {}
- }
- };
- b.jPlayer.nativeFeatures.init();
- b.jPlayer.focus = null;
- b.jPlayer.keyIgnoreElementNames =
- "INPUT TEXTAREA";
- var p = function (a) {
- var c = b.jPlayer.focus,
- d;
- c && (b.each(b.jPlayer.keyIgnoreElementNames.split(/\s+/g), function (c, b) {
- if (a.target.nodeName.toUpperCase() === b.toUpperCase()) return d = !0, !1
- }), d || b.each(c.options.keyBindings, function (d, g) {
- if (g && a.which === g.key && b.isFunction(g.fn)) return a.preventDefault(), g.fn(c), !1
- }))
- };
- b.jPlayer.keys = function (a) {
- b(document.documentElement).unbind("keydown.jPlayer");
- a && b(document.documentElement).bind("keydown.jPlayer", p)
- };
- b.jPlayer.keys(!0);
- b.jPlayer.prototype = {
- count: 0,
- version: {
- script: "2.6.0",
- needFlash: "2.6.0",
- flash: "unknown"
- },
- options: {
- swfPath: "js",
- solution: "html, flash",
- supplied: "mp3",
- preload: "metadata",
- volume: 0.8,
- muted: !1,
- remainingDuration: !1,
- toggleDuration: !1,
- playbackRate: 1,
- defaultPlaybackRate: 1,
- minPlaybackRate: 0.5,
- maxPlaybackRate: 4,
- wmode: "opaque",
- backgroundColor: "#000000",
- cssSelectorAncestor: "#jp_container_1",
- cssSelector: {
- videoPlay: ".jp-video-play",
- play: ".jp-play",
- pause: ".jp-pause",
- stop: ".jp-stop",
- seekBar: ".jp-seek-bar",
- playBar: ".jp-play-bar",
- mute: ".jp-mute",
- unmute: ".jp-unmute",
- volumeBar: ".jp-volume-bar",
- volumeBarValue: ".jp-volume-bar-value",
- volumeMax: ".jp-volume-max",
- playbackRateBar: ".jp-playback-rate-bar",
- playbackRateBarValue: ".jp-playback-rate-bar-value",
- currentTime: ".jp-current-time",
- duration: ".jp-duration",
- title: ".jp-title",
- fullScreen: ".jp-full-screen",
- restoreScreen: ".jp-restore-screen",
- repeat: ".jp-repeat",
- repeatOff: ".jp-repeat-off",
- gui: ".jp-gui",
- noSolution: ".jp-no-solution"
- },
- smoothPlayBar: !1,
- fullScreen: !1,
- fullWindow: !1,
- autohide: {
- restored: !1,
- full: !0,
- fadeIn: 200,
- fadeOut: 600,
- hold: 1E3
- },
- loop: !1,
- repeat: function (a) {
- a.jPlayer.options.loop ? b(this).unbind(".jPlayerRepeat").bind(b.jPlayer.event.ended + ".jPlayer.jPlayerRepeat", function () {
- b(this).jPlayer("play")
- }) : b(this).unbind(".jPlayerRepeat")
- },
- nativeVideoControls: {},
- noFullWindow: {
- msie: /msie [0-6]\./,
- ipad: /ipad.*?os [0-4]\./,
- iphone: /iphone/,
- ipod: /ipod/,
- android_pad: /android [0-3]\.(?!.*?mobile)/,
- android_phone: /android.*?mobile/,
- blackberry: /blackberry/,
- windows_ce: /windows ce/,
- iemobile: /iemobile/,
- webos: /webos/
- },
- noVolume: {
- ipad: /ipad/,
- iphone: /iphone/,
- ipod: /ipod/,
- android_pad: /android(?!.*?mobile)/,
- android_phone: /android.*?mobile/,
- blackberry: /blackberry/,
- windows_ce: /windows ce/,
- iemobile: /iemobile/,
- webos: /webos/,
- playbook: /playbook/
- },
- timeFormat: {},
- keyEnabled: !1,
- audioFullScreen: !1,
- keyBindings: {
- play: {
- key: 32,
- fn: function (a) {
- a.status.paused ? a.play() : a.pause()
- }
- },
- fullScreen: {
- key: 13,
- fn: function (a) {
- (a.status.video || a.options.audioFullScreen) && a._setOption("fullScreen", !a.options.fullScreen)
- }
- },
- muted: {
- key: 8,
- fn: function (a) {
- a._muted(!a.options.muted)
- }
- },
- volumeUp: {
- key: 38,
- fn: function (a) {
- a.volume(a.options.volume + 0.1)
- }
- },
- volumeDown: {
- key: 40,
- fn: function (a) {
- a.volume(a.options.volume - 0.1)
- }
- }
- },
- verticalVolume: !1,
- verticalPlaybackRate: !1,
- globalVolume: !1,
- idPrefix: "jp",
- noConflict: "jQuery",
- emulateHtml: !1,
- consoleAlerts: !0,
- errorAlerts: !1,
- warningAlerts: !1
- },
- optionsAudio: {
- size: {
- width: "0px",
- height: "0px",
- cssClass: ""
- },
- sizeFull: {
- width: "0px",
- height: "0px",
- cssClass: ""
- }
- },
- optionsVideo: {
- size: {
- width: "480px",
- height: "270px",
- cssClass: "jp-video-270p"
- },
- sizeFull: {
- width: "100%",
- height: "100%",
- cssClass: "jp-video-full"
- }
- },
- instances: {},
- status: {
- src: "",
- media: {},
- paused: !0,
- format: {},
- formatType: "",
- waitForPlay: !0,
- waitForLoad: !0,
- srcSet: !1,
- video: !1,
- seekPercent: 0,
- currentPercentRelative: 0,
- currentPercentAbsolute: 0,
- currentTime: 0,
- duration: 0,
- remaining: 0,
- videoWidth: 0,
- videoHeight: 0,
- readyState: 0,
- networkState: 0,
- playbackRate: 1,
- ended: 0
- },
- internal: {
- ready: !1
- },
- solution: {
- html: !0,
- flash: !0
- },
- format: {
- mp3: {
- codec: 'audio/mpeg; codecs="mp3"',
- flashCanPlay: !0,
- media: "audio"
- },
- m4a: {
- codec: 'audio/mp4; codecs="mp4a.40.2"',
- flashCanPlay: !0,
- media: "audio"
- },
- m3u8a: {
- codec: 'application/vnd.apple.mpegurl; codecs="mp4a.40.2"',
- flashCanPlay: !1,
- media: "audio"
- },
- m3ua: {
- codec: "audio/mpegurl",
- flashCanPlay: !1,
- media: "audio"
- },
- oga: {
- codec: 'audio/ogg; codecs="vorbis, opus"',
- flashCanPlay: !1,
- media: "audio"
- },
- flac: {
- codec: "audio/x-flac",
- flashCanPlay: !1,
- media: "audio"
- },
- wav: {
- codec: 'audio/wav; codecs="1"',
- flashCanPlay: !1,
- media: "audio"
- },
- webma: {
- codec: 'audio/webm; codecs="vorbis"',
- flashCanPlay: !1,
- media: "audio"
- },
- fla: {
- codec: "audio/x-flv",
- flashCanPlay: !0,
- media: "audio"
- },
- rtmpa: {
- codec: 'audio/rtmp; codecs="rtmp"',
- flashCanPlay: !0,
- media: "audio"
- },
- m4v: {
- codec: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
- flashCanPlay: !0,
- media: "video"
- },
- m3u8v: {
- codec: 'application/vnd.apple.mpegurl; codecs="avc1.42E01E, mp4a.40.2"',
- flashCanPlay: !1,
- media: "video"
- },
- m3uv: {
- codec: "audio/mpegurl",
- flashCanPlay: !1,
- media: "video"
- },
- ogv: {
- codec: 'video/ogg; codecs="theora, vorbis"',
- flashCanPlay: !1,
- media: "video"
- },
- webmv: {
- codec: 'video/webm; codecs="vorbis, vp8"',
- flashCanPlay: !1,
- media: "video"
- },
- flv: {
- codec: "video/x-flv",
- flashCanPlay: !0,
- media: "video"
- },
- rtmpv: {
- codec: 'video/rtmp; codecs="rtmp"',
- flashCanPlay: !0,
- media: "video"
- }
- },
- _init: function () {
- var a = this;
- this.element.empty();
- this.status = b.extend({}, this.status);
- this.internal = b.extend({}, this.internal);
- this.options.timeFormat = b.extend({}, b.jPlayer.timeFormat, this.options.timeFormat);
- this.internal.cmdsIgnored = b.jPlayer.platform.ipad || b.jPlayer.platform.iphone || b.jPlayer.platform.ipod;
- this.internal.domNode = this.element.get(0);
- this.options.keyEnabled && !b.jPlayer.focus && (b.jPlayer.focus =
- this);
- this.androidFix = {
- setMedia: !1,
- play: !1,
- pause: !1,
- time: NaN
- };
- b.jPlayer.platform.android && (this.options.preload = "auto" !== this.options.preload ? "metadata" : "auto");
- this.formats = [];
- this.solutions = [];
- this.require = {};
- this.htmlElement = {};
- this.html = {};
- this.html.audio = {};
- this.html.video = {};
- this.flash = {};
- this.css = {};
- this.css.cs = {};
- this.css.jq = {};
- this.ancestorJq = [];
- this.options.volume = this._limitValue(this.options.volume, 0, 1);
- b.each(this.options.supplied.toLowerCase().split(","), function (c, d) {
- var e = d.replace(/^\s+|\s+$/g,
- "");
- if (a.format[e]) {
- var f = !1;
- b.each(a.formats, function (a, c) {
- if (e === c) return f = !0, !1
- });
- f || a.formats.push(e)
- }
- });
- b.each(this.options.solution.toLowerCase().split(","), function (c, d) {
- var e = d.replace(/^\s+|\s+$/g, "");
- if (a.solution[e]) {
- var f = !1;
- b.each(a.solutions, function (a, c) {
- if (e === c) return f = !0, !1
- });
- f || a.solutions.push(e)
- }
- });
- this.internal.instance = "jp_" + this.count;
- this.instances[this.internal.instance] = this.element;
- this.element.attr("id") || this.element.attr("id", this.options.idPrefix + "_jplayer_" + this.count);
- this.internal.self = b.extend({}, {
- id: this.element.attr("id"),
- jq: this.element
- });
- this.internal.audio = b.extend({}, {
- id: this.options.idPrefix + "_audio_" + this.count,
- jq: f
- });
- this.internal.video = b.extend({}, {
- id: this.options.idPrefix + "_video_" + this.count,
- jq: f
- });
- this.internal.flash = b.extend({}, {
- id: this.options.idPrefix + "_flash_" + this.count,
- jq: f,
- swf: this.options.swfPath + (".swf" !== this.options.swfPath.toLowerCase().slice(-4) ? (this.options.swfPath && "/" !== this.options.swfPath.slice(-1) ? "/" : "") + "Jplayer.swf" : "")
- });
- this.internal.poster = b.extend({}, {
- id: this.options.idPrefix + "_poster_" + this.count,
- jq: f
- });
- b.each(b.jPlayer.event, function (c, b) {
- a.options[c] !== f && (a.element.bind(b + ".jPlayer", a.options[c]), a.options[c] = f)
- });
- this.require.audio = !1;
- this.require.video = !1;
- b.each(this.formats, function (c, b) {
- a.require[a.format[b].media] = !0
- });
- this.options = this.require.video ? b.extend(!0, {}, this.optionsVideo, this.options) : b.extend(!0, {}, this.optionsAudio, this.options);
- this._setSize();
- this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls);
- this.status.noFullWindow = this._uaBlocklist(this.options.noFullWindow);
- this.status.noVolume = this._uaBlocklist(this.options.noVolume);
- b.jPlayer.nativeFeatures.fullscreen.api.fullscreenEnabled && this._fullscreenAddEventListeners();
- this._restrictNativeVideoControls();
- this.htmlElement.poster = document.createElement("img");
- this.htmlElement.poster.id = this.internal.poster.id;
- this.htmlElement.poster.onload = function () {
- a.status.video && !a.status.waitForPlay || a.internal.poster.jq.show()
- };
- this.element.append(this.htmlElement.poster);
- this.internal.poster.jq = b("#" + this.internal.poster.id);
- this.internal.poster.jq.css({
- width: this.status.width,
- height: this.status.height
- });
- this.internal.poster.jq.hide();
- this.internal.poster.jq.bind("click.jPlayer", function () {
- a._trigger(b.jPlayer.event.click)
- });
- this.html.audio.available = !1;
- this.require.audio && (this.htmlElement.audio = document.createElement("audio"), this.htmlElement.audio.id = this.internal.audio.id, this.html.audio.available = !!this.htmlElement.audio.canPlayType && this._testCanPlayType(this.htmlElement.audio));
- this.html.video.available = !1;
- this.require.video && (this.htmlElement.video = document.createElement("video"), this.htmlElement.video.id = this.internal.video.id, this.html.video.available = !!this.htmlElement.video.canPlayType && this._testCanPlayType(this.htmlElement.video));
- this.flash.available = this._checkForFlash(10.1);
- this.html.canPlay = {};
- this.flash.canPlay = {};
- b.each(this.formats, function (c, b) {
- a.html.canPlay[b] = a.html[a.format[b].media].available && "" !== a.htmlElement[a.format[b].media].canPlayType(a.format[b].codec);
- a.flash.canPlay[b] = a.format[b].flashCanPlay && a.flash.available
- });
- this.html.desired = !1;
- this.flash.desired = !1;
- b.each(this.solutions, function (c, d) {
- if (0 === c) a[d].desired = !0;
- else {
- var e = !1,
- f = !1;
- b.each(a.formats, function (c, b) {
- a[a.solutions[0]].canPlay[b] && ("video" === a.format[b].media ? f = !0 : e = !0)
- });
- a[d].desired = a.require.audio && !e || a.require.video && !f
- }
- });
- this.html.support = {};
- this.flash.support = {};
- b.each(this.formats, function (c, b) {
- a.html.support[b] = a.html.canPlay[b] && a.html.desired;
- a.flash.support[b] = a.flash.canPlay[b] &&
- a.flash.desired
- });
- this.html.used = !1;
- this.flash.used = !1;
- b.each(this.solutions, function (c, d) {
- b.each(a.formats, function (c, b) {
- if (a[d].support[b]) return a[d].used = !0, !1
- })
- });
- this._resetActive();
- this._resetGate();
- this._cssSelectorAncestor(this.options.cssSelectorAncestor);
- this.html.used || this.flash.used ? this.css.jq.noSolution.length && this.css.jq.noSolution.hide() : (this._error({
- type: b.jPlayer.error.NO_SOLUTION,
- context: "{solution:'" + this.options.solution + "', supplied:'" + this.options.supplied + "'}",
- message: b.jPlayer.errorMsg.NO_SOLUTION,
- hint: b.jPlayer.errorHint.NO_SOLUTION
- }), this.css.jq.noSolution.length && this.css.jq.noSolution.show());
- if (this.flash.used) {
- var c, d = "jQuery=" + encodeURI(this.options.noConflict) + "&id=" + encodeURI(this.internal.self.id) + "&vol=" + this.options.volume + "&muted=" + this.options.muted;
- if (b.jPlayer.browser.msie && (9 > Number(b.jPlayer.browser.version) || 9 > b.jPlayer.browser.documentMode)) {
- d = ['', '', '',
- '', ''
- ];
- c = document.createElement('');
- for (var e = 0; e < d.length; e++) c.appendChild(document.createElement(d[e]))
- } else e = function (a, c, b) {
- var d = document.createElement("param");
- d.setAttribute("name", c);
- d.setAttribute("value", b);
- a.appendChild(d)
- }, c = document.createElement("object"),
- c.setAttribute("id", this.internal.flash.id), c.setAttribute("name", this.internal.flash.id), c.setAttribute("data", this.internal.flash.swf), c.setAttribute("type", "application/x-shockwave-flash"), c.setAttribute("width", "1"), c.setAttribute("height", "1"), c.setAttribute("tabindex", "-1"), e(c, "flashvars", d), e(c, "allowscriptaccess", "always"), e(c, "bgcolor", this.options.backgroundColor), e(c, "wmode", this.options.wmode);
- this.element.append(c);
- this.internal.flash.jq = b(c)
- }
- this.status.playbackRateEnabled = this.html.used &&
- !this.flash.used ? this._testPlaybackRate("audio") : !1;
- this._updatePlaybackRate();
- this.html.used && (this.html.audio.available && (this._addHtmlEventListeners(this.htmlElement.audio, this.html.audio), this.element.append(this.htmlElement.audio), this.internal.audio.jq = b("#" + this.internal.audio.id)), this.html.video.available && (this._addHtmlEventListeners(this.htmlElement.video, this.html.video), this.element.append(this.htmlElement.video), this.internal.video.jq = b("#" + this.internal.video.id), this.status.nativeVideoControls ?
- this.internal.video.jq.css({
- width: this.status.width,
- height: this.status.height
- }) : this.internal.video.jq.css({
- width: "0px",
- height: "0px"
- }), this.internal.video.jq.bind("click.jPlayer", function () {
- a._trigger(b.jPlayer.event.click)
- })));
- this.options.emulateHtml && this._emulateHtmlBridge();
- this.html.used && !this.flash.used && setTimeout(function () {
- a.internal.ready = !0;
- a.version.flash = "n/a";
- a._trigger(b.jPlayer.event.repeat);
- a._trigger(b.jPlayer.event.ready)
- }, 100);
- this._updateNativeVideoControls();
- this.css.jq.videoPlay.length &&
- this.css.jq.videoPlay.hide();
- b.jPlayer.prototype.count++
- },
- destroy: function () {
- this.clearMedia();
- this._removeUiClass();
- this.css.jq.currentTime.length && this.css.jq.currentTime.text("");
- this.css.jq.duration.length && this.css.jq.duration.text("");
- b.each(this.css.jq, function (a, c) {
- c.length && c.unbind(".jPlayer")
- });
- this.internal.poster.jq.unbind(".jPlayer");
- this.internal.video.jq && this.internal.video.jq.unbind(".jPlayer");
- this._fullscreenRemoveEventListeners();
- this === b.jPlayer.focus && (b.jPlayer.focus = null);
- this.options.emulateHtml && this._destroyHtmlBridge();
- this.element.removeData("jPlayer");
- this.element.unbind(".jPlayer");
- this.element.empty();
- delete this.instances[this.internal.instance]
- },
- enable: function () {},
- disable: function () {},
- _testCanPlayType: function (a) {
- try {
- return a.canPlayType(this.format.mp3.codec), !0
- } catch (c) {
- return !1
- }
- },
- _testPlaybackRate: function (a) {
- a = document.createElement("string" === typeof a ? a : "audio");
- try {
- return "playbackRate" in a ? (a.playbackRate = 0.5, 0.5 === a.playbackRate) : !1
- } catch (c) {
- return !1
- }
- },
- _uaBlocklist: function (a) {
- var c = navigator.userAgent.toLowerCase(),
- d = !1;
- b.each(a, function (a, b) {
- if (b && b.test(c)) return d = !0, !1
- });
- return d
- },
- _restrictNativeVideoControls: function () {
- this.require.audio && this.status.nativeVideoControls && (this.status.nativeVideoControls = !1, this.status.noFullWindow = !0)
- },
- _updateNativeVideoControls: function () {
- this.html.video.available && this.html.used && (this.htmlElement.video.controls = this.status.nativeVideoControls, this._updateAutohide(), this.status.nativeVideoControls && this.require.video ?
- (this.internal.poster.jq.hide(), this.internal.video.jq.css({
- width: this.status.width,
- height: this.status.height
- })) : this.status.waitForPlay && this.status.video && (this.internal.poster.jq.show(), this.internal.video.jq.css({
- width: "0px",
- height: "0px"
- })))
- },
- _addHtmlEventListeners: function (a, c) {
- var d = this;
- a.preload = this.options.preload;
- a.muted = this.options.muted;
- a.volume = this.options.volume;
- this.status.playbackRateEnabled && (a.defaultPlaybackRate = this.options.defaultPlaybackRate, a.playbackRate = this.options.playbackRate);
- a.addEventListener("progress", function () {
- c.gate && (d.internal.cmdsIgnored && 0 < this.readyState && (d.internal.cmdsIgnored = !1), d.androidFix.setMedia = !1, d.androidFix.play && (d.androidFix.play = !1, d.play(d.androidFix.time)), d.androidFix.pause && (d.androidFix.pause = !1, d.pause(d.androidFix.time)), d._getHtmlStatus(a), d._updateInterface(), d._trigger(b.jPlayer.event.progress))
- }, !1);
- a.addEventListener("timeupdate", function () {
- c.gate && (d._getHtmlStatus(a), d._updateInterface(), d._trigger(b.jPlayer.event.timeupdate))
- }, !1);
- a.addEventListener("durationchange", function () {
- c.gate && (d._getHtmlStatus(a), d._updateInterface(), d._trigger(b.jPlayer.event.durationchange))
- }, !1);
- a.addEventListener("play", function () {
- c.gate && (d._updateButtons(!0), d._html_checkWaitForPlay(), d._trigger(b.jPlayer.event.play))
- }, !1);
- a.addEventListener("playing", function () {
- c.gate && (d._updateButtons(!0), d._seeked(), d._trigger(b.jPlayer.event.playing))
- }, !1);
- a.addEventListener("pause", function () {
- c.gate && (d._updateButtons(!1), d._trigger(b.jPlayer.event.pause))
- }, !1);
- a.addEventListener("waiting", function () {
- c.gate && (d._seeking(), d._trigger(b.jPlayer.event.waiting))
- }, !1);
- a.addEventListener("seeking", function () {
- c.gate && (d._seeking(), d._trigger(b.jPlayer.event.seeking))
- }, !1);
- a.addEventListener("seeked", function () {
- c.gate && (d._seeked(), d._trigger(b.jPlayer.event.seeked))
- }, !1);
- a.addEventListener("volumechange", function () {
- c.gate && (d.options.volume = a.volume, d.options.muted = a.muted, d._updateMute(), d._updateVolume(), d._trigger(b.jPlayer.event.volumechange))
- }, !1);
- a.addEventListener("ratechange",
- function () {
- c.gate && (d.options.defaultPlaybackRate = a.defaultPlaybackRate, d.options.playbackRate = a.playbackRate, d._updatePlaybackRate(), d._trigger(b.jPlayer.event.ratechange))
- }, !1);
- a.addEventListener("suspend", function () {
- c.gate && (d._seeked(), d._trigger(b.jPlayer.event.suspend))
- }, !1);
- a.addEventListener("ended", function () {
- c.gate && (b.jPlayer.browser.webkit || (d.htmlElement.media.currentTime = 0), d.htmlElement.media.pause(), d._updateButtons(!1), d._getHtmlStatus(a, !0), d._updateInterface(), d._trigger(b.jPlayer.event.ended))
- }, !1);
- a.addEventListener("error", function () {
- c.gate && (d._updateButtons(!1), d._seeked(), d.status.srcSet && (clearTimeout(d.internal.htmlDlyCmdId), d.status.waitForLoad = !0, d.status.waitForPlay = !0, d.status.video && !d.status.nativeVideoControls && d.internal.video.jq.css({
- width: "0px",
- height: "0px"
- }), d._validString(d.status.media.poster) && !d.status.nativeVideoControls && d.internal.poster.jq.show(), d.css.jq.videoPlay.length && d.css.jq.videoPlay.show(), d._error({
- type: b.jPlayer.error.URL,
- context: d.status.src,
- message: b.jPlayer.errorMsg.URL,
- hint: b.jPlayer.errorHint.URL
- })))
- }, !1);
- b.each(b.jPlayer.htmlEvent, function (e, g) {
- a.addEventListener(this, function () {
- c.gate && d._trigger(b.jPlayer.event[g])
- }, !1)
- })
- },
- _getHtmlStatus: function (a, c) {
- var b = 0,
- e = 0,
- g = 0,
- f = 0;
- isFinite(a.duration) && (this.status.duration = a.duration);
- b = a.currentTime;
- e = 0 < this.status.duration ? 100 * b / this.status.duration : 0;
- "object" === typeof a.seekable && 0 < a.seekable.length ? (g = 0 < this.status.duration ? 100 * a.seekable.end(a.seekable.length - 1) / this.status.duration : 100, f = 0 < this.status.duration ?
- 100 * a.currentTime / a.seekable.end(a.seekable.length - 1) : 0) : (g = 100, f = e);
- c && (e = f = b = 0);
- this.status.seekPercent = g;
- this.status.currentPercentRelative = f;
- this.status.currentPercentAbsolute = e;
- this.status.currentTime = b;
- this.status.remaining = this.status.duration - this.status.currentTime;
- this.status.videoWidth = a.videoWidth;
- this.status.videoHeight = a.videoHeight;
- this.status.readyState = a.readyState;
- this.status.networkState = a.networkState;
- this.status.playbackRate = a.playbackRate;
- this.status.ended = a.ended
- },
- _resetStatus: function () {
- this.status =
- b.extend({}, this.status, b.jPlayer.prototype.status)
- },
- _trigger: function (a, c, d) {
- a = b.Event(a);
- a.jPlayer = {};
- a.jPlayer.version = b.extend({}, this.version);
- a.jPlayer.options = b.extend(!0, {}, this.options);
- a.jPlayer.status = b.extend(!0, {}, this.status);
- a.jPlayer.html = b.extend(!0, {}, this.html);
- a.jPlayer.flash = b.extend(!0, {}, this.flash);
- c && (a.jPlayer.error = b.extend({}, c));
- d && (a.jPlayer.warning = b.extend({}, d));
- this.element.trigger(a)
- },
- jPlayerFlashEvent: function (a, c) {
- if (a === b.jPlayer.event.ready)
- if (!this.internal.ready) this.internal.ready = !0, this.internal.flash.jq.css({
- width: "0px",
- height: "0px"
- }), this.version.flash = c.version, this.version.needFlash !== this.version.flash && this._error({
- type: b.jPlayer.error.VERSION,
- context: this.version.flash,
- message: b.jPlayer.errorMsg.VERSION + this.version.flash,
- hint: b.jPlayer.errorHint.VERSION
- }), this._trigger(b.jPlayer.event.repeat), this._trigger(a);
- else if (this.flash.gate) {
- if (this.status.srcSet) {
- var d = this.status.currentTime,
- e = this.status.paused;
- this.setMedia(this.status.media);
- this.volumeWorker(this.options.volume);
- 0 < d && (e ? this.pause(d) : this.play(d))
- }
- this._trigger(b.jPlayer.event.flashreset)
- }
- if (this.flash.gate) switch (a) {
- case b.jPlayer.event.progress:
- this._getFlashStatus(c);
- this._updateInterface();
- this._trigger(a);
- break;
- case b.jPlayer.event.timeupdate:
- this._getFlashStatus(c);
- this._updateInterface();
- this._trigger(a);
- break;
- case b.jPlayer.event.play:
- this._seeked();
- this._updateButtons(!0);
- this._trigger(a);
- break;
- case b.jPlayer.event.pause:
- this._updateButtons(!1);
- this._trigger(a);
- break;
- case b.jPlayer.event.ended:
- this._updateButtons(!1);
- this._trigger(a);
- break;
- case b.jPlayer.event.click:
- this._trigger(a);
- break;
- case b.jPlayer.event.error:
- this.status.waitForLoad = !0;
- this.status.waitForPlay = !0;
- this.status.video && this.internal.flash.jq.css({
- width: "0px",
- height: "0px"
- });
- this._validString(this.status.media.poster) && this.internal.poster.jq.show();
- this.css.jq.videoPlay.length && this.status.video && this.css.jq.videoPlay.show();
- this.status.video ? this._flash_setVideo(this.status.media) : this._flash_setAudio(this.status.media);
- this._updateButtons(!1);
- this._error({
- type: b.jPlayer.error.URL,
- context: c.src,
- message: b.jPlayer.errorMsg.URL,
- hint: b.jPlayer.errorHint.URL
- });
- break;
- case b.jPlayer.event.seeking:
- this._seeking();
- this._trigger(a);
- break;
- case b.jPlayer.event.seeked:
- this._seeked();
- this._trigger(a);
- break;
- case b.jPlayer.event.ready:
- break;
- default:
- this._trigger(a)
- }
- return !1
- },
- _getFlashStatus: function (a) {
- this.status.seekPercent = a.seekPercent;
- this.status.currentPercentRelative = a.currentPercentRelative;
- this.status.currentPercentAbsolute = a.currentPercentAbsolute;
- this.status.currentTime = a.currentTime;
- this.status.duration = a.duration;
- this.status.remaining = a.duration - a.currentTime;
- this.status.videoWidth = a.videoWidth;
- this.status.videoHeight = a.videoHeight;
- this.status.readyState = 4;
- this.status.networkState = 0;
- this.status.playbackRate = 1;
- this.status.ended = !1
- },
- _updateButtons: function (a) {
- a === f ? a = !this.status.paused : this.status.paused = !a;
- this.css.jq.play.length && this.css.jq.pause.length && (a ? (this.css.jq.play.hide(), this.css.jq.pause.show()) : (this.css.jq.play.show(), this.css.jq.pause.hide()));
- this.css.jq.restoreScreen.length && this.css.jq.fullScreen.length && (this.status.noFullWindow ? (this.css.jq.fullScreen.hide(), this.css.jq.restoreScreen.hide()) : this.options.fullWindow ? (this.css.jq.fullScreen.hide(), this.css.jq.restoreScreen.show()) : (this.css.jq.fullScreen.show(), this.css.jq.restoreScreen.hide()));
- this.css.jq.repeat.length && this.css.jq.repeatOff.length && (this.options.loop ? (this.css.jq.repeat.hide(), this.css.jq.repeatOff.show()) : (this.css.jq.repeat.show(), this.css.jq.repeatOff.hide()))
- },
- _updateInterface: function () {
- this.css.jq.seekBar.length && this.css.jq.seekBar.width(this.status.seekPercent + "%");
- this.css.jq.playBar.length && (this.options.smoothPlayBar ? this.css.jq.playBar.stop().animate({
- width: this.status.currentPercentAbsolute + "%"
- }, 250, "linear") : this.css.jq.playBar.width(this.status.currentPercentRelative + "%"));
- var a = "";
- this.css.jq.currentTime.length && (a = this._convertTime(this.status.currentTime), a !== this.css.jq.currentTime.text() && this.css.jq.currentTime.text(this._convertTime(this.status.currentTime)));
- var a = "",
- a = this.status.duration,
- c = this.status.remaining;
- this.css.jq.duration.length && ("string" === typeof this.status.media.duration ? a = this.status.media.duration : ("number" === typeof this.status.media.duration && (a = this.status.media.duration, c = a - this.status.currentTime), a = this.options.remainingDuration ? (0 < c ? "-" : "") + this._convertTime(c) : this._convertTime(a)), a !== this.css.jq.duration.text() && this.css.jq.duration.text(a))
- },
- _convertTime: l.prototype.time,
- _seeking: function () {
- this.css.jq.seekBar.length && this.css.jq.seekBar.addClass("jp-seeking-bg")
- },
- _seeked: function () {
- this.css.jq.seekBar.length && this.css.jq.seekBar.removeClass("jp-seeking-bg")
- },
- _resetGate: function () {
- this.html.audio.gate = !1;
- this.html.video.gate = !1;
- this.flash.gate = !1
- },
- _resetActive: function () {
- this.html.active = !1;
- this.flash.active = !1
- },
- _escapeHtml: function (a) {
- return a.split("&").join("&").split("<").join("<").split(">").join(">").split('"').join(""")
- },
- _qualifyURL: function (a) {
- var c = document.createElement("div");
- c.innerHTML = 'x';
- return c.firstChild.href
- },
- _absoluteMediaUrls: function (a) {
- var c = this;
- b.each(a, function (b, e) {
- e && c.format[b] && (a[b] = c._qualifyURL(e))
- });
- return a
- },
- setMedia: function (a) {
- var c = this,
- d = !1,
- e = this.status.media.poster !== a.poster;
- this._resetMedia();
- this._resetGate();
- this._resetActive();
- this.androidFix.setMedia = !1;
- this.androidFix.play = !1;
- this.androidFix.pause = !1;
- a = this._absoluteMediaUrls(a);
- b.each(this.formats, function (e, f) {
- var k = "video" === c.format[f].media;
- b.each(c.solutions, function (e, g) {
- if (c[g].support[f] && c._validString(a[f])) {
- var l =
- "html" === g;
- k ? (l ? (c.html.video.gate = !0, c._html_setVideo(a), c.html.active = !0) : (c.flash.gate = !0, c._flash_setVideo(a), c.flash.active = !0), c.css.jq.videoPlay.length && c.css.jq.videoPlay.show(), c.status.video = !0) : (l ? (c.html.audio.gate = !0, c._html_setAudio(a), c.html.active = !0, b.jPlayer.platform.android && (c.androidFix.setMedia = !0)) : (c.flash.gate = !0, c._flash_setAudio(a), c.flash.active = !0), c.css.jq.videoPlay.length && c.css.jq.videoPlay.hide(), c.status.video = !1);
- d = !0;
- return !1
- }
- });
- if (d) return !1
- });
- d ? (this.status.nativeVideoControls &&
- this.html.video.gate || !this._validString(a.poster) || (e ? this.htmlElement.poster.src = a.poster : this.internal.poster.jq.show()), this.css.jq.title.length && "string" === typeof a.title && (this.css.jq.title.html(a.title), this.htmlElement.audio && this.htmlElement.audio.setAttribute("title", a.title), this.htmlElement.video && this.htmlElement.video.setAttribute("title", a.title)), this.status.srcSet = !0, this.status.media = b.extend({}, a), this._updateButtons(!1), this._updateInterface(), this._trigger(b.jPlayer.event.setmedia)) :
- this._error({
- type: b.jPlayer.error.NO_SUPPORT,
- context: "{supplied:'" + this.options.supplied + "'}",
- message: b.jPlayer.errorMsg.NO_SUPPORT,
- hint: b.jPlayer.errorHint.NO_SUPPORT
- })
- },
- _resetMedia: function () {
- this._resetStatus();
- this._updateButtons(!1);
- this._updateInterface();
- this._seeked();
- this.internal.poster.jq.hide();
- clearTimeout(this.internal.htmlDlyCmdId);
- this.html.active ? this._html_resetMedia() : this.flash.active && this._flash_resetMedia()
- },
- clearMedia: function () {
- this._resetMedia();
- this.html.active ? this._html_clearMedia() :
- this.flash.active && this._flash_clearMedia();
- this._resetGate();
- this._resetActive()
- },
- load: function () {
- this.status.srcSet ? this.html.active ? this._html_load() : this.flash.active && this._flash_load() : this._urlNotSetError("load")
- },
- focus: function () {
- this.options.keyEnabled && (b.jPlayer.focus = this)
- },
- play: function (a) {
- a = "number" === typeof a ? a : NaN;
- this.status.srcSet ? (this.focus(), this.html.active ? this._html_play(a) : this.flash.active && this._flash_play(a)) : this._urlNotSetError("play")
- },
- videoPlay: function () {
- this.play()
- },
- pause: function (a) {
- a = "number" === typeof a ? a : NaN;
- this.status.srcSet ? this.html.active ? this._html_pause(a) : this.flash.active && this._flash_pause(a) : this._urlNotSetError("pause")
- },
- tellOthers: function (a, c) {
- var d = this,
- e = "function" === typeof c,
- g = Array.prototype.slice.call(arguments);
- "string" === typeof a && (e && g.splice(1, 1), b.each(this.instances, function () {
- d.element !== this && (e && !c.call(this.data("jPlayer"), d) || this.jPlayer.apply(this, g))
- }))
- },
- pauseOthers: function (a) {
- this.tellOthers("pause", function () {
- return this.status.srcSet
- },
- a)
- },
- stop: function () {
- this.status.srcSet ? this.html.active ? this._html_pause(0) : this.flash.active && this._flash_pause(0) : this._urlNotSetError("stop")
- },
- playHead: function (a) {
- a = this._limitValue(a, 0, 100);
- this.status.srcSet ? this.html.active ? this._html_playHead(a) : this.flash.active && this._flash_playHead(a) : this._urlNotSetError("playHead")
- },
- _muted: function (a) {
- this.mutedWorker(a);
- this.options.globalVolume && this.tellOthers("mutedWorker", function () {
- return this.options.globalVolume
- }, a)
- },
- mutedWorker: function (a) {
- this.options.muted =
- a;
- this.html.used && this._html_setProperty("muted", a);
- this.flash.used && this._flash_mute(a);
- this.html.video.gate || this.html.audio.gate || (this._updateMute(a), this._updateVolume(this.options.volume), this._trigger(b.jPlayer.event.volumechange))
- },
- mute: function (a) {
- a = a === f ? !0 : !!a;
- this._muted(a)
- },
- unmute: function (a) {
- a = a === f ? !0 : !!a;
- this._muted(!a)
- },
- _updateMute: function (a) {
- a === f && (a = this.options.muted);
- this.css.jq.mute.length && this.css.jq.unmute.length && (this.status.noVolume ? (this.css.jq.mute.hide(), this.css.jq.unmute.hide()) :
- a ? (this.css.jq.mute.hide(), this.css.jq.unmute.show()) : (this.css.jq.mute.show(), this.css.jq.unmute.hide()))
- },
- volume: function (a) {
- this.volumeWorker(a);
- this.options.globalVolume && this.tellOthers("volumeWorker", function () {
- return this.options.globalVolume
- }, a)
- },
- volumeWorker: function (a) {
- a = this._limitValue(a, 0, 1);
- this.options.volume = a;
- this.html.used && this._html_setProperty("volume", a);
- this.flash.used && this._flash_volume(a);
- this.html.video.gate || this.html.audio.gate || (this._updateVolume(a), this._trigger(b.jPlayer.event.volumechange))
- },
- volumeBar: function (a) {
- if (this.css.jq.volumeBar.length) {
- var c = b(a.currentTarget),
- d = c.offset(),
- e = a.pageX - d.left,
- g = c.width();
- a = c.height() - a.pageY + d.top;
- c = c.height();
- this.options.verticalVolume ? this.volume(a / c) : this.volume(e / g)
- }
- this.options.muted && this._muted(!1)
- },
- _updateVolume: function (a) {
- a === f && (a = this.options.volume);
- a = this.options.muted ? 0 : a;
- this.status.noVolume ? (this.css.jq.volumeBar.length && this.css.jq.volumeBar.hide(), this.css.jq.volumeBarValue.length && this.css.jq.volumeBarValue.hide(), this.css.jq.volumeMax.length &&
- this.css.jq.volumeMax.hide()) : (this.css.jq.volumeBar.length && this.css.jq.volumeBar.show(), this.css.jq.volumeBarValue.length && (this.css.jq.volumeBarValue.show(), this.css.jq.volumeBarValue[this.options.verticalVolume ? "height" : "width"](100 * a + "%")), this.css.jq.volumeMax.length && this.css.jq.volumeMax.show())
- },
- volumeMax: function () {
- this.volume(1);
- this.options.muted && this._muted(!1)
- },
- _cssSelectorAncestor: function (a) {
- var c = this;
- this.options.cssSelectorAncestor = a;
- this._removeUiClass();
- this.ancestorJq = a ? b(a) : [];
- a && 1 !== this.ancestorJq.length && this._warning({
- type: b.jPlayer.warning.CSS_SELECTOR_COUNT,
- context: a,
- message: b.jPlayer.warningMsg.CSS_SELECTOR_COUNT + this.ancestorJq.length + " found for cssSelectorAncestor.",
- hint: b.jPlayer.warningHint.CSS_SELECTOR_COUNT
- });
- this._addUiClass();
- b.each(this.options.cssSelector, function (a, b) {
- c._cssSelector(a, b)
- });
- this._updateInterface();
- this._updateButtons();
- this._updateAutohide();
- this._updateVolume();
- this._updateMute()
- },
- _cssSelector: function (a, c) {
- var d = this;
- "string" === typeof c ?
- b.jPlayer.prototype.options.cssSelector[a] ? (this.css.jq[a] && this.css.jq[a].length && this.css.jq[a].unbind(".jPlayer"), this.options.cssSelector[a] = c, this.css.cs[a] = this.options.cssSelectorAncestor + " " + c, this.css.jq[a] = c ? b(this.css.cs[a]) : [], this.css.jq[a].length && this[a] && this.css.jq[a].bind("click.jPlayer", function (c) {
- c.preventDefault();
- d[a](c);
- b(this).blur()
- }), c && 1 !== this.css.jq[a].length && this._warning({
- type: b.jPlayer.warning.CSS_SELECTOR_COUNT,
- context: this.css.cs[a],
- message: b.jPlayer.warningMsg.CSS_SELECTOR_COUNT +
- this.css.jq[a].length + " found for " + a + " method.",
- hint: b.jPlayer.warningHint.CSS_SELECTOR_COUNT
- })) : this._warning({
- type: b.jPlayer.warning.CSS_SELECTOR_METHOD,
- context: a,
- message: b.jPlayer.warningMsg.CSS_SELECTOR_METHOD,
- hint: b.jPlayer.warningHint.CSS_SELECTOR_METHOD
- }) : this._warning({
- type: b.jPlayer.warning.CSS_SELECTOR_STRING,
- context: c,
- message: b.jPlayer.warningMsg.CSS_SELECTOR_STRING,
- hint: b.jPlayer.warningHint.CSS_SELECTOR_STRING
- })
- },
- duration: function (a) {
- this.options.toggleDuration && this._setOption("remainingDuration", !this.options.remainingDuration)
- },
- seekBar: function (a) {
- if (this.css.jq.seekBar.length) {
- var c = b(a.currentTarget),
- d = c.offset();
- a = a.pageX - d.left+8;
- c = c.width();
- this.playHead(100 * a / c)
- }
- },
- playbackRate: function (a) {
- this._setOption("playbackRate", a)
- },
- playbackRateBar: function (a) {
- if (this.css.jq.playbackRateBar.length) {
- var c = b(a.currentTarget),
- d = c.offset(),
- e = a.pageX - d.left,
- g = c.width();
- a = c.height() - a.pageY + d.top;
- c = c.height();
- this.playbackRate((this.options.verticalPlaybackRate ? a / c : e / g) * (this.options.maxPlaybackRate -
- this.options.minPlaybackRate) + this.options.minPlaybackRate)
- }
- },
- _updatePlaybackRate: function () {
- var a = (this.options.playbackRate - this.options.minPlaybackRate) / (this.options.maxPlaybackRate - this.options.minPlaybackRate);
- this.status.playbackRateEnabled ? (this.css.jq.playbackRateBar.length && this.css.jq.playbackRateBar.show(), this.css.jq.playbackRateBarValue.length && (this.css.jq.playbackRateBarValue.show(), this.css.jq.playbackRateBarValue[this.options.verticalPlaybackRate ? "height" : "width"](100 * a + "%"))) : (this.css.jq.playbackRateBar.length &&
- this.css.jq.playbackRateBar.hide(), this.css.jq.playbackRateBarValue.length && this.css.jq.playbackRateBarValue.hide())
- },
- repeat: function () {
- this._loop(!0)
- },
- repeatOff: function () {
- this._loop(!1)
- },
- _loop: function (a) {
- this.options.loop !== a && (this.options.loop = a, this._updateButtons(), this._trigger(b.jPlayer.event.repeat))
- },
- option: function (a, c) {
- var d = a;
- if (0 === arguments.length) return b.extend(!0, {}, this.options);
- if ("string" === typeof a) {
- var e = a.split(".");
- if (c === f) {
- for (var d = b.extend(!0, {}, this.options), g = 0; g < e.length; g++)
- if (d[e[g]] !==
- f) d = d[e[g]];
- else return this._warning({
- type: b.jPlayer.warning.OPTION_KEY,
- context: a,
- message: b.jPlayer.warningMsg.OPTION_KEY,
- hint: b.jPlayer.warningHint.OPTION_KEY
- }), f;
- return d
- }
- for (var g = d = {}, h = 0; h < e.length; h++) h < e.length - 1 ? (g[e[h]] = {}, g = g[e[h]]) : g[e[h]] = c
- }
- this._setOptions(d);
- return this
- },
- _setOptions: function (a) {
- var c = this;
- b.each(a, function (a, b) {
- c._setOption(a, b)
- });
- return this
- },
- _setOption: function (a, c) {
- var d = this;
- switch (a) {
- case "volume":
- this.volume(c);
- break;
- case "muted":
- this._muted(c);
- break;
- case "globalVolume":
- this.options[a] =
- c;
- break;
- case "cssSelectorAncestor":
- this._cssSelectorAncestor(c);
- break;
- case "cssSelector":
- b.each(c, function (a, c) {
- d._cssSelector(a, c)
- });
- break;
- case "playbackRate":
- this.options[a] = c = this._limitValue(c, this.options.minPlaybackRate, this.options.maxPlaybackRate);
- this.html.used && this._html_setProperty("playbackRate", c);
- this._updatePlaybackRate();
- break;
- case "defaultPlaybackRate":
- this.options[a] = c = this._limitValue(c, this.options.minPlaybackRate, this.options.maxPlaybackRate);
- this.html.used && this._html_setProperty("defaultPlaybackRate",
- c);
- this._updatePlaybackRate();
- break;
- case "minPlaybackRate":
- this.options[a] = c = this._limitValue(c, 0.1, this.options.maxPlaybackRate - 0.1);
- this._updatePlaybackRate();
- break;
- case "maxPlaybackRate":
- this.options[a] = c = this._limitValue(c, this.options.minPlaybackRate + 0.1, 16);
- this._updatePlaybackRate();
- break;
- case "fullScreen":
- if (this.options[a] !== c) {
- var e = b.jPlayer.nativeFeatures.fullscreen.used.webkitVideo;
- if (!e || e && !this.status.waitForPlay) e || (this.options[a] = c), c ? this._requestFullscreen() : this._exitFullscreen(),
- e || this._setOption("fullWindow", c)
- }
- break;
- case "fullWindow":
- this.options[a] !== c && (this._removeUiClass(), this.options[a] = c, this._refreshSize());
- break;
- case "size":
- this.options.fullWindow || this.options[a].cssClass === c.cssClass || this._removeUiClass();
- this.options[a] = b.extend({}, this.options[a], c);
- this._refreshSize();
- break;
- case "sizeFull":
- this.options.fullWindow && this.options[a].cssClass !== c.cssClass && this._removeUiClass();
- this.options[a] = b.extend({}, this.options[a], c);
- this._refreshSize();
- break;
- case "autohide":
- this.options[a] =
- b.extend({}, this.options[a], c);
- this._updateAutohide();
- break;
- case "loop":
- this._loop(c);
- break;
- case "remainingDuration":
- this.options[a] = c;
- this._updateInterface();
- break;
- case "toggleDuration":
- this.options[a] = c;
- break;
- case "nativeVideoControls":
- this.options[a] = b.extend({}, this.options[a], c);
- this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls);
- this._restrictNativeVideoControls();
- this._updateNativeVideoControls();
- break;
- case "noFullWindow":
- this.options[a] = b.extend({}, this.options[a],
- c);
- this.status.nativeVideoControls = this._uaBlocklist(this.options.nativeVideoControls);
- this.status.noFullWindow = this._uaBlocklist(this.options.noFullWindow);
- this._restrictNativeVideoControls();
- this._updateButtons();
- break;
- case "noVolume":
- this.options[a] = b.extend({}, this.options[a], c);
- this.status.noVolume = this._uaBlocklist(this.options.noVolume);
- this._updateVolume();
- this._updateMute();
- break;
- case "emulateHtml":
- this.options[a] !== c && ((this.options[a] = c) ? this._emulateHtmlBridge() : this._destroyHtmlBridge());
- break;
- case "timeFormat":
- this.options[a] = b.extend({}, this.options[a], c);
- break;
- case "keyEnabled":
- this.options[a] = c;
- c || this !== b.jPlayer.focus || (b.jPlayer.focus = null);
- break;
- case "keyBindings":
- this.options[a] = b.extend(!0, {}, this.options[a], c);
- break;
- case "audioFullScreen":
- this.options[a] = c
- }
- return this
- },
- _refreshSize: function () {
- this._setSize();
- this._addUiClass();
- this._updateSize();
- this._updateButtons();
- this._updateAutohide();
- this._trigger(b.jPlayer.event.resize)
- },
- _setSize: function () {
- this.options.fullWindow ?
- (this.status.width = this.options.sizeFull.width, this.status.height = this.options.sizeFull.height, this.status.cssClass = this.options.sizeFull.cssClass) : (this.status.width = this.options.size.width, this.status.height = this.options.size.height, this.status.cssClass = this.options.size.cssClass);
- this.element.css({
- width: this.status.width,
- height: this.status.height
- })
- },
- _addUiClass: function () {
- this.ancestorJq.length && this.ancestorJq.addClass(this.status.cssClass)
- },
- _removeUiClass: function () {
- this.ancestorJq.length && this.ancestorJq.removeClass(this.status.cssClass)
- },
- _updateSize: function () {
- this.internal.poster.jq.css({
- width: this.status.width,
- height: this.status.height
- });
- !this.status.waitForPlay && this.html.active && this.status.video || this.html.video.available && this.html.used && this.status.nativeVideoControls ? this.internal.video.jq.css({
- width: this.status.width,
- height: this.status.height
- }) : !this.status.waitForPlay && this.flash.active && this.status.video && this.internal.flash.jq.css({
- width: this.status.width,
- height: this.status.height
- })
- },
- _updateAutohide: function () {
- var a = this,
- c = function () {
- a.css.jq.gui.fadeIn(a.options.autohide.fadeIn, function () {
- clearTimeout(a.internal.autohideId);
- a.internal.autohideId = setTimeout(function () {
- a.css.jq.gui.fadeOut(a.options.autohide.fadeOut)
- }, a.options.autohide.hold)
- })
- };
- this.css.jq.gui.length && (this.css.jq.gui.stop(!0, !0), clearTimeout(this.internal.autohideId), this.element.unbind(".jPlayerAutohide"), this.css.jq.gui.unbind(".jPlayerAutohide"), this.status.nativeVideoControls ? this.css.jq.gui.hide() : this.options.fullWindow && this.options.autohide.full ||
- !this.options.fullWindow && this.options.autohide.restored ? (this.element.bind("mousemove.jPlayer.jPlayerAutohide", c), this.css.jq.gui.bind("mousemove.jPlayer.jPlayerAutohide", c), this.css.jq.gui.hide()) : this.css.jq.gui.show())
- },
- fullScreen: function () {
- this._setOption("fullScreen", !0)
- },
- restoreScreen: function () {
- this._setOption("fullScreen", !1)
- },
- _fullscreenAddEventListeners: function () {
- var a = this,
- c = b.jPlayer.nativeFeatures.fullscreen;
- c.api.fullscreenEnabled && c.event.fullscreenchange && ("function" !== typeof this.internal.fullscreenchangeHandler &&
- (this.internal.fullscreenchangeHandler = function () {
- a._fullscreenchange()
- }), document.addEventListener(c.event.fullscreenchange, this.internal.fullscreenchangeHandler, !1))
- },
- _fullscreenRemoveEventListeners: function () {
- var a = b.jPlayer.nativeFeatures.fullscreen;
- this.internal.fullscreenchangeHandler && document.removeEventListener(a.event.fullscreenchange, this.internal.fullscreenchangeHandler, !1)
- },
- _fullscreenchange: function () {
- this.options.fullScreen && !b.jPlayer.nativeFeatures.fullscreen.api.fullscreenElement() &&
- this._setOption("fullScreen", !1)
- },
- _requestFullscreen: function () {
- var a = this.ancestorJq.length ? this.ancestorJq[0] : this.element[0],
- c = b.jPlayer.nativeFeatures.fullscreen;
- c.used.webkitVideo && (a = this.htmlElement.video);
- c.api.fullscreenEnabled && c.api.requestFullscreen(a)
- },
- _exitFullscreen: function () {
- var a = b.jPlayer.nativeFeatures.fullscreen,
- c;
- a.used.webkitVideo && (c = this.htmlElement.video);
- a.api.fullscreenEnabled && a.api.exitFullscreen(c)
- },
- _html_initMedia: function (a) {
- var c = b(this.htmlElement.media).empty();
- b.each(a.track || [], function (a, b) {
- var g = document.createElement("track");
- g.setAttribute("kind", b.kind ? b.kind : "");
- g.setAttribute("src", b.src ? b.src : "");
- g.setAttribute("srclang", b.srclang ? b.srclang : "");
- g.setAttribute("label", b.label ? b.label : "");
- b.def && g.setAttribute("default", b.def);
- c.append(g)
- });
- this.htmlElement.media.src = this.status.src;
- "none" !== this.options.preload && this._html_load();
- this._trigger(b.jPlayer.event.timeupdate)
- },
- _html_setFormat: function (a) {
- var c = this;
- b.each(this.formats, function (b, e) {
- if (c.html.support[e] &&
- a[e]) return c.status.src = a[e], c.status.format[e] = !0, c.status.formatType = e, !1
- })
- },
- _html_setAudio: function (a) {
- this._html_setFormat(a);
- this.htmlElement.media = this.htmlElement.audio;
- this._html_initMedia(a)
- },
- _html_setVideo: function (a) {
- this._html_setFormat(a);
- this.status.nativeVideoControls && (this.htmlElement.video.poster = this._validString(a.poster) ? a.poster : "");
- this.htmlElement.media = this.htmlElement.video;
- this._html_initMedia(a)
- },
- _html_resetMedia: function () {
- this.htmlElement.media && (this.htmlElement.media.id !==
- this.internal.video.id || this.status.nativeVideoControls || this.internal.video.jq.css({
- width: "0px",
- height: "0px"
- }), this.htmlElement.media.pause())
- },
- _html_clearMedia: function () {
- this.htmlElement.media && (this.htmlElement.media.src = "about:blank", this.htmlElement.media.load())
- },
- _html_load: function () {
- this.status.waitForLoad && (this.status.waitForLoad = !1, this.htmlElement.media.load());
- clearTimeout(this.internal.htmlDlyCmdId)
- },
- _html_play: function (a) {
- var b = this,
- d = this.htmlElement.media;
- this.androidFix.pause = !1;
- this._html_load();
- if (this.androidFix.setMedia) this.androidFix.play = !0, this.androidFix.time = a;
- else if (isNaN(a)) d.play();
- else {
- this.internal.cmdsIgnored && d.play();
- try {
- if (!d.seekable || "object" === typeof d.seekable && 0 < d.seekable.length) d.currentTime = a, d.play();
- else throw 1;
- } catch (e) {
- this.internal.htmlDlyCmdId = setTimeout(function () {
- b.play(a)
- }, 250);
- return
- }
- }
- this._html_checkWaitForPlay()
- },
- _html_pause: function (a) {
- var b = this,
- d = this.htmlElement.media;
- this.androidFix.play = !1;
- 0 < a ? this._html_load() : clearTimeout(this.internal.htmlDlyCmdId);
- d.pause();
- if (this.androidFix.setMedia) this.androidFix.pause = !0, this.androidFix.time = a;
- else if (!isNaN(a)) try {
- if (!d.seekable || "object" === typeof d.seekable && 0 < d.seekable.length) d.currentTime = a;
- else throw 1;
- } catch (e) {
- this.internal.htmlDlyCmdId = setTimeout(function () {
- b.pause(a)
- }, 250);
- return
- }
- 0 < a && this._html_checkWaitForPlay()
- },
- _html_playHead: function (a) {
- var b = this,
- d = this.htmlElement.media;
- this._html_load();
- try {
- if ("object" === typeof d.seekable && 0 < d.seekable.length) d.currentTime = a * d.seekable.end(d.seekable.length -
- 1) / 100;
- else if (0 < d.duration && !isNaN(d.duration)) d.currentTime = a * d.duration / 100;
- else throw "e";
- } catch (e) {
- this.internal.htmlDlyCmdId = setTimeout(function () {
- b.playHead(a)
- }, 250);
- return
- }
- this.status.waitForLoad || this._html_checkWaitForPlay()
- },
- _html_checkWaitForPlay: function () {
- this.status.waitForPlay && (this.status.waitForPlay = !1, this.css.jq.videoPlay.length && this.css.jq.videoPlay.hide(), this.status.video && (this.internal.poster.jq.hide(), this.internal.video.jq.css({
- width: this.status.width,
- height: this.status.height
- })))
- },
- _html_setProperty: function (a, b) {
- this.html.audio.available && (this.htmlElement.audio[a] = b);
- this.html.video.available && (this.htmlElement.video[a] = b)
- },
- _flash_setAudio: function (a) {
- var c = this;
- try {
- b.each(this.formats, function (b, d) {
- if (c.flash.support[d] && a[d]) {
- switch (d) {
- case "m4a":
- case "fla":
- c._getMovie().fl_setAudio_m4a(a[d]);
- break;
- case "mp3":
- c._getMovie().fl_setAudio_mp3(a[d]);
- break;
- case "rtmpa":
- c._getMovie().fl_setAudio_rtmp(a[d])
- }
- c.status.src = a[d];
- c.status.format[d] = !0;
- c.status.formatType = d;
- return !1
- }
- }),
- "auto" === this.options.preload && (this._flash_load(), this.status.waitForLoad = !1)
- } catch (d) {
- this._flashError(d)
- }
- },
- _flash_setVideo: function (a) {
- var c = this;
- try {
- b.each(this.formats, function (b, d) {
- if (c.flash.support[d] && a[d]) {
- switch (d) {
- case "m4v":
- case "flv":
- c._getMovie().fl_setVideo_m4v(a[d]);
- break;
- case "rtmpv":
- c._getMovie().fl_setVideo_rtmp(a[d])
- }
- c.status.src = a[d];
- c.status.format[d] = !0;
- c.status.formatType = d;
- return !1
- }
- }), "auto" === this.options.preload && (this._flash_load(), this.status.waitForLoad = !1)
- } catch (d) {
- this._flashError(d)
- }
- },
- _flash_resetMedia: function () {
- this.internal.flash.jq.css({
- width: "0px",
- height: "0px"
- });
- this._flash_pause(NaN)
- },
- _flash_clearMedia: function () {
- try {
- this._getMovie().fl_clearMedia()
- } catch (a) {
- this._flashError(a)
- }
- },
- _flash_load: function () {
- try {
- this._getMovie().fl_load()
- } catch (a) {
- this._flashError(a)
- }
- this.status.waitForLoad = !1
- },
- _flash_play: function (a) {
- try {
- this._getMovie().fl_play(a)
- } catch (b) {
- this._flashError(b)
- }
- this.status.waitForLoad = !1;
- this._flash_checkWaitForPlay()
- },
- _flash_pause: function (a) {
- try {
- this._getMovie().fl_pause(a)
- } catch (b) {
- this._flashError(b)
- }
- 0 <
- a && (this.status.waitForLoad = !1, this._flash_checkWaitForPlay())
- },
- _flash_playHead: function (a) {
- try {
- this._getMovie().fl_play_head(a)
- } catch (b) {
- this._flashError(b)
- }
- this.status.waitForLoad || this._flash_checkWaitForPlay()
- },
- _flash_checkWaitForPlay: function () {
- this.status.waitForPlay && (this.status.waitForPlay = !1, this.css.jq.videoPlay.length && this.css.jq.videoPlay.hide(), this.status.video && (this.internal.poster.jq.hide(), this.internal.flash.jq.css({
- width: this.status.width,
- height: this.status.height
- })))
- },
- _flash_volume: function (a) {
- try {
- this._getMovie().fl_volume(a)
- } catch (b) {
- this._flashError(b)
- }
- },
- _flash_mute: function (a) {
- try {
- this._getMovie().fl_mute(a)
- } catch (b) {
- this._flashError(b)
- }
- },
- _getMovie: function () {
- return document[this.internal.flash.id]
- },
- _getFlashPluginVersion: function () {
- var a = 0,
- b;
- if (window.ActiveXObject) try {
- if (b = new ActiveXObject("ShockwaveFlash.ShockwaveFlash")) {
- var d = b.GetVariable("$version");
- d && (d = d.split(" ")[1].split(","), a = parseInt(d[0], 10) + "." + parseInt(d[1], 10))
- }
- } catch (e) {} else navigator.plugins && 0 < navigator.mimeTypes.length && (b = navigator.plugins["Shockwave Flash"]) && (a = navigator.plugins["Shockwave Flash"].description.replace(/.*\s(\d+\.\d+).*/,
- "$1"));
- return 1 * a
- },
- _checkForFlash: function (a) {
- var b = !1;
- this._getFlashPluginVersion() >= a && (b = !0);
- return b
- },
- _validString: function (a) {
- return a && "string" === typeof a
- },
- _limitValue: function (a, b, d) {
- return a < b ? b : a > d ? d : a
- },
- _urlNotSetError: function (a) {
- this._error({
- type: b.jPlayer.error.URL_NOT_SET,
- context: a,
- message: b.jPlayer.errorMsg.URL_NOT_SET,
- hint: b.jPlayer.errorHint.URL_NOT_SET
- })
- },
- _flashError: function (a) {
- var c;
- c = this.internal.ready ? "FLASH_DISABLED" : "FLASH";
- this._error({
- type: b.jPlayer.error[c],
- context: this.internal.flash.swf,
- message: b.jPlayer.errorMsg[c] + a.message,
- hint: b.jPlayer.errorHint[c]
- });
- this.internal.flash.jq.css({
- width: "1px",
- height: "1px"
- })
- },
- _error: function (a) {
- this._trigger(b.jPlayer.event.error, a);
- this.options.errorAlerts && this._alert("Error!" + (a.message ? "\n" + a.message : "") + (a.hint ? "\n" + a.hint : "") + "\nContext: " + a.context)
- },
- _warning: function (a) {
- this._trigger(b.jPlayer.event.warning, f, a);
- this.options.warningAlerts && this._alert("Warning!" + (a.message ? "\n" + a.message : "") + (a.hint ? "\n" + a.hint : "") + "\nContext: " + a.context)
- },
- _alert: function (a) {
- a = "jPlayer " + this.version.script + " : id='" + this.internal.self.id + "' : " + a;
- this.options.consoleAlerts ? window.console && window.console.log && window.console.log(a) : alert(a)
- },
- _emulateHtmlBridge: function () {
- var a = this;
- b.each(b.jPlayer.emulateMethods.split(/\s+/g), function (b, d) {
- a.internal.domNode[d] = function (b) {
- a[d](b)
- }
- });
- b.each(b.jPlayer.event, function (c, d) {
- var e = !0;
- b.each(b.jPlayer.reservedEvent.split(/\s+/g), function (a, b) {
- if (b === c) return e = !1
- });
- e && a.element.bind(d + ".jPlayer.jPlayerHtml",
- function () {
- a._emulateHtmlUpdate();
- var b = document.createEvent("Event");
- b.initEvent(c, !1, !0);
- a.internal.domNode.dispatchEvent(b)
- })
- })
- },
- _emulateHtmlUpdate: function () {
- var a = this;
- b.each(b.jPlayer.emulateStatus.split(/\s+/g), function (b, d) {
- a.internal.domNode[d] = a.status[d]
- });
- b.each(b.jPlayer.emulateOptions.split(/\s+/g), function (b, d) {
- a.internal.domNode[d] = a.options[d]
- })
- },
- _destroyHtmlBridge: function () {
- var a = this;
- this.element.unbind(".jPlayerHtml");
- b.each((b.jPlayer.emulateMethods + " " + b.jPlayer.emulateStatus +
- " " + b.jPlayer.emulateOptions).split(/\s+/g), function (b, d) {
- delete a.internal.domNode[d]
- })
- }
- };
- b.jPlayer.error = {
- FLASH: "e_flash",
- FLASH_DISABLED: "e_flash_disabled",
- NO_SOLUTION: "e_no_solution",
- NO_SUPPORT: "e_no_support",
- URL: "e_url",
- URL_NOT_SET: "e_url_not_set",
- VERSION: "e_version"
- };
- b.jPlayer.errorMsg = {
- FLASH: "jPlayer's Flash fallback is not configured correctly, or a command was issued before the jPlayer Ready event. Details: ",
- FLASH_DISABLED: "jPlayer's Flash fallback has been disabled by the browser due to the CSS rules you have used. Details: ",
- NO_SOLUTION: "No solution can be found by jPlayer in this browser. Neither HTML nor Flash can be used.",
- NO_SUPPORT: "It is not possible to play any media format provided in setMedia() on this browser using your current options.",
- URL: "Media URL could not be loaded.",
- URL_NOT_SET: "Attempt to issue media playback commands, while no media url is set.",
- VERSION: "jPlayer " + b.jPlayer.prototype.version.script + " needs Jplayer.swf version " + b.jPlayer.prototype.version.needFlash + " but found "
- };
- b.jPlayer.errorHint = {
- FLASH: "Check your swfPath option and that Jplayer.swf is there.",
- FLASH_DISABLED: "Check that you have not display:none; the jPlayer entity or any ancestor.",
- NO_SOLUTION: "Review the jPlayer options: support and supplied.",
- NO_SUPPORT: "Video or audio formats defined in the supplied option are missing.",
- URL: "Check media URL is valid.",
- URL_NOT_SET: "Use setMedia() to set the media URL.",
- VERSION: "Update jPlayer files."
- };
- b.jPlayer.warning = {
- CSS_SELECTOR_COUNT: "e_css_selector_count",
- CSS_SELECTOR_METHOD: "e_css_selector_method",
- CSS_SELECTOR_STRING: "e_css_selector_string",
- OPTION_KEY: "e_option_key"
- };
- b.jPlayer.warningMsg = {
- CSS_SELECTOR_COUNT: "The number of css selectors found did not equal one: ",
- CSS_SELECTOR_METHOD: "The methodName given in jPlayer('cssSelector') is not a valid jPlayer method.",
- CSS_SELECTOR_STRING: "The methodCssSelector given in jPlayer('cssSelector') is not a String or is empty.",
- OPTION_KEY: "The option requested in jPlayer('option') is undefined."
- };
- b.jPlayer.warningHint = {
- CSS_SELECTOR_COUNT: "Check your css selector and the ancestor.",
- CSS_SELECTOR_METHOD: "Check your method name.",
- CSS_SELECTOR_STRING: "Check your css selector is a string.",
- OPTION_KEY: "Check your option name."
- }
-});
\ No newline at end of file
diff --git a/10.大屏音乐/js/jPlayer/popcorn/popcorn.jplayer.js b/10.大屏音乐/js/jPlayer/popcorn/popcorn.jplayer.js
deleted file mode 100644
index 154e190..0000000
--- a/10.大屏音乐/js/jPlayer/popcorn/popcorn.jplayer.js
+++ /dev/null
@@ -1,583 +0,0 @@
-/*
- * jPlayer Player Plugin for Popcorn JavaScript Library
- * http://www.jplayer.org
- *
- * Copyright (c) 2012 - 2014 Happyworm Ltd
- * Licensed under the MIT license.
- * http://opensource.org/licenses/MIT
- *
- * Author: Mark J Panaghiston
- * Version: 1.1.3
- * Date: 2nd April 2014
- *
- * For Popcorn Version: 1.3
- * For jPlayer Version: 2.6.0
- * Requires: jQuery 1.7+
- * Note: jQuery dependancy cannot be removed since jPlayer 2 is a jQuery plugin. Use of jQuery will be kept to a minimum.
- */
-
-/* Code verified using http://www.jshint.com/ */
-/*jshint asi:false, bitwise:false, boss:false, browser:true, curly:false, debug:false, eqeqeq:true, eqnull:false, evil:false, forin:false, immed:false, jquery:true, laxbreak:false, newcap:true, noarg:true, noempty:true, nonew:true, onevar:false, passfail:false, plusplus:false, regexp:false, undef:true, sub:false, strict:false, white:false, smarttabs:true */
-/*global Popcorn:false, console:false */
-
-(function(Popcorn) {
-
- var JQUERY_SCRIPT = '//code.jquery.com/jquery-1.11.0.min.js', // Used if jQuery not already present.
- JPLAYER_SCRIPT = '//www.jplayer.org/2.6.0/js/jquery.jplayer.min.js', // Used if jPlayer not already present.
- JPLAYER_SWFPATH = '//www.jplayer.org/2.6.0/js/Jplayer.swf', // Used if not specified in jPlayer options via SRC Object.
- SOLUTION = 'html,flash', // The default solution option.
- DEBUG = false, // Decided to leave the debugging option and console output in for the time being. Overhead is trivial.
- jQueryDownloading = false, // Flag to stop multiple instances from each pulling in jQuery, thus corrupting it.
- jPlayerDownloading = false, // Flag to stop multiple instances from each pulling in jPlayer, thus corrupting it.
- format = { // Duplicate of jPlayer 2.5.0 object, to avoid always requiring jQuery and jPlayer to be loaded before performing the _canPlayType() test.
- mp3: {
- codec: 'audio/mpeg; codecs="mp3"',
- flashCanPlay: true,
- media: 'audio'
- },
- m4a: { // AAC / MP4
- codec: 'audio/mp4; codecs="mp4a.40.2"',
- flashCanPlay: true,
- media: 'audio'
- },
- m3u8a: { // AAC / MP4 / Apple HLS
- codec: 'application/vnd.apple.mpegurl; codecs="mp4a.40.2"',
- flashCanPlay: false,
- media: 'audio'
- },
- m3ua: { // M3U
- codec: 'audio/mpegurl',
- flashCanPlay: false,
- media: 'audio'
- },
- oga: { // OGG
- codec: 'audio/ogg; codecs="vorbis, opus"',
- flashCanPlay: false,
- media: 'audio'
- },
- flac: { // FLAC
- codec: 'audio/x-flac',
- flashCanPlay: false,
- media: 'audio'
- },
- wav: { // PCM
- codec: 'audio/wav; codecs="1"',
- flashCanPlay: false,
- media: 'audio'
- },
- webma: { // WEBM
- codec: 'audio/webm; codecs="vorbis"',
- flashCanPlay: false,
- media: 'audio'
- },
- fla: { // FLV / F4A
- codec: 'audio/x-flv',
- flashCanPlay: true,
- media: 'audio'
- },
- rtmpa: { // RTMP AUDIO
- codec: 'audio/rtmp; codecs="rtmp"',
- flashCanPlay: true,
- media: 'audio'
- },
- m4v: { // H.264 / MP4
- codec: 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"',
- flashCanPlay: true,
- media: 'video'
- },
- m3u8v: { // H.264 / AAC / MP4 / Apple HLS
- codec: 'application/vnd.apple.mpegurl; codecs="avc1.42E01E, mp4a.40.2"',
- flashCanPlay: false,
- media: 'video'
- },
- m3uv: { // M3U
- codec: 'audio/mpegurl',
- flashCanPlay: false,
- media: 'video'
- },
- ogv: { // OGG
- codec: 'video/ogg; codecs="theora, vorbis"',
- flashCanPlay: false,
- media: 'video'
- },
- webmv: { // WEBM
- codec: 'video/webm; codecs="vorbis, vp8"',
- flashCanPlay: false,
- media: 'video'
- },
- flv: { // FLV / F4V
- codec: 'video/x-flv',
- flashCanPlay: true,
- media: 'video'
- },
- rtmpv: { // RTMP VIDEO
- codec: 'video/rtmp; codecs="rtmp"',
- flashCanPlay: true,
- media: 'video'
- }
- },
- isObject = function(val) { // Basic check for Object
- if(val && typeof val === 'object' && val.hasOwnProperty) {
- return true;
- } else {
- return false;
- }
- },
- getMediaType = function(url) { // Function to gleam the media type from the URL
- var mediaType = false;
- if(/\.mp3$/i.test(url)) {
- mediaType = 'mp3';
- } else if(/\.mp4$/i.test(url) || /\.m4v$/i.test(url)) {
- mediaType = 'm4v';
- } else if(/\.m4a$/i.test(url)) {
- mediaType = 'm4a';
- } else if(/\.ogg$/i.test(url) || /\.oga$/i.test(url)) {
- mediaType = 'oga';
- } else if(/\.ogv$/i.test(url)) {
- mediaType = 'ogv';
- } else if(/\.webm$/i.test(url)) {
- mediaType = 'webmv';
- }
- return mediaType;
- },
- getSupplied = function(url) { // Function to generate a supplied option from an src object. ie., When supplied not specified.
- var supplied = '',
- separator = '';
- if(isObject(url)) {
- // Generate supplied option from object's properties. Non-format properties would be ignored by jPlayer. Order is unpredictable.
- for(var prop in url) {
- if(url.hasOwnProperty(prop)) {
- supplied += separator + prop;
- separator = ',';
- }
- }
- }
- if(DEBUG) console.log('getSupplied(): Generated: supplied = "' + supplied + '"');
- return supplied;
- };
-
- Popcorn.player( 'jplayer', {
- _canPlayType: function( containerType, url ) {
- // url : Either a String or an Object structured similar a jPlayer media object. ie., As used by setMedia in jPlayer.
- // The url object may also contain a solution and supplied property.
-
- // Define the src object structure here!
-
- var cType = containerType.toLowerCase(),
- srcObj = {
- media:{},
- options:{}
- },
- rVal = false, // Only a boolean false means it is not supported.
- mediaType;
-
- if(cType !== 'video' && cType !== 'audio') {
-
- if(typeof url === 'string') {
- // Check it starts with http, so the URL is absolute... Well, it is not a perfect check.
- if(/^http.*/i.test(url)) {
- mediaType = getMediaType(url);
- if(mediaType) {
- srcObj.media[mediaType] = url;
- srcObj.options.solution = SOLUTION;
- srcObj.options.supplied = mediaType;
- }
- }
- } else {
- srcObj = url; // Assume the url is an src object.
- }
-
- // Check for Object and appropriate minimum data structure.
- if(isObject(srcObj) && isObject(srcObj.media)) {
-
- if(!isObject(srcObj.options)) {
- srcObj.options = {};
- }
-
- if(!srcObj.options.solution) {
- srcObj.options.solution = SOLUTION;
- }
-
- if(!srcObj.options.supplied) {
- srcObj.options.supplied = getSupplied(srcObj.media);
- }
-
- // Figure out how jPlayer will play it.
- // This may not work properly when both audio and video is supplied. ie., A media player. But it should return truethy and jPlayer can figure it out.
-
- var solution = srcObj.options.solution.toLowerCase().split(","), // Create the solution array, with prority based on the order of the solution string.
- supplied = srcObj.options.supplied.toLowerCase().split(","); // Create the supplied formats array, with prority based on the order of the supplied formats string.
-
- for(var sol = 0; sol < solution.length; sol++) {
-
- var solutionType = solution[sol].replace(/^\s+|\s+$/g, ""), //trim
- checkingHtml = solutionType === 'html',
- checkingFlash = solutionType === 'flash',
- mediaElem;
-
- for(var fmt = 0; fmt < supplied.length; fmt++) {
- mediaType = supplied[fmt].replace(/^\s+|\s+$/g, ""); //trim
- if(format[mediaType]) { // Check format is valid.
-
- // Create an HTML5 media element for the type of media.
- if(!mediaElem && checkingHtml) {
- mediaElem = document.createElement(format[mediaType].media);
- }
- // See if the HTML5 media element can play the MIME / Codec type.
- // Flash also returns the object if the format is playable, so it is truethy, but that html property is false.
- // This assumes Flash is available, but that should be dealt with by jPlayer if that happens.
- var htmlCanPlay = !!(mediaElem && mediaElem.canPlayType && mediaElem.canPlayType(format[mediaType].codec)),
- htmlWillPlay = htmlCanPlay && checkingHtml,
- flashWillPlay = format[mediaType].flashCanPlay && checkingFlash;
- // The first one found will match what jPlayer uses.
- if(htmlWillPlay || flashWillPlay) {
- rVal = {
- html: htmlWillPlay,
- type: mediaType
- };
- sol = solution.length; // Exit solution loop
- fmt = supplied.length; // Exit supplied loop
- }
- }
- }
- }
- }
- }
- return rVal;
- },
- // _setup: function( options ) { // Warning: options is deprecated.
- _setup: function() {
- var media = this,
- myPlayer, // The jQuery selector of the jPlayer element. Usually a
- jPlayerObj, // The jPlayer data instance. For performance and DRY code.
- mediaType = 'unknown',
- jpMedia = {},
- jpOptions = {},
- ready = false, // Used during init to override the annoying duration dependance in the track event padding during Popcorn's isReady(). ie., We is ready after loadeddata and duration can then be set real value at leisure.
- duration = 0, // For the durationchange event with both HTML5 and Flash solutions. Used with 'ready' to keep control during the Popcorn isReady() via loadeddata event. (Duration=0 is bad.)
- durationchangeId = null, // A timeout ID used with delayed durationchange event. (Because of the duration=NaN fudge to avoid Popcorn track event corruption.)
- canplaythrough = false,
- error = null, // The MediaError object.
-
- dispatchDurationChange = function() {
- if(ready) {
- if(DEBUG) console.log('Dispatched event : durationchange : ' + duration);
- media.dispatchEvent('durationchange');
- } else {
- if(DEBUG) console.log('DELAYED EVENT (!ready) : durationchange : ' + duration);
- clearTimeout(durationchangeId); // Stop multiple triggers causing multiple timeouts running in parallel.
- durationchangeId = setTimeout(dispatchDurationChange, 250);
- }
- },
-
- jPlayerFlashEventsPatch = function() {
-
- /* Events already supported by jPlayer Flash:
- * loadstart
- * loadedmetadata (M4A, M4V)
- * progress
- * play
- * pause
- * seeking
- * seeked
- * timeupdate
- * ended
- * volumechange
- * error <- See the custom handler in jPlayerInit()
- */
-
- /* Events patched:
- * loadeddata
- * durationchange
- * canplaythrough
- * playing
- */
-
- /* Events NOT patched:
- * suspend
- * abort
- * emptied
- * stalled
- * loadedmetadata (MP3)
- * waiting
- * canplay
- * ratechange
- */
-
- // Triggering patched events through the jPlayer Object so the events are homogeneous. ie., The contain the event.jPlayer data structure.
-
- var checkDuration = function(event) {
- if(event.jPlayer.status.duration !== duration) {
- duration = event.jPlayer.status.duration;
- dispatchDurationChange();
- }
- },
-
- checkCanPlayThrough = function(event) {
- if(!canplaythrough && event.jPlayer.status.seekPercent === 100) {
- canplaythrough = true;
- setTimeout(function() {
- if(DEBUG) console.log('Trigger : canplaythrough');
- jPlayerObj._trigger($.jPlayer.event.canplaythrough);
- }, 0);
- }
- };
-
- myPlayer.bind($.jPlayer.event.loadstart, function() {
- setTimeout(function() {
- if(DEBUG) console.log('Trigger : loadeddata');
- jPlayerObj._trigger($.jPlayer.event.loadeddata);
- }, 0);
- })
- .bind($.jPlayer.event.progress, function(event) {
- checkDuration(event);
- checkCanPlayThrough(event);
- })
- .bind($.jPlayer.event.timeupdate, function(event) {
- checkDuration(event);
- checkCanPlayThrough(event);
- })
- .bind($.jPlayer.event.play, function() {
- setTimeout(function() {
- if(DEBUG) console.log('Trigger : playing');
- jPlayerObj._trigger($.jPlayer.event.playing);
- }, 0);
- });
-
- if(DEBUG) console.log('Created CUSTOM event handlers for FLASH');
- },
-
- jPlayerInit = function() {
- (function($) {
-
- myPlayer = $('#' + media.id);
-
- if(typeof media.src === 'string') {
- mediaType = getMediaType(media.src);
- jpMedia[mediaType] = media.src;
- jpOptions.supplied = mediaType;
- jpOptions.solution = SOLUTION;
- } else if(isObject(media.src)) {
- jpMedia = isObject(media.src.media) ? media.src.media : {};
- jpOptions = isObject(media.src.options) ? media.src.options : {};
- jpOptions.solution = jpOptions.solution || SOLUTION;
- jpOptions.supplied = jpOptions.supplied || getSupplied(media.src.media);
- }
-
- // Allow the swfPath to be set to local server. ie., If the jPlayer Plugin is local and already on the page, then you can also use the local SWF.
- jpOptions.swfPath = jpOptions.swfPath || JPLAYER_SWFPATH;
-
- myPlayer.bind($.jPlayer.event.ready, function(event) {
- if(event.jPlayer.flash.used) {
- jPlayerFlashEventsPatch();
- }
- // Set the media andd load it, so that the Flash solution behaves similar to HTML5 solution.
- // This also allows the loadstart event to be used to know jPlayer is ready.
- $(this).jPlayer('setMedia', jpMedia).jPlayer('load');
- });
-
- // Do not auto-bubble the reserved events, nor the loadeddata and durationchange event, since the duration must be carefully handled when loadeddata event occurs.
- // See the duration property code for more details. (Ranting.)
-
- var reservedEvents = $.jPlayer.reservedEvent + ' loadeddata durationchange',
- reservedEvent = reservedEvents.split(/\s+/g);
-
- // Generate event handlers for all the standard HTML5 media events. (Except durationchange)
-
- var bindEvent = function(name) {
- myPlayer.bind($.jPlayer.event[name], function(event) {
- if(DEBUG) console.log('Dispatched event: ' + name + (event && event.jPlayer ? ' (' + event.jPlayer.status.currentTime + 's)' : '')); // Must be after dispatch for some reason on Firefox/Opera
- media.dispatchEvent(name);
- });
- if(DEBUG) console.log('Created event handler for: ' + name);
- };
-
- for(var eventName in $.jPlayer.event) {
- if($.jPlayer.event.hasOwnProperty(eventName)) {
- var nativeEvent = true;
- for(var iRes in reservedEvent) {
- if(reservedEvent.hasOwnProperty(iRes)) {
- if(reservedEvent[iRes] === eventName) {
- nativeEvent = false;
- break;
- }
- }
- }
- if(nativeEvent) {
- bindEvent(eventName);
- } else {
- if(DEBUG) console.log('Skipped auto event handler creation for: ' + eventName);
- }
- }
- }
-
- myPlayer.bind($.jPlayer.event.loadeddata, function(event) {
- if(DEBUG) console.log('Dispatched event: loadeddata' + (event && event.jPlayer ? ' (' + event.jPlayer.status.currentTime + 's)' : ''));
- media.dispatchEvent('loadeddata');
- ready = true;
- });
- if(DEBUG) console.log('Created CUSTOM event handler for: loadeddata');
-
- myPlayer.bind($.jPlayer.event.durationchange, function(event) {
- duration = event.jPlayer.status.duration;
- dispatchDurationChange();
- });
- if(DEBUG) console.log('Created CUSTOM event handler for: durationchange');
-
- // The error event is a special case. Plus jPlayer error event assumes it is a broken URL. (It could also be a decoder error... Or aborted or a Network error.)
- myPlayer.bind($.jPlayer.event.error, function(event) {
- // Not sure how to handle the error situation. Popcorn does not appear to have the error or error.code property documented here: http://popcornjs.org/popcorn-docs/media-methods/
- // If any error event happens, then something has gone pear shaped.
-
- error = event.jPlayer.error; // Saving object pointer, not a copy of the object. Possible garbage collection issue... But the player is dead anyway, so don't care.
-
- if(error.type === $.jPlayer.error.URL) {
- error.code = 4; // MEDIA_ERR_SRC_NOT_SUPPORTED since jPlayer makes this assumption. It is the most common error, then the decode error. Never seen either of the other 2 error types occur.
- } else {
- error.code = 0; // It was a jPlayer error, not an HTML5 media error.
- }
-
- if(DEBUG) console.log('Dispatched event: error');
- if(DEBUG) console.dir(error);
- media.dispatchEvent('error');
- });
- if(DEBUG) console.log('Created CUSTOM event handler for: error');
-
- Popcorn.player.defineProperty( media, 'error', {
- set: function() {
- // Read-only property
- return error;
- },
- get: function() {
- return error;
- }
- });
-
- Popcorn.player.defineProperty( media, 'currentTime', {
- set: function( val ) {
- if(jPlayerObj.status.paused) {
- myPlayer.jPlayer('pause', val);
- } else {
- myPlayer.jPlayer('play', val);
- }
- return val;
- },
- get: function() {
- return jPlayerObj.status.currentTime;
- }
- });
-
- /* The joy of duration and the loadeddata event isReady() handler
- * The duration is assumed to be a NaN or a valid duration.
- * jPlayer uses zero instead of a NaN and this screws up the Popcorn track event start/end arrays padding.
- * This line here:
- * videoDurationPlus = duration != duration ? Number.MAX_VALUE : duration + 1;
- * Not sure why it is not simply:
- * videoDurationPlus = Number.MAX_VALUE; // Who cares if the padding is close to the real duration?
- * So if you trigger loadeddata before the duration is correct, the track event padding is screwed up. (It pads the start, not the end... Well, duration+1 = 0+1 = 1s)
- * That line makes the MP3 Flash fallback difficult to setup. The whole MP3 will need to load before the duration is known.
- * Planning on using a NaN for duration until a >0 value is found... Except with MP3, where seekPercent must be 100% before setting the duration.
- * Why not just use a NaN during init... And then correct the duration later?
- */
-
- Popcorn.player.defineProperty( media, 'duration', {
- set: function() {
- // Read-only property
- if(ready) {
- return duration;
- } else {
- return NaN;
- }
- },
- get: function() {
- if(ready) {
- return duration; // Popcorn has initialized, we can now use duration zero or whatever without fear.
- } else {
- return NaN; // Keep the duration a NaN until after loadeddata event has occurred. Otherwise Popcorn track event padding is corrupted.
- }
- }
- });
-
- Popcorn.player.defineProperty( media, 'muted', {
- set: function( val ) {
- myPlayer.jPlayer('mute', val);
- return jPlayerObj.options.muted;
- },
- get: function() {
- return jPlayerObj.options.muted;
- }
- });
-
- Popcorn.player.defineProperty( media, 'volume', {
- set: function( val ) {
- myPlayer.jPlayer('volume', val);
- return jPlayerObj.options.volume;
- },
- get: function() {
- return jPlayerObj.options.volume;
- }
- });
-
- Popcorn.player.defineProperty( media, 'paused', {
- set: function() {
- // Read-only property
- return jPlayerObj.status.paused;
- },
- get: function() {
- return jPlayerObj.status.paused;
- }
- });
-
- media.play = function() {
- myPlayer.jPlayer('play');
- };
- media.pause = function() {
- myPlayer.jPlayer('pause');
- };
-
- myPlayer.jPlayer(jpOptions); // Instance jPlayer. Note that the options should not have a ready event defined... Kill it by default?
- jPlayerObj = myPlayer.data('jPlayer');
-
- }(jQuery));
- },
-
- jPlayerCheck = function() {
- if (!jQuery.jPlayer) {
- if (!jPlayerDownloading) {
- jPlayerDownloading = true;
- Popcorn.getScript(JPLAYER_SCRIPT, function() {
- jPlayerDownloading = false;
- jPlayerInit();
- });
- } else {
- setTimeout(jPlayerCheck, 250);
- }
- } else {
- jPlayerInit();
- }
- },
-
- jQueryCheck = function() {
- if (!window.jQuery) {
- if (!jQueryDownloading) {
- jQueryDownloading = true;
- Popcorn.getScript(JQUERY_SCRIPT, function() {
- jQueryDownloading = false;
- jPlayerCheck();
- });
- } else {
- setTimeout(jQueryCheck, 250);
- }
- } else {
- jPlayerCheck();
- }
- };
-
- jQueryCheck();
- },
- _teardown: function() {
- jQuery('#' + this.id).jPlayer('destroy');
- }
- });
-
-}(Popcorn));
\ No newline at end of file
diff --git a/10.大屏音乐/js/jquery.js b/10.大屏音乐/js/jquery.js
deleted file mode 100644
index 77e0821..0000000
--- a/10.大屏音乐/js/jquery.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v1.8.3 jquery.com | jquery.org/license */
-(function (e, t) { function _(e) { var t = M[e] = {}; return v.each(e.split(y), function (e, n) { t[n] = !0 }), t } function H(e, n, r) { if (r === t && e.nodeType === 1) { var i = "data-" + n.replace(P, "-$1").toLowerCase(); r = e.getAttribute(i); if (typeof r == "string") { try { r = r === "true" ? !0 : r === "false" ? !1 : r === "null" ? null : +r + "" === r ? +r : D.test(r) ? v.parseJSON(r) : r } catch (s) { } v.data(e, n, r) } else r = t } return r } function B(e) { var t; for (t in e) { if (t === "data" && v.isEmptyObject(e[t])) continue; if (t !== "toJSON") return !1 } return !0 } function et() { return !1 } function tt() { return !0 } function ut(e) { return !e || !e.parentNode || e.parentNode.nodeType === 11 } function at(e, t) { do e = e[t]; while (e && e.nodeType !== 1); return e } function ft(e, t, n) { t = t || 0; if (v.isFunction(t)) return v.grep(e, function (e, r) { var i = !!t.call(e, r, e); return i === n }); if (t.nodeType) return v.grep(e, function (e, r) { return e === t === n }); if (typeof t == "string") { var r = v.grep(e, function (e) { return e.nodeType === 1 }); if (it.test(t)) return v.filter(t, r, !n); t = v.filter(t, r) } return v.grep(e, function (e, r) { return v.inArray(e, t) >= 0 === n }) } function lt(e) { var t = ct.split("|"), n = e.createDocumentFragment(); if (n.createElement) while (t.length) n.createElement(t.pop()); return n } function Lt(e, t) { return e.getElementsByTagName(t)[0] || e.appendChild(e.ownerDocument.createElement(t)) } function At(e, t) { if (t.nodeType !== 1 || !v.hasData(e)) return; var n, r, i, s = v._data(e), o = v._data(t, s), u = s.events; if (u) { delete o.handle, o.events = {}; for (n in u) for (r = 0, i = u[n].length; r < i; r++)v.event.add(t, n, u[n][r]) } o.data && (o.data = v.extend({}, o.data)) } function Ot(e, t) { var n; if (t.nodeType !== 1) return; t.clearAttributes && t.clearAttributes(), t.mergeAttributes && t.mergeAttributes(e), n = t.nodeName.toLowerCase(), n === "object" ? (t.parentNode && (t.outerHTML = e.outerHTML), v.support.html5Clone && e.innerHTML && !v.trim(t.innerHTML) && (t.innerHTML = e.innerHTML)) : n === "input" && Et.test(e.type) ? (t.defaultChecked = t.checked = e.checked, t.value !== e.value && (t.value = e.value)) : n === "option" ? t.selected = e.defaultSelected : n === "input" || n === "textarea" ? t.defaultValue = e.defaultValue : n === "script" && t.text !== e.text && (t.text = e.text), t.removeAttribute(v.expando) } function Mt(e) { return typeof e.getElementsByTagName != "undefined" ? e.getElementsByTagName("*") : typeof e.querySelectorAll != "undefined" ? e.querySelectorAll("*") : [] } function _t(e) { Et.test(e.type) && (e.defaultChecked = e.checked) } function Qt(e, t) { if (t in e) return t; var n = t.charAt(0).toUpperCase() + t.slice(1), r = t, i = Jt.length; while (i--) { t = Jt[i] + n; if (t in e) return t } return r } function Gt(e, t) { return e = t || e, v.css(e, "display") === "none" || !v.contains(e.ownerDocument, e) } function Yt(e, t) { var n, r, i = [], s = 0, o = e.length; for (; s < o; s++) { n = e[s]; if (!n.style) continue; i[s] = v._data(n, "olddisplay"), t ? (!i[s] && n.style.display === "none" && (n.style.display = ""), n.style.display === "" && Gt(n) && (i[s] = v._data(n, "olddisplay", nn(n.nodeName)))) : (r = Dt(n, "display"), !i[s] && r !== "none" && v._data(n, "olddisplay", r)) } for (s = 0; s < o; s++) { n = e[s]; if (!n.style) continue; if (!t || n.style.display === "none" || n.style.display === "") n.style.display = t ? i[s] || "" : "none" } return e } function Zt(e, t, n) { var r = Rt.exec(t); return r ? Math.max(0, r[1] - (n || 0)) + (r[2] || "px") : t } function en(e, t, n, r) { var i = n === (r ? "border" : "content") ? 4 : t === "width" ? 1 : 0, s = 0; for (; i < 4; i += 2)n === "margin" && (s += v.css(e, n + $t[i], !0)), r ? (n === "content" && (s -= parseFloat(Dt(e, "padding" + $t[i])) || 0), n !== "margin" && (s -= parseFloat(Dt(e, "border" + $t[i] + "Width")) || 0)) : (s += parseFloat(Dt(e, "padding" + $t[i])) || 0, n !== "padding" && (s += parseFloat(Dt(e, "border" + $t[i] + "Width")) || 0)); return s } function tn(e, t, n) { var r = t === "width" ? e.offsetWidth : e.offsetHeight, i = !0, s = v.support.boxSizing && v.css(e, "boxSizing") === "border-box"; if (r <= 0 || r == null) { r = Dt(e, t); if (r < 0 || r == null) r = e.style[t]; if (Ut.test(r)) return r; i = s && (v.support.boxSizingReliable || r === e.style[t]), r = parseFloat(r) || 0 } return r + en(e, t, n || (s ? "border" : "content"), i) + "px" } function nn(e) { if (Wt[e]) return Wt[e]; var t = v("<" + e + ">").appendTo(i.body), n = t.css("display"); t.remove(); if (n === "none" || n === "") { Pt = i.body.appendChild(Pt || v.extend(i.createElement("iframe"), { frameBorder: 0, width: 0, height: 0 })); if (!Ht || !Pt.createElement) Ht = (Pt.contentWindow || Pt.contentDocument).document, Ht.write(""), Ht.close(); t = Ht.body.appendChild(Ht.createElement(e)), n = Dt(t, "display"), i.body.removeChild(Pt) } return Wt[e] = n, n } function fn(e, t, n, r) { var i; if (v.isArray(t)) v.each(t, function (t, i) { n || sn.test(e) ? r(e, i) : fn(e + "[" + (typeof i == "object" ? t : "") + "]", i, n, r) }); else if (!n && v.type(t) === "object") for (i in t) fn(e + "[" + i + "]", t[i], n, r); else r(e, t) } function Cn(e) { return function (t, n) { typeof t != "string" && (n = t, t = "*"); var r, i, s, o = t.toLowerCase().split(y), u = 0, a = o.length; if (v.isFunction(n)) for (; u < a; u++)r = o[u], s = /^\+/.test(r), s && (r = r.substr(1) || "*"), i = e[r] = e[r] || [], i[s ? "unshift" : "push"](n) } } function kn(e, n, r, i, s, o) { s = s || n.dataTypes[0], o = o || {}, o[s] = !0; var u, a = e[s], f = 0, l = a ? a.length : 0, c = e === Sn; for (; f < l && (c || !u); f++)u = a[f](n, r, i), typeof u == "string" && (!c || o[u] ? u = t : (n.dataTypes.unshift(u), u = kn(e, n, r, i, u, o))); return (c || !u) && !o["*"] && (u = kn(e, n, r, i, "*", o)), u } function Ln(e, n) { var r, i, s = v.ajaxSettings.flatOptions || {}; for (r in n) n[r] !== t && ((s[r] ? e : i || (i = {}))[r] = n[r]); i && v.extend(!0, e, i) } function An(e, n, r) { var i, s, o, u, a = e.contents, f = e.dataTypes, l = e.responseFields; for (s in l) s in r && (n[l[s]] = r[s]); while (f[0] === "*") f.shift(), i === t && (i = e.mimeType || n.getResponseHeader("content-type")); if (i) for (s in a) if (a[s] && a[s].test(i)) { f.unshift(s); break } if (f[0] in r) o = f[0]; else { for (s in r) { if (!f[0] || e.converters[s + " " + f[0]]) { o = s; break } u || (u = s) } o = o || u } if (o) return o !== f[0] && f.unshift(o), r[o] } function On(e, t) { var n, r, i, s, o = e.dataTypes.slice(), u = o[0], a = {}, f = 0; e.dataFilter && (t = e.dataFilter(t, e.dataType)); if (o[1]) for (n in e.converters) a[n.toLowerCase()] = e.converters[n]; for (; i = o[++f];)if (i !== "*") { if (u !== "*" && u !== i) { n = a[u + " " + i] || a["* " + i]; if (!n) for (r in a) { s = r.split(" "); if (s[1] === i) { n = a[u + " " + s[0]] || a["* " + s[0]]; if (n) { n === !0 ? n = a[r] : a[r] !== !0 && (i = s[0], o.splice(f--, 0, i)); break } } } if (n !== !0) if (n && e["throws"]) t = n(t); else try { t = n(t) } catch (l) { return { state: "parsererror", error: n ? l : "No conversion from " + u + " to " + i } } } u = i } return { state: "success", data: t } } function Fn() { try { return new e.XMLHttpRequest } catch (t) { } } function In() { try { return new e.ActiveXObject("Microsoft.XMLHTTP") } catch (t) { } } function $n() { return setTimeout(function () { qn = t }, 0), qn = v.now() } function Jn(e, t) { v.each(t, function (t, n) { var r = (Vn[t] || []).concat(Vn["*"]), i = 0, s = r.length; for (; i < s; i++)if (r[i].call(e, t, n)) return }) } function Kn(e, t, n) { var r, i = 0, s = 0, o = Xn.length, u = v.Deferred().always(function () { delete a.elem }), a = function () { var t = qn || $n(), n = Math.max(0, f.startTime + f.duration - t), r = n / f.duration || 0, i = 1 - r, s = 0, o = f.tweens.length; for (; s < o; s++)f.tweens[s].run(i); return u.notifyWith(e, [f, i, n]), i < 1 && o ? n : (u.resolveWith(e, [f]), !1) }, f = u.promise({ elem: e, props: v.extend({}, t), opts: v.extend(!0, { specialEasing: {} }, n), originalProperties: t, originalOptions: n, startTime: qn || $n(), duration: n.duration, tweens: [], createTween: function (t, n, r) { var i = v.Tween(e, f.opts, t, n, f.opts.specialEasing[t] || f.opts.easing); return f.tweens.push(i), i }, stop: function (t) { var n = 0, r = t ? f.tweens.length : 0; for (; n < r; n++)f.tweens[n].run(1); return t ? u.resolveWith(e, [f, t]) : u.rejectWith(e, [f, t]), this } }), l = f.props; Qn(l, f.opts.specialEasing); for (; i < o; i++) { r = Xn[i].call(f, e, l, f.opts); if (r) return r } return Jn(f, l), v.isFunction(f.opts.start) && f.opts.start.call(e, f), v.fx.timer(v.extend(a, { anim: f, queue: f.opts.queue, elem: e })), f.progress(f.opts.progress).done(f.opts.done, f.opts.complete).fail(f.opts.fail).always(f.opts.always) } function Qn(e, t) { var n, r, i, s, o; for (n in e) { r = v.camelCase(n), i = t[r], s = e[n], v.isArray(s) && (i = s[1], s = e[n] = s[0]), n !== r && (e[r] = s, delete e[n]), o = v.cssHooks[r]; if (o && "expand" in o) { s = o.expand(s), delete e[r]; for (n in s) n in e || (e[n] = s[n], t[n] = i) } else t[r] = i } } function Gn(e, t, n) { var r, i, s, o, u, a, f, l, c, h = this, p = e.style, d = {}, m = [], g = e.nodeType && Gt(e); n.queue || (l = v._queueHooks(e, "fx"), l.unqueued == null && (l.unqueued = 0, c = l.empty.fire, l.empty.fire = function () { l.unqueued || c() }), l.unqueued++ , h.always(function () { h.always(function () { l.unqueued-- , v.queue(e, "fx").length || l.empty.fire() }) })), e.nodeType === 1 && ("height" in t || "width" in t) && (n.overflow = [p.overflow, p.overflowX, p.overflowY], v.css(e, "display") === "inline" && v.css(e, "float") === "none" && (!v.support.inlineBlockNeedsLayout || nn(e.nodeName) === "inline" ? p.display = "inline-block" : p.zoom = 1)), n.overflow && (p.overflow = "hidden", v.support.shrinkWrapBlocks || h.done(function () { p.overflow = n.overflow[0], p.overflowX = n.overflow[1], p.overflowY = n.overflow[2] })); for (r in t) { s = t[r]; if (Un.exec(s)) { delete t[r], a = a || s === "toggle"; if (s === (g ? "hide" : "show")) continue; m.push(r) } } o = m.length; if (o) { u = v._data(e, "fxshow") || v._data(e, "fxshow", {}), "hidden" in u && (g = u.hidden), a && (u.hidden = !g), g ? v(e).show() : h.done(function () { v(e).hide() }), h.done(function () { var t; v.removeData(e, "fxshow", !0); for (t in d) v.style(e, t, d[t]) }); for (r = 0; r < o; r++)i = m[r], f = h.createTween(i, g ? u[i] : 0), d[i] = u[i] || v.style(e, i), i in u || (u[i] = f.start, g && (f.end = f.start, f.start = i === "width" || i === "height" ? 1 : 0)) } } function Yn(e, t, n, r, i) { return new Yn.prototype.init(e, t, n, r, i) } function Zn(e, t) { var n, r = { height: e }, i = 0; t = t ? 1 : 0; for (; i < 4; i += 2 - t)n = $t[i], r["margin" + n] = r["padding" + n] = e; return t && (r.opacity = r.width = e), r } function tr(e) { return v.isWindow(e) ? e : e.nodeType === 9 ? e.defaultView || e.parentWindow : !1 } var n, r, i = e.document, s = e.location, o = e.navigator, u = e.jQuery, a = e.$, f = Array.prototype.push, l = Array.prototype.slice, c = Array.prototype.indexOf, h = Object.prototype.toString, p = Object.prototype.hasOwnProperty, d = String.prototype.trim, v = function (e, t) { return new v.fn.init(e, t, n) }, m = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source, g = /\S/, y = /\s+/, b = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, w = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/, E = /^<(\w+)\s*\/?>(?:<\/\1>|)$/, S = /^[\],:{}\s]*$/, x = /(?:^|:|,)(?:\s*\[)+/g, T = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g, N = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g, C = /^-ms-/, k = /-([\da-z])/gi, L = function (e, t) { return (t + "").toUpperCase() }, A = function () { i.addEventListener ? (i.removeEventListener("DOMContentLoaded", A, !1), v.ready()) : i.readyState === "complete" && (i.detachEvent("onreadystatechange", A), v.ready()) }, O = {}; v.fn = v.prototype = { constructor: v, init: function (e, n, r) { var s, o, u, a; if (!e) return this; if (e.nodeType) return this.context = this[0] = e, this.length = 1, this; if (typeof e == "string") { e.charAt(0) === "<" && e.charAt(e.length - 1) === ">" && e.length >= 3 ? s = [null, e, null] : s = w.exec(e); if (s && (s[1] || !n)) { if (s[1]) return n = n instanceof v ? n[0] : n, a = n && n.nodeType ? n.ownerDocument || n : i, e = v.parseHTML(s[1], a, !0), E.test(s[1]) && v.isPlainObject(n) && this.attr.call(e, n, !0), v.merge(this, e); o = i.getElementById(s[2]); if (o && o.parentNode) { if (o.id !== s[2]) return r.find(e); this.length = 1, this[0] = o } return this.context = i, this.selector = e, this } return !n || n.jquery ? (n || r).find(e) : this.constructor(n).find(e) } return v.isFunction(e) ? r.ready(e) : (e.selector !== t && (this.selector = e.selector, this.context = e.context), v.makeArray(e, this)) }, selector: "", jquery: "1.8.3", length: 0, size: function () { return this.length }, toArray: function () { return l.call(this) }, get: function (e) { return e == null ? this.toArray() : e < 0 ? this[this.length + e] : this[e] }, pushStack: function (e, t, n) { var r = v.merge(this.constructor(), e); return r.prevObject = this, r.context = this.context, t === "find" ? r.selector = this.selector + (this.selector ? " " : "") + n : t && (r.selector = this.selector + "." + t + "(" + n + ")"), r }, each: function (e, t) { return v.each(this, e, t) }, ready: function (e) { return v.ready.promise().done(e), this }, eq: function (e) { return e = +e, e === -1 ? this.slice(e) : this.slice(e, e + 1) }, first: function () { return this.eq(0) }, last: function () { return this.eq(-1) }, slice: function () { return this.pushStack(l.apply(this, arguments), "slice", l.call(arguments).join(",")) }, map: function (e) { return this.pushStack(v.map(this, function (t, n) { return e.call(t, n, t) })) }, end: function () { return this.prevObject || this.constructor(null) }, push: f, sort: [].sort, splice: [].splice }, v.fn.init.prototype = v.fn, v.extend = v.fn.extend = function () { var e, n, r, i, s, o, u = arguments[0] || {}, a = 1, f = arguments.length, l = !1; typeof u == "boolean" && (l = u, u = arguments[1] || {}, a = 2), typeof u != "object" && !v.isFunction(u) && (u = {}), f === a && (u = this, --a); for (; a < f; a++)if ((e = arguments[a]) != null) for (n in e) { r = u[n], i = e[n]; if (u === i) continue; l && i && (v.isPlainObject(i) || (s = v.isArray(i))) ? (s ? (s = !1, o = r && v.isArray(r) ? r : []) : o = r && v.isPlainObject(r) ? r : {}, u[n] = v.extend(l, o, i)) : i !== t && (u[n] = i) } return u }, v.extend({ noConflict: function (t) { return e.$ === v && (e.$ = a), t && e.jQuery === v && (e.jQuery = u), v }, isReady: !1, readyWait: 1, holdReady: function (e) { e ? v.readyWait++ : v.ready(!0) }, ready: function (e) { if (e === !0 ? --v.readyWait : v.isReady) return; if (!i.body) return setTimeout(v.ready, 1); v.isReady = !0; if (e !== !0 && --v.readyWait > 0) return; r.resolveWith(i, [v]), v.fn.trigger && v(i).trigger("ready").off("ready") }, isFunction: function (e) { return v.type(e) === "function" }, isArray: Array.isArray || function (e) { return v.type(e) === "array" }, isWindow: function (e) { return e != null && e == e.window }, isNumeric: function (e) { return !isNaN(parseFloat(e)) && isFinite(e) }, type: function (e) { return e == null ? String(e) : O[h.call(e)] || "object" }, isPlainObject: function (e) { if (!e || v.type(e) !== "object" || e.nodeType || v.isWindow(e)) return !1; try { if (e.constructor && !p.call(e, "constructor") && !p.call(e.constructor.prototype, "isPrototypeOf")) return !1 } catch (n) { return !1 } var r; for (r in e); return r === t || p.call(e, r) }, isEmptyObject: function (e) { var t; for (t in e) return !1; return !0 }, error: function (e) { throw new Error(e) }, parseHTML: function (e, t, n) { var r; return !e || typeof e != "string" ? null : (typeof t == "boolean" && (n = t, t = 0), t = t || i, (r = E.exec(e)) ? [t.createElement(r[1])] : (r = v.buildFragment([e], t, n ? null : []), v.merge([], (r.cacheable ? v.clone(r.fragment) : r.fragment).childNodes))) }, parseJSON: function (t) { if (!t || typeof t != "string") return null; t = v.trim(t); if (e.JSON && e.JSON.parse) return e.JSON.parse(t); if (S.test(t.replace(T, "@").replace(N, "]").replace(x, ""))) return (new Function("return " + t))(); v.error("Invalid JSON: " + t) }, parseXML: function (n) { var r, i; if (!n || typeof n != "string") return null; try { e.DOMParser ? (i = new DOMParser, r = i.parseFromString(n, "text/xml")) : (r = new ActiveXObject("Microsoft.XMLDOM"), r.async = "false", r.loadXML(n)) } catch (s) { r = t } return (!r || !r.documentElement || r.getElementsByTagName("parsererror").length) && v.error("Invalid XML: " + n), r }, noop: function () { }, globalEval: function (t) { t && g.test(t) && (e.execScript || function (t) { e.eval.call(e, t) })(t) }, camelCase: function (e) { return e.replace(C, "ms-").replace(k, L) }, nodeName: function (e, t) { return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() }, each: function (e, n, r) { var i, s = 0, o = e.length, u = o === t || v.isFunction(e); if (r) { if (u) { for (i in e) if (n.apply(e[i], r) === !1) break } else for (; s < o;)if (n.apply(e[s++], r) === !1) break } else if (u) { for (i in e) if (n.call(e[i], i, e[i]) === !1) break } else for (; s < o;)if (n.call(e[s], s, e[s++]) === !1) break; return e }, trim: d && !d.call("\ufeff\u00a0") ? function (e) { return e == null ? "" : d.call(e) } : function (e) { return e == null ? "" : (e + "").replace(b, "") }, makeArray: function (e, t) { var n, r = t || []; return e != null && (n = v.type(e), e.length == null || n === "string" || n === "function" || n === "regexp" || v.isWindow(e) ? f.call(r, e) : v.merge(r, e)), r }, inArray: function (e, t, n) { var r; if (t) { if (c) return c.call(t, e, n); r = t.length, n = n ? n < 0 ? Math.max(0, r + n) : n : 0; for (; n < r; n++)if (n in t && t[n] === e) return n } return -1 }, merge: function (e, n) { var r = n.length, i = e.length, s = 0; if (typeof r == "number") for (; s < r; s++)e[i++] = n[s]; else while (n[s] !== t) e[i++] = n[s++]; return e.length = i, e }, grep: function (e, t, n) { var r, i = [], s = 0, o = e.length; n = !!n; for (; s < o; s++)r = !!t(e[s], s), n !== r && i.push(e[s]); return i }, map: function (e, n, r) { var i, s, o = [], u = 0, a = e.length, f = e instanceof v || a !== t && typeof a == "number" && (a > 0 && e[0] && e[a - 1] || a === 0 || v.isArray(e)); if (f) for (; u < a; u++)i = n(e[u], u, r), i != null && (o[o.length] = i); else for (s in e) i = n(e[s], s, r), i != null && (o[o.length] = i); return o.concat.apply([], o) }, guid: 1, proxy: function (e, n) { var r, i, s; return typeof n == "string" && (r = e[n], n = e, e = r), v.isFunction(e) ? (i = l.call(arguments, 2), s = function () { return e.apply(n, i.concat(l.call(arguments))) }, s.guid = e.guid = e.guid || v.guid++ , s) : t }, access: function (e, n, r, i, s, o, u) { var a, f = r == null, l = 0, c = e.length; if (r && typeof r == "object") { for (l in r) v.access(e, n, l, r[l], 1, o, i); s = 1 } else if (i !== t) { a = u === t && v.isFunction(i), f && (a ? (a = n, n = function (e, t, n) { return a.call(v(e), n) }) : (n.call(e, i), n = null)); if (n) for (; l < c; l++)n(e[l], r, a ? i.call(e[l], l, n(e[l], r)) : i, u); s = 1 } return s ? e : f ? n.call(e) : c ? n(e[0], r) : o }, now: function () { return (new Date).getTime() } }), v.ready.promise = function (t) { if (!r) { r = v.Deferred(); if (i.readyState === "complete") setTimeout(v.ready, 1); else if (i.addEventListener) i.addEventListener("DOMContentLoaded", A, !1), e.addEventListener("load", v.ready, !1); else { i.attachEvent("onreadystatechange", A), e.attachEvent("onload", v.ready); var n = !1; try { n = e.frameElement == null && i.documentElement } catch (s) { } n && n.doScroll && function o() { if (!v.isReady) { try { n.doScroll("left") } catch (e) { return setTimeout(o, 50) } v.ready() } }() } } return r.promise(t) }, v.each("Boolean Number String Function Array Date RegExp Object".split(" "), function (e, t) { O["[object " + t + "]"] = t.toLowerCase() }), n = v(i); var M = {}; v.Callbacks = function (e) { e = typeof e == "string" ? M[e] || _(e) : v.extend({}, e); var n, r, i, s, o, u, a = [], f = !e.once && [], l = function (t) { n = e.memory && t, r = !0, u = s || 0, s = 0, o = a.length, i = !0; for (; a && u < o; u++)if (a[u].apply(t[0], t[1]) === !1 && e.stopOnFalse) { n = !1; break } i = !1, a && (f ? f.length && l(f.shift()) : n ? a = [] : c.disable()) }, c = { add: function () { if (a) { var t = a.length; (function r(t) { v.each(t, function (t, n) { var i = v.type(n); i === "function" ? (!e.unique || !c.has(n)) && a.push(n) : n && n.length && i !== "string" && r(n) }) })(arguments), i ? o = a.length : n && (s = t, l(n)) } return this }, remove: function () { return a && v.each(arguments, function (e, t) { var n; while ((n = v.inArray(t, a, n)) > -1) a.splice(n, 1), i && (n <= o && o-- , n <= u && u--) }), this }, has: function (e) { return v.inArray(e, a) > -1 }, empty: function () { return a = [], this }, disable: function () { return a = f = n = t, this }, disabled: function () { return !a }, lock: function () { return f = t, n || c.disable(), this }, locked: function () { return !f }, fireWith: function (e, t) { return t = t || [], t = [e, t.slice ? t.slice() : t], a && (!r || f) && (i ? f.push(t) : l(t)), this }, fire: function () { return c.fireWith(this, arguments), this }, fired: function () { return !!r } }; return c }, v.extend({ Deferred: function (e) { var t = [["resolve", "done", v.Callbacks("once memory"), "resolved"], ["reject", "fail", v.Callbacks("once memory"), "rejected"], ["notify", "progress", v.Callbacks("memory")]], n = "pending", r = { state: function () { return n }, always: function () { return i.done(arguments).fail(arguments), this }, then: function () { var e = arguments; return v.Deferred(function (n) { v.each(t, function (t, r) { var s = r[0], o = e[t]; i[r[1]](v.isFunction(o) ? function () { var e = o.apply(this, arguments); e && v.isFunction(e.promise) ? e.promise().done(n.resolve).fail(n.reject).progress(n.notify) : n[s + "With"](this === i ? n : this, [e]) } : n[s]) }), e = null }).promise() }, promise: function (e) { return e != null ? v.extend(e, r) : r } }, i = {}; return r.pipe = r.then, v.each(t, function (e, s) { var o = s[2], u = s[3]; r[s[1]] = o.add, u && o.add(function () { n = u }, t[e ^ 1][2].disable, t[2][2].lock), i[s[0]] = o.fire, i[s[0] + "With"] = o.fireWith }), r.promise(i), e && e.call(i, i), i }, when: function (e) { var t = 0, n = l.call(arguments), r = n.length, i = r !== 1 || e && v.isFunction(e.promise) ? r : 0, s = i === 1 ? e : v.Deferred(), o = function (e, t, n) { return function (r) { t[e] = this, n[e] = arguments.length > 1 ? l.call(arguments) : r, n === u ? s.notifyWith(t, n) : --i || s.resolveWith(t, n) } }, u, a, f; if (r > 1) { u = new Array(r), a = new Array(r), f = new Array(r); for (; t < r; t++)n[t] && v.isFunction(n[t].promise) ? n[t].promise().done(o(t, f, n)).fail(s.reject).progress(o(t, a, u)) : --i } return i || s.resolveWith(f, n), s.promise() } }), v.support = function () { var t, n, r, s, o, u, a, f, l, c, h, p = i.createElement("div"); p.setAttribute("className", "t"), p.innerHTML = "
a", n = p.getElementsByTagName("*"), r = p.getElementsByTagName("a")[0]; if (!n || !r || !n.length) return {}; s = i.createElement("select"), o = s.appendChild(i.createElement("option")), u = p.getElementsByTagName("input")[0], r.style.cssText = "top:1px;float:left;opacity:.5", t = { leadingWhitespace: p.firstChild.nodeType === 3, tbody: !p.getElementsByTagName("tbody").length, htmlSerialize: !!p.getElementsByTagName("link").length, style: /top/.test(r.getAttribute("style")), hrefNormalized: r.getAttribute("href") === "/a", opacity: /^0.5/.test(r.style.opacity), cssFloat: !!r.style.cssFloat, checkOn: u.value === "on", optSelected: o.selected, getSetAttribute: p.className !== "t", enctype: !!i.createElement("form").enctype, html5Clone: i.createElement("nav").cloneNode(!0).outerHTML !== "<:nav>", boxModel: i.compatMode === "CSS1Compat", submitBubbles: !0, changeBubbles: !0, focusinBubbles: !1, deleteExpando: !0, noCloneEvent: !0, inlineBlockNeedsLayout: !1, shrinkWrapBlocks: !1, reliableMarginRight: !0, boxSizingReliable: !0, pixelPosition: !1 }, u.checked = !0, t.noCloneChecked = u.cloneNode(!0).checked, s.disabled = !0, t.optDisabled = !o.disabled; try { delete p.test } catch (d) { t.deleteExpando = !1 } !p.addEventListener && p.attachEvent && p.fireEvent && (p.attachEvent("onclick", h = function () { t.noCloneEvent = !1 }), p.cloneNode(!0).fireEvent("onclick"), p.detachEvent("onclick", h)), u = i.createElement("input"), u.value = "t", u.setAttribute("type", "radio"), t.radioValue = u.value === "t", u.setAttribute("checked", "checked"), u.setAttribute("name", "t"), p.appendChild(u), a = i.createDocumentFragment(), a.appendChild(p.lastChild), t.checkClone = a.cloneNode(!0).cloneNode(!0).lastChild.checked, t.appendChecked = u.checked, a.removeChild(u), a.appendChild(p); if (p.attachEvent) for (l in { submit: !0, change: !0, focusin: !0 }) f = "on" + l, c = f in p, c || (p.setAttribute(f, "return;"), c = typeof p[f] == "function"), t[l + "Bubbles"] = c; return v(function () { var n, r, s, o, u = "padding:0;margin:0;border:0;display:block;overflow:hidden;", a = i.getElementsByTagName("body")[0]; if (!a) return; n = i.createElement("div"), n.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px", a.insertBefore(n, a.firstChild), r = i.createElement("div"), n.appendChild(r), r.innerHTML = "
t
", s = r.getElementsByTagName("td"), s[0].style.cssText = "padding:0;margin:0;border:0;display:none", c = s[0].offsetHeight === 0, s[0].style.display = "", s[1].style.display = "none", t.reliableHiddenOffsets = c && s[0].offsetHeight === 0, r.innerHTML = "", r.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;", t.boxSizing = r.offsetWidth === 4, t.doesNotIncludeMarginInBodyOffset = a.offsetTop !== 1, e.getComputedStyle && (t.pixelPosition = (e.getComputedStyle(r, null) || {}).top !== "1%", t.boxSizingReliable = (e.getComputedStyle(r, null) || { width: "4px" }).width === "4px", o = i.createElement("div"), o.style.cssText = r.style.cssText = u, o.style.marginRight = o.style.width = "0", r.style.width = "1px", r.appendChild(o), t.reliableMarginRight = !parseFloat((e.getComputedStyle(o, null) || {}).marginRight)), typeof r.style.zoom != "undefined" && (r.innerHTML = "", r.style.cssText = u + "width:1px;padding:1px;display:inline;zoom:1", t.inlineBlockNeedsLayout = r.offsetWidth === 3, r.style.display = "block", r.style.overflow = "visible", r.innerHTML = "", r.firstChild.style.width = "5px", t.shrinkWrapBlocks = r.offsetWidth !== 3, n.style.zoom = 1), a.removeChild(n), n = r = s = o = null }), a.removeChild(p), n = r = s = o = u = a = p = null, t }(); var D = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/, P = /([A-Z])/g; v.extend({ cache: {}, deletedIds: [], uuid: 0, expando: "jQuery" + (v.fn.jquery + Math.random()).replace(/\D/g, ""), noData: { embed: !0, object: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000", applet: !0 }, hasData: function (e) { return e = e.nodeType ? v.cache[e[v.expando]] : e[v.expando], !!e && !B(e) }, data: function (e, n, r, i) { if (!v.acceptData(e)) return; var s, o, u = v.expando, a = typeof n == "string", f = e.nodeType, l = f ? v.cache : e, c = f ? e[u] : e[u] && u; if ((!c || !l[c] || !i && !l[c].data) && a && r === t) return; c || (f ? e[u] = c = v.deletedIds.pop() || v.guid++ : c = u), l[c] || (l[c] = {}, f || (l[c].toJSON = v.noop)); if (typeof n == "object" || typeof n == "function") i ? l[c] = v.extend(l[c], n) : l[c].data = v.extend(l[c].data, n); return s = l[c], i || (s.data || (s.data = {}), s = s.data), r !== t && (s[v.camelCase(n)] = r), a ? (o = s[n], o == null && (o = s[v.camelCase(n)])) : o = s, o }, removeData: function (e, t, n) { if (!v.acceptData(e)) return; var r, i, s, o = e.nodeType, u = o ? v.cache : e, a = o ? e[v.expando] : v.expando; if (!u[a]) return; if (t) { r = n ? u[a] : u[a].data; if (r) { v.isArray(t) || (t in r ? t = [t] : (t = v.camelCase(t), t in r ? t = [t] : t = t.split(" "))); for (i = 0, s = t.length; i < s; i++)delete r[t[i]]; if (!(n ? B : v.isEmptyObject)(r)) return } } if (!n) { delete u[a].data; if (!B(u[a])) return } o ? v.cleanData([e], !0) : v.support.deleteExpando || u != u.window ? delete u[a] : u[a] = null }, _data: function (e, t, n) { return v.data(e, t, n, !0) }, acceptData: function (e) { var t = e.nodeName && v.noData[e.nodeName.toLowerCase()]; return !t || t !== !0 && e.getAttribute("classid") === t } }), v.fn.extend({ data: function (e, n) { var r, i, s, o, u, a = this[0], f = 0, l = null; if (e === t) { if (this.length) { l = v.data(a); if (a.nodeType === 1 && !v._data(a, "parsedAttrs")) { s = a.attributes; for (u = s.length; f < u; f++)o = s[f].name, o.indexOf("data-") || (o = v.camelCase(o.substring(5)), H(a, o, l[o])); v._data(a, "parsedAttrs", !0) } } return l } return typeof e == "object" ? this.each(function () { v.data(this, e) }) : (r = e.split(".", 2), r[1] = r[1] ? "." + r[1] : "", i = r[1] + "!", v.access(this, function (n) { if (n === t) return l = this.triggerHandler("getData" + i, [r[0]]), l === t && a && (l = v.data(a, e), l = H(a, e, l)), l === t && r[1] ? this.data(r[0]) : l; r[1] = n, this.each(function () { var t = v(this); t.triggerHandler("setData" + i, r), v.data(this, e, n), t.triggerHandler("changeData" + i, r) }) }, null, n, arguments.length > 1, null, !1)) }, removeData: function (e) { return this.each(function () { v.removeData(this, e) }) } }), v.extend({ queue: function (e, t, n) { var r; if (e) return t = (t || "fx") + "queue", r = v._data(e, t), n && (!r || v.isArray(n) ? r = v._data(e, t, v.makeArray(n)) : r.push(n)), r || [] }, dequeue: function (e, t) { t = t || "fx"; var n = v.queue(e, t), r = n.length, i = n.shift(), s = v._queueHooks(e, t), o = function () { v.dequeue(e, t) }; i === "inprogress" && (i = n.shift(), r--), i && (t === "fx" && n.unshift("inprogress"), delete s.stop, i.call(e, o, s)), !r && s && s.empty.fire() }, _queueHooks: function (e, t) { var n = t + "queueHooks"; return v._data(e, n) || v._data(e, n, { empty: v.Callbacks("once memory").add(function () { v.removeData(e, t + "queue", !0), v.removeData(e, n, !0) }) }) } }), v.fn.extend({ queue: function (e, n) { var r = 2; return typeof e != "string" && (n = e, e = "fx", r--), arguments.length < r ? v.queue(this[0], e) : n === t ? this : this.each(function () { var t = v.queue(this, e, n); v._queueHooks(this, e), e === "fx" && t[0] !== "inprogress" && v.dequeue(this, e) }) }, dequeue: function (e) { return this.each(function () { v.dequeue(this, e) }) }, delay: function (e, t) { return e = v.fx ? v.fx.speeds[e] || e : e, t = t || "fx", this.queue(t, function (t, n) { var r = setTimeout(t, e); n.stop = function () { clearTimeout(r) } }) }, clearQueue: function (e) { return this.queue(e || "fx", []) }, promise: function (e, n) { var r, i = 1, s = v.Deferred(), o = this, u = this.length, a = function () { --i || s.resolveWith(o, [o]) }; typeof e != "string" && (n = e, e = t), e = e || "fx"; while (u--) r = v._data(o[u], e + "queueHooks"), r && r.empty && (i++ , r.empty.add(a)); return a(), s.promise(n) } }); var j, F, I, q = /[\t\r\n]/g, R = /\r/g, U = /^(?:button|input)$/i, z = /^(?:button|input|object|select|textarea)$/i, W = /^a(?:rea|)$/i, X = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, V = v.support.getSetAttribute; v.fn.extend({ attr: function (e, t) { return v.access(this, v.attr, e, t, arguments.length > 1) }, removeAttr: function (e) { return this.each(function () { v.removeAttr(this, e) }) }, prop: function (e, t) { return v.access(this, v.prop, e, t, arguments.length > 1) }, removeProp: function (e) { return e = v.propFix[e] || e, this.each(function () { try { this[e] = t, delete this[e] } catch (n) { } }) }, addClass: function (e) { var t, n, r, i, s, o, u; if (v.isFunction(e)) return this.each(function (t) { v(this).addClass(e.call(this, t, this.className)) }); if (e && typeof e == "string") { t = e.split(y); for (n = 0, r = this.length; n < r; n++) { i = this[n]; if (i.nodeType === 1) if (!i.className && t.length === 1) i.className = e; else { s = " " + i.className + " "; for (o = 0, u = t.length; o < u; o++)s.indexOf(" " + t[o] + " ") < 0 && (s += t[o] + " "); i.className = v.trim(s) } } } return this }, removeClass: function (e) { var n, r, i, s, o, u, a; if (v.isFunction(e)) return this.each(function (t) { v(this).removeClass(e.call(this, t, this.className)) }); if (e && typeof e == "string" || e === t) { n = (e || "").split(y); for (u = 0, a = this.length; u < a; u++) { i = this[u]; if (i.nodeType === 1 && i.className) { r = (" " + i.className + " ").replace(q, " "); for (s = 0, o = n.length; s < o; s++)while (r.indexOf(" " + n[s] + " ") >= 0) r = r.replace(" " + n[s] + " ", " "); i.className = e ? v.trim(r) : "" } } } return this }, toggleClass: function (e, t) { var n = typeof e, r = typeof t == "boolean"; return v.isFunction(e) ? this.each(function (n) { v(this).toggleClass(e.call(this, n, this.className, t), t) }) : this.each(function () { if (n === "string") { var i, s = 0, o = v(this), u = t, a = e.split(y); while (i = a[s++]) u = r ? u : !o.hasClass(i), o[u ? "addClass" : "removeClass"](i) } else if (n === "undefined" || n === "boolean") this.className && v._data(this, "__className__", this.className), this.className = this.className || e === !1 ? "" : v._data(this, "__className__") || "" }) }, hasClass: function (e) { var t = " " + e + " ", n = 0, r = this.length; for (; n < r; n++)if (this[n].nodeType === 1 && (" " + this[n].className + " ").replace(q, " ").indexOf(t) >= 0) return !0; return !1 }, val: function (e) { var n, r, i, s = this[0]; if (!arguments.length) { if (s) return n = v.valHooks[s.type] || v.valHooks[s.nodeName.toLowerCase()], n && "get" in n && (r = n.get(s, "value")) !== t ? r : (r = s.value, typeof r == "string" ? r.replace(R, "") : r == null ? "" : r); return } return i = v.isFunction(e), this.each(function (r) { var s, o = v(this); if (this.nodeType !== 1) return; i ? s = e.call(this, r, o.val()) : s = e, s == null ? s = "" : typeof s == "number" ? s += "" : v.isArray(s) && (s = v.map(s, function (e) { return e == null ? "" : e + "" })), n = v.valHooks[this.type] || v.valHooks[this.nodeName.toLowerCase()]; if (!n || !("set" in n) || n.set(this, s, "value") === t) this.value = s }) } }), v.extend({ valHooks: { option: { get: function (e) { var t = e.attributes.value; return !t || t.specified ? e.value : e.text } }, select: { get: function (e) { var t, n, r = e.options, i = e.selectedIndex, s = e.type === "select-one" || i < 0, o = s ? null : [], u = s ? i + 1 : r.length, a = i < 0 ? u : s ? i : 0; for (; a < u; a++) { n = r[a]; if ((n.selected || a === i) && (v.support.optDisabled ? !n.disabled : n.getAttribute("disabled") === null) && (!n.parentNode.disabled || !v.nodeName(n.parentNode, "optgroup"))) { t = v(n).val(); if (s) return t; o.push(t) } } return o }, set: function (e, t) { var n = v.makeArray(t); return v(e).find("option").each(function () { this.selected = v.inArray(v(this).val(), n) >= 0 }), n.length || (e.selectedIndex = -1), n } } }, attrFn: {}, attr: function (e, n, r, i) { var s, o, u, a = e.nodeType; if (!e || a === 3 || a === 8 || a === 2) return; if (i && v.isFunction(v.fn[n])) return v(e)[n](r); if (typeof e.getAttribute == "undefined") return v.prop(e, n, r); u = a !== 1 || !v.isXMLDoc(e), u && (n = n.toLowerCase(), o = v.attrHooks[n] || (X.test(n) ? F : j)); if (r !== t) { if (r === null) { v.removeAttr(e, n); return } return o && "set" in o && u && (s = o.set(e, r, n)) !== t ? s : (e.setAttribute(n, r + ""), r) } return o && "get" in o && u && (s = o.get(e, n)) !== null ? s : (s = e.getAttribute(n), s === null ? t : s) }, removeAttr: function (e, t) { var n, r, i, s, o = 0; if (t && e.nodeType === 1) { r = t.split(y); for (; o < r.length; o++)i = r[o], i && (n = v.propFix[i] || i, s = X.test(i), s || v.attr(e, i, ""), e.removeAttribute(V ? i : n), s && n in e && (e[n] = !1)) } }, attrHooks: { type: { set: function (e, t) { if (U.test(e.nodeName) && e.parentNode) v.error("type property can't be changed"); else if (!v.support.radioValue && t === "radio" && v.nodeName(e, "input")) { var n = e.value; return e.setAttribute("type", t), n && (e.value = n), t } } }, value: { get: function (e, t) { return j && v.nodeName(e, "button") ? j.get(e, t) : t in e ? e.value : null }, set: function (e, t, n) { if (j && v.nodeName(e, "button")) return j.set(e, t, n); e.value = t } } }, propFix: { tabindex: "tabIndex", readonly: "readOnly", "for": "htmlFor", "class": "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, prop: function (e, n, r) { var i, s, o, u = e.nodeType; if (!e || u === 3 || u === 8 || u === 2) return; return o = u !== 1 || !v.isXMLDoc(e), o && (n = v.propFix[n] || n, s = v.propHooks[n]), r !== t ? s && "set" in s && (i = s.set(e, r, n)) !== t ? i : e[n] = r : s && "get" in s && (i = s.get(e, n)) !== null ? i : e[n] }, propHooks: { tabIndex: { get: function (e) { var n = e.getAttributeNode("tabindex"); return n && n.specified ? parseInt(n.value, 10) : z.test(e.nodeName) || W.test(e.nodeName) && e.href ? 0 : t } } } }), F = { get: function (e, n) { var r, i = v.prop(e, n); return i === !0 || typeof i != "boolean" && (r = e.getAttributeNode(n)) && r.nodeValue !== !1 ? n.toLowerCase() : t }, set: function (e, t, n) { var r; return t === !1 ? v.removeAttr(e, n) : (r = v.propFix[n] || n, r in e && (e[r] = !0), e.setAttribute(n, n.toLowerCase())), n } }, V || (I = { name: !0, id: !0, coords: !0 }, j = v.valHooks.button = { get: function (e, n) { var r; return r = e.getAttributeNode(n), r && (I[n] ? r.value !== "" : r.specified) ? r.value : t }, set: function (e, t, n) { var r = e.getAttributeNode(n); return r || (r = i.createAttribute(n), e.setAttributeNode(r)), r.value = t + "" } }, v.each(["width", "height"], function (e, t) { v.attrHooks[t] = v.extend(v.attrHooks[t], { set: function (e, n) { if (n === "") return e.setAttribute(t, "auto"), n } }) }), v.attrHooks.contenteditable = { get: j.get, set: function (e, t, n) { t === "" && (t = "false"), j.set(e, t, n) } }), v.support.hrefNormalized || v.each(["href", "src", "width", "height"], function (e, n) { v.attrHooks[n] = v.extend(v.attrHooks[n], { get: function (e) { var r = e.getAttribute(n, 2); return r === null ? t : r } }) }), v.support.style || (v.attrHooks.style = { get: function (e) { return e.style.cssText.toLowerCase() || t }, set: function (e, t) { return e.style.cssText = t + "" } }), v.support.optSelected || (v.propHooks.selected = v.extend(v.propHooks.selected, { get: function (e) { var t = e.parentNode; return t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex), null } })), v.support.enctype || (v.propFix.enctype = "encoding"), v.support.checkOn || v.each(["radio", "checkbox"], function () { v.valHooks[this] = { get: function (e) { return e.getAttribute("value") === null ? "on" : e.value } } }), v.each(["radio", "checkbox"], function () { v.valHooks[this] = v.extend(v.valHooks[this], { set: function (e, t) { if (v.isArray(t)) return e.checked = v.inArray(v(e).val(), t) >= 0 } }) }); var $ = /^(?:textarea|input|select)$/i, J = /^([^\.]*|)(?:\.(.+)|)$/, K = /(?:^|\s)hover(\.\S+|)\b/, Q = /^key/, G = /^(?:mouse|contextmenu)|click/, Y = /^(?:focusinfocus|focusoutblur)$/, Z = function (e) { return v.event.special.hover ? e : e.replace(K, "mouseenter$1 mouseleave$1") }; v.event = { add: function (e, n, r, i, s) { var o, u, a, f, l, c, h, p, d, m, g; if (e.nodeType === 3 || e.nodeType === 8 || !n || !r || !(o = v._data(e))) return; r.handler && (d = r, r = d.handler, s = d.selector), r.guid || (r.guid = v.guid++), a = o.events, a || (o.events = a = {}), u = o.handle, u || (o.handle = u = function (e) { return typeof v == "undefined" || !!e && v.event.triggered === e.type ? t : v.event.dispatch.apply(u.elem, arguments) }, u.elem = e), n = v.trim(Z(n)).split(" "); for (f = 0; f < n.length; f++) { l = J.exec(n[f]) || [], c = l[1], h = (l[2] || "").split(".").sort(), g = v.event.special[c] || {}, c = (s ? g.delegateType : g.bindType) || c, g = v.event.special[c] || {}, p = v.extend({ type: c, origType: l[1], data: i, handler: r, guid: r.guid, selector: s, needsContext: s && v.expr.match.needsContext.test(s), namespace: h.join(".") }, d), m = a[c]; if (!m) { m = a[c] = [], m.delegateCount = 0; if (!g.setup || g.setup.call(e, i, h, u) === !1) e.addEventListener ? e.addEventListener(c, u, !1) : e.attachEvent && e.attachEvent("on" + c, u) } g.add && (g.add.call(e, p), p.handler.guid || (p.handler.guid = r.guid)), s ? m.splice(m.delegateCount++, 0, p) : m.push(p), v.event.global[c] = !0 } e = null }, global: {}, remove: function (e, t, n, r, i) { var s, o, u, a, f, l, c, h, p, d, m, g = v.hasData(e) && v._data(e); if (!g || !(h = g.events)) return; t = v.trim(Z(t || "")).split(" "); for (s = 0; s < t.length; s++) { o = J.exec(t[s]) || [], u = a = o[1], f = o[2]; if (!u) { for (u in h) v.event.remove(e, u + t[s], n, r, !0); continue } p = v.event.special[u] || {}, u = (r ? p.delegateType : p.bindType) || u, d = h[u] || [], l = d.length, f = f ? new RegExp("(^|\\.)" + f.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null; for (c = 0; c < d.length; c++)m = d[c], (i || a === m.origType) && (!n || n.guid === m.guid) && (!f || f.test(m.namespace)) && (!r || r === m.selector || r === "**" && m.selector) && (d.splice(c--, 1), m.selector && d.delegateCount-- , p.remove && p.remove.call(e, m)); d.length === 0 && l !== d.length && ((!p.teardown || p.teardown.call(e, f, g.handle) === !1) && v.removeEvent(e, u, g.handle), delete h[u]) } v.isEmptyObject(h) && (delete g.handle, v.removeData(e, "events", !0)) }, customEvent: { getData: !0, setData: !0, changeData: !0 }, trigger: function (n, r, s, o) { if (!s || s.nodeType !== 3 && s.nodeType !== 8) { var u, a, f, l, c, h, p, d, m, g, y = n.type || n, b = []; if (Y.test(y + v.event.triggered)) return; y.indexOf("!") >= 0 && (y = y.slice(0, -1), a = !0), y.indexOf(".") >= 0 && (b = y.split("."), y = b.shift(), b.sort()); if ((!s || v.event.customEvent[y]) && !v.event.global[y]) return; n = typeof n == "object" ? n[v.expando] ? n : new v.Event(y, n) : new v.Event(y), n.type = y, n.isTrigger = !0, n.exclusive = a, n.namespace = b.join("."), n.namespace_re = n.namespace ? new RegExp("(^|\\.)" + b.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, h = y.indexOf(":") < 0 ? "on" + y : ""; if (!s) { u = v.cache; for (f in u) u[f].events && u[f].events[y] && v.event.trigger(n, r, u[f].handle.elem, !0); return } n.result = t, n.target || (n.target = s), r = r != null ? v.makeArray(r) : [], r.unshift(n), p = v.event.special[y] || {}; if (p.trigger && p.trigger.apply(s, r) === !1) return; m = [[s, p.bindType || y]]; if (!o && !p.noBubble && !v.isWindow(s)) { g = p.delegateType || y, l = Y.test(g + y) ? s : s.parentNode; for (c = s; l; l = l.parentNode)m.push([l, g]), c = l; c === (s.ownerDocument || i) && m.push([c.defaultView || c.parentWindow || e, g]) } for (f = 0; f < m.length && !n.isPropagationStopped(); f++)l = m[f][0], n.type = m[f][1], d = (v._data(l, "events") || {})[n.type] && v._data(l, "handle"), d && d.apply(l, r), d = h && l[h], d && v.acceptData(l) && d.apply && d.apply(l, r) === !1 && n.preventDefault(); return n.type = y, !o && !n.isDefaultPrevented() && (!p._default || p._default.apply(s.ownerDocument, r) === !1) && (y !== "click" || !v.nodeName(s, "a")) && v.acceptData(s) && h && s[y] && (y !== "focus" && y !== "blur" || n.target.offsetWidth !== 0) && !v.isWindow(s) && (c = s[h], c && (s[h] = null), v.event.triggered = y, s[y](), v.event.triggered = t, c && (s[h] = c)), n.result } return }, dispatch: function (n) { n = v.event.fix(n || e.event); var r, i, s, o, u, a, f, c, h, p, d = (v._data(this, "events") || {})[n.type] || [], m = d.delegateCount, g = l.call(arguments), y = !n.exclusive && !n.namespace, b = v.event.special[n.type] || {}, w = []; g[0] = n, n.delegateTarget = this; if (b.preDispatch && b.preDispatch.call(this, n) === !1) return; if (m && (!n.button || n.type !== "click")) for (s = n.target; s != this; s = s.parentNode || this)if (s.disabled !== !0 || n.type !== "click") { u = {}, f = []; for (r = 0; r < m; r++)c = d[r], h = c.selector, u[h] === t && (u[h] = c.needsContext ? v(h, this).index(s) >= 0 : v.find(h, this, null, [s]).length), u[h] && f.push(c); f.length && w.push({ elem: s, matches: f }) } d.length > m && w.push({ elem: this, matches: d.slice(m) }); for (r = 0; r < w.length && !n.isPropagationStopped(); r++) { a = w[r], n.currentTarget = a.elem; for (i = 0; i < a.matches.length && !n.isImmediatePropagationStopped(); i++) { c = a.matches[i]; if (y || !n.namespace && !c.namespace || n.namespace_re && n.namespace_re.test(c.namespace)) n.data = c.data, n.handleObj = c, o = ((v.event.special[c.origType] || {}).handle || c.handler).apply(a.elem, g), o !== t && (n.result = o, o === !1 && (n.preventDefault(), n.stopPropagation())) } } return b.postDispatch && b.postDispatch.call(this, n), n.result }, props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), fixHooks: {}, keyHooks: { props: "char charCode key keyCode".split(" "), filter: function (e, t) { return e.which == null && (e.which = t.charCode != null ? t.charCode : t.keyCode), e } }, mouseHooks: { props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function (e, n) { var r, s, o, u = n.button, a = n.fromElement; return e.pageX == null && n.clientX != null && (r = e.target.ownerDocument || i, s = r.documentElement, o = r.body, e.pageX = n.clientX + (s && s.scrollLeft || o && o.scrollLeft || 0) - (s && s.clientLeft || o && o.clientLeft || 0), e.pageY = n.clientY + (s && s.scrollTop || o && o.scrollTop || 0) - (s && s.clientTop || o && o.clientTop || 0)), !e.relatedTarget && a && (e.relatedTarget = a === e.target ? n.toElement : a), !e.which && u !== t && (e.which = u & 1 ? 1 : u & 2 ? 3 : u & 4 ? 2 : 0), e } }, fix: function (e) { if (e[v.expando]) return e; var t, n, r = e, s = v.event.fixHooks[e.type] || {}, o = s.props ? this.props.concat(s.props) : this.props; e = v.Event(r); for (t = o.length; t;)n = o[--t], e[n] = r[n]; return e.target || (e.target = r.srcElement || i), e.target.nodeType === 3 && (e.target = e.target.parentNode), e.metaKey = !!e.metaKey, s.filter ? s.filter(e, r) : e }, special: { load: { noBubble: !0 }, focus: { delegateType: "focusin" }, blur: { delegateType: "focusout" }, beforeunload: { setup: function (e, t, n) { v.isWindow(this) && (this.onbeforeunload = n) }, teardown: function (e, t) { this.onbeforeunload === t && (this.onbeforeunload = null) } } }, simulate: function (e, t, n, r) { var i = v.extend(new v.Event, n, { type: e, isSimulated: !0, originalEvent: {} }); r ? v.event.trigger(i, null, t) : v.event.dispatch.call(t, i), i.isDefaultPrevented() && n.preventDefault() } }, v.event.handle = v.event.dispatch, v.removeEvent = i.removeEventListener ? function (e, t, n) { e.removeEventListener && e.removeEventListener(t, n, !1) } : function (e, t, n) { var r = "on" + t; e.detachEvent && (typeof e[r] == "undefined" && (e[r] = null), e.detachEvent(r, n)) }, v.Event = function (e, t) { if (!(this instanceof v.Event)) return new v.Event(e, t); e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || e.returnValue === !1 || e.getPreventDefault && e.getPreventDefault() ? tt : et) : this.type = e, t && v.extend(this, t), this.timeStamp = e && e.timeStamp || v.now(), this[v.expando] = !0 }, v.Event.prototype = { preventDefault: function () { this.isDefaultPrevented = tt; var e = this.originalEvent; if (!e) return; e.preventDefault ? e.preventDefault() : e.returnValue = !1 }, stopPropagation: function () { this.isPropagationStopped = tt; var e = this.originalEvent; if (!e) return; e.stopPropagation && e.stopPropagation(), e.cancelBubble = !0 }, stopImmediatePropagation: function () { this.isImmediatePropagationStopped = tt, this.stopPropagation() }, isDefaultPrevented: et, isPropagationStopped: et, isImmediatePropagationStopped: et }, v.each({ mouseenter: "mouseover", mouseleave: "mouseout" }, function (e, t) { v.event.special[e] = { delegateType: t, bindType: t, handle: function (e) { var n, r = this, i = e.relatedTarget, s = e.handleObj, o = s.selector; if (!i || i !== r && !v.contains(r, i)) e.type = s.origType, n = s.handler.apply(this, arguments), e.type = t; return n } } }), v.support.submitBubbles || (v.event.special.submit = { setup: function () { if (v.nodeName(this, "form")) return !1; v.event.add(this, "click._submit keypress._submit", function (e) { var n = e.target, r = v.nodeName(n, "input") || v.nodeName(n, "button") ? n.form : t; r && !v._data(r, "_submit_attached") && (v.event.add(r, "submit._submit", function (e) { e._submit_bubble = !0 }), v._data(r, "_submit_attached", !0)) }) }, postDispatch: function (e) { e._submit_bubble && (delete e._submit_bubble, this.parentNode && !e.isTrigger && v.event.simulate("submit", this.parentNode, e, !0)) }, teardown: function () { if (v.nodeName(this, "form")) return !1; v.event.remove(this, "._submit") } }), v.support.changeBubbles || (v.event.special.change = { setup: function () { if ($.test(this.nodeName)) { if (this.type === "checkbox" || this.type === "radio") v.event.add(this, "propertychange._change", function (e) { e.originalEvent.propertyName === "checked" && (this._just_changed = !0) }), v.event.add(this, "click._change", function (e) { this._just_changed && !e.isTrigger && (this._just_changed = !1), v.event.simulate("change", this, e, !0) }); return !1 } v.event.add(this, "beforeactivate._change", function (e) { var t = e.target; $.test(t.nodeName) && !v._data(t, "_change_attached") && (v.event.add(t, "change._change", function (e) { this.parentNode && !e.isSimulated && !e.isTrigger && v.event.simulate("change", this.parentNode, e, !0) }), v._data(t, "_change_attached", !0)) }) }, handle: function (e) { var t = e.target; if (this !== t || e.isSimulated || e.isTrigger || t.type !== "radio" && t.type !== "checkbox") return e.handleObj.handler.apply(this, arguments) }, teardown: function () { return v.event.remove(this, "._change"), !$.test(this.nodeName) } }), v.support.focusinBubbles || v.each({ focus: "focusin", blur: "focusout" }, function (e, t) { var n = 0, r = function (e) { v.event.simulate(t, e.target, v.event.fix(e), !0) }; v.event.special[t] = { setup: function () { n++ === 0 && i.addEventListener(e, r, !0) }, teardown: function () { --n === 0 && i.removeEventListener(e, r, !0) } } }), v.fn.extend({ on: function (e, n, r, i, s) { var o, u; if (typeof e == "object") { typeof n != "string" && (r = r || n, n = t); for (u in e) this.on(u, n, r, e[u], s); return this } r == null && i == null ? (i = n, r = n = t) : i == null && (typeof n == "string" ? (i = r, r = t) : (i = r, r = n, n = t)); if (i === !1) i = et; else if (!i) return this; return s === 1 && (o = i, i = function (e) { return v().off(e), o.apply(this, arguments) }, i.guid = o.guid || (o.guid = v.guid++)), this.each(function () { v.event.add(this, e, i, r, n) }) }, one: function (e, t, n, r) { return this.on(e, t, n, r, 1) }, off: function (e, n, r) { var i, s; if (e && e.preventDefault && e.handleObj) return i = e.handleObj, v(e.delegateTarget).off(i.namespace ? i.origType + "." + i.namespace : i.origType, i.selector, i.handler), this; if (typeof e == "object") { for (s in e) this.off(s, n, e[s]); return this } if (n === !1 || typeof n == "function") r = n, n = t; return r === !1 && (r = et), this.each(function () { v.event.remove(this, e, r, n) }) }, bind: function (e, t, n) { return this.on(e, null, t, n) }, unbind: function (e, t) { return this.off(e, null, t) }, live: function (e, t, n) { return v(this.context).on(e, this.selector, t, n), this }, die: function (e, t) { return v(this.context).off(e, this.selector || "**", t), this }, delegate: function (e, t, n, r) { return this.on(t, e, n, r) }, undelegate: function (e, t, n) { return arguments.length === 1 ? this.off(e, "**") : this.off(t, e || "**", n) }, trigger: function (e, t) { return this.each(function () { v.event.trigger(e, t, this) }) }, triggerHandler: function (e, t) { if (this[0]) return v.event.trigger(e, t, this[0], !0) }, toggle: function (e) { var t = arguments, n = e.guid || v.guid++, r = 0, i = function (n) { var i = (v._data(this, "lastToggle" + e.guid) || 0) % r; return v._data(this, "lastToggle" + e.guid, i + 1), n.preventDefault(), t[i].apply(this, arguments) || !1 }; i.guid = n; while (r < t.length) t[r++].guid = n; return this.click(i) }, hover: function (e, t) { return this.mouseenter(e).mouseleave(t || e) } }), v.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function (e, t) { v.fn[t] = function (e, n) { return n == null && (n = e, e = null), arguments.length > 0 ? this.on(t, null, e, n) : this.trigger(t) }, Q.test(t) && (v.event.fixHooks[t] = v.event.keyHooks), G.test(t) && (v.event.fixHooks[t] = v.event.mouseHooks) }), function (e, t) { function nt(e, t, n, r) { n = n || [], t = t || g; var i, s, a, f, l = t.nodeType; if (!e || typeof e != "string") return n; if (l !== 1 && l !== 9) return []; a = o(t); if (!a && !r) if (i = R.exec(e)) if (f = i[1]) { if (l === 9) { s = t.getElementById(f); if (!s || !s.parentNode) return n; if (s.id === f) return n.push(s), n } else if (t.ownerDocument && (s = t.ownerDocument.getElementById(f)) && u(t, s) && s.id === f) return n.push(s), n } else { if (i[2]) return S.apply(n, x.call(t.getElementsByTagName(e), 0)), n; if ((f = i[3]) && Z && t.getElementsByClassName) return S.apply(n, x.call(t.getElementsByClassName(f), 0)), n } return vt(e.replace(j, "$1"), t, n, r, a) } function rt(e) { return function (t) { var n = t.nodeName.toLowerCase(); return n === "input" && t.type === e } } function it(e) { return function (t) { var n = t.nodeName.toLowerCase(); return (n === "input" || n === "button") && t.type === e } } function st(e) { return N(function (t) { return t = +t, N(function (n, r) { var i, s = e([], n.length, t), o = s.length; while (o--) n[i = s[o]] && (n[i] = !(r[i] = n[i])) }) }) } function ot(e, t, n) { if (e === t) return n; var r = e.nextSibling; while (r) { if (r === t) return -1; r = r.nextSibling } return 1 } function ut(e, t) { var n, r, s, o, u, a, f, l = L[d][e + " "]; if (l) return t ? 0 : l.slice(0); u = e, a = [], f = i.preFilter; while (u) { if (!n || (r = F.exec(u))) r && (u = u.slice(r[0].length) || u), a.push(s = []); n = !1; if (r = I.exec(u)) s.push(n = new m(r.shift())), u = u.slice(n.length), n.type = r[0].replace(j, " "); for (o in i.filter) (r = J[o].exec(u)) && (!f[o] || (r = f[o](r))) && (s.push(n = new m(r.shift())), u = u.slice(n.length), n.type = o, n.matches = r); if (!n) break } return t ? u.length : u ? nt.error(e) : L(e, a).slice(0) } function at(e, t, r) { var i = t.dir, s = r && t.dir === "parentNode", o = w++; return t.first ? function (t, n, r) { while (t = t[i]) if (s || t.nodeType === 1) return e(t, n, r) } : function (t, r, u) { if (!u) { var a, f = b + " " + o + " ", l = f + n; while (t = t[i]) if (s || t.nodeType === 1) { if ((a = t[d]) === l) return t.sizset; if (typeof a == "string" && a.indexOf(f) === 0) { if (t.sizset) return t } else { t[d] = l; if (e(t, r, u)) return t.sizset = !0, t; t.sizset = !1 } } } else while (t = t[i]) if (s || t.nodeType === 1) if (e(t, r, u)) return t } } function ft(e) { return e.length > 1 ? function (t, n, r) { var i = e.length; while (i--) if (!e[i](t, n, r)) return !1; return !0 } : e[0] } function lt(e, t, n, r, i) { var s, o = [], u = 0, a = e.length, f = t != null; for (; u < a; u++)if (s = e[u]) if (!n || n(s, r, i)) o.push(s), f && t.push(u); return o } function ct(e, t, n, r, i, s) { return r && !r[d] && (r = ct(r)), i && !i[d] && (i = ct(i, s)), N(function (s, o, u, a) { var f, l, c, h = [], p = [], d = o.length, v = s || dt(t || "*", u.nodeType ? [u] : u, []), m = e && (s || !t) ? lt(v, h, e, u, a) : v, g = n ? i || (s ? e : d || r) ? [] : o : m; n && n(m, g, u, a); if (r) { f = lt(g, p), r(f, [], u, a), l = f.length; while (l--) if (c = f[l]) g[p[l]] = !(m[p[l]] = c) } if (s) { if (i || e) { if (i) { f = [], l = g.length; while (l--) (c = g[l]) && f.push(m[l] = c); i(null, g = [], f, a) } l = g.length; while (l--) (c = g[l]) && (f = i ? T.call(s, c) : h[l]) > -1 && (s[f] = !(o[f] = c)) } } else g = lt(g === o ? g.splice(d, g.length) : g), i ? i(null, o, g, a) : S.apply(o, g) }) } function ht(e) { var t, n, r, s = e.length, o = i.relative[e[0].type], u = o || i.relative[" "], a = o ? 1 : 0, f = at(function (e) { return e === t }, u, !0), l = at(function (e) { return T.call(t, e) > -1 }, u, !0), h = [function (e, n, r) { return !o && (r || n !== c) || ((t = n).nodeType ? f(e, n, r) : l(e, n, r)) }]; for (; a < s; a++)if (n = i.relative[e[a].type]) h = [at(ft(h), n)]; else { n = i.filter[e[a].type].apply(null, e[a].matches); if (n[d]) { r = ++a; for (; r < s; r++)if (i.relative[e[r].type]) break; return ct(a > 1 && ft(h), a > 1 && e.slice(0, a - 1).join("").replace(j, "$1"), n, a < r && ht(e.slice(a, r)), r < s && ht(e = e.slice(r)), r < s && e.join("")) } h.push(n) } return ft(h) } function pt(e, t) { var r = t.length > 0, s = e.length > 0, o = function (u, a, f, l, h) { var p, d, v, m = [], y = 0, w = "0", x = u && [], T = h != null, N = c, C = u || s && i.find.TAG("*", h && a.parentNode || a), k = b += N == null ? 1 : Math.E; T && (c = a !== g && a, n = o.el); for (; (p = C[w]) != null; w++) { if (s && p) { for (d = 0; v = e[d]; d++)if (v(p, a, f)) { l.push(p); break } T && (b = k, n = ++o.el) } r && ((p = !v && p) && y-- , u && x.push(p)) } y += w; if (r && w !== y) { for (d = 0; v = t[d]; d++)v(x, m, a, f); if (u) { if (y > 0) while (w--) !x[w] && !m[w] && (m[w] = E.call(l)); m = lt(m) } S.apply(l, m), T && !u && m.length > 0 && y + t.length > 1 && nt.uniqueSort(l) } return T && (b = k, c = N), x }; return o.el = 0, r ? N(o) : o } function dt(e, t, n) { var r = 0, i = t.length; for (; r < i; r++)nt(e, t[r], n); return n } function vt(e, t, n, r, s) { var o, u, f, l, c, h = ut(e), p = h.length; if (!r && h.length === 1) { u = h[0] = h[0].slice(0); if (u.length > 2 && (f = u[0]).type === "ID" && t.nodeType === 9 && !s && i.relative[u[1].type]) { t = i.find.ID(f.matches[0].replace($, ""), t, s)[0]; if (!t) return n; e = e.slice(u.shift().length) } for (o = J.POS.test(e) ? -1 : u.length - 1; o >= 0; o--) { f = u[o]; if (i.relative[l = f.type]) break; if (c = i.find[l]) if (r = c(f.matches[0].replace($, ""), z.test(u[0].type) && t.parentNode || t, s)) { u.splice(o, 1), e = r.length && u.join(""); if (!e) return S.apply(n, x.call(r, 0)), n; break } } } return a(e, h)(r, t, s, n, z.test(e)), n } function mt() { } var n, r, i, s, o, u, a, f, l, c, h = !0, p = "undefined", d = ("sizcache" + Math.random()).replace(".", ""), m = String, g = e.document, y = g.documentElement, b = 0, w = 0, E = [].pop, S = [].push, x = [].slice, T = [].indexOf || function (e) { var t = 0, n = this.length; for (; t < n; t++)if (this[t] === e) return t; return -1 }, N = function (e, t) { return e[d] = t == null || t, e }, C = function () { var e = {}, t = []; return N(function (n, r) { return t.push(n) > i.cacheLength && delete e[t.shift()], e[n + " "] = r }, e) }, k = C(), L = C(), A = C(), O = "[\\x20\\t\\r\\n\\f]", M = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+", _ = M.replace("w", "w#"), D = "([*^$|!~]?=)", P = "\\[" + O + "*(" + M + ")" + O + "*(?:" + D + O + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + _ + ")|)|)" + O + "*\\]", H = ":(" + M + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + P + ")|[^:]|\\\\.)*|.*))\\)|)", B = ":(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + O + "*((?:-\\d)?\\d*)" + O + "*\\)|)(?=[^-]|$)", j = new RegExp("^" + O + "+|((?:^|[^\\\\])(?:\\\\.)*)" + O + "+$", "g"), F = new RegExp("^" + O + "*," + O + "*"), I = new RegExp("^" + O + "*([\\x20\\t\\r\\n\\f>+~])" + O + "*"), q = new RegExp(H), R = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/, U = /^:not/, z = /[\x20\t\r\n\f]*[+~]/, W = /:not\($/, X = /h\d/i, V = /input|select|textarea|button/i, $ = /\\(?!\\)/g, J = { ID: new RegExp("^#(" + M + ")"), CLASS: new RegExp("^\\.(" + M + ")"), NAME: new RegExp("^\\[name=['\"]?(" + M + ")['\"]?\\]"), TAG: new RegExp("^(" + M.replace("w", "w*") + ")"), ATTR: new RegExp("^" + P), PSEUDO: new RegExp("^" + H), POS: new RegExp(B, "i"), CHILD: new RegExp("^:(only|nth|first|last)-child(?:\\(" + O + "*(even|odd|(([+-]|)(\\d*)n|)" + O + "*(?:([+-]|)" + O + "*(\\d+)|))" + O + "*\\)|)", "i"), needsContext: new RegExp("^" + O + "*[>+~]|" + B, "i") }, K = function (e) { var t = g.createElement("div"); try { return e(t) } catch (n) { return !1 } finally { t = null } }, Q = K(function (e) { return e.appendChild(g.createComment("")), !e.getElementsByTagName("*").length }), G = K(function (e) { return e.innerHTML = "", e.firstChild && typeof e.firstChild.getAttribute !== p && e.firstChild.getAttribute("href") === "#" }), Y = K(function (e) { e.innerHTML = ""; var t = typeof e.lastChild.getAttribute("multiple"); return t !== "boolean" && t !== "string" }), Z = K(function (e) { return e.innerHTML = "", !e.getElementsByClassName || !e.getElementsByClassName("e").length ? !1 : (e.lastChild.className = "e", e.getElementsByClassName("e").length === 2) }), et = K(function (e) { e.id = d + 0, e.innerHTML = "", y.insertBefore(e, y.firstChild); var t = g.getElementsByName && g.getElementsByName(d).length === 2 + g.getElementsByName(d + 0).length; return r = !g.getElementById(d), y.removeChild(e), t }); try { x.call(y.childNodes, 0)[0].nodeType } catch (tt) { x = function (e) { var t, n = []; for (; t = this[e]; e++)n.push(t); return n } } nt.matches = function (e, t) { return nt(e, null, null, t) }, nt.matchesSelector = function (e, t) { return nt(t, null, null, [e]).length > 0 }, s = nt.getText = function (e) { var t, n = "", r = 0, i = e.nodeType; if (i) { if (i === 1 || i === 9 || i === 11) { if (typeof e.textContent == "string") return e.textContent; for (e = e.firstChild; e; e = e.nextSibling)n += s(e) } else if (i === 3 || i === 4) return e.nodeValue } else for (; t = e[r]; r++)n += s(t); return n }, o = nt.isXML = function (e) { var t = e && (e.ownerDocument || e).documentElement; return t ? t.nodeName !== "HTML" : !1 }, u = nt.contains = y.contains ? function (e, t) { var n = e.nodeType === 9 ? e.documentElement : e, r = t && t.parentNode; return e === r || !!(r && r.nodeType === 1 && n.contains && n.contains(r)) } : y.compareDocumentPosition ? function (e, t) { return t && !!(e.compareDocumentPosition(t) & 16) } : function (e, t) { while (t = t.parentNode) if (t === e) return !0; return !1 }, nt.attr = function (e, t) { var n, r = o(e); return r || (t = t.toLowerCase()), (n = i.attrHandle[t]) ? n(e) : r || Y ? e.getAttribute(t) : (n = e.getAttributeNode(t), n ? typeof e[t] == "boolean" ? e[t] ? t : null : n.specified ? n.value : null : null) }, i = nt.selectors = { cacheLength: 50, createPseudo: N, match: J, attrHandle: G ? {} : { href: function (e) { return e.getAttribute("href", 2) }, type: function (e) { return e.getAttribute("type") } }, find: { ID: r ? function (e, t, n) { if (typeof t.getElementById !== p && !n) { var r = t.getElementById(e); return r && r.parentNode ? [r] : [] } } : function (e, n, r) { if (typeof n.getElementById !== p && !r) { var i = n.getElementById(e); return i ? i.id === e || typeof i.getAttributeNode !== p && i.getAttributeNode("id").value === e ? [i] : t : [] } }, TAG: Q ? function (e, t) { if (typeof t.getElementsByTagName !== p) return t.getElementsByTagName(e) } : function (e, t) { var n = t.getElementsByTagName(e); if (e === "*") { var r, i = [], s = 0; for (; r = n[s]; s++)r.nodeType === 1 && i.push(r); return i } return n }, NAME: et && function (e, t) { if (typeof t.getElementsByName !== p) return t.getElementsByName(name) }, CLASS: Z && function (e, t, n) { if (typeof t.getElementsByClassName !== p && !n) return t.getElementsByClassName(e) } }, relative: { ">": { dir: "parentNode", first: !0 }, " ": { dir: "parentNode" }, "+": { dir: "previousSibling", first: !0 }, "~": { dir: "previousSibling" } }, preFilter: { ATTR: function (e) { return e[1] = e[1].replace($, ""), e[3] = (e[4] || e[5] || "").replace($, ""), e[2] === "~=" && (e[3] = " " + e[3] + " "), e.slice(0, 4) }, CHILD: function (e) { return e[1] = e[1].toLowerCase(), e[1] === "nth" ? (e[2] || nt.error(e[0]), e[3] = +(e[3] ? e[4] + (e[5] || 1) : 2 * (e[2] === "even" || e[2] === "odd")), e[4] = +(e[6] + e[7] || e[2] === "odd")) : e[2] && nt.error(e[0]), e }, PSEUDO: function (e) { var t, n; if (J.CHILD.test(e[0])) return null; if (e[3]) e[2] = e[3]; else if (t = e[4]) q.test(t) && (n = ut(t, !0)) && (n = t.indexOf(")", t.length - n) - t.length) && (t = t.slice(0, n), e[0] = e[0].slice(0, n)), e[2] = t; return e.slice(0, 3) } }, filter: { ID: r ? function (e) { return e = e.replace($, ""), function (t) { return t.getAttribute("id") === e } } : function (e) { return e = e.replace($, ""), function (t) { var n = typeof t.getAttributeNode !== p && t.getAttributeNode("id"); return n && n.value === e } }, TAG: function (e) { return e === "*" ? function () { return !0 } : (e = e.replace($, "").toLowerCase(), function (t) { return t.nodeName && t.nodeName.toLowerCase() === e }) }, CLASS: function (e) { var t = k[d][e + " "]; return t || (t = new RegExp("(^|" + O + ")" + e + "(" + O + "|$)")) && k(e, function (e) { return t.test(e.className || typeof e.getAttribute !== p && e.getAttribute("class") || "") }) }, ATTR: function (e, t, n) { return function (r, i) { var s = nt.attr(r, e); return s == null ? t === "!=" : t ? (s += "", t === "=" ? s === n : t === "!=" ? s !== n : t === "^=" ? n && s.indexOf(n) === 0 : t === "*=" ? n && s.indexOf(n) > -1 : t === "$=" ? n && s.substr(s.length - n.length) === n : t === "~=" ? (" " + s + " ").indexOf(n) > -1 : t === "|=" ? s === n || s.substr(0, n.length + 1) === n + "-" : !1) : !0 } }, CHILD: function (e, t, n, r) { return e === "nth" ? function (e) { var t, i, s = e.parentNode; if (n === 1 && r === 0) return !0; if (s) { i = 0; for (t = s.firstChild; t; t = t.nextSibling)if (t.nodeType === 1) { i++; if (e === t) break } } return i -= r, i === n || i % n === 0 && i / n >= 0 } : function (t) { var n = t; switch (e) { case "only": case "first": while (n = n.previousSibling) if (n.nodeType === 1) return !1; if (e === "first") return !0; n = t; case "last": while (n = n.nextSibling) if (n.nodeType === 1) return !1; return !0 } } }, PSEUDO: function (e, t) { var n, r = i.pseudos[e] || i.setFilters[e.toLowerCase()] || nt.error("unsupported pseudo: " + e); return r[d] ? r(t) : r.length > 1 ? (n = [e, e, "", t], i.setFilters.hasOwnProperty(e.toLowerCase()) ? N(function (e, n) { var i, s = r(e, t), o = s.length; while (o--) i = T.call(e, s[o]), e[i] = !(n[i] = s[o]) }) : function (e) { return r(e, 0, n) }) : r } }, pseudos: { not: N(function (e) { var t = [], n = [], r = a(e.replace(j, "$1")); return r[d] ? N(function (e, t, n, i) { var s, o = r(e, null, i, []), u = e.length; while (u--) if (s = o[u]) e[u] = !(t[u] = s) }) : function (e, i, s) { return t[0] = e, r(t, null, s, n), !n.pop() } }), has: N(function (e) { return function (t) { return nt(e, t).length > 0 } }), contains: N(function (e) { return function (t) { return (t.textContent || t.innerText || s(t)).indexOf(e) > -1 } }), enabled: function (e) { return e.disabled === !1 }, disabled: function (e) { return e.disabled === !0 }, checked: function (e) { var t = e.nodeName.toLowerCase(); return t === "input" && !!e.checked || t === "option" && !!e.selected }, selected: function (e) { return e.parentNode && e.parentNode.selectedIndex, e.selected === !0 }, parent: function (e) { return !i.pseudos.empty(e) }, empty: function (e) { var t; e = e.firstChild; while (e) { if (e.nodeName > "@" || (t = e.nodeType) === 3 || t === 4) return !1; e = e.nextSibling } return !0 }, header: function (e) { return X.test(e.nodeName) }, text: function (e) { var t, n; return e.nodeName.toLowerCase() === "input" && (t = e.type) === "text" && ((n = e.getAttribute("type")) == null || n.toLowerCase() === t) }, radio: rt("radio"), checkbox: rt("checkbox"), file: rt("file"), password: rt("password"), image: rt("image"), submit: it("submit"), reset: it("reset"), button: function (e) { var t = e.nodeName.toLowerCase(); return t === "input" && e.type === "button" || t === "button" }, input: function (e) { return V.test(e.nodeName) }, focus: function (e) { var t = e.ownerDocument; return e === t.activeElement && (!t.hasFocus || t.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) }, active: function (e) { return e === e.ownerDocument.activeElement }, first: st(function () { return [0] }), last: st(function (e, t) { return [t - 1] }), eq: st(function (e, t, n) { return [n < 0 ? n + t : n] }), even: st(function (e, t) { for (var n = 0; n < t; n += 2)e.push(n); return e }), odd: st(function (e, t) { for (var n = 1; n < t; n += 2)e.push(n); return e }), lt: st(function (e, t, n) { for (var r = n < 0 ? n + t : n; --r >= 0;)e.push(r); return e }), gt: st(function (e, t, n) { for (var r = n < 0 ? n + t : n; ++r < t;)e.push(r); return e }) } }, f = y.compareDocumentPosition ? function (e, t) { return e === t ? (l = !0, 0) : (!e.compareDocumentPosition || !t.compareDocumentPosition ? e.compareDocumentPosition : e.compareDocumentPosition(t) & 4) ? -1 : 1 } : function (e, t) { if (e === t) return l = !0, 0; if (e.sourceIndex && t.sourceIndex) return e.sourceIndex - t.sourceIndex; var n, r, i = [], s = [], o = e.parentNode, u = t.parentNode, a = o; if (o === u) return ot(e, t); if (!o) return -1; if (!u) return 1; while (a) i.unshift(a), a = a.parentNode; a = u; while (a) s.unshift(a), a = a.parentNode; n = i.length, r = s.length; for (var f = 0; f < n && f < r; f++)if (i[f] !== s[f]) return ot(i[f], s[f]); return f === n ? ot(e, s[f], -1) : ot(i[f], t, 1) }, [0, 0].sort(f), h = !l, nt.uniqueSort = function (e) { var t, n = [], r = 1, i = 0; l = h, e.sort(f); if (l) { for (; t = e[r]; r++)t === e[r - 1] && (i = n.push(r)); while (i--) e.splice(n[i], 1) } return e }, nt.error = function (e) { throw new Error("Syntax error, unrecognized expression: " + e) }, a = nt.compile = function (e, t) { var n, r = [], i = [], s = A[d][e + " "]; if (!s) { t || (t = ut(e)), n = t.length; while (n--) s = ht(t[n]), s[d] ? r.push(s) : i.push(s); s = A(e, pt(i, r)) } return s }, g.querySelectorAll && function () { var e, t = vt, n = /'|\\/g, r = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g, i = [":focus"], s = [":active"], u = y.matchesSelector || y.mozMatchesSelector || y.webkitMatchesSelector || y.oMatchesSelector || y.msMatchesSelector; K(function (e) { e.innerHTML = "", e.querySelectorAll("[selected]").length || i.push("\\[" + O + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)"), e.querySelectorAll(":checked").length || i.push(":checked") }), K(function (e) { e.innerHTML = "", e.querySelectorAll("[test^='']").length && i.push("[*^$]=" + O + "*(?:\"\"|'')"), e.innerHTML = "", e.querySelectorAll(":enabled").length || i.push(":enabled", ":disabled") }), i = new RegExp(i.join("|")), vt = function (e, r, s, o, u) { if (!o && !u && !i.test(e)) { var a, f, l = !0, c = d, h = r, p = r.nodeType === 9 && e; if (r.nodeType === 1 && r.nodeName.toLowerCase() !== "object") { a = ut(e), (l = r.getAttribute("id")) ? c = l.replace(n, "\\$&") : r.setAttribute("id", c), c = "[id='" + c + "'] ", f = a.length; while (f--) a[f] = c + a[f].join(""); h = z.test(e) && r.parentNode || r, p = a.join(",") } if (p) try { return S.apply(s, x.call(h.querySelectorAll(p), 0)), s } catch (v) { } finally { l || r.removeAttribute("id") } } return t(e, r, s, o, u) }, u && (K(function (t) { e = u.call(t, "div"); try { u.call(t, "[test!='']:sizzle"), s.push("!=", H) } catch (n) { } }), s = new RegExp(s.join("|")), nt.matchesSelector = function (t, n) { n = n.replace(r, "='$1']"); if (!o(t) && !s.test(n) && !i.test(n)) try { var a = u.call(t, n); if (a || e || t.document && t.document.nodeType !== 11) return a } catch (f) { } return nt(n, null, null, [t]).length > 0 }) }(), i.pseudos.nth = i.pseudos.eq, i.filters = mt.prototype = i.pseudos, i.setFilters = new mt, nt.attr = v.attr, v.find = nt, v.expr = nt.selectors, v.expr[":"] = v.expr.pseudos, v.unique = nt.uniqueSort, v.text = nt.getText, v.isXMLDoc = nt.isXML, v.contains = nt.contains }(e); var nt = /Until$/, rt = /^(?:parents|prev(?:Until|All))/, it = /^.[^:#\[\.,]*$/, st = v.expr.match.needsContext, ot = { children: !0, contents: !0, next: !0, prev: !0 }; v.fn.extend({ find: function (e) { var t, n, r, i, s, o, u = this; if (typeof e != "string") return v(e).filter(function () { for (t = 0, n = u.length; t < n; t++)if (v.contains(u[t], this)) return !0 }); o = this.pushStack("", "find", e); for (t = 0, n = this.length; t < n; t++) { r = o.length, v.find(e, this[t], o); if (t > 0) for (i = r; i < o.length; i++)for (s = 0; s < r; s++)if (o[s] === o[i]) { o.splice(i--, 1); break } } return o }, has: function (e) { var t, n = v(e, this), r = n.length; return this.filter(function () { for (t = 0; t < r; t++)if (v.contains(this, n[t])) return !0 }) }, not: function (e) { return this.pushStack(ft(this, e, !1), "not", e) }, filter: function (e) { return this.pushStack(ft(this, e, !0), "filter", e) }, is: function (e) { return !!e && (typeof e == "string" ? st.test(e) ? v(e, this.context).index(this[0]) >= 0 : v.filter(e, this).length > 0 : this.filter(e).length > 0) }, closest: function (e, t) { var n, r = 0, i = this.length, s = [], o = st.test(e) || typeof e != "string" ? v(e, t || this.context) : 0; for (; r < i; r++) { n = this[r]; while (n && n.ownerDocument && n !== t && n.nodeType !== 11) { if (o ? o.index(n) > -1 : v.find.matchesSelector(n, e)) { s.push(n); break } n = n.parentNode } } return s = s.length > 1 ? v.unique(s) : s, this.pushStack(s, "closest", e) }, index: function (e) { return e ? typeof e == "string" ? v.inArray(this[0], v(e)) : v.inArray(e.jquery ? e[0] : e, this) : this[0] && this[0].parentNode ? this.prevAll().length : -1 }, add: function (e, t) { var n = typeof e == "string" ? v(e, t) : v.makeArray(e && e.nodeType ? [e] : e), r = v.merge(this.get(), n); return this.pushStack(ut(n[0]) || ut(r[0]) ? r : v.unique(r)) }, addBack: function (e) { return this.add(e == null ? this.prevObject : this.prevObject.filter(e)) } }), v.fn.andSelf = v.fn.addBack, v.each({ parent: function (e) { var t = e.parentNode; return t && t.nodeType !== 11 ? t : null }, parents: function (e) { return v.dir(e, "parentNode") }, parentsUntil: function (e, t, n) { return v.dir(e, "parentNode", n) }, next: function (e) { return at(e, "nextSibling") }, prev: function (e) { return at(e, "previousSibling") }, nextAll: function (e) { return v.dir(e, "nextSibling") }, prevAll: function (e) { return v.dir(e, "previousSibling") }, nextUntil: function (e, t, n) { return v.dir(e, "nextSibling", n) }, prevUntil: function (e, t, n) { return v.dir(e, "previousSibling", n) }, siblings: function (e) { return v.sibling((e.parentNode || {}).firstChild, e) }, children: function (e) { return v.sibling(e.firstChild) }, contents: function (e) { return v.nodeName(e, "iframe") ? e.contentDocument || e.contentWindow.document : v.merge([], e.childNodes) } }, function (e, t) { v.fn[e] = function (n, r) { var i = v.map(this, t, n); return nt.test(e) || (r = n), r && typeof r == "string" && (i = v.filter(r, i)), i = this.length > 1 && !ot[e] ? v.unique(i) : i, this.length > 1 && rt.test(e) && (i = i.reverse()), this.pushStack(i, e, l.call(arguments).join(",")) } }), v.extend({ filter: function (e, t, n) { return n && (e = ":not(" + e + ")"), t.length === 1 ? v.find.matchesSelector(t[0], e) ? [t[0]] : [] : v.find.matches(e, t) }, dir: function (e, n, r) { var i = [], s = e[n]; while (s && s.nodeType !== 9 && (r === t || s.nodeType !== 1 || !v(s).is(r))) s.nodeType === 1 && i.push(s), s = s[n]; return i }, sibling: function (e, t) { var n = []; for (; e; e = e.nextSibling)e.nodeType === 1 && e !== t && n.push(e); return n } }); var ct = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", ht = / jQuery\d+="(?:null|\d+)"/g, pt = /^\s+/, dt = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, vt = /<([\w:]+)/, mt = /]", "i"), Et = /^(?:checkbox|radio)$/, St = /checked\s*(?:[^=]|=\s*.checked.)/i, xt = /\/(java|ecma)script/i, Tt = /^\s*\s*$/g, Nt = { option: [1, ""], legend: [1, ""], thead: [1, "
"]), v.fn.extend({ text: function (e) { return v.access(this, function (e) { return e === t ? v.text(this) : this.empty().append((this[0] && this[0].ownerDocument || i).createTextNode(e)) }, null, e, arguments.length) }, wrapAll: function (e) { if (v.isFunction(e)) return this.each(function (t) { v(this).wrapAll(e.call(this, t)) }); if (this[0]) { var t = v(e, this[0].ownerDocument).eq(0).clone(!0); this[0].parentNode && t.insertBefore(this[0]), t.map(function () { var e = this; while (e.firstChild && e.firstChild.nodeType === 1) e = e.firstChild; return e }).append(this) } return this }, wrapInner: function (e) { return v.isFunction(e) ? this.each(function (t) { v(this).wrapInner(e.call(this, t)) }) : this.each(function () { var t = v(this), n = t.contents(); n.length ? n.wrapAll(e) : t.append(e) }) }, wrap: function (e) { var t = v.isFunction(e); return this.each(function (n) { v(this).wrapAll(t ? e.call(this, n) : e) }) }, unwrap: function () { return this.parent().each(function () { v.nodeName(this, "body") || v(this).replaceWith(this.childNodes) }).end() }, append: function () { return this.domManip(arguments, !0, function (e) { (this.nodeType === 1 || this.nodeType === 11) && this.appendChild(e) }) }, prepend: function () { return this.domManip(arguments, !0, function (e) { (this.nodeType === 1 || this.nodeType === 11) && this.insertBefore(e, this.firstChild) }) }, before: function () { if (!ut(this[0])) return this.domManip(arguments, !1, function (e) { this.parentNode.insertBefore(e, this) }); if (arguments.length) { var e = v.clean(arguments); return this.pushStack(v.merge(e, this), "before", this.selector) } }, after: function () { if (!ut(this[0])) return this.domManip(arguments, !1, function (e) { this.parentNode.insertBefore(e, this.nextSibling) }); if (arguments.length) { var e = v.clean(arguments); return this.pushStack(v.merge(this, e), "after", this.selector) } }, remove: function (e, t) { var n, r = 0; for (; (n = this[r]) != null; r++)if (!e || v.filter(e, [n]).length) !t && n.nodeType === 1 && (v.cleanData(n.getElementsByTagName("*")), v.cleanData([n])), n.parentNode && n.parentNode.removeChild(n); return this }, empty: function () { var e, t = 0; for (; (e = this[t]) != null; t++) { e.nodeType === 1 && v.cleanData(e.getElementsByTagName("*")); while (e.firstChild) e.removeChild(e.firstChild) } return this }, clone: function (e, t) { return e = e == null ? !1 : e, t = t == null ? e : t, this.map(function () { return v.clone(this, e, t) }) }, html: function (e) { return v.access(this, function (e) { var n = this[0] || {}, r = 0, i = this.length; if (e === t) return n.nodeType === 1 ? n.innerHTML.replace(ht, "") : t; if (typeof e == "string" && !yt.test(e) && (v.support.htmlSerialize || !wt.test(e)) && (v.support.leadingWhitespace || !pt.test(e)) && !Nt[(vt.exec(e) || ["", ""])[1].toLowerCase()]) { e = e.replace(dt, "<$1>$2>"); try { for (; r < i; r++)n = this[r] || {}, n.nodeType === 1 && (v.cleanData(n.getElementsByTagName("*")), n.innerHTML = e); n = 0 } catch (s) { } } n && this.empty().append(e) }, null, e, arguments.length) }, replaceWith: function (e) { return ut(this[0]) ? this.length ? this.pushStack(v(v.isFunction(e) ? e() : e), "replaceWith", e) : this : v.isFunction(e) ? this.each(function (t) { var n = v(this), r = n.html(); n.replaceWith(e.call(this, t, r)) }) : (typeof e != "string" && (e = v(e).detach()), this.each(function () { var t = this.nextSibling, n = this.parentNode; v(this).remove(), t ? v(t).before(e) : v(n).append(e) })) }, detach: function (e) { return this.remove(e, !0) }, domManip: function (e, n, r) { e = [].concat.apply([], e); var i, s, o, u, a = 0, f = e[0], l = [], c = this.length; if (!v.support.checkClone && c > 1 && typeof f == "string" && St.test(f)) return this.each(function () { v(this).domManip(e, n, r) }); if (v.isFunction(f)) return this.each(function (i) { var s = v(this); e[0] = f.call(this, i, n ? s.html() : t), s.domManip(e, n, r) }); if (this[0]) { i = v.buildFragment(e, this, l), o = i.fragment, s = o.firstChild, o.childNodes.length === 1 && (o = s); if (s) { n = n && v.nodeName(s, "tr"); for (u = i.cacheable || c - 1; a < c; a++)r.call(n && v.nodeName(this[a], "table") ? Lt(this[a], "tbody") : this[a], a === u ? o : v.clone(o, !0, !0)) } o = s = null, l.length && v.each(l, function (e, t) { t.src ? v.ajax ? v.ajax({ url: t.src, type: "GET", dataType: "script", async: !1, global: !1, "throws": !0 }) : v.error("no ajax") : v.globalEval((t.text || t.textContent || t.innerHTML || "").replace(Tt, "")), t.parentNode && t.parentNode.removeChild(t) }) } return this } }), v.buildFragment = function (e, n, r) { var s, o, u, a = e[0]; return n = n || i, n = !n.nodeType && n[0] || n, n = n.ownerDocument || n, e.length === 1 && typeof a == "string" && a.length < 512 && n === i && a.charAt(0) === "<" && !bt.test(a) && (v.support.checkClone || !St.test(a)) && (v.support.html5Clone || !wt.test(a)) && (o = !0, s = v.fragments[a], u = s !== t), s || (s = n.createDocumentFragment(), v.clean(e, n, s, r), o && (v.fragments[a] = u && s)), { fragment: s, cacheable: o } }, v.fragments = {}, v.each({ appendTo: "append", prependTo: "prepend", insertBefore: "before", insertAfter: "after", replaceAll: "replaceWith" }, function (e, t) { v.fn[e] = function (n) { var r, i = 0, s = [], o = v(n), u = o.length, a = this.length === 1 && this[0].parentNode; if ((a == null || a && a.nodeType === 11 && a.childNodes.length === 1) && u === 1) return o[t](this[0]), this; for (; i < u; i++)r = (i > 0 ? this.clone(!0) : this).get(), v(o[i])[t](r), s = s.concat(r); return this.pushStack(s, e, o.selector) } }), v.extend({ clone: function (e, t, n) { var r, i, s, o; v.support.html5Clone || v.isXMLDoc(e) || !wt.test("<" + e.nodeName + ">") ? o = e.cloneNode(!0) : (kt.innerHTML = e.outerHTML, kt.removeChild(o = kt.firstChild)); if ((!v.support.noCloneEvent || !v.support.noCloneChecked) && (e.nodeType === 1 || e.nodeType === 11) && !v.isXMLDoc(e)) { Ot(e, o), r = Mt(e), i = Mt(o); for (s = 0; r[s]; ++s)i[s] && Ot(r[s], i[s]) } if (t) { At(e, o); if (n) { r = Mt(e), i = Mt(o); for (s = 0; r[s]; ++s)At(r[s], i[s]) } } return r = i = null, o }, clean: function (e, t, n, r) { var s, o, u, a, f, l, c, h, p, d, m, g, y = t === i && Ct, b = []; if (!t || typeof t.createDocumentFragment == "undefined") t = i; for (s = 0; (u = e[s]) != null; s++) { typeof u == "number" && (u += ""); if (!u) continue; if (typeof u == "string") if (!gt.test(u)) u = t.createTextNode(u); else { y = y || lt(t), c = t.createElement("div"), y.appendChild(c), u = u.replace(dt, "<$1>$2>"), a = (vt.exec(u) || ["", ""])[1].toLowerCase(), f = Nt[a] || Nt._default, l = f[0], c.innerHTML = f[1] + u + f[2]; while (l--) c = c.lastChild; if (!v.support.tbody) { h = mt.test(u), p = a === "table" && !h ? c.firstChild && c.firstChild.childNodes : f[1] === "
" && !h ? c.childNodes : []; for (o = p.length - 1; o >= 0; --o)v.nodeName(p[o], "tbody") && !p[o].childNodes.length && p[o].parentNode.removeChild(p[o]) } !v.support.leadingWhitespace && pt.test(u) && c.insertBefore(t.createTextNode(pt.exec(u)[0]), c.firstChild), u = c.childNodes, c.parentNode.removeChild(c) } u.nodeType ? b.push(u) : v.merge(b, u) } c && (u = c = y = null); if (!v.support.appendChecked) for (s = 0; (u = b[s]) != null; s++)v.nodeName(u, "input") ? _t(u) : typeof u.getElementsByTagName != "undefined" && v.grep(u.getElementsByTagName("input"), _t); if (n) { m = function (e) { if (!e.type || xt.test(e.type)) return r ? r.push(e.parentNode ? e.parentNode.removeChild(e) : e) : n.appendChild(e) }; for (s = 0; (u = b[s]) != null; s++)if (!v.nodeName(u, "script") || !m(u)) n.appendChild(u), typeof u.getElementsByTagName != "undefined" && (g = v.grep(v.merge([], u.getElementsByTagName("script")), m), b.splice.apply(b, [s + 1, 0].concat(g)), s += g.length) } return b }, cleanData: function (e, t) { var n, r, i, s, o = 0, u = v.expando, a = v.cache, f = v.support.deleteExpando, l = v.event.special; for (; (i = e[o]) != null; o++)if (t || v.acceptData(i)) { r = i[u], n = r && a[r]; if (n) { if (n.events) for (s in n.events) l[s] ? v.event.remove(i, s) : v.removeEvent(i, s, n.handle); a[r] && (delete a[r], f ? delete i[u] : i.removeAttribute ? i.removeAttribute(u) : i[u] = null, v.deletedIds.push(r)) } } } }), function () { var e, t; v.uaMatch = function (e) { e = e.toLowerCase(); var t = /(chrome)[ \/]([\w.]+)/.exec(e) || /(webkit)[ \/]([\w.]+)/.exec(e) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(e) || /(msie) ([\w.]+)/.exec(e) || e.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(e) || []; return { browser: t[1] || "", version: t[2] || "0" } }, e = v.uaMatch(o.userAgent), t = {}, e.browser && (t[e.browser] = !0, t.version = e.version), t.chrome ? t.webkit = !0 : t.webkit && (t.safari = !0), v.browser = t, v.sub = function () { function e(t, n) { return new e.fn.init(t, n) } v.extend(!0, e, this), e.superclass = this, e.fn = e.prototype = this(), e.fn.constructor = e, e.sub = this.sub, e.fn.init = function (r, i) { return i && i instanceof v && !(i instanceof e) && (i = e(i)), v.fn.init.call(this, r, i, t) }, e.fn.init.prototype = e.fn; var t = e(i); return e } }(); var Dt, Pt, Ht, Bt = /alpha\([^)]*\)/i, jt = /opacity=([^)]*)/, Ft = /^(top|right|bottom|left)$/, It = /^(none|table(?!-c[ea]).+)/, qt = /^margin/, Rt = new RegExp("^(" + m + ")(.*)$", "i"), Ut = new RegExp("^(" + m + ")(?!px)[a-z%]+$", "i"), zt = new RegExp("^([-+])=(" + m + ")", "i"), Wt = { BODY: "block" }, Xt = { position: "absolute", visibility: "hidden", display: "block" }, Vt = { letterSpacing: 0, fontWeight: 400 }, $t = ["Top", "Right", "Bottom", "Left"], Jt = ["Webkit", "O", "Moz", "ms"], Kt = v.fn.toggle; v.fn.extend({ css: function (e, n) { return v.access(this, function (e, n, r) { return r !== t ? v.style(e, n, r) : v.css(e, n) }, e, n, arguments.length > 1) }, show: function () { return Yt(this, !0) }, hide: function () { return Yt(this) }, toggle: function (e, t) { var n = typeof e == "boolean"; return v.isFunction(e) && v.isFunction(t) ? Kt.apply(this, arguments) : this.each(function () { (n ? e : Gt(this)) ? v(this).show() : v(this).hide() }) } }), v.extend({ cssHooks: { opacity: { get: function (e, t) { if (t) { var n = Dt(e, "opacity"); return n === "" ? "1" : n } } } }, cssNumber: { fillOpacity: !0, fontWeight: !0, lineHeight: !0, opacity: !0, orphans: !0, widows: !0, zIndex: !0, zoom: !0 }, cssProps: { "float": v.support.cssFloat ? "cssFloat" : "styleFloat" }, style: function (e, n, r, i) { if (!e || e.nodeType === 3 || e.nodeType === 8 || !e.style) return; var s, o, u, a = v.camelCase(n), f = e.style; n = v.cssProps[a] || (v.cssProps[a] = Qt(f, a)), u = v.cssHooks[n] || v.cssHooks[a]; if (r === t) return u && "get" in u && (s = u.get(e, !1, i)) !== t ? s : f[n]; o = typeof r, o === "string" && (s = zt.exec(r)) && (r = (s[1] + 1) * s[2] + parseFloat(v.css(e, n)), o = "number"); if (r == null || o === "number" && isNaN(r)) return; o === "number" && !v.cssNumber[a] && (r += "px"); if (!u || !("set" in u) || (r = u.set(e, r, i)) !== t) try { f[n] = r } catch (l) { } }, css: function (e, n, r, i) { var s, o, u, a = v.camelCase(n); return n = v.cssProps[a] || (v.cssProps[a] = Qt(e.style, a)), u = v.cssHooks[n] || v.cssHooks[a], u && "get" in u && (s = u.get(e, !0, i)), s === t && (s = Dt(e, n)), s === "normal" && n in Vt && (s = Vt[n]), r || i !== t ? (o = parseFloat(s), r || v.isNumeric(o) ? o || 0 : s) : s }, swap: function (e, t, n) { var r, i, s = {}; for (i in t) s[i] = e.style[i], e.style[i] = t[i]; r = n.call(e); for (i in t) e.style[i] = s[i]; return r } }), e.getComputedStyle ? Dt = function (t, n) { var r, i, s, o, u = e.getComputedStyle(t, null), a = t.style; return u && (r = u.getPropertyValue(n) || u[n], r === "" && !v.contains(t.ownerDocument, t) && (r = v.style(t, n)), Ut.test(r) && qt.test(n) && (i = a.width, s = a.minWidth, o = a.maxWidth, a.minWidth = a.maxWidth = a.width = r, r = u.width, a.width = i, a.minWidth = s, a.maxWidth = o)), r } : i.documentElement.currentStyle && (Dt = function (e, t) { var n, r, i = e.currentStyle && e.currentStyle[t], s = e.style; return i == null && s && s[t] && (i = s[t]), Ut.test(i) && !Ft.test(t) && (n = s.left, r = e.runtimeStyle && e.runtimeStyle.left, r && (e.runtimeStyle.left = e.currentStyle.left), s.left = t === "fontSize" ? "1em" : i, i = s.pixelLeft + "px", s.left = n, r && (e.runtimeStyle.left = r)), i === "" ? "auto" : i }), v.each(["height", "width"], function (e, t) { v.cssHooks[t] = { get: function (e, n, r) { if (n) return e.offsetWidth === 0 && It.test(Dt(e, "display")) ? v.swap(e, Xt, function () { return tn(e, t, r) }) : tn(e, t, r) }, set: function (e, n, r) { return Zt(e, n, r ? en(e, t, r, v.support.boxSizing && v.css(e, "boxSizing") === "border-box") : 0) } } }), v.support.opacity || (v.cssHooks.opacity = { get: function (e, t) { return jt.test((t && e.currentStyle ? e.currentStyle.filter : e.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : t ? "1" : "" }, set: function (e, t) { var n = e.style, r = e.currentStyle, i = v.isNumeric(t) ? "alpha(opacity=" + t * 100 + ")" : "", s = r && r.filter || n.filter || ""; n.zoom = 1; if (t >= 1 && v.trim(s.replace(Bt, "")) === "" && n.removeAttribute) { n.removeAttribute("filter"); if (r && !r.filter) return } n.filter = Bt.test(s) ? s.replace(Bt, i) : s + " " + i } }), v(function () { v.support.reliableMarginRight || (v.cssHooks.marginRight = { get: function (e, t) { return v.swap(e, { display: "inline-block" }, function () { if (t) return Dt(e, "marginRight") }) } }), !v.support.pixelPosition && v.fn.position && v.each(["top", "left"], function (e, t) { v.cssHooks[t] = { get: function (e, n) { if (n) { var r = Dt(e, t); return Ut.test(r) ? v(e).position()[t] + "px" : r } } } }) }), v.expr && v.expr.filters && (v.expr.filters.hidden = function (e) { return e.offsetWidth === 0 && e.offsetHeight === 0 || !v.support.reliableHiddenOffsets && (e.style && e.style.display || Dt(e, "display")) === "none" }, v.expr.filters.visible = function (e) { return !v.expr.filters.hidden(e) }), v.each({ margin: "", padding: "", border: "Width" }, function (e, t) { v.cssHooks[e + t] = { expand: function (n) { var r, i = typeof n == "string" ? n.split(" ") : [n], s = {}; for (r = 0; r < 4; r++)s[e + $t[r] + t] = i[r] || i[r - 2] || i[0]; return s } }, qt.test(e) || (v.cssHooks[e + t].set = Zt) }); var rn = /%20/g, sn = /\[\]$/, on = /\r?\n/g, un = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i, an = /^(?:select|textarea)/i; v.fn.extend({ serialize: function () { return v.param(this.serializeArray()) }, serializeArray: function () { return this.map(function () { return this.elements ? v.makeArray(this.elements) : this }).filter(function () { return this.name && !this.disabled && (this.checked || an.test(this.nodeName) || un.test(this.type)) }).map(function (e, t) { var n = v(this).val(); return n == null ? null : v.isArray(n) ? v.map(n, function (e, n) { return { name: t.name, value: e.replace(on, "\r\n") } }) : { name: t.name, value: n.replace(on, "\r\n") } }).get() } }), v.param = function (e, n) { var r, i = [], s = function (e, t) { t = v.isFunction(t) ? t() : t == null ? "" : t, i[i.length] = encodeURIComponent(e) + "=" + encodeURIComponent(t) }; n === t && (n = v.ajaxSettings && v.ajaxSettings.traditional); if (v.isArray(e) || e.jquery && !v.isPlainObject(e)) v.each(e, function () { s(this.name, this.value) }); else for (r in e) fn(r, e[r], n, s); return i.join("&").replace(rn, "+") }; var ln, cn, hn = /#.*$/, pn = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, dn = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/, vn = /^(?:GET|HEAD)$/, mn = /^\/\//, gn = /\?/, yn = /
-//
-//
-// Here's how it works.
-//
-// ```
-// // Get a reference to the logo element.
-// var el = document.getElementById('logo');
-//
-// // create a SpringSystem and a Spring with a bouncy config.
-// var springSystem = new rebound.SpringSystem();
-// var spring = springSystem.createSpring(50, 3);
-//
-// // Add a listener to the spring. Every time the physics
-// // solver updates the Spring's value onSpringUpdate will
-// // be called.
-// spring.addListener({
-// onSpringUpdate: function(spring) {
-// var val = spring.getCurrentValue();
-// val = rebound.MathUtil
-// .mapValueInRange(val, 0, 1, 1, 0.5);
-// scale(el, val);
-// }
-// });
-//
-// // Listen for mouse down/up/out and toggle the
-// //springs endValue from 0 to 1.
-// el.addEventListener('mousedown', function() {
-// spring.setEndValue(1);
-// });
-//
-// el.addEventListener('mouseout', function() {
-// spring.setEndValue(0);
-// });
-//
-// el.addEventListener('mouseup', function() {
-// spring.setEndValue(0);
-// });
-//
-// // Helper for scaling an element with css transforms.
-// function scale(el, val) {
-// el.style.mozTransform =
-// el.style.msTransform =
-// el.style.webkitTransform =
-// el.style.transform = 'scale3d(' +
-// val + ', ' + val + ', 1)';
-// }
-// ```
-
-(function () {
- var rebound = {};
- var util = rebound.util = {};
- var concat = Array.prototype.concat;
- var slice = Array.prototype.slice;
-
- // Bind a function to a context object.
- util.bind = function bind(func, context) {
- var args = slice.call(arguments, 2);
- return function () {
- func.apply(context, concat.call(args, slice.call(arguments)));
- };
- };
-
- // Add all the properties in the source to the target.
- util.extend = function extend(target, source) {
- for (var key in source) {
- if (source.hasOwnProperty(key)) {
- target[key] = source[key];
- }
- }
- };
-
- // SpringSystem
- // ------------
- // **SpringSystem** is a set of Springs that all run on the same physics
- // timing loop. To get started with a Rebound animation you first
- // create a new SpringSystem and then add springs to it.
- var SpringSystem = rebound.SpringSystem = function SpringSystem(looper) {
- this._springRegistry = {};
- this._activeSprings = [];
- this.listeners = [];
- this._idleSpringIndices = [];
- this.looper = looper || new AnimationLooper();
- this.looper.springSystem = this;
- };
-
- util.extend(SpringSystem.prototype, {
-
- _springRegistry: null,
-
- _isIdle: true,
-
- _lastTimeMillis: -1,
-
- _activeSprings: null,
-
- listeners: null,
-
- _idleSpringIndices: null,
-
- // A SpringSystem is iterated by a looper. The looper is responsible
- // for executing each frame as the SpringSystem is resolved to idle.
- // There are three types of Loopers described below AnimationLooper,
- // SimulationLooper, and SteppingSimulationLooper. AnimationLooper is
- // the default as it is the most useful for common UI animations.
- setLooper: function setLooper(looper) {
- this.looper = looper;
- looper.springSystem = this;
- },
-
- // Add a new spring to this SpringSystem. This Spring will now be solved for
- // during the physics iteration loop. By default the spring will use the
- // default Origami spring config with 40 tension and 7 friction, but you can
- // also provide your own values here.
- createSpring: function createSpring(tension, friction) {
- var springConfig;
- if (tension === undefined || friction === undefined) {
- springConfig = SpringConfig.DEFAULT_ORIGAMI_SPRING_CONFIG;
- } else {
- springConfig = SpringConfig.fromOrigamiTensionAndFriction(tension, friction);
- }
- return this.createSpringWithConfig(springConfig);
- },
-
- // Add a spring with a specified bounciness and speed. To replicate Origami
- // compositions based on PopAnimation patches, use this factory method to
- // create matching springs.
- createSpringWithBouncinessAndSpeed: function createSpringWithBouncinessAndSpeed(bounciness, speed) {
- var springConfig;
- if (bounciness === undefined || speed === undefined) {
- springConfig = SpringConfig.DEFAULT_ORIGAMI_SPRING_CONFIG;
- } else {
- springConfig = SpringConfig.fromBouncinessAndSpeed(bounciness, speed);
- }
- return this.createSpringWithConfig(springConfig);
- },
-
- // Add a spring with the provided SpringConfig.
- createSpringWithConfig: function createSpringWithConfig(springConfig) {
- var spring = new Spring(this);
- this.registerSpring(spring);
- spring.setSpringConfig(springConfig);
- return spring;
- },
-
- // You can check if a SpringSystem is idle or active by calling
- // getIsIdle. If all of the Springs in the SpringSystem are at rest,
- // i.e. the physics forces have reached equilibrium, then this
- // method will return true.
- getIsIdle: function getIsIdle() {
- return this._isIdle;
- },
-
- // Retrieve a specific Spring from the SpringSystem by id. This
- // can be useful for inspecting the state of a spring before
- // or after an integration loop in the SpringSystem executes.
- getSpringById: function getSpringById(id) {
- return this._springRegistry[id];
- },
-
- // Get a listing of all the springs registered with this
- // SpringSystem.
- getAllSprings: function getAllSprings() {
- var vals = [];
- for (var id in this._springRegistry) {
- if (this._springRegistry.hasOwnProperty(id)) {
- vals.push(this._springRegistry[id]);
- }
- }
- return vals;
- },
-
- // registerSpring is called automatically as soon as you create
- // a Spring with SpringSystem#createSpring. This method sets the
- // spring up in the registry so that it can be solved in the
- // solver loop.
- registerSpring: function registerSpring(spring) {
- this._springRegistry[spring.getId()] = spring;
- },
-
- // Deregister a spring with this SpringSystem. The SpringSystem will
- // no longer consider this Spring during its integration loop once
- // this is called. This is normally done automatically for you when
- // you call Spring#destroy.
- deregisterSpring: function deregisterSpring(spring) {
- removeFirst(this._activeSprings, spring);
- delete this._springRegistry[spring.getId()];
- },
-
- advance: function advance(time, deltaTime) {
- while (this._idleSpringIndices.length > 0) {
- this._idleSpringIndices.pop();
- } for (var i = 0, len = this._activeSprings.length; i < len; i++) {
- var spring = this._activeSprings[i];
- if (spring.systemShouldAdvance()) {
- spring.advance(time / 1000.0, deltaTime / 1000.0);
- } else {
- this._idleSpringIndices.push(this._activeSprings.indexOf(spring));
- }
- }
- while (this._idleSpringIndices.length > 0) {
- var idx = this._idleSpringIndices.pop();
- idx >= 0 && this._activeSprings.splice(idx, 1);
- }
- },
-
- // This is our main solver loop called to move the simulation
- // forward through time. Before each pass in the solver loop
- // onBeforeIntegrate is called on an any listeners that have
- // registered themeselves with the SpringSystem. This gives you
- // an opportunity to apply any constraints or adjustments to
- // the springs that should be enforced before each iteration
- // loop. Next the advance method is called to move each Spring in
- // the systemShouldAdvance forward to the current time. After the
- // integration step runs in advance, onAfterIntegrate is called
- // on any listeners that have registered themselves with the
- // SpringSystem. This gives you an opportunity to run any post
- // integration constraints or adjustments on the Springs in the
- // SpringSystem.
- loop: function loop(currentTimeMillis) {
- var listener;
- if (this._lastTimeMillis === -1) {
- this._lastTimeMillis = currentTimeMillis - 1;
- }
- var ellapsedMillis = currentTimeMillis - this._lastTimeMillis;
- this._lastTimeMillis = currentTimeMillis;
-
- var i = 0,
- len = this.listeners.length;
- for (i = 0; i < len; i++) {
- listener = this.listeners[i];
- listener.onBeforeIntegrate && listener.onBeforeIntegrate(this);
- }
-
- this.advance(currentTimeMillis, ellapsedMillis);
- if (this._activeSprings.length === 0) {
- this._isIdle = true;
- this._lastTimeMillis = -1;
- }
-
- for (i = 0; i < len; i++) {
- listener = this.listeners[i];
- listener.onAfterIntegrate && listener.onAfterIntegrate(this);
- }
-
- if (!this._isIdle) {
- this.looper.run();
- }
- },
-
- // activateSpring is used to notify the SpringSystem that a Spring
- // has become displaced. The system responds by starting its solver
- // loop up if it is currently idle.
- activateSpring: function activateSpring(springId) {
- var spring = this._springRegistry[springId];
- if (this._activeSprings.indexOf(spring) == -1) {
- this._activeSprings.push(spring);
- }
- if (this.getIsIdle()) {
- this._isIdle = false;
- this.looper.run();
- }
- },
-
- // Add a listener to the SpringSystem so that you can receive
- // before/after integration notifications allowing Springs to be
- // constrained or adjusted.
- addListener: function addListener(listener) {
- this.listeners.push(listener);
- },
-
- // Remove a previously added listener on the SpringSystem.
- removeListener: function removeListener(listener) {
- removeFirst(this.listeners, listener);
- },
-
- // Remove all previously added listeners on the SpringSystem.
- removeAllListeners: function removeAllListeners() {
- this.listeners = [];
- }
-
- });
-
- // Spring
- // ------
- // **Spring** provides a model of a classical spring acting to
- // resolve a body to equilibrium. Springs have configurable
- // tension which is a force multipler on the displacement of the
- // spring from its rest point or `endValue` as defined by [Hooke's
- // law](http://en.wikipedia.org/wiki/Hooke's_law). Springs also have
- // configurable friction, which ensures that they do not oscillate
- // infinitely. When a Spring is displaced by updating it's resting
- // or `currentValue`, the SpringSystems that contain that Spring
- // will automatically start looping to solve for equilibrium. As each
- // timestep passes, `SpringListener` objects attached to the Spring
- // will be notified of the updates providing a way to drive an
- // animation off of the spring's resolution curve.
- var Spring = rebound.Spring = function Spring(springSystem) {
- this._id = 's' + Spring._ID++;
- this._springSystem = springSystem;
- this.listeners = [];
- this._currentState = new PhysicsState();
- this._previousState = new PhysicsState();
- this._tempState = new PhysicsState();
- };
-
- util.extend(Spring, {
- _ID: 0,
-
- MAX_DELTA_TIME_SEC: 0.064,
-
- SOLVER_TIMESTEP_SEC: 0.001
-
- });
-
- util.extend(Spring.prototype, {
-
- _id: 0,
-
- _springConfig: null,
-
- _overshootClampingEnabled: false,
-
- _currentState: null,
-
- _previousState: null,
-
- _tempState: null,
-
- _startValue: 0,
-
- _endValue: 0,
-
- _wasAtRest: true,
-
- _restSpeedThreshold: 0.001,
-
- _displacementFromRestThreshold: 0.001,
-
- listeners: null,
-
- _timeAccumulator: 0,
-
- _springSystem: null,
-
- // Remove a Spring from simulation and clear its listeners.
- destroy: function destroy() {
- this.listeners = [];
- this.frames = [];
- this._springSystem.deregisterSpring(this);
- },
-
- // Get the id of the spring, which can be used to retrieve it from
- // the SpringSystems it participates in later.
- getId: function getId() {
- return this._id;
- },
-
- // Set the configuration values for this Spring. A SpringConfig
- // contains the tension and friction values used to solve for the
- // equilibrium of the Spring in the physics loop.
- setSpringConfig: function setSpringConfig(springConfig) {
- this._springConfig = springConfig;
- return this;
- },
-
- // Retrieve the SpringConfig used by this Spring.
- getSpringConfig: function getSpringConfig() {
- return this._springConfig;
- },
-
- // Set the current position of this Spring. Listeners will be updated
- // with this value immediately. If the rest or `endValue` is not
- // updated to match this value, then the spring will be dispalced and
- // the SpringSystem will start to loop to restore the spring to the
- // `endValue`.
- //
- // A common pattern is to move a Spring around without animation by
- // calling.
- //
- // ```
- // spring.setCurrentValue(n).setAtRest();
- // ```
- //
- // This moves the Spring to a new position `n`, sets the endValue
- // to `n`, and removes any velocity from the `Spring`. By doing
- // this you can allow the `SpringListener` to manage the position
- // of UI elements attached to the spring even when moving without
- // animation. For example, when dragging an element you can
- // update the position of an attached view through a spring
- // by calling `spring.setCurrentValue(x)`. When
- // the gesture ends you can update the Springs
- // velocity and endValue
- // `spring.setVelocity(gestureEndVelocity).setEndValue(flingTarget)`
- // to cause it to naturally animate the UI element to the resting
- // position taking into account existing velocity. The codepaths for
- // synchronous movement and spring driven animation can
- // be unified using this technique.
- setCurrentValue: function setCurrentValue(currentValue, skipSetAtRest) {
- this._startValue = currentValue;
- this._currentState.position = currentValue;
- if (!skipSetAtRest) {
- this.setAtRest();
- }
- this.notifyPositionUpdated(false, false);
- return this;
- },
-
- // Get the position that the most recent animation started at. This
- // can be useful for determining the number off oscillations that
- // have occurred.
- getStartValue: function getStartValue() {
- return this._startValue;
- },
-
- // Retrieve the current value of the Spring.
- getCurrentValue: function getCurrentValue() {
- return this._currentState.position;
- },
-
- // Get the absolute distance of the Spring from it's resting endValue
- // position.
- getCurrentDisplacementDistance: function getCurrentDisplacementDistance() {
- return this.getDisplacementDistanceForState(this._currentState);
- },
-
- getDisplacementDistanceForState: function getDisplacementDistanceForState(state) {
- return Math.abs(this._endValue - state.position);
- },
-
- // Set the endValue or resting position of the spring. If this
- // value is different than the current value, the SpringSystem will
- // be notified and will begin running its solver loop to resolve
- // the Spring to equilibrium. Any listeners that are registered
- // for onSpringEndStateChange will also be notified of this update
- // immediately.
- setEndValue: function setEndValue(endValue) {
- if (this._endValue == endValue && this.isAtRest()) {
- return this;
- }
- this._startValue = this.getCurrentValue();
- this._endValue = endValue;
- this._springSystem.activateSpring(this.getId());
- for (var i = 0, len = this.listeners.length; i < len; i++) {
- var listener = this.listeners[i];
- var onChange = listener.onSpringEndStateChange;
- onChange && onChange(this);
- }
- return this;
- },
-
- // Retrieve the endValue or resting position of this spring.
- getEndValue: function getEndValue() {
- return this._endValue;
- },
-
- // Set the current velocity of the Spring. As previously mentioned,
- // this can be useful when you are performing a direct manipulation
- // gesture. When a UI element is released you may call setVelocity
- // on its animation Spring so that the Spring continues with the
- // same velocity as the gesture ended with. The friction, tension,
- // and displacement of the Spring will then govern its motion to
- // return to rest on a natural feeling curve.
- setVelocity: function setVelocity(velocity) {
- if (velocity === this._currentState.velocity) {
- return this;
- }
- this._currentState.velocity = velocity;
- this._springSystem.activateSpring(this.getId());
- return this;
- },
-
- // Get the current velocity of the Spring.
- getVelocity: function getVelocity() {
- return this._currentState.velocity;
- },
-
- // Set a threshold value for the movement speed of the Spring below
- // which it will be considered to be not moving or resting.
- setRestSpeedThreshold: function setRestSpeedThreshold(restSpeedThreshold) {
- this._restSpeedThreshold = restSpeedThreshold;
- return this;
- },
-
- // Retrieve the rest speed threshold for this Spring.
- getRestSpeedThreshold: function getRestSpeedThreshold() {
- return this._restSpeedThreshold;
- },
-
- // Set a threshold value for displacement below which the Spring
- // will be considered to be not displaced i.e. at its resting
- // `endValue`.
- setRestDisplacementThreshold: function setRestDisplacementThreshold(displacementFromRestThreshold) {
- this._displacementFromRestThreshold = displacementFromRestThreshold;
- },
-
- // Retrieve the rest displacement threshold for this spring.
- getRestDisplacementThreshold: function getRestDisplacementThreshold() {
- return this._displacementFromRestThreshold;
- },
-
- // Enable overshoot clamping. This means that the Spring will stop
- // immediately when it reaches its resting position regardless of
- // any existing momentum it may have. This can be useful for certain
- // types of animations that should not oscillate such as a scale
- // down to 0 or alpha fade.
- setOvershootClampingEnabled: function setOvershootClampingEnabled(enabled) {
- this._overshootClampingEnabled = enabled;
- return this;
- },
-
- // Check if overshoot clamping is enabled for this spring.
- isOvershootClampingEnabled: function isOvershootClampingEnabled() {
- return this._overshootClampingEnabled;
- },
-
- // Check if the Spring has gone past its end point by comparing
- // the direction it was moving in when it started to the current
- // position and end value.
- isOvershooting: function isOvershooting() {
- var start = this._startValue;
- var end = this._endValue;
- return this._springConfig.tension > 0 && (start < end && this.getCurrentValue() > end || start > end && this.getCurrentValue() < end);
- },
-
- // Spring.advance is the main solver method for the Spring. It takes
- // the current time and delta since the last time step and performs
- // an RK4 integration to get the new position and velocity state
- // for the Spring based on the tension, friction, velocity, and
- // displacement of the Spring.
- advance: function advance(time, realDeltaTime) {
- var isAtRest = this.isAtRest();
-
- if (isAtRest && this._wasAtRest) {
- return;
- }
-
- var adjustedDeltaTime = realDeltaTime;
- if (realDeltaTime > Spring.MAX_DELTA_TIME_SEC) {
- adjustedDeltaTime = Spring.MAX_DELTA_TIME_SEC;
- }
-
- this._timeAccumulator += adjustedDeltaTime;
-
- var tension = this._springConfig.tension,
- friction = this._springConfig.friction,
- position = this._currentState.position,
- velocity = this._currentState.velocity,
- tempPosition = this._tempState.position,
- tempVelocity = this._tempState.velocity,
- aVelocity,
- aAcceleration,
- bVelocity,
- bAcceleration,
- cVelocity,
- cAcceleration,
- dVelocity,
- dAcceleration,
- dxdt,
- dvdt;
-
- while (this._timeAccumulator >= Spring.SOLVER_TIMESTEP_SEC) {
-
- this._timeAccumulator -= Spring.SOLVER_TIMESTEP_SEC;
-
- if (this._timeAccumulator < Spring.SOLVER_TIMESTEP_SEC) {
- this._previousState.position = position;
- this._previousState.velocity = velocity;
- }
-
- aVelocity = velocity;
- aAcceleration = tension * (this._endValue - tempPosition) - friction * velocity;
-
- tempPosition = position + aVelocity * Spring.SOLVER_TIMESTEP_SEC * 0.5;
- tempVelocity = velocity + aAcceleration * Spring.SOLVER_TIMESTEP_SEC * 0.5;
- bVelocity = tempVelocity;
- bAcceleration = tension * (this._endValue - tempPosition) - friction * tempVelocity;
-
- tempPosition = position + bVelocity * Spring.SOLVER_TIMESTEP_SEC * 0.5;
- tempVelocity = velocity + bAcceleration * Spring.SOLVER_TIMESTEP_SEC * 0.5;
- cVelocity = tempVelocity;
- cAcceleration = tension * (this._endValue - tempPosition) - friction * tempVelocity;
-
- tempPosition = position + cVelocity * Spring.SOLVER_TIMESTEP_SEC * 0.5;
- tempVelocity = velocity + cAcceleration * Spring.SOLVER_TIMESTEP_SEC * 0.5;
- dVelocity = tempVelocity;
- dAcceleration = tension * (this._endValue - tempPosition) - friction * tempVelocity;
-
- dxdt = 1.0 / 6.0 * (aVelocity + 2.0 * (bVelocity + cVelocity) + dVelocity);
- dvdt = 1.0 / 6.0 * (aAcceleration + 2.0 * (bAcceleration + cAcceleration) + dAcceleration);
-
- position += dxdt * Spring.SOLVER_TIMESTEP_SEC;
- velocity += dvdt * Spring.SOLVER_TIMESTEP_SEC;
- }
-
- this._tempState.position = tempPosition;
- this._tempState.velocity = tempVelocity;
-
- this._currentState.position = position;
- this._currentState.velocity = velocity;
-
- if (this._timeAccumulator > 0) {
- this._interpolate(this._timeAccumulator / Spring.SOLVER_TIMESTEP_SEC);
- }
-
- if (this.isAtRest() || this._overshootClampingEnabled && this.isOvershooting()) {
-
- if (this._springConfig.tension > 0) {
- this._startValue = this._endValue;
- this._currentState.position = this._endValue;
- } else {
- this._endValue = this._currentState.position;
- this._startValue = this._endValue;
- }
- this.setVelocity(0);
- isAtRest = true;
- }
-
- var notifyActivate = false;
- if (this._wasAtRest) {
- this._wasAtRest = false;
- notifyActivate = true;
- }
-
- var notifyAtRest = false;
- if (isAtRest) {
- this._wasAtRest = true;
- notifyAtRest = true;
- }
-
- this.notifyPositionUpdated(notifyActivate, notifyAtRest);
- },
-
- notifyPositionUpdated: function notifyPositionUpdated(notifyActivate, notifyAtRest) {
- for (var i = 0, len = this.listeners.length; i < len; i++) {
- var listener = this.listeners[i];
- if (notifyActivate && listener.onSpringActivate) {
- listener.onSpringActivate(this);
- }
-
- if (listener.onSpringUpdate) {
- listener.onSpringUpdate(this);
- }
-
- if (notifyAtRest && listener.onSpringAtRest) {
- listener.onSpringAtRest(this);
- }
- }
- },
-
- // Check if the SpringSystem should advance. Springs are advanced
- // a final frame after they reach equilibrium to ensure that the
- // currentValue is exactly the requested endValue regardless of the
- // displacement threshold.
- systemShouldAdvance: function systemShouldAdvance() {
- return !this.isAtRest() || !this.wasAtRest();
- },
-
- wasAtRest: function wasAtRest() {
- return this._wasAtRest;
- },
-
- // Check if the Spring is atRest meaning that it's currentValue and
- // endValue are the same and that it has no velocity. The previously
- // described thresholds for speed and displacement define the bounds
- // of this equivalence check. If the Spring has 0 tension, then it will
- // be considered at rest whenever its absolute velocity drops below the
- // restSpeedThreshold.
- isAtRest: function isAtRest() {
- return Math.abs(this._currentState.velocity) < this._restSpeedThreshold && (this.getDisplacementDistanceForState(this._currentState) <= this._displacementFromRestThreshold || this._springConfig.tension === 0);
- },
-
- // Force the spring to be at rest at its current position. As
- // described in the documentation for setCurrentValue, this method
- // makes it easy to do synchronous non-animated updates to ui
- // elements that are attached to springs via SpringListeners.
- setAtRest: function setAtRest() {
- this._endValue = this._currentState.position;
- this._tempState.position = this._currentState.position;
- this._currentState.velocity = 0;
- return this;
- },
-
- _interpolate: function _interpolate(alpha) {
- this._currentState.position = this._currentState.position * alpha + this._previousState.position * (1 - alpha);
- this._currentState.velocity = this._currentState.velocity * alpha + this._previousState.velocity * (1 - alpha);
- },
-
- getListeners: function getListeners() {
- return this.listeners;
- },
-
- addListener: function addListener(newListener) {
- this.listeners.push(newListener);
- return this;
- },
-
- removeListener: function removeListener(listenerToRemove) {
- removeFirst(this.listeners, listenerToRemove);
- return this;
- },
-
- removeAllListeners: function removeAllListeners() {
- this.listeners = [];
- return this;
- },
-
- currentValueIsApproximately: function currentValueIsApproximately(value) {
- return Math.abs(this.getCurrentValue() - value) <= this.getRestDisplacementThreshold();
- }
-
- });
-
- // PhysicsState
- // ------------
- // **PhysicsState** consists of a position and velocity. A Spring uses
- // this internally to keep track of its current and prior position and
- // velocity values.
- var PhysicsState = function PhysicsState() { };
-
- util.extend(PhysicsState.prototype, {
- position: 0,
- velocity: 0
- });
-
- // SpringConfig
- // ------------
- // **SpringConfig** maintains a set of tension and friction constants
- // for a Spring. You can use fromOrigamiTensionAndFriction to convert
- // values from the [Origami](http://facebook.github.io/origami/)
- // design tool directly to Rebound spring constants.
- var SpringConfig = rebound.SpringConfig = function SpringConfig(tension, friction) {
- this.tension = tension;
- this.friction = friction;
- };
-
- // Loopers
- // -------
- // **AnimationLooper** plays each frame of the SpringSystem on animation
- // timing loop. This is the default type of looper for a new spring system
- // as it is the most common when developing UI.
- var AnimationLooper = rebound.AnimationLooper = function AnimationLooper() {
- this.springSystem = null;
- var _this = this;
- var _run = function _run() {
- _this.springSystem.loop(Date.now());
- };
-
- this.run = function () {
- util.onFrame(_run);
- };
- };
-
- // **SimulationLooper** resolves the SpringSystem to a resting state in a
- // tight and blocking loop. This is useful for synchronously generating
- // pre-recorded animations that can then be played on a timing loop later.
- // Sometimes this lead to better performance to pre-record a single spring
- // curve and use it to drive many animations; however, it can make dynamic
- // response to user input a bit trickier to implement.
- rebound.SimulationLooper = function SimulationLooper(timestep) {
- this.springSystem = null;
- var time = 0;
- var running = false;
- timestep = timestep || 16.667;
-
- this.run = function () {
- if (running) {
- return;
- }
- running = true;
- while (!this.springSystem.getIsIdle()) {
- this.springSystem.loop(time += timestep);
- }
- running = false;
- };
- };
-
- // **SteppingSimulationLooper** resolves the SpringSystem one step at a
- // time controlled by an outside loop. This is useful for testing and
- // verifying the behavior of a SpringSystem or if you want to control your own
- // timing loop for some reason e.g. slowing down or speeding up the
- // simulation.
- rebound.SteppingSimulationLooper = function (timestep) {
- this.springSystem = null;
- var time = 0;
-
- // this.run is NOOP'd here to allow control from the outside using
- // this.step.
- this.run = function () { };
-
- // Perform one step toward resolving the SpringSystem.
- this.step = function (timestep) {
- this.springSystem.loop(time += timestep);
- };
- };
-
- // Math for converting from
- // [Origami](http://facebook.github.io/origami/) to
- // [Rebound](http://facebook.github.io/rebound).
- // You mostly don't need to worry about this, just use
- // SpringConfig.fromOrigamiTensionAndFriction(v, v);
- var OrigamiValueConverter = rebound.OrigamiValueConverter = {
- tensionFromOrigamiValue: function tensionFromOrigamiValue(oValue) {
- return (oValue - 30.0) * 3.62 + 194.0;
- },
-
- origamiValueFromTension: function origamiValueFromTension(tension) {
- return (tension - 194.0) / 3.62 + 30.0;
- },
-
- frictionFromOrigamiValue: function frictionFromOrigamiValue(oValue) {
- return (oValue - 8.0) * 3.0 + 25.0;
- },
-
- origamiFromFriction: function origamiFromFriction(friction) {
- return (friction - 25.0) / 3.0 + 8.0;
- }
- };
-
- // BouncyConversion provides math for converting from Origami PopAnimation
- // config values to regular Origami tension and friction values. If you are
- // trying to replicate prototypes made with PopAnimation patches in Origami,
- // then you should create your springs with
- // SpringSystem.createSpringWithBouncinessAndSpeed, which uses this Math
- // internally to create a spring to match the provided PopAnimation
- // configuration from Origami.
- var BouncyConversion = rebound.BouncyConversion = function (bounciness, speed) {
- this.bounciness = bounciness;
- this.speed = speed;
- var b = this.normalize(bounciness / 1.7, 0, 20.0);
- b = this.projectNormal(b, 0.0, 0.8);
- var s = this.normalize(speed / 1.7, 0, 20.0);
- this.bouncyTension = this.projectNormal(s, 0.5, 200);
- this.bouncyFriction = this.quadraticOutInterpolation(b, this.b3Nobounce(this.bouncyTension), 0.01);
- };
-
- util.extend(BouncyConversion.prototype, {
-
- normalize: function normalize(value, startValue, endValue) {
- return (value - startValue) / (endValue - startValue);
- },
-
- projectNormal: function projectNormal(n, start, end) {
- return start + n * (end - start);
- },
-
- linearInterpolation: function linearInterpolation(t, start, end) {
- return t * end + (1.0 - t) * start;
- },
-
- quadraticOutInterpolation: function quadraticOutInterpolation(t, start, end) {
- return this.linearInterpolation(2 * t - t * t, start, end);
- },
-
- b3Friction1: function b3Friction1(x) {
- return 0.0007 * Math.pow(x, 3) - 0.031 * Math.pow(x, 2) + 0.64 * x + 1.28;
- },
-
- b3Friction2: function b3Friction2(x) {
- return 0.000044 * Math.pow(x, 3) - 0.006 * Math.pow(x, 2) + 0.36 * x + 2.;
- },
-
- b3Friction3: function b3Friction3(x) {
- return 0.00000045 * Math.pow(x, 3) - 0.000332 * Math.pow(x, 2) + 0.1078 * x + 5.84;
- },
-
- b3Nobounce: function b3Nobounce(tension) {
- var friction = 0;
- if (tension <= 18) {
- friction = this.b3Friction1(tension);
- } else if (tension > 18 && tension <= 44) {
- friction = this.b3Friction2(tension);
- } else {
- friction = this.b3Friction3(tension);
- }
- return friction;
- }
- });
-
- util.extend(SpringConfig, {
- // Convert an origami Spring tension and friction to Rebound spring
- // constants. If you are prototyping a design with Origami, this
- // makes it easy to make your springs behave exactly the same in
- // Rebound.
- fromOrigamiTensionAndFriction: function fromOrigamiTensionAndFriction(tension, friction) {
- return new SpringConfig(OrigamiValueConverter.tensionFromOrigamiValue(tension), OrigamiValueConverter.frictionFromOrigamiValue(friction));
- },
-
- // Convert an origami PopAnimation Spring bounciness and speed to Rebound
- // spring constants. If you are using PopAnimation patches in Origami, this
- // utility will provide springs that match your prototype.
- fromBouncinessAndSpeed: function fromBouncinessAndSpeed(bounciness, speed) {
- var bouncyConversion = new rebound.BouncyConversion(bounciness, speed);
- return this.fromOrigamiTensionAndFriction(bouncyConversion.bouncyTension, bouncyConversion.bouncyFriction);
- },
-
- // Create a SpringConfig with no tension or a coasting spring with some
- // amount of Friction so that it does not coast infininitely.
- coastingConfigWithOrigamiFriction: function coastingConfigWithOrigamiFriction(friction) {
- return new SpringConfig(0, OrigamiValueConverter.frictionFromOrigamiValue(friction));
- }
- });
-
- SpringConfig.DEFAULT_ORIGAMI_SPRING_CONFIG = SpringConfig.fromOrigamiTensionAndFriction(40, 7);
-
- util.extend(SpringConfig.prototype, { friction: 0, tension: 0 });
-
- // Here are a couple of function to convert colors between hex codes and RGB
- // component values. These are handy when performing color
- // tweening animations.
- var colorCache = {};
- util.hexToRGB = function (color) {
- if (colorCache[color]) {
- return colorCache[color];
- }
- color = color.replace('#', '');
- if (color.length === 3) {
- color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2];
- }
- var parts = color.match(/.{2}/g);
-
- var ret = {
- r: parseInt(parts[0], 16),
- g: parseInt(parts[1], 16),
- b: parseInt(parts[2], 16)
- };
-
- colorCache[color] = ret;
- return ret;
- };
-
- util.rgbToHex = function (r, g, b) {
- r = r.toString(16);
- g = g.toString(16);
- b = b.toString(16);
- r = r.length < 2 ? '0' + r : r;
- g = g.length < 2 ? '0' + g : g;
- b = b.length < 2 ? '0' + b : b;
- return '#' + r + g + b;
- };
-
- var MathUtil = rebound.MathUtil = {
- // This helper function does a linear interpolation of a value from
- // one range to another. This can be very useful for converting the
- // motion of a Spring to a range of UI property values. For example a
- // spring moving from position 0 to 1 could be interpolated to move a
- // view from pixel 300 to 350 and scale it from 0.5 to 1. The current
- // position of the `Spring` just needs to be run through this method
- // taking its input range in the _from_ parameters with the property
- // animation range in the _to_ parameters.
- mapValueInRange: function mapValueInRange(value, fromLow, fromHigh, toLow, toHigh) {
- var fromRangeSize = fromHigh - fromLow;
- var toRangeSize = toHigh - toLow;
- var valueScale = (value - fromLow) / fromRangeSize;
- return toLow + valueScale * toRangeSize;
- },
-
- // Interpolate two hex colors in a 0 - 1 range or optionally provide a
- // custom range with fromLow,fromHight. The output will be in hex by default
- // unless asRGB is true in which case it will be returned as an rgb string.
- interpolateColor: function interpolateColor(val, startColor, endColor, fromLow, fromHigh, asRGB) {
- fromLow = fromLow === undefined ? 0 : fromLow;
- fromHigh = fromHigh === undefined ? 1 : fromHigh;
- startColor = util.hexToRGB(startColor);
- endColor = util.hexToRGB(endColor);
- var r = Math.floor(util.mapValueInRange(val, fromLow, fromHigh, startColor.r, endColor.r));
- var g = Math.floor(util.mapValueInRange(val, fromLow, fromHigh, startColor.g, endColor.g));
- var b = Math.floor(util.mapValueInRange(val, fromLow, fromHigh, startColor.b, endColor.b));
- if (asRGB) {
- return 'rgb(' + r + ',' + g + ',' + b + ')';
- } else {
- return util.rgbToHex(r, g, b);
- }
- },
-
- degreesToRadians: function degreesToRadians(deg) {
- return deg * Math.PI / 180;
- },
-
- radiansToDegrees: function radiansToDegrees(rad) {
- return rad * 180 / Math.PI;
- }
-
- };
-
- util.extend(util, MathUtil);
-
- // Utilities
- // ---------
- // Here are a few useful JavaScript utilities.
-
- // Lop off the first occurence of the reference in the Array.
- function removeFirst(array, item) {
- var idx = array.indexOf(item);
- idx != -1 && array.splice(idx, 1);
- }
-
- var _onFrame;
- if (typeof window !== 'undefined') {
- _onFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || window.oRequestAnimationFrame || function (callback) {
- window.setTimeout(callback, 1000 / 60);
- };
- }
- if (!_onFrame && typeof process !== 'undefined' && process.title === 'node') {
- _onFrame = setImmediate;
- }
-
- // Cross browser/node timer functions.
- util.onFrame = function onFrame(func) {
- return _onFrame(func);
- };
-
- // Export the public api using exports for common js or the window for
- // normal browser inclusion.
- if (typeof exports != 'undefined') {
- util.extend(exports, rebound);
- } else if (typeof window != 'undefined') {
- window.rebound = rebound;
- }
-})();
-
-// Legal Stuff
-// -----------
-/**
- * Copyright (c) 2013, Facebook, Inc.
- * All rights reserved.
- *
- * This source code is licensed under the BSD-style license found in the
- * LICENSE file in the root directory of this source tree. An additional grant
- * of patent rights can be found in the PATENTS file in the same directory.
- */
-'use strict';
-
-/**
- * Polygon.
- * Create a regular polygon and provide api to compute inscribed child.
- */
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-var Polygon = function () {
- function Polygon() {
- var radius = arguments.length <= 0 || arguments[0] === undefined ? 100 : arguments[0];
- var sides = arguments.length <= 1 || arguments[1] === undefined ? 3 : arguments[1];
- var depth = arguments.length <= 2 || arguments[2] === undefined ? 0 : arguments[2];
- var colors = arguments[3];
-
- _classCallCheck(this, Polygon);
-
- this._radius = radius;
- this._sides = sides;
- this._depth = depth;
- this._colors = colors;
-
- this._x = 0;
- this._y = 0;
-
- this.rotation = 0;
- this.scale = 1;
-
- // Get basePolygon points straight away.
- this.points = this._getRegularPolygonPoints();
- }
-
- /**
- * Get the points of any regular polygon based on
- * the number of sides and radius.
- */
-
-
- _createClass(Polygon, [{
- key: '_getRegularPolygonPoints',
- value: function _getRegularPolygonPoints() {
-
- var points = [];
-
- var i = 0;
-
- while (i < this._sides) {
- // Note that sin and cos are inverted in order to draw
- // polygon pointing down like: ∇
- var x = -this._radius * Math.sin(i * 2 * Math.PI / this._sides);
- var y = this._radius * Math.cos(i * 2 * Math.PI / this._sides);
-
- points.push({ x: x, y: y });
-
- i++;
- }
-
- return points;
- }
-
- /**
- * Get the inscribed polygon points by calling `getInterpolatedPoint`
- * for the points (start, end) of each side.
- */
-
- }, {
- key: '_getInscribedPoints',
- value: function _getInscribedPoints(points, progress) {
- var _this = this;
-
- var inscribedPoints = [];
-
- points.forEach(function (item, i) {
-
- var start = item;
- var end = points[i + 1];
-
- if (!end) {
- end = points[0];
- }
-
- var point = _this._getInterpolatedPoint(start, end, progress);
-
- inscribedPoints.push(point);
- });
-
- return inscribedPoints;
- }
-
- /**
- * Get interpolated point using linear interpolation
- * on x and y axis.
- */
-
- }, {
- key: '_getInterpolatedPoint',
- value: function _getInterpolatedPoint(start, end, progress) {
-
- var Ax = start.x;
- var Ay = start.y;
-
- var Bx = end.x;
- var By = end.y;
-
- // Linear interpolation formula:
- // point = start + (end - start) * progress;
- var Cx = Ax + (Bx - Ax) * progress;
- var Cy = Ay + (By - Ay) * progress;
-
- return {
- x: Cx,
- y: Cy
- };
- }
-
- /**
- * Update children points array.
- */
-
- }, {
- key: '_getUpdatedChildren',
- value: function _getUpdatedChildren(progress) {
-
- var children = [];
-
- for (var i = 0; i < this._depth; i++) {
-
- // Get basePolygon points on first lap
- // then get previous child points.
- var points = children[i - 1] || this.points;
-
- var inscribedPoints = this._getInscribedPoints(points, progress);
-
- children.push(inscribedPoints);
- }
-
- return children;
- }
-
- /**
- * Render children, first update children array,
- * then loop and draw each child.
- */
-
- }, {
- key: 'renderChildren',
- value: function renderChildren(context, progress) {
- var _this2 = this;
-
- var children = this._getUpdatedChildren(progress);
-
- // child = array of points at a certain progress over the parent sides.
- children.forEach(function (points, i) {
-
- // Draw child.
- context.beginPath();
- points.forEach(function (point) {
- return context.lineTo(point.x, point.y);
- });
- context.closePath();
-
- // Set colors.
- var strokeColor = _this2._colors.stroke;
- var childColor = _this2._colors.child;
-
- if (strokeColor) {
- context.strokeStyle = strokeColor;
- context.stroke();
- }
-
- if (childColor) {
- var rgb = rebound.util.hexToRGB(childColor);
-
- var alphaUnit = 1 / children.length;
- var alpha = alphaUnit + alphaUnit * i;
-
- var rgba = 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + alpha + ')';
-
- context.fillStyle = rgba;
-
- // Set Shadow.
- context.shadowColor = 'rgba(0,0,0, 0.1)';
- context.shadowBlur = 10;
- context.shadowOffsetX = 0;
- context.shadowOffsetY = 0;
-
- context.fill();
- }
- });
- }
-
- /**
- * Render.
- */
-
- }, {
- key: 'render',
- value: function render(context) {
-
- context.save();
-
- context.translate(this._x, this._y);
-
- if (this.rotation !== 0) {
- context.rotate(rebound.MathUtil.degreesToRadians(this.rotation));
- }
-
- if (this.scale !== 1) {
- context.scale(this.scale, this.scale);
- }
-
- // Draw basePolygon.
- context.beginPath();
- this.points.forEach(function (point) {
- return context.lineTo(point.x, point.y);
- });
- context.closePath();
-
- // Set colors.
- var strokeColor = this._colors.stroke;
- var childColor = this._colors.base;
-
- if (strokeColor) {
- context.strokeStyle = strokeColor;
- context.stroke();
- }
-
- if (childColor) {
- context.fillStyle = childColor;
- context.fill();
- }
-
- context.restore();
- }
- }]);
-
- return Polygon;
-}();
-'use strict';
-
-/**
- * Spinner.
- * Create a canvas element, append it to the body, render polygon with
- * inscribed children, provide init and complete methods to control spinner.
- */
-
-var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-var Spinner = function () {
- function Spinner(params) {
- _classCallCheck(this, Spinner);
-
- var id = params.id,
- radius = params.radius,
- sides = params.sides,
- depth = params.depth,
- colors = params.colors,
- alwaysForward = params.alwaysForward,
- restAt = params.restAt,
- renderBase = params.renderBase;
-
- if (sides < 3) {
- console.warn('At least 3 sides required.');
- sides = 3;
- }
-
- this._colors = colors;
-
- this._canvas = document.createElement('canvas');
- this._canvas.style.backgroundColor = colors.background;
-
- this._canvasW = params.canvasW;
- this._canvasH = params.canvasH;
- this._canvasOpacity = 1;
-
- this._centerX = null;
- this._centerY = null;
-
- this._alwaysForward = alwaysForward;
- this._restThreshold = restAt;
- this._renderBase = renderBase;
-
- this._springRangeLow = 0;
- this._springRangeHigh = this._restThreshold || 1;
-
- // Instantiate basePolygon.
- this._basePolygon = new Polygon(radius, sides, depth, colors);
-
- this._progress = 0;
-
- this.isAutoSpin = null;
- this._isCompleting = null;
- }
-
- /**
- * Init spinner.
- */
-
-
- _createClass(Spinner, [{
- key: 'init',
- value: function init(spring, autoSpin) {
-
- this._addCanvas();
-
- this._spring = spring;
- this._addSpringListener();
-
- this.isAutoSpin = autoSpin;
-
- if (autoSpin) {
- // Start auto spin.
- this.spin();
- } else {
- // Render first frame only.
- this._spring.setEndValue(0);
- this.render();
- }
- }
- }, {
- key: '_addCanvas',
- value: function _addCanvas() {
- // document.body.appendChild(this._canvas);
- this.context = this._canvas.getContext('2d');
- this._setCanvasSize();
- }
- }, {
- key: '_setCanvasSize',
- value: function _setCanvasSize() {
- // this._canvasW = this._canvas.width = window.innerWidth;
- // this._canvasH = this._canvas.height = window.innerHeight;
- this._canvas.width = this._canvasW;
- this._canvas.height = this._canvasH;
-
- this._canvas.style.position = 'fixed';
- this._canvas.style.top = 0;
- this._canvas.style.left = 0;
-
- this._centerX = this._canvasW / 2;
- this._centerY = this._canvasH / 2;
- }
- }, {
- key: '_addSpringListener',
- value: function _addSpringListener() {
-
- var ctx = this;
-
- // Add a listener to the spring. Every time the physics
- // solver updates the Spring's value onSpringUpdate will
- // be called.
- this._spring.addListener({
- onSpringUpdate: function onSpringUpdate(spring) {
-
- var val = spring.getCurrentValue();
-
- // Input range in the `from` parameters.
- var fromLow = 0,
- fromHigh = 1,
-
- // Property animation range in the `to` parameters.
- toLow = ctx._springRangeLow,
- toHigh = ctx._springRangeHigh;
-
- val = rebound.MathUtil.mapValueInRange(val, fromLow, fromHigh, toLow, toHigh);
-
- // Note that the render method is
- // called with the spring motion value.
- ctx.render(val);
- }
- });
- }
-
- /**
- * Start complete animation.
- */
-
- }, {
- key: 'setComplete',
- value: function setComplete() {
- this._isCompleting = true;
- }
- }, {
- key: '_completeAnimation',
- value: function _completeAnimation() {
-
- // Fade out the canvas.
- this._canvasOpacity -= 0.1;
- this._canvas.style.opacity = this._canvasOpacity;
-
- // Stop animation and remove canvas.
- if (this._canvasOpacity <= 0) {
- this.isAutoSpin = false;
- this._spring.setAtRest();
- this._canvas.remove();
- }
- }
-
- /**
- * Spin animation.
- */
-
- }, {
- key: 'spin',
- value: function spin() {
-
- if (this._alwaysForward) {
-
- var currentValue = this._spring.getCurrentValue();
-
- // Switch the animation range used to compute the value
- // in the `onSpringUpdate`, so to change the reverse animation
- // of the spring at a certain threshold.
- if (this._restThreshold && currentValue === 1) {
- this._switchSpringRange();
- }
-
- // In order to keep the motion going forward
- // when spring reach 1 reset to 0 at rest.
- if (currentValue === 1) {
- this._spring.setCurrentValue(0).setAtRest();
- }
- }
-
- // Restart the spinner.
- this._spring.setEndValue(this._spring.getCurrentValue() === 1 ? 0 : 1);
- }
- }, {
- key: '_switchSpringRange',
- value: function _switchSpringRange() {
-
- var threshold = this._restThreshold;
-
- this._springRangeLow = this._springRangeLow === threshold ? 0 : threshold;
- this._springRangeHigh = this._springRangeHigh === threshold ? 1 : threshold;
- }
-
- /**
- * Render.
- */
-
- }, {
- key: 'render',
- value: function render(progress) {
-
- // Update progess if present and round to 4th decimal.
- if (progress) {
- this._progress = Math.round(progress * 10000) / 10000;
- }
-
- // Restart the spin.
- if (this.isAutoSpin && this._spring.isAtRest()) {
- this.spin();
- }
-
- // Complete the animation.
- if (this._isCompleting) {
- this._completeAnimation();
- }
-
- // Clear canvas and save context.
- this.context.clearRect(0, 0, this._canvasW, this._canvasH);
- this.context.save();
-
- // Draw bg
- this.context.rect(0, 0, this._canvasW, this._canvasH);
- this.context.fillStyle = this._colors.background;
- this.context.fill();
-
- // Move to center.
- this.context.translate(this._centerX, this._centerY);
-
- this.context.lineWidth = 1.5;
-
- // Render basePolygon.
- if (this._renderBase) {
- this._basePolygon.render(this.context);
- }
-
- // Render inscribed polygons.
- this._basePolygon.renderChildren(this.context, this._progress);
-
- this.context.restore();
- }
- }]);
-
- return Spinner;
-}();
-'use strict';
-
-/**
- * Demo.
- */
-
-var demo = {
- settings: SETTINGS,
-
- context: null,
-
- /**
- * Initialize Rebound.js with settings.
- * Rebound is used to generate a spring which
- * is then used to animate the spinner.
- * See more: http://facebook.github.io/rebound-js/docs/rebound.html
- */
- initRebound: function initRebound(settings) {
- // Create a SpringSystem.
- var springSystem = new rebound.SpringSystem();
-
- // Add a spring to the system.
- return springSystem.createSpring(settings.tension, settings.friction);
- },
-
-
- /**
- * Initialize Spinner with settings.
- */
- initSpinner: function initSpinner(settings) {
- return new Spinner(settings);
- },
-
-
- /**
- * Initialize demo.
- */
- init: function init() {
-
- demo.settings.forEach(function (setting) {
- // Instantiate animation engine and spinner system.
- setting.instances.spring = demo.initRebound(setting.rebound);
- setting.instances.spinner = demo.initSpinner(setting.spinner);
- // Init animation with Rebound Spring System.
- setting.instances.spinner.init(setting.instances.spring, playAll);
- });
-
- var canvas = document.createElement('canvas');
-
- demo.context = canvas.getContext('2d');
-
- canvas.width = window.innerWidth;
- canvas.height = window.innerHeight;
-
- canvas.width = gridEl.offsetWidth;
- canvas.height = gridH * Math.ceil(demo.settings.length / cols);
-
- canvas.style.position = 'absolute';
- canvas.style.top = 0;
- canvas.style.left = 0;
-
- gridEl.appendChild(canvas);
-
- demo.render();
-
- if (!playAll) {
- (function () {
- var gridElTop = gridEl.getBoundingClientRect().top;
- // Activate spinners on click only.
- document.addEventListener('load', function (e) {
-
- var cellX = Math.floor(e.clientX / gridW);
- var cellY = Math.floor((e.clientY + window.scrollY - gridElTop) / gridH);
-
- var cell = cellX + cellY * cols;
-
- // Play clicked spinner.
- if (demo.settings[cell]) {
- (function () {
- var spinner = demo.settings[cell].instances.spinner;
-
- spinner.isAutoSpin = true;
- spinner.spin();
-
- setTimeout(function () {
- spinner.isAutoSpin = false;
-
- }, 4000);
- })();
- }
- });
- })
-
-
- ();
- }
- },
- render: function render() {
-
- demo.context.clearRect(0, 0, window.innerWidth, window.innerHeight);
-
- var x = 0;
- var y = 0;
-
- demo.settings.forEach(function (item) {
-
- var spinner = item.instances.spinner;
-
- demo.context.drawImage(spinner.context.canvas, x, y);
-
- x += gridW;
-
- if (x >= window.innerWidth) {
- x = 0;
- y += gridH;
- }
- });
-
- requestAnimationFrame(demo.render);
- }
-};
-
-document.addEventListener('DOMContentLoaded', demo.init);
-//# sourceMappingURL=main.grid.js.map
diff --git a/10.大屏音乐/listen.html b/10.大屏音乐/listen.html
deleted file mode 100644
index 0e833f1..0000000
--- a/10.大屏音乐/listen.html
+++ /dev/null
@@ -1,653 +0,0 @@
-
-
-
-
- Musik | Web Application
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-