2010-11-22 06:14:12 +02:00
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Convenience Functions (mini library)
|
|
|
|
// Functions not specific to video or VideoJS and could probably be replaced with a library like jQuery
|
|
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
VideoJS.extend({
|
|
|
|
|
|
|
|
addClass: function(element, classToAdd){
|
2010-12-16 22:55:52 +02:00
|
|
|
if ((" "+element.className+" ").indexOf(" "+classToAdd+" ") == -1) {
|
|
|
|
element.className = element.className === "" ? classToAdd : element.className + " " + classToAdd;
|
2010-11-22 08:21:36 +02:00
|
|
|
}
|
2010-11-22 06:14:12 +02:00
|
|
|
},
|
|
|
|
removeClass: function(element, classToRemove){
|
|
|
|
if (element.className.indexOf(classToRemove) == -1) { return; }
|
|
|
|
var classNames = element.className.split(/\s+/);
|
|
|
|
classNames.splice(classNames.lastIndexOf(classToRemove),1);
|
|
|
|
element.className = classNames.join(" ");
|
|
|
|
},
|
|
|
|
createElement: function(tagName, attributes){
|
|
|
|
return this.merge(document.createElement(tagName), attributes);
|
|
|
|
},
|
|
|
|
|
|
|
|
// Attempt to block the ability to select text while dragging controls
|
|
|
|
blockTextSelection: function(){
|
|
|
|
document.body.focus();
|
|
|
|
document.onselectstart = function () { return false; };
|
|
|
|
},
|
|
|
|
// Turn off text selection blocking
|
|
|
|
unblockTextSelection: function(){ document.onselectstart = function () { return true; }; },
|
|
|
|
|
|
|
|
// Return seconds as MM:SS
|
|
|
|
formatTime: function(secs) {
|
|
|
|
var seconds = Math.round(secs);
|
|
|
|
var minutes = Math.floor(seconds / 60);
|
|
|
|
minutes = (minutes >= 10) ? minutes : "0" + minutes;
|
|
|
|
seconds = Math.floor(seconds % 60);
|
|
|
|
seconds = (seconds >= 10) ? seconds : "0" + seconds;
|
|
|
|
return minutes + ":" + seconds;
|
|
|
|
},
|
|
|
|
|
|
|
|
// Return the relative horizonal position of an event as a value from 0-1
|
|
|
|
getRelativePosition: function(x, relativeElement){
|
|
|
|
return Math.max(0, Math.min(1, (x - this.findPosX(relativeElement)) / relativeElement.offsetWidth));
|
|
|
|
},
|
|
|
|
// Get an objects position on the page
|
|
|
|
findPosX: function(obj) {
|
|
|
|
var curleft = obj.offsetLeft;
|
|
|
|
while(obj = obj.offsetParent) {
|
|
|
|
curleft += obj.offsetLeft;
|
|
|
|
}
|
|
|
|
return curleft;
|
|
|
|
},
|
|
|
|
getComputedStyleValue: function(element, style){
|
|
|
|
return window.getComputedStyle(element, null).getPropertyValue(style);
|
|
|
|
},
|
|
|
|
|
|
|
|
round: function(num, dec) {
|
|
|
|
if (!dec) { dec = 0; }
|
|
|
|
return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
|
|
|
|
},
|
2010-12-16 22:55:52 +02:00
|
|
|
|
2010-11-22 08:21:36 +02:00
|
|
|
addListener: function(element, type, handler){
|
|
|
|
if (element.addEventListener) {
|
|
|
|
element.addEventListener(type, handler, false);
|
|
|
|
} else if (element.attachEvent) {
|
|
|
|
element.attachEvent("on"+type, handler);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
removeListener: function(element, type, handler){
|
|
|
|
if (element.removeEventListener) {
|
|
|
|
element.removeEventListener(type, handler, false);
|
|
|
|
} else if (element.attachEvent) {
|
|
|
|
element.detachEvent("on"+type, handler);
|
|
|
|
}
|
|
|
|
},
|
2010-11-22 06:14:12 +02:00
|
|
|
|
|
|
|
get: function(url, onSuccess){
|
|
|
|
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) {}
|
|
|
|
//Microsoft.XMLHTTP points to Msxml2.XMLHTTP.3.0 and is redundant
|
|
|
|
throw new Error("This browser does not support XMLHttpRequest.");
|
|
|
|
};
|
|
|
|
}
|
|
|
|
var request = new XMLHttpRequest();
|
|
|
|
request.open("GET",url);
|
|
|
|
request.onreadystatechange = function() {
|
|
|
|
if (request.readyState == 4 && request.status == 200) {
|
|
|
|
onSuccess(request.responseText);
|
|
|
|
}
|
|
|
|
}.context(this);
|
|
|
|
request.send();
|
|
|
|
},
|
|
|
|
|
2010-12-10 22:53:18 +02:00
|
|
|
trim: function(string){ return string.toString().replace(/^\s+/, "").replace(/\s+$/, ""); },
|
|
|
|
|
2010-11-22 06:14:12 +02:00
|
|
|
// DOM Ready functionality adapted from jQuery. http://jquery.com/
|
|
|
|
bindDOMReady: function(){
|
|
|
|
if (document.readyState === "complete") {
|
|
|
|
return VideoJS.onDOMReady();
|
|
|
|
}
|
|
|
|
if (document.addEventListener) {
|
|
|
|
document.addEventListener("DOMContentLoaded", VideoJS.DOMContentLoaded, false);
|
|
|
|
window.addEventListener("load", VideoJS.onDOMReady, false);
|
|
|
|
} else if (document.attachEvent) {
|
|
|
|
document.attachEvent("onreadystatechange", VideoJS.DOMContentLoaded);
|
|
|
|
window.attachEvent("onload", VideoJS.onDOMReady);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
DOMContentLoaded: function(){
|
|
|
|
if (document.addEventListener) {
|
|
|
|
document.removeEventListener( "DOMContentLoaded", VideoJS.DOMContentLoaded, false);
|
|
|
|
VideoJS.onDOMReady();
|
|
|
|
} else if ( document.attachEvent ) {
|
|
|
|
if ( document.readyState === "complete" ) {
|
|
|
|
document.detachEvent("onreadystatechange", VideoJS.DOMContentLoaded);
|
|
|
|
VideoJS.onDOMReady();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
// Functions to be run once the DOM is loaded
|
|
|
|
DOMReadyList: [],
|
|
|
|
addToDOMReady: function(fn){
|
|
|
|
if (VideoJS.DOMIsReady) {
|
|
|
|
fn.call(document);
|
|
|
|
} else {
|
|
|
|
VideoJS.DOMReadyList.push(fn);
|
|
|
|
}
|
|
|
|
},
|
|
|
|
|
|
|
|
DOMIsReady: false,
|
|
|
|
onDOMReady: function(){
|
|
|
|
if (VideoJS.DOMIsReady) { return; }
|
|
|
|
if (!document.body) { return setTimeout(VideoJS.onDOMReady, 13); }
|
|
|
|
VideoJS.DOMIsReady = true;
|
|
|
|
if (VideoJS.DOMReadyList) {
|
|
|
|
for (var i=0; i<VideoJS.DOMReadyList.length; i++) {
|
|
|
|
VideoJS.DOMReadyList[i].call(document);
|
|
|
|
}
|
|
|
|
VideoJS.DOMReadyList = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
VideoJS.bindDOMReady();
|
|
|
|
|
|
|
|
// Allows for binding context to functions
|
|
|
|
// when using in event listeners and timeouts
|
|
|
|
Function.prototype.context = function(obj){
|
|
|
|
var method = this,
|
|
|
|
temp = function(){
|
|
|
|
return method.apply(obj, arguments);
|
|
|
|
};
|
|
|
|
return temp;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Like context, in that it creates a closure
|
|
|
|
// But insteaad keep "this" intact, and passes the var as the second argument of the function
|
|
|
|
// Need for event listeners where you need to know what called the event
|
|
|
|
// Only use with event callbacks
|
|
|
|
Function.prototype.evtContext = function(obj){
|
|
|
|
var method = this,
|
|
|
|
temp = function(){
|
|
|
|
var origContext = this;
|
|
|
|
return method.call(obj, arguments[0], origContext);
|
|
|
|
};
|
|
|
|
return temp;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Removeable Event listener with Context
|
|
|
|
// Replaces the original function with a version that has context
|
|
|
|
// So it can be removed using the original function name.
|
|
|
|
// In order to work, a version of the function must already exist in the player/prototype
|
|
|
|
Function.prototype.rEvtContext = function(obj, funcParent){
|
2010-11-22 08:21:36 +02:00
|
|
|
if (this.hasContext === true) { return this; }
|
2010-11-22 06:14:12 +02:00
|
|
|
if (!funcParent) { funcParent = obj; }
|
|
|
|
for (var attrname in funcParent) {
|
|
|
|
if (funcParent[attrname] == this) {
|
|
|
|
funcParent[attrname] = this.evtContext(obj);
|
|
|
|
funcParent[attrname].hasContext = true;
|
|
|
|
return funcParent[attrname];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return this.evtContext(obj);
|
|
|
|
};
|
2010-11-22 08:23:22 +02:00
|
|
|
|