using jquery ui draggable changes the state of an element from absolute to relative
positioning, which breaks the way our seek button expands itself, so we need to
force absolute positioning, quite uglily, using jquery.
/* data.js - this file deals with how the players gets and sends data */
IriSP.DataLoader = function() {
this._cache = {};
/*
A structure to hold callbacks for specific urls. We need it because
ajax calls are asynchronous, so it means that sometimes we ask
multiple times for a ressource because the first call hasn't been
received yet.
*/
this._callbacks = {};
};
IriSP.DataLoader.prototype.get = function(url, callback) {
var base_url = url.split("&")[0]
if (this._cache.hasOwnProperty(base_url)) {
callback(this._cache[base_url]);
} else {
if (!this._callbacks.hasOwnProperty(base_url)) {
this._callbacks[base_url] = [];
this._callbacks[base_url].push(callback);
/* we need a closure because this gets lost when it's called back */
// uncomment you don't want to use caching.
// IriSP.jQuery.get(url, callback);
var func = function(data) {
this._cache[base_url] = data;
var i = 0;
for (i = 0; i < this._callbacks[base_url].length; i++) {
this._callbacks[base_url][i](this._cache[base_url]);
}
};
/* automagically choose between json and jsonp */
if (url.indexOf(document.location.hostname) === -1 &&
url.indexOf("http://") !== -1 /* not a relative url */ ) {
// we contacting a foreign domain, use JSONP
IriSP.jQuery.get(url, {}, IriSP.wrap(this, func), "jsonp");
} else {
// otherwise, hey, whatever rows your boat
IriSP.jQuery.get(url, IriSP.wrap(this, func));
}
} else {
/* simply push the callback - it'll get called when the ressource
has been received */
this._callbacks[base_url].push(callback);
}
}
}
/* the base abstract "class" */
IriSP.Serializer = function(DataLoader, url) {
this._DataLoader = DataLoader;
this._url = url;
this._data = [];
};
IriSP.Serializer.prototype.serialize = function(data) { };
IriSP.Serializer.prototype.deserialize = function(data) {};
IriSP.Serializer.prototype.currentMedia = function() {
};
IriSP.Serializer.prototype.sync = function(callback) {
callback.call(this, this._data);
};
IriSP.SerializerFactory = function(DataLoader) {
this._dataloader = DataLoader;
};
IriSP.SerializerFactory.prototype.getSerializer = function(metadataOptions) {
/* This function returns serializer set-up with the correct
configuration - takes a metadata struct describing the metadata source
*/
if (metadataOptions === undefined)
/* return an empty serializer */
return IriSP.Serializer("", "");
switch(metadataOptions.type) {
case "json":
return new IriSP.JSONSerializer(this._dataloader, metadataOptions.src);
break;
case "dummy": /* only used for unit testing - not defined in production */
return new IriSP.MockSerializer(this._dataloader, metadataOptions.src);
break;
case "empty":
return new IriSP.Serializer("", "empty");
break;
default:
return undefined;
}
};