diff --git a/lib/flowplayer/README.txt b/lib/flowplayer/README.txt index 742633c27a5..62e9422988b 100644 --- a/lib/flowplayer/README.txt +++ b/lib/flowplayer/README.txt @@ -1,8 +1,63 @@ Version history: +3.2.17 +------ +- #75 set the child display list different when a gradient is set. +- The clip property 'bufferLength' now accepts decimal values, for example bufferLength: 0.2 +- #121 XSS fix: Only load plugins and external config from the same domain as the player swf is loaded from +- Made it possible to tab out of the player and into the HTML page using the keyboard alone. +- Change links in the context menu and in the logos to point to http://flash.flowplayer.org +- Pausing a live stream now leaves the video frame visible #81 +- Audio plugin is not loaded nor used when the the provider is set excplicitly in the clip to a non-audio value, for + example to 'http' +- Allow playing another instream clip while already playing one. Issue #131 +- Fixed memory leaks related to repeatedly starting playback with the play() API method. #163 + +3.2.16 +------ +- new clip event onMetadataChange, dispatched for example when switching bitrate + +Fixes: + +- Shows logo in accelerated mode #20 +- mid-rolls freeze if multiple providers are used #42 +- onFire fired twice on replay #52 +- rtmp + hw accel + instream clips lose video, or aspect ratio #44 +- URL name parts containing semi-colons (;) should pass validation through linkUrl usage #53 +- cuepoints fired multiple times with the bitrateselect plugin #50 +- fix for dispatching onBegin in certain situations +- if onStart has been dispatched already prevent dispatching many onBegin events + + +3.2.15 +------ +- #15 fixes for #627, handle the display init on startup. +- #615 dispatch begin if in paused mode too early. +- #629 if start has been dispatched already prevent dispatching many begin events. +- #20 for the free player swap the logo with the stage video mask to display underneath not on top. +- #42 pass in stream clips through and close the stream before returning to the parent clip. +- #52 when replaying flag start has dispatched on the current clip. +- #44 fixes for #627 check if the stagevideo dimensions and positioning has changed to update the stage video mask with. +- unbinding and binding stage video events caused issues with instream playlists therefore has to be kept binded. +- unbinded stage video events during seeking to prevent the mask repositioning. +- #53 update url filter to accomodate for pretty urls with semi colons. +- #50 if we have metadata already set it is being updated during seeks and switching, dispatch metadata change events instead. + +3.2.14 +------ +- #614 when the clip ends if the next clip in the provider has a different provider close the provider stream. +- #627 only detach / attach the display on start events which causes issues in buffering events after a seek in stagevideo. +- #627 re-enable stagevideo state change listeners if stagevideo is available or detach the fullscreen events on first call. +- #9 when replaying from stopping, connection does not receive callbacks anymore. + + + + 3.2.13 ------ - Updated to automatically load the latest controls and audio plugins +- #612 add some logging for the stagevideo render state to determine what mode the hardware acceleration is in for various systems. +- #628 opera browsers do not return filesize correctly for latest flash players so require to use load completion instead which may help with gzipped files also. 3.2.12 ------ diff --git a/lib/flowplayer/README_audio.txt b/lib/flowplayer/README_audio.txt index 746c5ee8bbd..3a788b68c97 100644 --- a/lib/flowplayer/README_audio.txt +++ b/lib/flowplayer/README_audio.txt @@ -7,6 +7,7 @@ Version history: - #582 fixes for metadata events dispatching in playlists and when replaying same audio item, cleanup duration updating once download has completed, fixes for clearing the previous cover image display. - #611 close the channel and sound on stream not found errors. +- #614 fixes for auto buffering issues where a sound channel may not be active yet. 3.2.9 ----- diff --git a/lib/flowplayer/flowplayer-3.2.13.js b/lib/flowplayer/flowplayer-3.2.13.js new file mode 100644 index 00000000000..cb8dd86a5a1 --- /dev/null +++ b/lib/flowplayer/flowplayer-3.2.13.js @@ -0,0 +1,1015 @@ +/* + * flowplayer.js The Flowplayer API + * + * Copyright 2009-2011 Flowplayer Oy + * + * This file is part of Flowplayer. + * + * Flowplayer is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Flowplayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Flowplayer. If not, see . + * + */ +!function () { + function h(p) { + console.log("$f.fireEvent", [].slice.call(p)) + } + + function l(r) { + if (!r || typeof r != "object") { + return r + } + var p = new r.constructor(); + for (var q in r) { + if (r.hasOwnProperty(q)) { + p[q] = l(r[q]) + } + } + return p + } + + function n(u, r) { + if (!u) { + return + } + var p, q = 0, s = u.length; + if (s === undefined) { + for (p in u) { + if (r.call(u[p], p, u[p]) === false) { + break + } + } + } else { + for (var t = u[0]; q < s && r.call(t, q, t) !== false; t = u[++q]) { + } + } + return u + } + + function c(p) { + return document.getElementById(p) + } + + function j(r, q, p) { + if (typeof q != "object") { + return r + } + if (r && q) { + n(q, function (s, t) { + if (!p || typeof t != "function") { + r[s] = t + } + }) + } + return r + } + + function o(t) { + var r = t.indexOf("."); + if (r != -1) { + var q = t.slice(0, r) || "*"; + var p = t.slice(r + 1, t.length); + var s = []; + n(document.getElementsByTagName(q), function () { + if (this.className && this.className.indexOf(p) != -1) { + s.push(this) + } + }); + return s + } + } + + function g(p) { + p = p || window.event; + if (p.preventDefault) { + p.stopPropagation(); + p.preventDefault() + } else { + p.returnValue = false; + p.cancelBubble = true + } + return false + } + + function k(r, p, q) { + r[p] = r[p] || []; + r[p].push(q) + } + + function e(p) { + return p.replace(/&/g, "%26").replace(/&/g, "%26").replace(/=/g, "%3D") + } + + function f() { + return"_" + ("" + Math.random()).slice(2, 10) + } + + var i = function (u, s, t) { + var r = this, q = {}, v = {}; + r.index = s; + if (typeof u == "string") { + u = {url: u} + } + j(this, u, true); + n(("Begin*,Start,Pause*,Resume*,Seek*,Stop*,Finish*,LastSecond,Update,BufferFull,BufferEmpty,BufferStop").split(","), function () { + var w = "on" + this; + if (w.indexOf("*") != -1) { + w = w.slice(0, w.length - 1); + var x = "onBefore" + w.slice(2); + r[x] = function (y) { + k(v, x, y); + return r + } + } + r[w] = function (y) { + k(v, w, y); + return r + }; + if (s == -1) { + if (r[x]) { + t[x] = r[x] + } + if (r[w]) { + t[w] = r[w] + } + } + }); + j(this, {onCuepoint: function (y, x) { + if (arguments.length == 1) { + q.embedded = [null, y]; + return r + } + if (typeof y == "number") { + y = [y] + } + var w = f(); + q[w] = [y, x]; + if (t.isLoaded()) { + t._api().fp_addCuepoints(y, s, w) + } + return r + }, update: function (x) { + j(r, x); + if (t.isLoaded()) { + t._api().fp_updateClip(x, s) + } + var w = t.getConfig(); + var y = (s == -1) ? w.clip : w.playlist[s]; + j(y, x, true) + }, _fireEvent: function (w, z, x, B) { + if (w == "onLoad") { + n(q, function (C, D) { + if (D[0]) { + t._api().fp_addCuepoints(D[0], s, C) + } + }); + return false + } + B = B || r; + if (w == "onCuepoint") { + var A = q[z]; + if (A) { + return A[1].call(t, B, x) + } + } + if (z && "onBeforeBegin,onMetaData,onMetaDataChange,onStart,onUpdate,onResume".indexOf(w) != -1) { + j(B, z); + if (z.metaData) { + if (!B.duration) { + B.duration = z.metaData.duration + } else { + B.fullDuration = z.metaData.duration + } + } + } + var y = true; + n(v[w], function () { + y = this.call(t, B, z, x) + }); + return y + }}); + if (u.onCuepoint) { + var p = u.onCuepoint; + r.onCuepoint.apply(r, typeof p == "function" ? [p] : p); + delete u.onCuepoint + } + n(u, function (w, x) { + if (typeof x == "function") { + k(v, w, x); + delete u[w] + } + }); + if (s == -1) { + t.onCuepoint = this.onCuepoint + } + }; + var m = function (q, s, r, u) { + var p = this, t = {}, v = false; + if (u) { + j(t, u) + } + n(s, function (w, x) { + if (typeof x == "function") { + t[w] = x; + delete s[w] + } + }); + j(this, {animate: function (z, A, y) { + if (!z) { + return p + } + if (typeof A == "function") { + y = A; + A = 500 + } + if (typeof z == "string") { + var x = z; + z = {}; + z[x] = A; + A = 500 + } + if (y) { + var w = f(); + t[w] = y + } + if (A === undefined) { + A = 500 + } + s = r._api().fp_animate(q, z, A, w); + return p + }, css: function (x, y) { + if (y !== undefined) { + var w = {}; + w[x] = y; + x = w + } + s = r._api().fp_css(q, x); + j(p, s); + return p + }, show: function () { + this.display = "block"; + r._api().fp_showPlugin(q); + return p + }, hide: function () { + this.display = "none"; + r._api().fp_hidePlugin(q); + return p + }, toggle: function () { + this.display = r._api().fp_togglePlugin(q); + return p + }, fadeTo: function (z, y, x) { + if (typeof y == "function") { + x = y; + y = 500 + } + if (x) { + var w = f(); + t[w] = x + } + this.display = r._api().fp_fadeTo(q, z, y, w); + this.opacity = z; + return p + }, fadeIn: function (x, w) { + return p.fadeTo(1, x, w) + }, fadeOut: function (x, w) { + return p.fadeTo(0, x, w) + }, getName: function () { + return q + }, getPlayer: function () { + return r + }, _fireEvent: function (x, w, y) { + if (x == "onUpdate") { + var A = r._api().fp_getPlugin(q); + if (!A) { + return + } + j(p, A); + delete p.methods; + if (!v) { + n(A.methods, function () { + var C = "" + this; + p[C] = function () { + var D = [].slice.call(arguments); + var E = r._api().fp_invoke(q, C, D); + return E === "undefined" || E === undefined ? p : E + } + }); + v = true + } + } + var B = t[x]; + if (B) { + var z = B.apply(p, w); + if (x.slice(0, 1) == "_") { + delete t[x] + } + return z + } + return p + }}) + }; + + function b(r, H, u) { + var x = this, w = null, E = false, v, t, G = [], z = {}, y = {}, F, s, q, D, p, B; + j(x, {id: function () { + return F + }, isLoaded: function () { + return(w !== null && w.fp_play !== undefined && !E) + }, getParent: function () { + return r + }, hide: function (I) { + if (I) { + r.style.height = "0px" + } + if (x.isLoaded()) { + w.style.height = "0px" + } + return x + }, show: function () { + r.style.height = B + "px"; + if (x.isLoaded()) { + w.style.height = p + "px" + } + return x + }, isHidden: function () { + return x.isLoaded() && parseInt(w.style.height, 10) === 0 + }, load: function (K) { + if (!x.isLoaded() && x._fireEvent("onBeforeLoad") !== false) { + var I = function () { + if (v && !flashembed.isSupported(H.version)) { + r.innerHTML = "" + } + if (K) { + K.cached = true; + k(y, "onLoad", K) + } + flashembed(r, H, {config: u}) + }; + var J = 0; + n(a, function () { + this.unload(function (L) { + if (++J == a.length) { + I() + } + }) + }) + } + return x + }, unload: function (K) { + if (v.replace(/\s/g, "") !== "") { + if (x._fireEvent("onBeforeUnload") === false) { + if (K) { + K(false) + } + return x + } + E = true; + try { + if (w) { + if (w.fp_isFullscreen()) { + w.fp_toggleFullscreen() + } + w.fp_close(); + x._fireEvent("onUnload") + } + } catch (I) { + } + var J = function () { + w = null; + r.innerHTML = v; + E = false; + if (K) { + K(true) + } + }; + if (/WebKit/i.test(navigator.userAgent) && !/Chrome/i.test(navigator.userAgent)) { + setTimeout(J, 0) + } else { + J() + } + } else { + if (K) { + K(false) + } + } + return x + }, getClip: function (I) { + if (I === undefined) { + I = D + } + return G[I] + }, getCommonClip: function () { + return t + }, getPlaylist: function () { + return G + }, getPlugin: function (I) { + var K = z[I]; + if (!K && x.isLoaded()) { + var J = x._api().fp_getPlugin(I); + if (J) { + K = new m(I, J, x); + z[I] = K + } + } + return K + }, getScreen: function () { + return x.getPlugin("screen") + }, getControls: function () { + return x.getPlugin("controls")._fireEvent("onUpdate") + }, getLogo: function () { + try { + return x.getPlugin("logo")._fireEvent("onUpdate") + } catch (I) { + } + }, getPlay: function () { + return x.getPlugin("play")._fireEvent("onUpdate") + }, getConfig: function (I) { + return I ? l(u) : u + }, getFlashParams: function () { + return H + }, loadPlugin: function (L, K, N, M) { + if (typeof N == "function") { + M = N; + N = {} + } + var J = M ? f() : "_"; + x._api().fp_loadPlugin(L, K, N, J); + var I = {}; + I[J] = M; + var O = new m(L, null, x, I); + z[L] = O; + return O + }, getState: function () { + return x.isLoaded() ? w.fp_getState() : -1 + }, play: function (J, I) { + var K = function () { + if (J !== undefined) { + x._api().fp_play(J, I) + } else { + x._api().fp_play() + } + }; + if (x.isLoaded()) { + K() + } else { + if (E) { + setTimeout(function () { + x.play(J, I) + }, 50) + } else { + x.load(function () { + K() + }) + } + } + return x + }, getVersion: function () { + var J = "flowplayer.js @VERSION"; + if (x.isLoaded()) { + var I = w.fp_getVersion(); + I.push(J); + return I + } + return J + }, _api: function () { + if (!x.isLoaded()) { + throw"Flowplayer " + x.id() + " not loaded when calling an API method" + } + return w + }, setClip: function (I) { + n(I, function (J, K) { + if (typeof K == "function") { + k(y, J, K); + delete I[J] + } else { + if (J == "onCuepoint") { + $f(r).getCommonClip().onCuepoint(I[J][0], I[J][1]) + } + } + }); + x.setPlaylist([I]); + return x + }, getIndex: function () { + return q + }, bufferAnimate: function (I) { + w.fp_bufferAnimate(I === undefined || I); + return x + }, _swfHeight: function () { + return w.clientHeight + }}); + n(("Click*,Load*,Unload*,Keypress*,Volume*,Mute*,Unmute*,PlaylistReplace,ClipAdd,Fullscreen*,FullscreenExit,Error,MouseOver,MouseOut").split(","), function () { + var I = "on" + this; + if (I.indexOf("*") != -1) { + I = I.slice(0, I.length - 1); + var J = "onBefore" + I.slice(2); + x[J] = function (K) { + k(y, J, K); + return x + } + } + x[I] = function (K) { + k(y, I, K); + return x + } + }); + n(("pause,resume,mute,unmute,stop,toggle,seek,getStatus,getVolume,setVolume,getTime,isPaused,isPlaying,startBuffering,stopBuffering,isFullscreen,toggleFullscreen,reset,close,setPlaylist,addClip,playFeed,setKeyboardShortcutsEnabled,isKeyboardShortcutsEnabled").split(","), function () { + var I = this; + x[I] = function (K, J) { + if (!x.isLoaded()) { + return x + } + var L = null; + if (K !== undefined && J !== undefined) { + L = w["fp_" + I](K, J) + } else { + L = (K === undefined) ? w["fp_" + I]() : w["fp_" + I](K) + } + return L === "undefined" || L === undefined ? x : L + } + }); + x._fireEvent = function (R) { + if (typeof R == "string") { + R = [R] + } + var S = R[0], P = R[1], N = R[2], M = R[3], L = 0; + if (u.debug) { + h(R) + } + if (!x.isLoaded() && S == "onLoad" && P == "player") { + w = w || c(s); + p = x._swfHeight(); + n(G, function () { + this._fireEvent("onLoad") + }); + n(z, function (T, U) { + U._fireEvent("onUpdate") + }); + t._fireEvent("onLoad") + } + if (S == "onLoad" && P != "player") { + return + } + if (S == "onError") { + if (typeof P == "string" || (typeof P == "number" && typeof N == "number")) { + P = N; + N = M + } + } + if (S == "onContextMenu") { + n(u.contextMenu[P], function (T, U) { + U.call(x) + }); + return + } + if (S == "onPluginEvent" || S == "onBeforePluginEvent") { + var I = P.name || P; + var J = z[I]; + if (J) { + J._fireEvent("onUpdate", P); + return J._fireEvent(N, R.slice(3)) + } + return + } + if (S == "onPlaylistReplace") { + G = []; + var O = 0; + n(P, function () { + G.push(new i(this, O++, x)) + }) + } + if (S == "onClipAdd") { + if (P.isInStream) { + return + } + P = new i(P, N, x); + G.splice(N, 0, P); + for (L = N + 1; L < G.length; L++) { + G[L].index++ + } + } + var Q = true; + if (typeof P == "number" && P < G.length) { + D = P; + var K = G[P]; + if (K) { + Q = K._fireEvent(S, N, M) + } + if (!K || Q !== false) { + Q = t._fireEvent(S, N, M, K) + } + } + n(y[S], function () { + Q = this.call(x, P, N); + if (this.cached) { + y[S].splice(L, 1) + } + if (Q === false) { + return false + } + L++ + }); + return Q + }; + function C() { + r.innerHTML=''; // Moodle hack - we do not want splashscreens, unfortunately there is not switch to disable them + if ($f(r)) { + $f(r).getParent().innerHTML = ""; + q = $f(r).getIndex(); + a[q] = x + } else { + a.push(x); + q = a.length - 1 + } + B = parseInt(r.style.height, 10) || r.clientHeight; + F = r.id || "fp" + f(); + s = H.id || F + "_api"; + H.id = s; + v = r.innerHTML; + if (typeof u == "string") { + u = {clip: {url: u}} + } + u.playerId = F; + u.clip = u.clip || {}; + if (r.getAttribute("href", 2) && !u.clip.url) { + u.clip.url = r.getAttribute("href", 2) + } + if (u.clip.url) { + u.clip.url = e(u.clip.url) + } + t = new i(u.clip, -1, x); + u.playlist = u.playlist || [u.clip]; + var J = 0; + n(u.playlist, function () { + var M = this; + if (typeof M == "object" && M.length) { + M = {url: "" + M} + } + if (M.url) { + M.url = e(M.url) + } + n(u.clip, function (N, O) { + if (O !== undefined && M[N] === undefined && typeof O != "function") { + M[N] = O + } + }); + u.playlist[J] = M; + M = new i(M, J, x); + G.push(M); + J++ + }); + n(u, function (M, N) { + if (typeof N == "function") { + if (t[M]) { + t[M](N) + } else { + k(y, M, N) + } + delete u[M] + } + }); + n(u.plugins, function (M, N) { + if (N) { + z[M] = new m(M, N, x) + } + }); + if (!u.plugins || u.plugins.controls === undefined) { + z.controls = new m("controls", null, x) + } + z.canvas = new m("canvas", null, x); + v = r.innerHTML; + function L(M) { + if (/iPad|iPhone|iPod/i.test(navigator.userAgent) && !/.flv$/i.test(G[0].url) && !K()) { + return true + } + if (!x.isLoaded() && x._fireEvent("onBeforeClick") !== false) { + x.load() + } + return g(M) + } + + function K() { + return x.hasiPadSupport && x.hasiPadSupport() + } + + function I() { + if (v.replace(/\s/g, "") !== "") { + if (r.addEventListener) { + r.addEventListener("click", L, false) + } else { + if (r.attachEvent) { + r.attachEvent("onclick", L) + } + } + } else { + if (r.addEventListener && !K()) { + r.addEventListener("click", g, false) + } + x.load() + } + } + + setTimeout(I, 0) + } + + if (typeof r == "string") { + var A = c(r); + if (!A) { + throw"Flowplayer cannot access element: " + r + } + r = A; + C() + } else { + C() + } + } + + var a = []; + + function d(p) { + this.length = p.length; + this.each = function (r) { + n(p, r) + }; + this.size = function () { + return p.length + }; + var q = this; + for (name in b.prototype) { + q[name] = function () { + var r = arguments; + q.each(function () { + this[name].apply(this, r) + }) + } + } + } + + window.flowplayer = window.$f = function () { + var q = null; + var p = arguments[0]; + if(!flashembed.isSupported([6, 65])){return null;} // Moodle hack - we do not want the missing flash hints - we need the original links for accessibility and incompatible browsers + if (!arguments.length) { + n(a, function () { + if (this.isLoaded()) { + q = this; + return false + } + }); + return q || a[0] + } + if (arguments.length == 1) { + if (typeof p == "number") { + return a[p] + } else { + if (p == "*") { + return new d(a) + } + n(a, function () { + if (this.id() == p.id || this.id() == p || this.getParent() == p) { + q = this; + return false + } + }); + return q + } + } + if (arguments.length > 1) { + var u = arguments[1], r = (arguments.length == 3) ? arguments[2] : {}; + if (typeof u == "string") { + u = {src: u} + } + u = j({bgcolor: "#000000", version: [10, 1], expressInstall: "http://releases.flowplayer.org/swf/expressinstall.swf", cachebusting: false}, u); + if (typeof p == "string") { + if (p.indexOf(".") != -1) { + var t = []; + n(o(p), function () { + t.push(new b(this, l(u), l(r))) + }); + return new d(t) + } else { + var s = c(p); + return new b(s !== null ? s : l(p), l(u), l(r)) + } + } else { + if (p) { + return new b(p, l(u), l(r)) + } + } + } + return null + }; + j(window.$f, {fireEvent: function () { + var q = [].slice.call(arguments); + var r = $f(q[0]); + return r ? r._fireEvent(q.slice(1)) : null + }, addPlugin: function (p, q) { + b.prototype[p] = q; + return $f + }, each: n, extend: j}); + if (typeof jQuery == "function") { + jQuery.fn.flowplayer = function (r, q) { + if (!arguments.length || typeof arguments[0] == "number") { + var p = []; + this.each(function () { + var s = $f(this); + if (s) { + p.push(s) + } + }); + return arguments.length ? p[arguments[0]] : new d(p) + } + return this.each(function () { + $f(this, l(r), q ? l(q) : {}) + }) + } + } +}(); +!function () { + var h = document.all, j = "http://get.adobe.com/flashplayer", c = typeof jQuery == "function", e = /(\d+)[^\d]+(\d+)[^\d]*(\d*)/, b = {width: "100%", height: "100%", id: "_" + ("" + Math.random()).slice(9), allowfullscreen: true, allowscriptaccess: "always", quality: "high", version: [3, 0], onFail: null, expressInstall: null, w3c: false, cachebusting: false}; + if (window.attachEvent) { + window.attachEvent("onbeforeunload", function () { + __flash_unloadHandler = function () { + }; + __flash_savedUnloadHandler = function () { + } + }) + } + function i(m, l) { + if (l) { + for (var f in l) { + if (l.hasOwnProperty(f)) { + m[f] = l[f] + } + } + } + return m + } + + function a(f, n) { + var m = []; + for (var l in f) { + if (f.hasOwnProperty(l)) { + m[l] = n(f[l]) + } + } + return m + } + + window.flashembed = function (f, m, l) { + if (typeof f == "string") { + f = document.getElementById(f.replace("#", "")) + } + if (!f) { + return + } + if (typeof m == "string") { + m = {src: m} + } + return new d(f, i(i({}, b), m), l) + }; + var g = i(window.flashembed, {conf: b, getVersion: function () { + var m, f, o; + try { + o = navigator.plugins["Shockwave Flash"]; + if (o[0].enabledPlugin != null) { + f = o.description.slice(16) + } + } catch (p) { + try { + m = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + f = m && m.GetVariable("$version") + } catch (n) { + try { + m = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + f = m && m.GetVariable("$version") + } catch (l) { + } + } + } + f = e.exec(f); + return f ? [1 * f[1], 1 * f[(f[1] * 1 > 9 ? 2 : 3)] * 1] : [0, 0] + }, asString: function (l) { + if (l === null || l === undefined) { + return null + } + var f = typeof l; + if (f == "object" && l.push) { + f = "array" + } + switch (f) { + case"string": + l = l.replace(new RegExp('(["\\\\])', "g"), "\\$1"); + l = l.replace(/^\s?(\d+\.?\d*)%/, "$1pct"); + return'"' + l + '"'; + case"array": + return"[" + a(l,function (o) { + return g.asString(o) + }).join(",") + "]"; + case"function": + return'"function()"'; + case"object": + var m = []; + for (var n in l) { + if (l.hasOwnProperty(n)) { + m.push('"' + n + '":' + g.asString(l[n])) + } + } + return"{" + m.join(",") + "}" + } + return String(l).replace(/\s/g, " ").replace(/\'/g, '"') + }, getHTML: function (o, l) { + o = i({}, o); + var n = '' + } + o.width = o.height = o.id = o.w3c = o.src = null; + o.onFail = o.version = o.expressInstall = null; + for (var m in o) { + if (o[m]) { + n += '' + } + } + var p = ""; + if (l) { + for (var f in l) { + if (l[f]) { + var q = l[f]; + p += f + "=" + (/function|object/.test(typeof q) ? g.asString(q) : q) + "&" + } + } + p = p.slice(0, -1); + n += '" + } + n += ""; + return n + }, isSupported: function (f) { + return k[0] > f[0] || k[0] == f[0] && k[1] >= f[1] + }}); + var k = g.getVersion(); + + function d(f, n, m) { + if (g.isSupported(n.version)) { + f.innerHTML = g.getHTML(n, m) + } else { + if (n.expressInstall && g.isSupported([6, 65])) { + f.innerHTML = g.getHTML(i(n, {src: n.expressInstall}), {MMredirectURL: encodeURIComponent(location.href), MMplayerType: "PlugIn", MMdoctitle: document.title}) + } else { + if (!f.innerHTML.replace(/\s/g, "")) { + f.innerHTML = "

Flash version " + n.version + " or greater is required

" + (k[0] > 0 ? "Your version is " + k : "You have no flash plugin installed") + "

" + (f.tagName == "A" ? "

Click here to download latest version

" : "

Download latest version from here

"); + if (f.tagName == "A" || f.tagName == "DIV") { + f.onclick = function () { + location.href = j + } + } + } + if (n.onFail) { + var l = n.onFail.call(this); + if (typeof l == "string") { + f.innerHTML = l + } + } + } + } + if (h) { + window[n.id] = document.getElementById(n.id) + } + i(this, {getRoot: function () { + return f + }, getOptions: function () { + return n + }, getConf: function () { + return m + }, getApi: function () { + return f.firstChild + }}) + } + + if (c) { + jQuery.tools = jQuery.tools || {version: "@VERSION"}; + jQuery.tools.flashembed = {conf: b}; + jQuery.fn.flashembed = function (l, f) { + return this.each(function () { + $(this).data("flashembed", flashembed(this, l, f)) + }) + } + } +}(); \ No newline at end of file diff --git a/lib/flowplayer/flowplayer-3.2.13.min.js b/lib/flowplayer/flowplayer-3.2.13.min.js new file mode 100644 index 00000000000..821945ad867 --- /dev/null +++ b/lib/flowplayer/flowplayer-3.2.13.min.js @@ -0,0 +1,22 @@ +/* + * flowplayer.js The Flowplayer API + * + * Copyright 2009-2011 Flowplayer Oy + * + * This file is part of Flowplayer. + * + * Flowplayer is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Flowplayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Flowplayer. If not, see . + * + */ +!function(){function h(p){console.log("$f.fireEvent",[].slice.call(p))}function l(r){if(!r||typeof r!="object"){return r}var p=new r.constructor();for(var q in r){if(r.hasOwnProperty(q)){p[q]=l(r[q])}}return p}function n(u,r){if(!u){return}var p,q=0,s=u.length;if(s===undefined){for(p in u){if(r.call(u[p],p,u[p])===false){break}}}else{for(var t=u[0];q1){var u=arguments[1],r=(arguments.length==3)?arguments[2]:{};if(typeof u=="string"){u={src:u}}u=j({bgcolor:"#000000",version:[10,1],expressInstall:"http://releases.flowplayer.org/swf/expressinstall.swf",cachebusting:false},u);if(typeof p=="string"){if(p.indexOf(".")!=-1){var t=[];n(o(p),function(){t.push(new b(this,l(u),l(r)))});return new d(t)}else{var s=c(p);return new b(s!==null?s:l(p),l(u),l(r))}}else{if(p){return new b(p,l(u),l(r))}}}return null};j(window.$f,{fireEvent:function(){var q=[].slice.call(arguments);var r=$f(q[0]);return r?r._fireEvent(q.slice(1)):null},addPlugin:function(p,q){b.prototype[p]=q;return $f},each:n,extend:j});if(typeof jQuery=="function"){jQuery.fn.flowplayer=function(r,q){if(!arguments.length||typeof arguments[0]=="number"){var p=[];this.each(function(){var s=$f(this);if(s){p.push(s)}});return arguments.length?p[arguments[0]]:new d(p)}return this.each(function(){$f(this,l(r),q?l(q):{})})}}}();!function(){var h=document.all,j="http://get.adobe.com/flashplayer",c=typeof jQuery=="function",e=/(\d+)[^\d]+(\d+)[^\d]*(\d*)/,b={width:"100%",height:"100%",id:"_"+(""+Math.random()).slice(9),allowfullscreen:true,allowscriptaccess:"always",quality:"high",version:[3,0],onFail:null,expressInstall:null,w3c:false,cachebusting:false};if(window.attachEvent){window.attachEvent("onbeforeunload",function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){}})}function i(m,l){if(l){for(var f in l){if(l.hasOwnProperty(f)){m[f]=l[f]}}}return m}function a(f,n){var m=[];for(var l in f){if(f.hasOwnProperty(l)){m[l]=n(f[l])}}return m}window.flashembed=function(f,m,l){if(typeof f=="string"){f=document.getElementById(f.replace("#",""))}if(!f){return}if(typeof m=="string"){m={src:m}}return new d(f,i(i({},b),m),l)};var g=i(window.flashembed,{conf:b,getVersion:function(){var m,f,o;try{o=navigator.plugins["Shockwave Flash"];if(o[0].enabledPlugin!=null){f=o.description.slice(16)}}catch(p){try{m=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");f=m&&m.GetVariable("$version")}catch(n){try{m=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");f=m&&m.GetVariable("$version")}catch(l){}}}f=e.exec(f);return f?[1*f[1],1*f[(f[1]*1>9?2:3)]*1]:[0,0]},asString:function(l){if(l===null||l===undefined){return null}var f=typeof l;if(f=="object"&&l.push){f="array"}switch(f){case"string":l=l.replace(new RegExp('(["\\\\])',"g"),"\\$1");l=l.replace(/^\s?(\d+\.?\d*)%/,"$1pct");return'"'+l+'"';case"array":return"["+a(l,function(o){return g.asString(o)}).join(",")+"]";case"function":return'"function()"';case"object":var m=[];for(var n in l){if(l.hasOwnProperty(n)){m.push('"'+n+'":'+g.asString(l[n]))}}return"{"+m.join(",")+"}"}return String(l).replace(/\s/g," ").replace(/\'/g,'"')},getHTML:function(o,l){o=i({},o);var n=''}o.width=o.height=o.id=o.w3c=o.src=null;o.onFail=o.version=o.expressInstall=null;for(var m in o){if(o[m]){n+=''}}var p="";if(l){for(var f in l){if(l[f]){var q=l[f];p+=f+"="+(/function|object/.test(typeof q)?g.asString(q):q)+"&"}}p=p.slice(0,-1);n+='"}n+="";return n},isSupported:function(f){return k[0]>f[0]||k[0]==f[0]&&k[1]>=f[1]}});var k=g.getVersion();function d(f,n,m){if(g.isSupported(n.version)){f.innerHTML=g.getHTML(n,m)}else{if(n.expressInstall&&g.isSupported([6,65])){f.innerHTML=g.getHTML(i(n,{src:n.expressInstall}),{MMredirectURL:encodeURIComponent(location.href),MMplayerType:"PlugIn",MMdoctitle:document.title})}else{if(!f.innerHTML.replace(/\s/g,"")){f.innerHTML="

Flash version "+n.version+" or greater is required

"+(k[0]>0?"Your version is "+k:"You have no flash plugin installed")+"

"+(f.tagName=="A"?"

Click here to download latest version

":"

Download latest version from here

");if(f.tagName=="A"||f.tagName=="DIV"){f.onclick=function(){location.href=j}}}if(n.onFail){var l=n.onFail.call(this);if(typeof l=="string"){f.innerHTML=l}}}}if(h){window[n.id]=document.getElementById(n.id)}i(this,{getRoot:function(){return f},getOptions:function(){return n},getConf:function(){return m},getApi:function(){return f.firstChild}})}if(c){jQuery.tools=jQuery.tools||{version:"@VERSION"};jQuery.tools.flashembed={conf:b};jQuery.fn.flashembed=function(l,f){return this.each(function(){$(this).data("flashembed",flashembed(this,l,f))})}}}(); \ No newline at end of file diff --git a/lib/flowplayer/flowplayer-3.2.18.swf b/lib/flowplayer/flowplayer-3.2.18.swf new file mode 100644 index 00000000000..aed1fcb126a Binary files /dev/null and b/lib/flowplayer/flowplayer-3.2.18.swf differ diff --git a/lib/flowplayer/flowplayer.audio-3.2.10.swf b/lib/flowplayer/flowplayer.audio-3.2.10.swf deleted file mode 100644 index 6dd0af32ba6..00000000000 Binary files a/lib/flowplayer/flowplayer.audio-3.2.10.swf and /dev/null differ diff --git a/lib/flowplayer/flowplayer.audio-3.2.11.swf b/lib/flowplayer/flowplayer.audio-3.2.11.swf new file mode 100644 index 00000000000..6c11d55170a Binary files /dev/null and b/lib/flowplayer/flowplayer.audio-3.2.11.swf differ diff --git a/lib/flowplayer/flowplayer.controls-3.2.16.swf b/lib/flowplayer/flowplayer.controls-3.2.16.swf new file mode 100644 index 00000000000..eacc8c0293d Binary files /dev/null and b/lib/flowplayer/flowplayer.controls-3.2.16.swf differ diff --git a/lib/javascript-static.js b/lib/javascript-static.js index de58184c223..de8700d9262 100644 --- a/lib/javascript-static.js +++ b/lib/javascript-static.js @@ -1908,9 +1908,9 @@ M.util.load_flowplayer = function() { for(var i=0; i 0 && video.height > 0) { - var src = {src: M.cfg.wwwroot + '/lib/flowplayer/flowplayer-3.2.14.swf', width: video.width, height: video.height}; + var src = {src: M.cfg.wwwroot + '/lib/flowplayer/flowplayer-3.2.18.swf', width: video.width, height: video.height}; } else { - var src = M.cfg.wwwroot + '/lib/flowplayer/flowplayer-3.2.14.swf'; + var src = M.cfg.wwwroot + '/lib/flowplayer/flowplayer-3.2.18.swf'; } flowplayer(video.id, src, { plugins: {controls: controls}, @@ -2010,17 +2010,17 @@ M.util.load_flowplayer = function() { controls.height = 25; controls.time = true; } - flowplayer(audio.id, M.cfg.wwwroot + '/lib/flowplayer/flowplayer-3.2.14.swf', { - plugins: {controls: controls, audio: {url: M.cfg.wwwroot + '/lib/flowplayer/flowplayer.audio-3.2.10.swf'}}, + flowplayer(audio.id, M.cfg.wwwroot + '/lib/flowplayer/flowplayer-3.2.18.swf', { + plugins: {controls: controls, audio: {url: M.cfg.wwwroot + '/lib/flowplayer/flowplayer.audio-3.2.11.swf'}}, clip: {url: audio.fileurl, provider: "audio", autoPlay: false} }); } } if (M.cfg.jsrev == -1) { - var jsurl = M.cfg.wwwroot + '/lib/flowplayer/flowplayer-3.2.11.js'; + var jsurl = M.cfg.wwwroot + '/lib/flowplayer/flowplayer-3.2.13.js'; } else { - var jsurl = M.cfg.wwwroot + '/lib/javascript.php?jsfile=/lib/flowplayer/flowplayer-3.2.11.min.js&rev=' + M.cfg.jsrev; + var jsurl = M.cfg.wwwroot + '/lib/javascript.php?jsfile=/lib/flowplayer/flowplayer-3.2.13.min.js&rev=' + M.cfg.jsrev; } var fileref = document.createElement('script'); fileref.setAttribute('type','text/javascript'); diff --git a/lib/thirdpartylibs.xml b/lib/thirdpartylibs.xml index 3c18f42b18f..0f454a77817 100644 --- a/lib/thirdpartylibs.xml +++ b/lib/thirdpartylibs.xml @@ -88,7 +88,7 @@ flowplayer Flowplayer GPL - 3.2.14 + 3.2.18 3