Sindbad~EG File Manager
/*!
Video.js - HTML5 Video Player
Version 3.2.0
LGPL v3 LICENSE INFO
This file is part of Video.js. Copyright 2011 Zencoder, Inc.
Video.js is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Video.js 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 Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with Video.js. If not, see <http://www.gnu.org/licenses/>.
*/
(function (window, undefined) {
var document = window.document;
document.createElement("video");
document.createElement("audio");
var VideoJS = function (id, addOptions, ready) {
var tag;
if (typeof id == "string") {
if (id.indexOf("#") === 0) {
id = id.slice(1)
}
if (_V_.players[id]) {
return _V_.players[id]
} else {
tag = _V_.el(id)
}
} else {
tag = id
}
if (!tag || !tag.nodeName) {
throw new TypeError("The element or ID supplied is not valid. (VideoJS)")
}
return tag.player || new _V_.Player(tag, addOptions, ready)
},
_V_ = VideoJS,
CDN_VERSION = "c";
VideoJS.players = {};
VideoJS.options = {
techOrder: ["html5", "flash"],
html5: {},
flash: {
swf: "http://vjs.zencdn.net/c/video-js.swf"
},
width: "auto",
height: "auto",
defaultVolume: 0,
components: {
posterImage: {},
textTrackDisplay: {},
loadingSpinner: {},
bigPlayButton: {},
controlBar: {}
}
};
if (CDN_VERSION != "GENERATED_CDN_VSN") {
_V_.options.flash.swf = "http://vjs.zencdn.net/" + CDN_VERSION + "/video-js.swf"
}
_V_.merge = function (obj1, obj2, safe) {
if (!obj2) {
obj2 = {}
}
for (var attrname in obj2) {
if (obj2.hasOwnProperty(attrname) && (!safe || !obj1.hasOwnProperty(attrname))) {
obj1[attrname] = obj2[attrname]
}
}
return obj1
};
_V_.extend = function (obj) {
this.merge(this, obj, true)
};
_V_.extend({
tech: {},
controlSets: {},
isIE: function () {
return !+"\v1"
},
isFF: function () {
return !!_V_.ua.match("Firefox")
},
isIPad: function () {
return navigator.userAgent.match(/iPad/i) !== null
},
isIPhone: function () {
return navigator.userAgent.match(/iPhone/i) !== null
},
isIOS: function () {
return VideoJS.isIPhone() || VideoJS.isIPad()
},
iOSVersion: function () {
var match = navigator.userAgent.match(/OS (\d+)_/i);
if (match && match[1]) {
return match[1]
}
},
isAndroid: function () {
return navigator.userAgent.match(/Android.*AppleWebKit/i) !== null
},
androidVersion: function () {
var match = navigator.userAgent.match(/Android (\d+)\./i);
if (match && match[1]) {
return match[1]
}
},
testVid: document.createElement("video"),
ua: navigator.userAgent,
support: {},
each: function (arr, fn) {
if (!arr || arr.length === 0) {
return
}
for (var i = 0, j = arr.length; i < j; i++) {
fn.call(this, arr[i], i)
}
},
eachProp: function (obj, fn) {
if (!obj) {
return
}
for (var name in obj) {
if (obj.hasOwnProperty(name)) {
fn.call(this, name, obj[name])
}
}
},
el: function (id) {
return document.getElementById(id)
},
createElement: function (tagName, attributes) {
var el = document.createElement(tagName),
attrname;
for (attrname in attributes) {
if (attributes.hasOwnProperty(attrname)) {
if (attrname.indexOf("-") !== -1) {
el.setAttribute(attrname, attributes[attrname])
} else {
el[attrname] = attributes[attrname]
}
}
}
return el
},
insertFirst: function (node, parent) {
if (parent.firstChild) {
parent.insertBefore(node, parent.firstChild)
} else {
parent.appendChild(node)
}
},
addClass: function (element, classToAdd) {
if ((" " + element.className + " ").indexOf(" " + classToAdd + " ") == -1) {
element.className = element.className === "" ? classToAdd : element.className + " " + classToAdd
}
},
removeClass: function (element, classToRemove) {
if (element.className.indexOf(classToRemove) == -1) {
return
}
var classNames = element.className.split(" ");
classNames.splice(classNames.indexOf(classToRemove), 1);
element.className = classNames.join(" ")
},
remove: function (item, array) {
if (!array) {
return
}
var i = array.indexOf(item);
if (i != -1) {
return array.splice(i, 1)
}
},
blockTextSelection: function () {
document.body.focus();
document.onselectstart = function () {
return false
}
},
unblockTextSelection: function () {
document.onselectstart = function () {
return true
}
},
formatTime: function (seconds, guide) {
guide = guide || seconds;
var s = Math.floor(seconds % 60),
m = Math.floor(seconds / 60 % 60),
h = Math.floor(seconds / 3600),
gm = Math.floor(guide / 60 % 60),
gh = Math.floor(guide / 3600);
h = (h > 0 || gh > 0) ? h + ":" : "";
m = (((h || gm >= 10) && m < 10) ? "0" + m : m) + ":";
s = (s < 10) ? "0" + s : s;
return h + m + s
},
uc: function (string) {
return string.charAt(0).toUpperCase() + string.slice(1)
},
getRelativePosition: function (x, relativeElement) {
return Math.max(0, Math.min(1, (x - _V_.findPosX(relativeElement)) / relativeElement.offsetWidth))
},
getComputedStyleValue: function (element, style) {
return window.getComputedStyle(element, null).getPropertyValue(style)
},
trim: function (string) {
return string.toString().replace(/^\s+/, "").replace(/\s+$/, "")
},
round: function (num, dec) {
if (!dec) {
dec = 0
}
return Math.round(num * Math.pow(10, dec)) / Math.pow(10, dec)
},
isEmpty: function (object) {
for (var prop in object) {
return false
}
return true
},
createTimeRange: function (start, end) {
return {
length: 1,
start: function () {
return start
},
end: function () {
return end
}
}
},
cache: {},
guid: 1,
expando: "vdata" + (new Date).getTime(),
getData: function (elem) {
var id = elem[_V_.expando];
if (!id) {
id = elem[_V_.expando] = _V_.guid++;
_V_.cache[id] = {}
}
return _V_.cache[id]
},
removeData: function (elem) {
var id = elem[_V_.expando];
if (!id) {
return
}
delete _V_.cache[id];
try {
delete elem[_V_.expando]
} catch (e) {
if (elem.removeAttribute) {
elem.removeAttribute(_V_.expando)
} else {
elem[_V_.expando] = null
}
}
},
proxy: function (context, fn, uid) {
if (!fn.guid) {
fn.guid = _V_.guid++
}
var ret = function () {
return fn.apply(context, arguments)
};
ret.guid = (uid) ? uid + "_" + fn.guid : fn.guid;
return ret
},
get: function (url, onSuccess, onError) {
var local = (url.indexOf("file:") == 0 || (window.location.href.indexOf("file:") == 0 && url.indexOf("http:") == -1));
if (typeof XMLHttpRequest == "undefined") {
XMLHttpRequest = function () {
try {
return new ActiveXObject("Msxml2.XMLHTTP.6.0")
} catch (e) {}
try {
return new ActiveXObject("Msxml2.XMLHTTP.3.0")
} catch (f) {}
try {
return new ActiveXObject("Msxml2.XMLHTTP")
} catch (g) {}
throw new Error("This browser does not support XMLHttpRequest.")
}
}
var request = new XMLHttpRequest();
try {
request.open("GET", url)
} catch (e) {
_V_.log("VideoJS XMLHttpRequest (open)", e);
return false
}
request.onreadystatechange = _V_.proxy(this, function () {
if (request.readyState == 4) {
if (request.status == 200 || local && request.status == 0) {
onSuccess(request.responseText)
} else {
if (onError) {
onError()
}
}
}
});
try {
request.send()
} catch (e) {
_V_.log("VideoJS XMLHttpRequest (send)", e);
if (onError) {
onError(e)
}
}
},
setLocalStorage: function (key, value) {
var localStorage = window.localStorage || false;
if (!localStorage) {
return
}
try {
localStorage[key] = value
} catch (e) {
if (e.code == 22 || e.code == 1014) {
_V_.log("LocalStorage Full (VideoJS)", e)
} else {
_V_.log("LocalStorage Error (VideoJS)", e)
}
}
},
getAbsoluteURL: function (url) {
if (!url.match(/^https?:\/\//)) {
url = _V_.createElement("div", {
innerHTML: '<a href="' + url + '">x</a>'
}).firstChild.href
}
return url
}
});
_V_.log = function () {
_V_.log.history = _V_.log.history || [];
_V_.log.history.push(arguments);
if (window.console) {
arguments.callee = arguments.callee.caller;
var newarr = [].slice.call(arguments);
(typeof console.log === "object" ? _V_.log.apply.call(console.log, console, newarr) : console.log.apply(console, newarr))
}
};
(function (b) {
function c() {}
for (var d = "assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","), a; a = d.pop();) {
b[a] = b[a] || c
}
})((function () {
try {
console.log();
return window.console
} catch (err) {
return window.console = {}
}
})());
if ("getBoundingClientRect" in document.documentElement) {
_V_.findPosX = function (el) {
var box;
try {
box = el.getBoundingClientRect()
} catch (e) {}
if (!box) {
return 0
}
var docEl = document.documentElement,
body = document.body,
clientLeft = docEl.clientLeft || body.clientLeft || 0,
scrollLeft = window.pageXOffset || body.scrollLeft,
left = box.left + scrollLeft - clientLeft;
return left
}
} else {
_V_.findPosX = function (el) {
var curleft = el.offsetLeft;
while (el = obj.offsetParent) {
if (el.className.indexOf("video-js") == -1) {} else {}
curleft += el.offsetLeft
}
return curleft
}
}(function () {
var initializing = false,
fnTest = /xyz/.test(function () {
xyz
}) ? /\b_super\b/ : /.*/;
_V_.Class = function () {};
_V_.Class.extend = function (prop) {
var _super = this.prototype;
initializing = true;
var prototype = new this();
initializing = false;
for (var name in prop) {
prototype[name] = typeof prop[name] == "function" && typeof _super[name] == "function" && fnTest.test(prop[name]) ? (function (name, fn) {
return function () {
var tmp = this._super;
this._super = _super[name];
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret
}
})(name, prop[name]) : prop[name]
}
function Class() {
if (!initializing && this.init) {
return this.init.apply(this, arguments)
} else {
if (!initializing) {
return arguments.callee.prototype.init()
}
}
}
Class.prototype = prototype;
Class.constructor = Class;
Class.extend = arguments.callee;
return Class
}
})();
_V_.Component = _V_.Class.extend({
init: function (player, options) {
this.player = player;
options = this.options = _V_.merge(this.options || {}, options);
if (options.el) {
this.el = options.el
} else {
this.el = this.createElement()
}
this.initComponents()
},
destroy: function () {},
createElement: function (type, attrs) {
return _V_.createElement(type || "div", attrs)
},
buildCSSClass: function () {
return ""
},
initComponents: function () {
var options = this.options;
if (options && options.components) {
this.eachProp(options.components, function (name, opts) {
var tempAdd = this.proxy(function () {
this[name] = this.addComponent(name, opts)
});
if (opts.loadEvent) {
this.one(opts.loadEvent, tempAdd)
} else {
tempAdd()
}
})
}
},
addComponent: function (name, options) {
var component, componentClass;
if (typeof name == "string") {
options = options || {};
componentClass = options.componentClass || _V_.uc(name);
component = new _V_[componentClass](this.player || this, options)
} else {
component = name
}
this.el.appendChild(component.el);
return component
},
removeComponent: function (component) {
this.el.removeChild(component.el)
},
show: function () {
this.el.style.display = "block"
},
hide: function () {
this.el.style.display = "none"
},
fadeIn: function () {
this.removeClass("vjs-fade-out");
this.addClass("vjs-fade-in")
},
fadeOut: function () {
this.removeClass("vjs-fade-in");
this.addClass("vjs-fade-out")
},
lockShowing: function () {
var style = this.el.style;
style.display = "block";
style.opacity = 1;
style.visiblity = "visible"
},
unlockShowing: function () {
var style = this.el.style;
style.display = "";
style.opacity = "";
style.visiblity = ""
},
addClass: function (classToAdd) {
_V_.addClass(this.el, classToAdd)
},
removeClass: function (classToRemove) {
_V_.removeClass(this.el, classToRemove)
},
addEvent: function (type, fn, uid) {
return _V_.addEvent(this.el, type, _V_.proxy(this, fn))
},
removeEvent: function (type, fn) {
return _V_.removeEvent(this.el, type, fn)
},
triggerEvent: function (type, e) {
return _V_.triggerEvent(this.el, type, e)
},
one: function (type, fn) {
_V_.one(this.el, type, _V_.proxy(this, fn))
},
ready: function (fn) {
if (!fn) {
return this
}
if (this.isReady) {
fn.call(this)
} else {
if (this.readyQueue === undefined) {
this.readyQueue = []
}
this.readyQueue.push(fn)
}
return this
},
triggerReady: function () {
this.isReady = true;
if (this.readyQueue && this.readyQueue.length > 0) {
this.each(this.readyQueue, function (fn) {
fn.call(this)
});
this.readyQueue = [];
this.triggerEvent("ready")
}
},
each: function (arr, fn) {
_V_.each.call(this, arr, fn)
},
eachProp: function (obj, fn) {
_V_.eachProp.call(this, obj, fn)
},
extend: function (obj) {
_V_.merge(this, obj)
},
proxy: function (fn, uid) {
return _V_.proxy(this, fn, uid)
}
});
_V_.Control = _V_.Component.extend({
buildCSSClass: function () {
return "vjs-control " + this._super()
}
});
_V_.ControlBar = _V_.Component.extend({
options: {
loadEvent: "play",
components: {
playToggle: {},
fullscreenToggle: {},
currentTimeDisplay: {},
timeDivider: {},
durationDisplay: {},
remainingTimeDisplay: {},
progressControl: {},
volumeControl: {},
muteToggle: {}
}
},
init: function (player, options) {
this._super(player, options);
player.addEvent("play", this.proxy(function () {
this.fadeIn();
this.player.addEvent("mouseover", this.proxy(this.fadeIn));
this.player.addEvent("mouseout", this.proxy(this.fadeOut))
}))
},
createElement: function () {
return _V_.createElement("div", {
className: "vjs-controls"
})
},
fadeIn: function () {
this._super();
this.player.triggerEvent("controlsvisible")
},
fadeOut: function () {
this._super();
this.player.triggerEvent("controlshidden")
},
lockShowing: function () {
this.el.style.opacity = "1"
}
});
_V_.Button = _V_.Control.extend({
init: function (player, options) {
this._super(player, options);
this.addEvent("click", this.onClick);
this.addEvent("focus", this.onFocus);
this.addEvent("blur", this.onBlur)
},
createElement: function (type, attrs) {
attrs = _V_.merge({
className: this.buildCSSClass(),
innerHTML: '<div><span class="vjs-control-text">' + (this.buttonText || "Need Text") + "</span></div>",
role: "button",
tabIndex: 0
}, attrs);
return this._super(type, attrs)
},
onClick: function () {},
onFocus: function () {
_V_.addEvent(document, "keyup", _V_.proxy(this, this.onKeyPress))
},
onKeyPress: function (event) {
if (event.which == 32 || event.which == 13) {
event.preventDefault();
this.onClick()
}
},
onBlur: function () {
_V_.removeEvent(document, "keyup", _V_.proxy(this, this.onKeyPress))
}
});
_V_.PlayButton = _V_.Button.extend({
buttonText: "Play",
buildCSSClass: function () {
return "vjs-play-button " + this._super()
},
onClick: function () {
this.player.play()
}
});
_V_.PauseButton = _V_.Button.extend({
buttonText: "Pause",
buildCSSClass: function () {
return "vjs-pause-button " + this._super()
},
onClick: function () {
this.player.pause()
}
});
_V_.PlayToggle = _V_.Button.extend({
buttonText: "Play",
init: function (player, options) {
this._super(player, options);
player.addEvent("play", _V_.proxy(this, this.onPlay));
player.addEvent("pause", _V_.proxy(this, this.onPause))
},
buildCSSClass: function () {
return "vjs-play-control " + this._super()
},
onClick: function () {
if (this.player.paused()) {
this.player.play()
} else {
this.player.pause()
}
},
onPlay: function () {
_V_.removeClass(this.el, "vjs-paused");
_V_.addClass(this.el, "vjs-playing")
},
onPause: function () {
_V_.removeClass(this.el, "vjs-playing");
_V_.addClass(this.el, "vjs-paused")
}
});
_V_.FullscreenToggle = _V_.Button.extend({
buttonText: "Fullscreen",
buildCSSClass: function () {
return "vjs-fullscreen-control " + this._super()
},
onClick: function () {
if (!this.player.isFullScreen) {
this.player.requestFullScreen()
} else {
this.player.cancelFullScreen()
}
}
});
_V_.BigPlayButton = _V_.Button.extend({
init: function (player, options) {
this._super(player, options);
player.addEvent("play", _V_.proxy(this, this.hide));
player.addEvent("ended", _V_.proxy(this, this.show))
},
createElement: function () {
return this._super("div", {
className: "vjs-big-play-button",
innerHTML: "<span></span>"
})
},
onClick: function () {
if (this.player.currentTime()) {
this.player.currentTime(0)
}
this.player.play()
}
});
_V_.LoadingSpinner = _V_.Component.extend({
init: function (player, options) {
this._super(player, options);
player.addEvent("canplay", _V_.proxy(this, this.hide));
player.addEvent("canplaythrough", _V_.proxy(this, this.hide));
player.addEvent("playing", _V_.proxy(this, this.hide));
player.addEvent("seeking", _V_.proxy(this, this.show));
player.addEvent("error", _V_.proxy(this, this.show));
player.addEvent("waiting", _V_.proxy(this, this.show))
},
createElement: function () {
var classNameSpinner, innerHtmlSpinner;
if (typeof this.player.el.style.WebkitBorderRadius == "string" || typeof this.player.el.style.MozBorderRadius == "string" || typeof this.player.el.style.KhtmlBorderRadius == "string" || typeof this.player.el.style.borderRadius == "string") {
classNameSpinner = "vjs-loading-spinner";
innerHtmlSpinner = "<div class='ball1'></div><div class='ball2'></div><div class='ball3'></div><div class='ball4'></div><div class='ball5'></div><div class='ball6'></div><div class='ball7'></div><div class='ball8'></div>"
} else {
classNameSpinner = "vjs-loading-spinner-fallback";
innerHtmlSpinner = ""
}
return this._super("div", {
className: classNameSpinner,
innerHTML: innerHtmlSpinner
})
}
});
_V_.CurrentTimeDisplay = _V_.Component.extend({
init: function (player, options) {
this._super(player, options);
player.addEvent("timeupdate", _V_.proxy(this, this.updateContent))
},
createElement: function () {
var el = this._super("div", {
className: "vjs-current-time vjs-time-controls vjs-control"
});
this.content = _V_.createElement("div", {
className: "vjs-current-time-display",
innerHTML: "0:00"
});
el.appendChild(_V_.createElement("div").appendChild(this.content));
return el
},
updateContent: function () {
var time = (this.player.scrubbing) ? this.player.values.currentTime : this.player.currentTime();
this.content.innerHTML = _V_.formatTime(time, this.player.duration())
}
});
_V_.DurationDisplay = _V_.Component.extend({
init: function (player, options) {
this._super(player, options);
player.addEvent("timeupdate", _V_.proxy(this, this.updateContent))
},
createElement: function () {
var el = this._super("div", {
className: "vjs-duration vjs-time-controls vjs-control"
});
this.content = _V_.createElement("div", {
className: "vjs-duration-display",
innerHTML: "0:00"
});
el.appendChild(_V_.createElement("div").appendChild(this.content));
return el
},
updateContent: function () {
if (this.player.duration()) {
this.content.innerHTML = _V_.formatTime(this.player.duration())
}
}
});
_V_.TimeDivider = _V_.Component.extend({
createElement: function () {
return this._super("div", {
className: "vjs-time-divider",
innerHTML: "<div><span>/</span></div>"
})
}
});
_V_.RemainingTimeDisplay = _V_.Component.extend({
init: function (player, options) {
this._super(player, options);
player.addEvent("timeupdate", _V_.proxy(this, this.updateContent))
},
createElement: function () {
var el = this._super("div", {
className: "vjs-remaining-time vjs-time-controls vjs-control"
});
this.content = _V_.createElement("div", {
className: "vjs-remaining-time-display",
innerHTML: "-0:00"
});
el.appendChild(_V_.createElement("div").appendChild(this.content));
return el
},
updateContent: function () {
if (this.player.duration()) {
this.content.innerHTML = "-" + _V_.formatTime(this.player.remainingTime())
}
}
});
_V_.Slider = _V_.Component.extend({
init: function (player, options) {
this._super(player, options);
player.addEvent(this.playerEvent, _V_.proxy(this, this.update));
this.addEvent("mousedown", this.onMouseDown);
this.addEvent("focus", this.onFocus);
this.addEvent("blur", this.onBlur);
this.player.addEvent("controlsvisible", this.proxy(this.update));
this.update()
},
createElement: function (type, attrs) {
attrs = _V_.merge({
role: "slider",
"aria-valuenow": 0,
"aria-valuemin": 0,
"aria-valuemax": 100,
tabIndex: 0
}, attrs);
return this._super(type, attrs)
},
onMouseDown: function (event) {
event.preventDefault();
_V_.blockTextSelection();
_V_.addEvent(document, "mousemove", _V_.proxy(this, this.onMouseMove));
_V_.addEvent(document, "mouseup", _V_.proxy(this, this.onMouseUp));
this.onMouseMove(event)
},
onMouseUp: function (event) {
_V_.unblockTextSelection();
_V_.removeEvent(document, "mousemove", this.onMouseMove, false);
_V_.removeEvent(document, "mouseup", this.onMouseUp, false);
this.update()
},
update: function () {
var barProgress, progress = this.getPercent();
handle = this.handle, bar = this.bar;
if (isNaN(progress)) {
progress = 0
}
barProgress = progress;
if (handle) {
var box = this.el,
boxWidth = box.offsetWidth,
handleWidth = handle.el.offsetWidth,
handlePercent = (handleWidth) ? handleWidth / boxWidth : 0,
boxAdjustedPercent = 1 - handlePercent;
adjustedProgress = progress * boxAdjustedPercent, barProgress = adjustedProgress + (handlePercent / 2);
handle.el.style.left = _V_.round(adjustedProgress * 100, 2) + "%"
}
bar.el.style.width = _V_.round(barProgress * 100, 2) + "%"
},
calculateDistance: function (event) {
var box = this.el,
boxX = _V_.findPosX(box),
boxW = box.offsetWidth,
handle = this.handle;
if (handle) {
var handleW = handle.el.offsetWidth;
boxX = boxX + (handleW / 2);
boxW = boxW - handleW
}
return Math.max(0, Math.min(1, (event.pageX - boxX) / boxW))
},
onFocus: function (event) {
_V_.addEvent(document, "keyup", _V_.proxy(this, this.onKeyPress))
},
onKeyPress: function (event) {
if (event.which == 37) {
event.preventDefault();
this.stepBack()
} else {
if (event.which == 39) {
event.preventDefault();
this.stepForward()
}
}
},
onBlur: function (event) {
_V_.removeEvent(document, "keyup", _V_.proxy(this, this.onKeyPress))
}
});
_V_.ProgressControl = _V_.Component.extend({
options: {
components: {
seekBar: {}
}
},
createElement: function () {
return this._super("div", {
className: "vjs-progress-control vjs-control"
})
}
});
_V_.SeekBar = _V_.Slider.extend({
options: {
components: {
loadProgressBar: {},
bar: {
componentClass: "PlayProgressBar"
},
handle: {
componentClass: "SeekHandle"
}
}
},
playerEvent: "timeupdate",
init: function (player, options) {
this._super(player, options)
},
createElement: function () {
return this._super("div", {
className: "vjs-progress-holder"
})
},
getPercent: function () {
return this.player.currentTime() / this.player.duration()
},
onMouseDown: function (event) {
this._super(event);
this.player.scrubbing = true;
this.videoWasPlaying = !this.player.paused();
this.player.pause()
},
onMouseMove: function (event) {
var newTime = this.calculateDistance(event) * this.player.duration();
if (newTime == this.player.duration()) {
newTime = newTime - 0.1
}
this.player.currentTime(newTime)
},
onMouseUp: function (event) {
this._super(event);
this.player.scrubbing = false;
if (this.videoWasPlaying) {
this.player.play()
}
},
stepForward: function () {
this.player.currentTime(this.player.currentTime() + 1)
},
stepBack: function () {
this.player.currentTime(this.player.currentTime() - 1)
}
});
_V_.LoadProgressBar = _V_.Component.extend({
init: function (player, options) {
this._super(player, options);
player.addEvent("progress", _V_.proxy(this, this.update))
},
createElement: function () {
return this._super("div", {
className: "vjs-load-progress",
innerHTML: '<span class="vjs-control-text">Loaded: 0%</span>'
})
},
update: function () {
if (this.el.style) {
this.el.style.width = _V_.round(this.player.bufferedPercent() * 100, 2) + "%"
}
}
});
_V_.PlayProgressBar = _V_.Component.extend({
createElement: function () {
return this._super("div", {
className: "vjs-play-progress",
innerHTML: '<span class="vjs-control-text">Progress: 0%</span>'
})
}
});
_V_.SeekHandle = _V_.Component.extend({
createElement: function () {
return this._super("div", {
className: "vjs-seek-handle",
innerHTML: '<span class="vjs-control-text">00:00</span>'
})
}
});
_V_.VolumeControl = _V_.Component.extend({
options: {
components: {
volumeBar: {}
}
},
createElement: function () {
return this._super("div", {
className: "vjs-volume-control vjs-control"
})
}
});
_V_.VolumeBar = _V_.Slider.extend({
options: {
components: {
bar: {
componentClass: "VolumeLevel"
},
handle: {
componentClass: "VolumeHandle"
}
}
},
playerEvent: "volumechange",
createElement: function () {
return this._super("div", {
className: "vjs-volume-bar"
})
},
onMouseMove: function (event) {
this.player.volume(this.calculateDistance(event))
},
getPercent: function () {
return this.player.volume()
},
stepForward: function () {
this.player.volume(this.player.volume() + 0.1)
},
stepBack: function () {
this.player.volume(this.player.volume() - 0.1)
}
});
_V_.VolumeLevel = _V_.Component.extend({
createElement: function () {
return this._super("div", {
className: "vjs-volume-level",
innerHTML: '<span class="vjs-control-text"></span>'
})
}
});
_V_.VolumeHandle = _V_.Component.extend({
createElement: function () {
return this._super("div", {
className: "vjs-volume-handle",
innerHTML: '<span class="vjs-control-text"></span>'
})
}
});
_V_.MuteToggle = _V_.Button.extend({
init: function (player, options) {
this._super(player, options);
player.addEvent("volumechange", _V_.proxy(this, this.update))
},
createElement: function () {
return this._super("div", {
className: "vjs-mute-control vjs-control",
innerHTML: '<div><span class="vjs-control-text">Mute</span></div>'
})
},
onClick: function (event) {
this.player.muted(this.player.muted() ? false : true)
},
update: function (event) {
var vol = this.player.volume(),
level = 3;
if (vol == 0 || this.player.muted()) {
level = 0
} else {
if (vol < 0.33) {
level = 1
} else {
if (vol < 0.67) {
level = 2
}
}
}
_V_.each.call(this, [0, 1, 2, 3], function (i) {
_V_.removeClass(this.el, "vjs-vol-" + i)
});
_V_.addClass(this.el, "vjs-vol-" + level)
}
});
_V_.PosterImage = _V_.Button.extend({
init: function (player, options) {
this._super(player, options);
if (!this.player.options.poster) {
this.hide()
}
player.addEvent("play", _V_.proxy(this, this.hide))
},
createElement: function () {
return _V_.createElement("img", {
className: "vjs-poster",
src: this.player.options.poster,
tabIndex: -1
})
},
onClick: function () {
this.player.play()
}
});
_V_.Menu = _V_.Component.extend({
init: function (player, options) {
this._super(player, options)
},
addItem: function (component) {
this.addComponent(component);
component.addEvent("click", this.proxy(function () {
this.unlockShowing()
}))
},
createElement: function () {
return this._super("ul", {
className: "vjs-menu"
})
}
});
_V_.MenuItem = _V_.Button.extend({
init: function (player, options) {
this._super(player, options);
if (options.selected) {
this.addClass("vjs-selected")
}
},
createElement: function (type, attrs) {
return this._super("li", _V_.merge({
className: "vjs-menu-item",
innerHTML: this.options.label
}, attrs))
},
onClick: function () {
this.selected(true)
},
selected: function (selected) {
if (selected) {
this.addClass("vjs-selected")
} else {
this.removeClass("vjs-selected")
}
}
});
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function (searchElement) {
if (this === void 0 || this === null) {
throw new TypeError()
}
var t = Object(this);
var len = t.length >>> 0;
if (len === 0) {
return -1
}
var n = 0;
if (arguments.length > 0) {
n = Number(arguments[1]);
if (n !== n) {
n = 0
} else {
if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {
n = (n > 0 || -1) * Math.floor(Math.abs(n))
}
}
}
if (n >= len) {
return -1
}
var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
for (; k < len; k++) {
if (k in t && t[k] === searchElement) {
return k
}
}
return -1
}
}
_V_.extend({
addEvent: function (elem, type, fn) {
var data = _V_.getData(elem),
handlers;
if (data && !data.handler) {
data.handler = function (event) {
event = _V_.fixEvent(event);
var handlers = _V_.getData(elem).events[event.type];
if (handlers) {
var handlersCopy = [];
_V_.each(handlers, function (handler, i) {
handlersCopy[i] = handler
});
for (var i = 0, l = handlersCopy.length; i < l; i++) {
handlersCopy[i].call(elem, event)
}
}
}
}
if (!data.events) {
data.events = {}
}
handlers = data.events[type];
if (!handlers) {
handlers = data.events[type] = [];
if (document.addEventListener) {
elem.addEventListener(type, data.handler, false)
} else {
if (document.attachEvent) {
elem.attachEvent("on" + type, data.handler)
}
}
}
if (!fn.guid) {
fn.guid = _V_.guid++
}
handlers.push(fn)
},
removeEvent: function (elem, type, fn) {
var data = _V_.getData(elem),
handlers;
if (!data.events) {
return
}
if (!type) {
for (type in data.events) {
_V_.cleanUpEvents(elem, type)
}
return
}
handlers = data.events[type];
if (!handlers) {
return
}
if (fn && fn.guid) {
for (var i = 0; i < handlers.length; i++) {
if (handlers[i].guid === fn.guid) {
handlers.splice(i--, 1)
}
}
}
_V_.cleanUpEvents(elem, type)
},
cleanUpEvents: function (elem, type) {
var data = _V_.getData(elem);
if (data.events[type].length === 0) {
delete data.events[type];
if (document.removeEventListener) {
elem.removeEventListener(type, data.handler, false)
} else {
if (document.detachEvent) {
elem.detachEvent("on" + type, data.handler)
}
}
}
if (_V_.isEmpty(data.events)) {
delete data.events;
delete data.handler
}
if (_V_.isEmpty(data)) {
_V_.removeData(elem)
}
},
fixEvent: function (event) {
if (event[_V_.expando]) {
return event
}
var originalEvent = event;
event = new _V_.Event(originalEvent);
for (var i = _V_.Event.props.length, prop; i;) {
prop = _V_.Event.props[--i];
event[prop] = originalEvent[prop]
}
if (!event.target) {
event.target = event.srcElement || document
}
if (event.target.nodeType === 3) {
event.target = event.target.parentNode
}
if (!event.relatedTarget && event.fromElement) {
event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement
}
if (event.pageX == null && event.clientX != null) {
var eventDocument = event.target.ownerDocument || document,
doc = eventDocument.documentElement,
body = eventDocument.body;
event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0)
}
if (event.which == null && (event.charCode != null || event.keyCode != null)) {
event.which = event.charCode != null ? event.charCode : event.keyCode
}
if (!event.metaKey && event.ctrlKey) {
event.metaKey = event.ctrlKey
}
if (!event.which && event.button !== undefined) {
event.which = (event.button & 1 ? 1 : (event.button & 2 ? 3 : (event.button & 4 ? 2 : 0)))
}
return event
},
triggerEvent: function (elem, event) {
var data = _V_.getData(elem),
parent = elem.parentNode || elem.ownerDocument,
type = event.type || event,
handler;
if (data) {
handler = data.handler
}
event = typeof event === "object" ? event[_V_.expando] ? event : new _V_.Event(type, event) : new _V_.Event(type);
event.type = type;
if (handler) {
handler.call(elem, event)
}
event.result = undefined;
event.target = elem
},
one: function (elem, type, fn) {
_V_.addEvent(elem, type, function () {
_V_.removeEvent(elem, type, arguments.callee);
fn.apply(this, arguments)
})
}
});
_V_.Event = function (src, props) {
if (src && src.type) {
this.originalEvent = src;
this.type = src.type;
this.isDefaultPrevented = (src.defaultPrevented || src.returnValue === false || src.getPreventDefault && src.getPreventDefault()) ? returnTrue : returnFalse
} else {
this.type = src
}
if (props) {
_V_.merge(this, props)
}
this.timeStamp = (new Date).getTime();
this[_V_.expando] = true
};
_V_.Event.prototype = {
preventDefault: function () {
this.isDefaultPrevented = returnTrue;
var e = this.originalEvent;
if (!e) {
return
}
if (e.preventDefault) {
e.preventDefault()
} else {
e.returnValue = false
}
},
stopPropagation: function () {
this.isPropagationStopped = returnTrue;
var e = this.originalEvent;
if (!e) {
return
}
if (e.stopPropagation) {
e.stopPropagation()
}
e.cancelBubble = true
},
stopImmediatePropagation: function () {
this.isImmediatePropagationStopped = returnTrue;
this.stopPropagation()
},
isDefaultPrevented: returnFalse,
isPropagationStopped: returnFalse,
isImmediatePropagationStopped: returnFalse
};
_V_.Event.props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" ");
function returnTrue() {
return true
}
function returnFalse() {
return false
}
var JSON;
if (!JSON) {
JSON = {}
}(function () {
var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
if (typeof JSON.parse !== "function") {
JSON.parse = function (text, reviver) {
var j;
function walk(holder, key) {
var k, v, value = holder[key];
if (value && typeof value === "object") {
for (k in value) {
if (Object.prototype.hasOwnProperty.call(value, k)) {
v = walk(value, k);
if (v !== undefined) {
value[k] = v
} else {
delete value[k]
}
}
}
}
return reviver.call(holder, key, value)
}
text = String(text);
cx.lastIndex = 0;
if (cx.test(text)) {
text = text.replace(cx, function (a) {
return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
})
}
if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
j = eval("(" + text + ")");
return typeof reviver === "function" ? walk({
"": j
}, "") : j
}
throw new SyntaxError("JSON.parse")
}
}
}());
_V_.Player = _V_.Component.extend({
init: function (tag, addOptions, ready) {
this.tag = tag;
var el = this.el = _V_.createElement("div"),
options = this.options = {},
width = options.width = tag.getAttribute("width"),
height = options.height = tag.getAttribute("height"),
initWidth = width || 300,
initHeight = height || 150;
tag.player = el.player = this;
this.ready(ready);
tag.parentNode.insertBefore(el, tag);
el.appendChild(tag);
el.id = this.id = tag.id;
el.className = tag.className;
tag.id += "_html5_api";
tag.className = "vjs-tech";
_V_.players[el.id] = this;
el.setAttribute("width", initWidth);
el.setAttribute("height", initHeight);
el.style.width = initWidth + "px";
el.style.height = initHeight + "px";
tag.removeAttribute("width");
tag.removeAttribute("height");
_V_.merge(options, _V_.options);
_V_.merge(options, this.getVideoTagSettings());
_V_.merge(options, addOptions);
tag.removeAttribute("controls");
tag.removeAttribute("poster");
if (tag.hasChildNodes()) {
for (var i = 0, j = tag.childNodes; i < j.length; i++) {
if (j[i].nodeName == "SOURCE" || j[i].nodeName == "TRACK") {
tag.removeChild(j[i])
}
}
}
this.values = {};
this.addClass("vjs-paused");
this.addEvent("ended", this.onEnded);
this.addEvent("play", this.onPlay);
this.addEvent("pause", this.onPause);
this.addEvent("progress", this.onProgress);
this.addEvent("error", this.onError);
if (options.controls) {
this.ready(function () {
this.initComponents()
})
}
this.textTracks = [];
if (options.tracks && options.tracks.length > 0) {
this.addTextTracks(options.tracks)
}
if (!options.sources || options.sources.length == 0) {
for (var i = 0, j = options.techOrder; i < j.length; i++) {
var techName = j[i],
tech = _V_[techName];
if (tech.isSupported()) {
this.loadTech(techName);
break
}
}
} else {
this.src(options.sources)
}
},
values: {},
destroy: function () {
this.stopTrackingProgress();
this.stopTrackingCurrentTime();
_V_.players[this.id] = null;
delete _V_.players[this.id];
this.tech.destroy();
this.el.parentNode.removeChild(this.el)
},
createElement: function (type, options) {},
getVideoTagSettings: function () {
var options = {
sources: [],
tracks: []
};
options.src = this.tag.getAttribute("src");
options.controls = this.tag.getAttribute("controls") !== null;
options.poster = this.tag.getAttribute("poster");
options.preload = this.tag.getAttribute("preload");
options.autoplay = this.tag.getAttribute("autoplay") !== null;
options.loop = this.tag.getAttribute("loop") !== null;
options.muted = this.tag.getAttribute("muted") !== null;
if (this.tag.hasChildNodes()) {
for (var c, i = 0, j = this.tag.childNodes; i < j.length; i++) {
c = j[i];
if (c.nodeName == "SOURCE") {
options.sources.push({
src: c.getAttribute("src"),
type: c.getAttribute("type"),
media: c.getAttribute("media"),
title: c.getAttribute("title")
})
}
if (c.nodeName == "TRACK") {
options.tracks.push({
src: c.getAttribute("src"),
kind: c.getAttribute("kind"),
srclang: c.getAttribute("srclang"),
label: c.getAttribute("label"),
"default": c.getAttribute("default") !== null,
title: c.getAttribute("title")
})
}
}
}
return options
},
loadTech: function (techName, source) {
if (this.tech) {
this.unloadTech()
} else {
if (techName != "html5" && this.tag) {
this.el.removeChild(this.tag);
this.tag = false
}
}
this.techName = techName;
this.isReady = false;
var techReady = function () {
this.player.triggerReady();
if (!this.support.progressEvent) {
this.player.manualProgressOn()
}
if (!this.support.timeupdateEvent) {
this.player.manualTimeUpdatesOn()
}
};
var techOptions = _V_.merge({
source: source,
parentEl: this.el
}, this.options[techName]);
if (source) {
if (source.src == this.values.src && this.values.currentTime > 0) {
techOptions.startTime = this.values.currentTime
}
this.values.src = source.src
}
this.tech = new _V_[techName](this, techOptions);
this.tech.ready(techReady)
},
unloadTech: function () {
this.tech.destroy();
if (this.manualProgress) {
this.manualProgressOff()
}
if (this.manualTimeUpdates) {
this.manualTimeUpdatesOff()
}
this.tech = false
},
manualProgressOn: function () {
this.manualProgress = true;
this.trackProgress();
this.tech.addEvent("progress", function () {
this.removeEvent("progress", arguments.callee);
this.support.progressEvent = true;
this.player.manualProgressOff()
})
},
manualProgressOff: function () {
this.manualProgress = false;
this.stopTrackingProgress()
},
trackProgress: function () {
this.progressInterval = setInterval(_V_.proxy(this, function () {
if (this.values.bufferEnd < this.buffered().end(0)) {
this.triggerEvent("progress")
} else {
if (this.bufferedPercent() == 1) {
this.stopTrackingProgress();
this.triggerEvent("progress")
}
}
}), 500)
},
stopTrackingProgress: function () {
clearInterval(this.progressInterval)
},
manualTimeUpdatesOn: function () {
this.manualTimeUpdates = true;
this.addEvent("play", this.trackCurrentTime);
this.addEvent("pause", this.stopTrackingCurrentTime);
this.tech.addEvent("timeupdate", function () {
this.removeEvent("timeupdate", arguments.callee);
this.support.timeupdateEvent = true;
this.player.manualTimeUpdatesOff()
})
},
manualTimeUpdatesOff: function () {
this.manualTimeUpdates = false;
this.stopTrackingCurrentTime();
this.removeEvent("play", this.trackCurrentTime);
this.removeEvent("pause", this.stopTrackingCurrentTime)
},
trackCurrentTime: function () {
if (this.currentTimeInterval) {
this.stopTrackingCurrentTime()
}
this.currentTimeInterval = setInterval(_V_.proxy(this, function () {
this.triggerEvent("timeupdate")
}), 250)
},
stopTrackingCurrentTime: function () {
clearInterval(this.currentTimeInterval)
},
onEnded: function () {
if (this.options.loop) {
this.currentTime(0);
this.play()
} else {
this.pause();
this.currentTime(0);
this.pause()
}
},
onPlay: function () {
_V_.removeClass(this.el, "vjs-paused");
_V_.addClass(this.el, "vjs-playing")
},
onPause: function () {
_V_.removeClass(this.el, "vjs-playing");
_V_.addClass(this.el, "vjs-paused")
},
onProgress: function () {
if (this.bufferedPercent() == 1) {
this.triggerEvent("loadedalldata")
}
},
onError: function (e) {
_V_.log("Video Error", e)
},
techCall: function (method, arg) {
if (!this.tech.isReady) {
this.tech.ready(function () {
this[method](arg)
})
} else {
try {
this.tech[method](arg)
} catch (e) {
_V_.log(e)
}
}
},
techGet: function (method) {
if (this.tech.isReady) {
try {
return this.tech[method]()
} catch (e) {
if (this.tech[method] === undefined) {
_V_.log("Video.js: " + method + " method not defined for " + this.techName + " playback technology.", e)
} else {
if (e.name == "TypeError") {
_V_.log("Video.js: " + method + " unavailable on " + this.techName + " playback technology element.", e);
this.tech.isReady = false
} else {
_V_.log(e)
}
}
}
}
return
},
play: function () {
this.techCall("play");
return this
},
pause: function () {
this.techCall("pause");
return this
},
paused: function () {
return (this.techGet("paused") === false) ? false : true
},
currentTime: function (seconds) {
if (seconds !== undefined) {
this.values.lastSetCurrentTime = seconds;
this.techCall("setCurrentTime", seconds);
if (this.manualTimeUpdates) {
this.triggerEvent("timeupdate")
}
return this
}
return this.values.currentTime = (this.techGet("currentTime") || 0)
},
duration: function () {
return parseFloat(this.techGet("duration"))
},
remainingTime: function () {
return this.duration() - this.currentTime()
},
buffered: function () {
var buffered = this.techGet("buffered"),
start = 0,
end = this.values.bufferEnd = this.values.bufferEnd || 0,
timeRange;
if (buffered && buffered.length > 0 && buffered.end(0) !== end) {
end = buffered.end(0);
this.values.bufferEnd = end
}
return _V_.createTimeRange(start, end)
},
bufferedPercent: function () {
return (this.duration()) ? this.buffered().end(0) / this.duration() : 0
},
volume: function (percentAsDecimal) {
var vol;
if (percentAsDecimal !== undefined) {
vol = Math.max(0, Math.min(1, parseFloat(percentAsDecimal)));
this.values.volume = vol;
this.techCall("setVolume", vol);
_V_.setLocalStorage("volume", vol);
return this
}
vol = parseFloat(this.techGet("volume"));
return (isNaN(vol)) ? 1 : vol
},
muted: function (muted) {
if (muted !== undefined) {
this.techCall("setMuted", muted);
return this
}
return this.techGet("muted") || false
},
width: function (width, skipListeners) {
if (width !== undefined) {
this.el.width = width;
this.el.style.width = width + "px";
if (!skipListeners) {
this.triggerEvent("resize")
}
return this
}
return parseInt(this.el.getAttribute("width"))
},
height: function (height) {
if (height !== undefined) {
this.el.height = height;
this.el.style.height = height + "px";
this.triggerEvent("resize");
return this
}
return parseInt(this.el.getAttribute("height"))
},
size: function (width, height) {
return this.width(width, true).height(height)
},
supportsFullScreen: function () {
return this.techGet("supportsFullScreen") || false
},
requestFullScreen: function () {
var requestFullScreen = _V_.support.requestFullScreen;
this.isFullScreen = true;
if (requestFullScreen) {
_V_.addEvent(document, requestFullScreen.eventName, this.proxy(function () {
this.isFullScreen = document[requestFullScreen.isFullScreen];
if (this.isFullScreen == false) {
_V_.removeEvent(document, requestFullScreen.eventName, arguments.callee)
}
this.triggerEvent("fullscreenchange")
}));
if (this.tech.support.fullscreenResize === false && this.options.flash.iFrameMode != true) {
this.pause();
this.unloadTech();
_V_.addEvent(document, requestFullScreen.eventName, this.proxy(function () {
_V_.removeEvent(document, requestFullScreen.eventName, arguments.callee);
this.loadTech(this.techName, {
src: this.values.src
})
}));
this.el[requestFullScreen.requestFn]()
} else {
this.el[requestFullScreen.requestFn]()
}
} else {
if (this.tech.supportsFullScreen()) {
this.triggerEvent("fullscreenchange");
this.techCall("enterFullScreen")
} else {
this.triggerEvent("fullscreenchange");
this.enterFullWindow()
}
}
return this
},
cancelFullScreen: function () {
var requestFullScreen = _V_.support.requestFullScreen;
this.isFullScreen = false;
if (requestFullScreen) {
if (this.tech.support.fullscreenResize === false && this.options.flash.iFrameMode != true) {
this.pause();
this.unloadTech();
_V_.addEvent(document, requestFullScreen.eventName, this.proxy(function () {
_V_.removeEvent(document, requestFullScreen.eventName, arguments.callee);
this.loadTech(this.techName, {
src: this.values.src
})
}));
document[requestFullScreen.cancelFn]()
} else {
document[requestFullScreen.cancelFn]()
}
} else {
if (this.tech.supportsFullScreen()) {
this.techCall("exitFullScreen");
this.triggerEvent("fullscreenchange")
} else {
this.exitFullWindow();
this.triggerEvent("fullscreenchange")
}
}
return this
},
enterFullWindow: function () {
this.isFullWindow = true;
this.docOrigOverflow = document.documentElement.style.overflow;
_V_.addEvent(document, "keydown", _V_.proxy(this, this.fullWindowOnEscKey));
document.documentElement.style.overflow = "hidden";
_V_.addClass(document.body, "vjs-full-window");
_V_.addClass(this.el, "vjs-fullscreen");
this.triggerEvent("enterFullWindow")
},
fullWindowOnEscKey: function (event) {
if (event.keyCode == 27) {
if (this.isFullScreen == true) {
this.cancelFullScreen()
} else {
this.exitFullWindow()
}
}
},
exitFullWindow: function () {
this.isFullWindow = false;
_V_.removeEvent(document, "keydown", this.fullWindowOnEscKey);
document.documentElement.style.overflow = this.docOrigOverflow;
_V_.removeClass(document.body, "vjs-full-window");
_V_.removeClass(this.el, "vjs-fullscreen");
this.triggerEvent("exitFullWindow")
},
selectSource: function (sources) {
for (var i = 0, j = this.options.techOrder; i < j.length; i++) {
var techName = j[i],
tech = _V_[techName];
if (tech.isSupported()) {
for (var a = 0, b = sources; a < b.length; a++) {
var source = b[a];
if (tech.canPlaySource.call(this, source)) {
return {
source: source,
tech: techName
}
}
}
}
}
return false
},
src: function (source) {
if (source instanceof Array) {
var sourceTech = this.selectSource(source),
source, techName;
if (sourceTech) {
source = sourceTech.source;
techName = sourceTech.tech;
if (techName == this.techName) {
this.src(source)
} else {
this.loadTech(techName, source)
}
} else {
_V_.log("No compatible source and playback technology were found.")
}
} else {
if (source instanceof Object) {
if (_V_[this.techName].canPlaySource(source)) {
this.src(source.src)
} else {
this.src([source])
}
} else {
this.values.src = source;
if (!this.isReady) {
this.ready(function () {
this.src(source)
})
} else {
this.techCall("src", source);
if (this.options.preload == "auto") {
this.load()
}
if (this.options.autoplay) {
this.play()
}
}
}
}
return this
},
load: function () {
this.techCall("load");
return this
},
currentSrc: function () {
return this.techGet("currentSrc") || this.values.src || ""
},
preload: function (value) {
if (value !== undefined) {
this.techCall("setPreload", value);
this.options.preload = value;
return this
}
return this.techGet("preload")
},
autoplay: function (value) {
if (value !== undefined) {
this.techCall("setAutoplay", value);
this.options.autoplay = value;
return this
}
return this.techGet("autoplay", value)
},
loop: function (value) {
if (value !== undefined) {
this.techCall("setLoop", value);
this.options.loop = value;
return this
}
return this.techGet("loop")
},
controls: function () {
return this.options.controls
},
poster: function () {
return this.techGet("poster")
},
error: function () {
return this.techGet("error")
},
ended: function () {
return this.techGet("ended")
}
});
(function () {
var requestFn, cancelFn, eventName, isFullScreen, playerProto = _V_.Player.prototype;
if (document.cancelFullscreen !== undefined) {
requestFn = "requestFullscreen";
cancelFn = "exitFullscreen";
eventName = "fullscreenchange";
isFullScreen = "fullScreen"
} else {
_V_.each(["moz", "webkit"], function (prefix) {
if ((prefix != "moz" || document.mozFullScreenEnabled) && document[prefix + "CancelFullScreen"] !== undefined) {
requestFn = prefix + "RequestFullScreen";
cancelFn = prefix + "CancelFullScreen";
eventName = prefix + "fullscreenchange";
if (prefix == "webkit") {
isFullScreen = prefix + "IsFullScreen"
} else {
isFullScreen = prefix + "FullScreen"
}
}
})
}
if (requestFn) {
_V_.support.requestFullScreen = {
requestFn: requestFn,
cancelFn: cancelFn,
eventName: eventName,
isFullScreen: isFullScreen
}
}
})();
_V_.PlaybackTech = _V_.Component.extend({
init: function (player, options) {},
onClick: function () {
if (this.player.options.controls) {
_V_.PlayToggle.prototype.onClick.call(this)
}
}
});
_V_.apiMethods = "play,pause,paused,currentTime,setCurrentTime,duration,buffered,volume,setVolume,muted,setMuted,width,height,supportsFullScreen,enterFullScreen,src,load,currentSrc,preload,setPreload,autoplay,setAutoplay,loop,setLoop,error,networkState,readyState,seeking,initialTime,startOffsetTime,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks,defaultPlaybackRate,playbackRate,mediaGroup,controller,controls,defaultMuted".split(",");
_V_.each(_V_.apiMethods, function (methodName) {
_V_.PlaybackTech.prototype[methodName] = function () {
throw new Error("The '" + methodName + "' method is not available on the playback technology's API")
}
});
_V_.html5 = _V_.PlaybackTech.extend({
init: function (player, options, ready) {
this.player = player;
this.el = this.createElement();
this.ready(ready);
this.addEvent("click", this.proxy(this.onClick));
var source = options.source;
if (source && this.el.currentSrc == source.src) {
player.triggerEvent("loadstart")
} else {
if (source) {
this.el.src = source.src
}
}
player.ready(function () {
if (this.options.autoplay && this.paused()) {
if(this.tag.poster !== ""){
this.tag.poster = null;
}
this.play()
}
});
this.setupTriggers();
this.triggerReady()
},
destroy: function () {
this.player.tag = false;
this.removeTriggers();
this.el.parentNode.removeChild(this.el)
},
createElement: function () {
var html5 = _V_.html5,
player = this.player,
el = player.tag,
newEl;
if (!el || this.support.movingElementInDOM === false) {
if (el) {
player.el.removeChild(el)
}
newEl = _V_.createElement("video", {
id: el.id || player.el.id + "_html5_api",
className: el.className || "vjs-tech"
});
el = newEl;
_V_.insertFirst(el, player.el)
}
_V_.each(["autoplay", "preload", "loop", "muted"], function (attr) {
if (player.options[attr] !== null) {
el[attr] = player.options[attr]
}
}, this);
return el
},
setupTriggers: function () {
_V_.each.call(this, _V_.html5.events, function (type) {
_V_.addEvent(this.el, type, _V_.proxy(this.player, this.eventHandler))
})
},
removeTriggers: function () {
_V_.each.call(this, _V_.html5.events, function (type) {
_V_.removeEvent(this.el, type, _V_.proxy(this.player, this.eventHandler))
})
},
eventHandler: function (e) {
e.stopPropagation();
this.triggerEvent(e)
},
play: function () {
this.el.play()
},
pause: function () {
this.el.pause()
},
paused: function () {
return this.el.paused
},
currentTime: function () {
return this.el.currentTime
},
setCurrentTime: function (seconds) {
try {
this.el.currentTime = seconds
} catch (e) {
_V_.log(e, "Video isn't ready. (VideoJS)")
}
},
duration: function () {
return this.el.duration || 0
},
buffered: function () {
return this.el.buffered
},
volume: function () {
return this.el.volume
},
setVolume: function (percentAsDecimal) {
this.el.volume = percentAsDecimal
},
muted: function () {
return this.el.muted
},
setMuted: function (muted) {
this.el.muted = muted
},
width: function () {
return this.el.offsetWidth
},
height: function () {
return this.el.offsetHeight
},
supportsFullScreen: function () {
if (typeof this.el.webkitEnterFullScreen == "function") {
if (!navigator.userAgent.match("Chrome") && !navigator.userAgent.match("Mac OS X 10.5")) {
return true
}
}
return false
},
enterFullScreen: function () {
try {
this.el.webkitEnterFullScreen()
} catch (e) {
if (e.code == 11) {
_V_.log("VideoJS: Video not ready.")
}
}
},
src: function (src) {
this.el.src = src
},
load: function () {
this.el.load()
},
currentSrc: function () {
return this.el.currentSrc
},
preload: function () {
return this.el.preload
},
setPreload: function (val) {
this.el.preload = val
},
autoplay: function () {
return this.el.autoplay
},
setAutoplay: function (val) {
this.el.autoplay = val
},
loop: function () {
return this.el.loop
},
setLoop: function (val) {
this.el.loop = val
},
error: function () {
return this.el.error
},
seeking: function () {
return this.el.seeking
},
ended: function () {
return this.el.ended
},
controls: function () {
return this.player.options.controls
},
defaultMuted: function () {
return this.el.defaultMuted
}
});
_V_.html5.isSupported = function () {
return !!document.createElement("video").canPlayType
};
_V_.html5.canPlaySource = function (srcObj) {
return !!document.createElement("video").canPlayType(srcObj.type)
};
_V_.html5.events = "loadstart,suspend,abort,error,emptied,stalled,loadedmetadata,loadeddata,canplay,canplaythrough,playing,waiting,seeking,seeked,ended,durationchange,timeupdate,progress,play,pause,ratechange,volumechange".split(",");
_V_.html5.prototype.support = {
fullscreen: (typeof _V_.testVid.webkitEnterFullScreen !== undefined) ? (!_V_.ua.match("Chrome") && !_V_.ua.match("Mac OS X 10.5") ? true : false) : false,
movingElementInDOM: !_V_.isIOS()
};
if (_V_.isAndroid()) {
if (_V_.androidVersion() < 3) {
document.createElement("video").constructor.prototype.canPlayType = function (type) {
return (type && type.toLowerCase().indexOf("video/mp4") != -1) ? "maybe" : ""
}
}
}
_V_.flash = _V_.PlaybackTech.extend({
init: function (player, options) {
this.player = player;
var source = options.source,
parentEl = options.parentEl,
placeHolder = this.el = _V_.createElement("div", {
id: parentEl.id + "_temp_flash"
}),
objId = player.el.id + "_flash_api",
playerOptions = player.options,
flashVars = _V_.merge({
readyFunction: "_V_.flash.onReady",
eventProxyFunction: "_V_.flash.onEvent",
errorEventProxyFunction: "_V_.flash.onError",
autoplay: playerOptions.autoplay,
preload: playerOptions.preload,
loop: playerOptions.loop,
muted: playerOptions.muted
}, options.flashVars),
params = _V_.merge({
wmode: "opaque",
bgcolor: "#000000"
}, options.params),
attributes = _V_.merge({
id: objId,
name: objId,
"class": "vjs-tech"
}, options.attributes);
if (source) {
flashVars.src = encodeURIComponent(_V_.getAbsoluteURL(source.src))
}
_V_.insertFirst(placeHolder, parentEl);
if (options.startTime) {
this.ready(function () {
this.load();
this.play();
this.currentTime(options.startTime)
})
}
if (options.iFrameMode == true && !_V_.isFF) {
var iFrm = _V_.createElement("iframe", {
id: objId + "_iframe",
name: objId + "_iframe",
className: "vjs-tech",
scrolling: "no",
marginWidth: 0,
marginHeight: 0,
frameBorder: 0
});
flashVars.readyFunction = "ready";
flashVars.eventProxyFunction = "events";
flashVars.errorEventProxyFunction = "errors";
_V_.addEvent(iFrm, "load", _V_.proxy(this, function () {
var iDoc, objTag, swfLoc, iWin = iFrm.contentWindow,
varString = "";
iDoc = iFrm.contentDocument ? iFrm.contentDocument : iFrm.contentWindow.document;
iDoc.write(_V_.flash.getEmbedCode(options.swf, flashVars, params, attributes));
iWin.player = this.player;
iWin.ready = _V_.proxy(this.player, function (currSwf) {
var el = iDoc.getElementById(currSwf),
player = this,
tech = player.tech;
tech.el = el;
_V_.addEvent(el, "click", tech.proxy(tech.onClick));
_V_.flash.checkReady(tech)
});
iWin.events = _V_.proxy(this.player, function (swfID, eventName, other) {
var player = this;
if (player && player.techName == "flash") {
player.triggerEvent(eventName)
}
});
iWin.errors = _V_.proxy(this.player, function (swfID, eventName) {
_V_.log("Flash Error", eventName)
})
}));
placeHolder.parentNode.replaceChild(iFrm, placeHolder)
} else {
_V_.flash.embed(options.swf, placeHolder, flashVars, params, attributes)
}
},
destroy: function () {
this.el.parentNode.removeChild(this.el)
},
play: function () {
this.el.vjs_play()
},
pause: function () {
this.el.vjs_pause()
},
src: function (src) {
src = _V_.getAbsoluteURL(src);
this.el.vjs_src(src);
if (this.player.autoplay()) {
var tech = this;
setTimeout(function () {
tech.play()
}, 0)
}
},
load: function () {
this.el.vjs_load()
},
poster: function () {
this.el.vjs_getProperty("poster")
},
buffered: function () {
return _V_.createTimeRange(0, this.el.vjs_getProperty("buffered"))
},
supportsFullScreen: function () {
return false
},
enterFullScreen: function () {
return false
}
});
(function () {
var api = _V_.flash.prototype,
readWrite = "preload,currentTime,defaultPlaybackRate,playbackRate,autoplay,loop,mediaGroup,controller,controls,volume,muted,defaultMuted".split(","),
readOnly = "error,currentSrc,networkState,readyState,seeking,initialTime,duration,startOffsetTime,paused,played,seekable,ended,videoTracks,audioTracks,videoWidth,videoHeight,textTracks".split(","),
callOnly = "load,play,pause".split(",");
createSetter = function (attr) {
var attrUpper = attr.charAt(0).toUpperCase() + attr.slice(1);
api["set" + attrUpper] = function (val) {
return this.el.vjs_setProperty(attr, val)
}
}, createGetter = function (attr) {
api[attr] = function () {
return this.el.vjs_getProperty(attr)
}
};
_V_.each(readWrite, function (attr) {
createGetter(attr);
createSetter(attr)
});
_V_.each(readOnly, function (attr) {
createGetter(attr)
})
})();
_V_.flash.isSupported = function () {
return _V_.flash.version()[0] >= 10
};
_V_.flash.canPlaySource = function (srcObj) {
if (srcObj.type in _V_.flash.prototype.support.formats) {
return "maybe"
}
};
_V_.flash.prototype.support = {
formats: {
"video/flv": "FLV",
"video/x-flv": "FLV",
"video/mp4": "MP4",
"video/m4v": "MP4"
},
progressEvent: false,
timeupdateEvent: false,
fullscreenResize: false,
parentResize: !(_V_.ua.match("Firefox"))
};
_V_.flash.onReady = function (currSwf) {
var el = _V_.el(currSwf);
var player = el.player || el.parentNode.player,
tech = player.tech;
el.player = player;
tech.el = el;
tech.addEvent("click", tech.onClick);
_V_.flash.checkReady(tech)
};
_V_.flash.checkReady = function (tech) {
if (tech.el.vjs_getProperty) {
tech.triggerReady()
} else {
setTimeout(function () {
_V_.flash.checkReady(tech)
}, 50)
}
};
_V_.flash.onEvent = function (swfID, eventName) {
var player = _V_.el(swfID).player;
player.triggerEvent(eventName)
};
_V_.flash.onError = function (swfID, err) {
var player = _V_.el(swfID).player;
player.triggerEvent("error");
_V_.log("Flash Error", err, swfID)
};
_V_.flash.version = function () {
var version = "0,0,0";
try {
version = new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version").replace(/\D+/g, ",").match(/^,?(.+),?$/)[1]
} catch (e) {
try {
if (navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin) {
version = (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1]
}
} catch (e) {}
}
return version.split(",")
};
_V_.flash.embed = function (swf, placeHolder, flashVars, params, attributes) {
var code = _V_.flash.getEmbedCode(swf, flashVars, params, attributes),
obj = _V_.createElement("div", {
innerHTML: code
}).childNodes[0],
par = placeHolder.parentNode;
placeHolder.parentNode.replaceChild(obj, placeHolder);
if (_V_.isIE()) {
var newObj = par.childNodes[0];
setTimeout(function () {
newObj.style.display = "block"
}, 1000)
}
return obj
};
_V_.flash.getEmbedCode = function (swf, flashVars, params, attributes) {
var objTag = '<object type="application/x-shockwave-flash"',
flashVarsString = "",
paramsString = "";
attrsString = "";
if (flashVars) {
_V_.eachProp(flashVars, function (key, val) {
flashVarsString += (key + "=" + val + "&")
})
}
params = _V_.merge({
movie: swf,
flashvars: flashVarsString,
allowScriptAccess: "always",
allowNetworking: "all"
}, params);
_V_.eachProp(params, function (key, val) {
paramsString += '<param name="' + key + '" value="' + val + '" />'
});
attributes = _V_.merge({
data: swf,
width: "100%",
height: "100%"
}, attributes);
_V_.eachProp(attributes, function (key, val) {
attrsString += (key + '="' + val + '" ')
});
return objTag + attrsString + ">" + paramsString + "</object>"
};
_V_.merge(_V_.Player.prototype, {
addTextTracks: function (trackObjects) {
var tracks = this.textTracks = (this.textTracks) ? this.textTracks : [],
i = 0,
j = trackObjects.length,
track, Kind;
for (; i < j; i++) {
Kind = _V_.uc(trackObjects[i].kind || "subtitles");
track = new _V_[Kind + "Track"](this, trackObjects[i]);
tracks.push(track);
if (track["default"]) {
this.ready(_V_.proxy(track, track.show))
}
}
return this
},
showTextTrack: function (id, disableSameKind) {
var tracks = this.textTracks,
i = 0,
j = tracks.length,
track, showTrack, kind;
for (; i < j; i++) {
track = tracks[i];
if (track.id === id) {
track.show();
showTrack = track
} else {
if (disableSameKind && track.kind == disableSameKind && track.mode > 0) {
track.disable()
}
}
}
kind = (showTrack) ? showTrack.kind : ((disableSameKind) ? disableSameKind : false);
if (kind) {
this.triggerEvent(kind + "trackchange")
}
return this
}
});
_V_.Track = _V_.Component.extend({
init: function (player, options) {
this._super(player, options);
_V_.merge(this, {
id: options.id || ("vjs_" + options.kind + "_" + options.language + "_" + _V_.guid++),
src: options.src,
"default": options["default"],
title: options.title,
language: options.srclang,
label: options.label,
cues: [],
activeCues: [],
readyState: 0,
mode: 0
})
},
createElement: function () {
return this._super("div", {
className: "vjs-" + this.kind + " vjs-text-track"
})
},
show: function () {
this.activate();
this.mode = 2;
this._super()
},
hide: function () {
this.activate();
this.mode = 1;
this._super()
},
disable: function () {
if (this.mode == 2) {
this.hide()
}
this.deactivate();
this.mode = 0
},
activate: function () {
if (this.readyState == 0) {
this.load()
}
if (this.mode == 0) {
this.player.addEvent("timeupdate", this.proxy(this.update, this.id));
this.player.addEvent("ended", this.proxy(this.reset, this.id));
if (this.kind == "captions" || this.kind == "subtitles") {
this.player.textTrackDisplay.addComponent(this)
}
}
},
deactivate: function () {
this.player.removeEvent("timeupdate", this.proxy(this.update, this.id));
this.player.removeEvent("ended", this.proxy(this.reset, this.id));
this.reset();
this.player.textTrackDisplay.removeComponent(this)
},
load: function () {
if (this.readyState == 0) {
this.readyState = 1;
_V_.get(this.src, this.proxy(this.parseCues), this.proxy(this.onError))
}
},
onError: function (err) {
this.error = err;
this.readyState = 3;
this.triggerEvent("error")
},
parseCues: function (srcContent) {
var cue, time, text, lines = srcContent.split("\n"),
line = "",
id;
for (var i = 1, j = lines.length; i < j; i++) {
line = _V_.trim(lines[i]);
if (line) {
if (line.indexOf("-->") == -1) {
id = line;
line = _V_.trim(lines[++i])
} else {
id = this.cues.length
}
cue = {
id: id,
index: this.cues.length
};
time = line.split(" --> ");
cue.startTime = this.parseCueTime(time[0]);
cue.endTime = this.parseCueTime(time[1]);
text = [];
while (lines[++i] && (line = _V_.trim(lines[i]))) {
text.push(line)
}
cue.text = text.join("<br/>");
this.cues.push(cue)
}
}
this.readyState = 2;
this.triggerEvent("loaded")
},
parseCueTime: function (timeText) {
var parts = timeText.split(":"),
time = 0,
hours, minutes, other, seconds, ms, flags;
if (parts.length == 3) {
hours = parts[0];
minutes = parts[1];
other = parts[2]
} else {
hours = 0;
minutes = parts[0];
other = parts[1]
}
other = other.split(/\s+/);
seconds = other.splice(0, 1)[0];
seconds = seconds.split(/\.|,/);
ms = parseFloat(seconds[1]);
seconds = seconds[0];
time += parseFloat(hours) * 3600;
time += parseFloat(minutes) * 60;
time += parseFloat(seconds);
if (ms) {
time += ms / 1000
}
return time
},
update: function () {
if (this.cues.length > 0) {
var time = this.player.currentTime();
if (this.prevChange === undefined || time < this.prevChange || this.nextChange <= time) {
var cues = this.cues,
newNextChange = this.player.duration(),
newPrevChange = 0,
reverse = false,
newCues = [],
firstActiveIndex, lastActiveIndex, html = "",
cue, i, j;
if (time >= this.nextChange || this.nextChange === undefined) {
i = (this.firstActiveIndex !== undefined) ? this.firstActiveIndex : 0
} else {
reverse = true;
i = (this.lastActiveIndex !== undefined) ? this.lastActiveIndex : cues.length - 1
}
while (true) {
cue = cues[i];
if (cue.endTime <= time) {
newPrevChange = Math.max(newPrevChange, cue.endTime);
if (cue.active) {
cue.active = false
}
} else {
if (time < cue.startTime) {
newNextChange = Math.min(newNextChange, cue.startTime);
if (cue.active) {
cue.active = false
}
if (!reverse) {
break
}
} else {
if (reverse) {
newCues.splice(0, 0, cue);
if (lastActiveIndex === undefined) {
lastActiveIndex = i
}
firstActiveIndex = i
} else {
newCues.push(cue);
if (firstActiveIndex === undefined) {
firstActiveIndex = i
}
lastActiveIndex = i
}
newNextChange = Math.min(newNextChange, cue.endTime);
newPrevChange = Math.max(newPrevChange, cue.startTime);
cue.active = true
}
}
if (reverse) {
if (i === 0) {
break
} else {
i--
}
} else {
if (i === cues.length - 1) {
break
} else {
i++
}
}
}
this.activeCues = newCues;
this.nextChange = newNextChange;
this.prevChange = newPrevChange;
this.firstActiveIndex = firstActiveIndex;
this.lastActiveIndex = lastActiveIndex;
this.updateDisplay();
this.triggerEvent("cuechange")
}
}
},
updateDisplay: function () {
var cues = this.activeCues,
html = "",
i = 0,
j = cues.length;
for (; i < j; i++) {
html += "<span class='vjs-tt-cue'>" + cues[i].text + "</span>"
}
this.el.innerHTML = html
},
reset: function () {
this.nextChange = 0;
this.prevChange = this.player.duration();
this.firstActiveIndex = 0;
this.lastActiveIndex = 0
}
});
_V_.CaptionsTrack = _V_.Track.extend({
kind: "captions"
});
_V_.SubtitlesTrack = _V_.Track.extend({
kind: "subtitles"
});
_V_.ChaptersTrack = _V_.Track.extend({
kind: "chapters"
});
_V_.TextTrackDisplay = _V_.Component.extend({
createElement: function () {
return this._super("div", {
className: "vjs-text-track-display"
})
}
});
_V_.TextTrackMenuItem = _V_.MenuItem.extend({
init: function (player, options) {
var track = this.track = options.track;
options.label = track.label;
options.selected = track["default"];
this._super(player, options);
this.player.addEvent(track.kind + "trackchange", _V_.proxy(this, this.update))
},
onClick: function () {
this._super();
this.player.showTextTrack(this.track.id, this.track.kind)
},
update: function () {
if (this.track.mode == 2) {
this.selected(true)
} else {
this.selected(false)
}
}
});
_V_.OffTextTrackMenuItem = _V_.TextTrackMenuItem.extend({
init: function (player, options) {
options.track = {
kind: options.kind,
player: player,
label: "Off"
};
this._super(player, options)
},
onClick: function () {
this._super();
this.player.showTextTrack(this.track.id, this.track.kind)
},
update: function () {
var tracks = this.player.textTracks,
i = 0,
j = tracks.length,
track, off = true;
for (; i < j; i++) {
track = tracks[i];
if (track.kind == this.track.kind && track.mode == 2) {
off = false
}
}
if (off) {
this.selected(true)
} else {
this.selected(false)
}
}
});
_V_.TextTrackButton = _V_.Button.extend({
init: function (player, options) {
this._super(player, options);
this.menu = this.createMenu();
if (this.items.length === 0) {
this.hide()
}
},
createMenu: function () {
var menu = new _V_.Menu(this.player);
menu.el.appendChild(_V_.createElement("li", {
className: "vjs-menu-title",
innerHTML: _V_.uc(this.kind)
}));
menu.addItem(new _V_.OffTextTrackMenuItem(this.player, {
kind: this.kind
}));
this.items = this.createItems();
this.each(this.items, function (item) {
menu.addItem(item)
});
this.addComponent(menu);
return menu
},
createItems: function () {
var items = [];
this.each(this.player.textTracks, function (track) {
if (track.kind === this.kind) {
items.push(new _V_.TextTrackMenuItem(this.player, {
track: track
}))
}
});
return items
},
buildCSSClass: function () {
return this.className + " vjs-menu-button " + this._super()
},
onFocus: function () {
this.menu.lockShowing();
_V_.one(this.menu.el.childNodes[this.menu.el.childNodes.length - 1], "blur", this.proxy(function () {
this.menu.unlockShowing()
}))
},
onBlur: function () {},
onClick: function () {
this.one("mouseout", this.proxy(function () {
this.menu.unlockShowing();
this.el.blur()
}))
}
});
_V_.CaptionsButton = _V_.TextTrackButton.extend({
kind: "captions",
buttonText: "Captions",
className: "vjs-captions-button"
});
_V_.SubtitlesButton = _V_.TextTrackButton.extend({
kind: "subtitles",
buttonText: "Subtitles",
className: "vjs-subtitles-button"
});
_V_.ChaptersButton = _V_.TextTrackButton.extend({
kind: "chapters",
buttonText: "Chapters",
className: "vjs-chapters-button",
createItems: function (chaptersTrack) {
var items = [];
this.each(this.player.textTracks, function (track) {
if (track.kind === this.kind) {
items.push(new _V_.TextTrackMenuItem(this.player, {
track: track
}))
}
});
return items
},
createMenu: function () {
var tracks = this.player.textTracks,
i = 0,
j = tracks.length,
track, chaptersTrack, items = this.items = [];
for (; i < j; i++) {
track = tracks[i];
if (track.kind == this.kind && track["default"]) {
if (track.readyState < 2) {
this.chaptersTrack = track;
track.addEvent("loaded", this.proxy(this.createMenu));
return
} else {
chaptersTrack = track;
break
}
}
}
var menu = this.menu = new _V_.Menu(this.player);
menu.el.appendChild(_V_.createElement("li", {
className: "vjs-menu-title",
innerHTML: _V_.uc(this.kind)
}));
if (chaptersTrack) {
var cues = chaptersTrack.cues,
i = 0,
j = cues.length,
cue, mi;
for (; i < j; i++) {
cue = cues[i];
mi = new _V_.ChaptersTrackMenuItem(this.player, {
track: chaptersTrack,
cue: cue
});
items.push(mi);
menu.addComponent(mi)
}
}
this.addComponent(menu);
if (this.items.length > 0) {
this.show()
}
return menu
}
});
_V_.ChaptersTrackMenuItem = _V_.MenuItem.extend({
init: function (player, options) {
var track = this.track = options.track,
cue = this.cue = options.cue,
currentTime = player.currentTime();
options.label = cue.text;
options.selected = (cue.startTime <= currentTime && currentTime < cue.endTime);
this._super(player, options);
track.addEvent("cuechange", _V_.proxy(this, this.update))
},
onClick: function () {
this._super();
this.player.currentTime(this.cue.startTime);
this.update(this.cue.startTime)
},
update: function (time) {
var cue = this.cue,
currentTime = this.player.currentTime();
if (cue.startTime <= currentTime && currentTime < cue.endTime) {
this.selected(true)
} else {
this.selected(false)
}
}
});
_V_.merge(_V_.ControlBar.prototype.options.components, {
subtitlesButton: {},
captionsButton: {},
chaptersButton: {}
});
_V_.autoSetup = function () {
var options, vid, player, vids = document.getElementsByTagName("video");
if (vids && vids.length > 0) {
for (var i = 0, j = vids.length; i < j; i++) {
vid = vids[i];
if (vid && vid.getAttribute) {
if (vid.player === undefined) {
options = vid.getAttribute("data-setup");
if (options !== null) {
options = JSON.parse(options || "{}");
player = _V_(vid, options)
}
}
} else {
_V_.autoSetupTimeout(1);
break
}
}
} else {
if (!_V_.windowLoaded) {
_V_.autoSetupTimeout(1)
}
}
};
_V_.autoSetupTimeout = function (wait) {
setTimeout(_V_.autoSetup, wait)
};
_V_.addEvent(window, "load", function () {
_V_.windowLoaded = true
});
_V_.autoSetup();
window.VideoJS = window._V_ = VideoJS
})(window);
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists