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 = '";
+ 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") + "
");
+ 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='";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")+"