/* Definition of an ancestor for the Widget classes */
if (typeof IriSP.Widgets === "undefined") {
IriSP.Widgets = {}
}
/**
* @class IriSP.Widget is an "abstract" class. It's mostly used to define some properties common to every widget.
*
* Note that widget constructors are never called directly by the user. Instead, the widgets are instantiated by functions
* defined in init.js
*
* @constructor
* @param player - a reference to the player widget
* @param config - configuration options for the widget
*/
IriSP.Widgets.Widget = function(player, config) {
if( typeof player === "undefined") {
/* Probably an abstract call of the class when
* individual widgets set their prototype */
return;
}
/* Setting all the configuration options */
var _type = config.type,
_config = IriSP._.defaults({}, config, player.config.default_options, this.defaults),
_this = this;
IriSP._(_config).forEach(function(_value, _key) {
_this[_key] = _value;
});
if (typeof this.width === "undefined") {
this.width = player.config.width;
}
/* Setting this.player at the end in case it's been overriden
* by a configuration option of the same name :-(
*/
this.player = player;
/* Getting metadata */
this.source = player.loadMetadata(this.metadata);
/* Call draw when loaded */
this.source.onLoad(function() {
_this.media = this.getCurrentMedia();
_this.draw();
});
/* Adding classes and html attributes */
this.$ = IriSP.jQuery('#' + this.container);
this.$.addClass("Ldt-TraceMe Ldt-Widget").attr("widget-type", _type);
this.l10n = (
typeof this.messages[IriSP.language] !== "undefined"
? this.messages[IriSP.language]
: (
IriSP.language.length > 2 && typeof this.messages[IriSP.language.substr(0,2)] !== "undefined"
? this.messages[IriSP.language.substr(0,2)]
: this.messages["en"]
)
);
};
IriSP.Widgets.Widget.prototype.defaults = {}
IriSP.Widgets.Widget.prototype.template = '';
IriSP.Widgets.Widget.prototype.messages = {"en":{}};
IriSP.Widgets.Widget.prototype.templateToHtml = function(_template) {
return Mustache.to_html(_template, this);
}
IriSP.Widgets.Widget.prototype.renderTemplate = function() {
this.$.append(this.templateToHtml(this.template));
}
IriSP.Widgets.Widget.prototype.functionWrapper = function(_name) {
var _this = this,
_function = this[_name];
if (typeof _function !== "undefined") {
return function() {
return _function.apply(_this, Array.prototype.slice.call(arguments, 0));
}
} else {
console.log("Error, Unknown function IriSP.Widgets" + this.type + "." + _name)
}
}
IriSP.Widgets.Widget.prototype.getFunctionOrName = function(_functionOrName) {
switch (typeof _functionOrName) {
case "function":
return _functionOrName;
case "string":
return this.functionWrapper(_functionOrName);
default:
return undefined;
}
}
IriSP.Widgets.Widget.prototype.onMdpEvent = function(_eventName, _functionOrName) {
this.player.on(_eventName, this.getFunctionOrName(_functionOrName));
}
IriSP.Widgets.Widget.prototype.onMediaEvent = function(_eventName, _functionOrName) {
if (typeof this.media === "undefined" || typeof this.media.on === "undefined") {
console.log("Error on widget "+this.type, this.media);
}
this.media.on(_eventName, this.getFunctionOrName(_functionOrName));
}
IriSP.Widgets.Widget.prototype.getWidgetAnnotations = function() {
return typeof this.annotation_type !== "undefined" && this.annotation_type ? this.media.getAnnotationsByTypeTitle(this.annotation_type) : this.media.getAnnotations();
}
IriSP.Widgets.Widget.prototype.getWidgetAnnotationsAtTime = function() {
var _time = this.media.getCurrentTime();
return this.getWidgetAnnotations().filter(function(_annotation) {
return _annotation.begin <= _time && _annotation.end > _time;
});
}
IriSP.Widgets.Widget.prototype.insertSubwidget = function(_selector, _propname, _widgetoptions) {
var _id = _selector.attr("id"),
_this = this,
_type = _widgetoptions.type,
$L = $LAB;
if (typeof _id == "undefined") {
_id = IriSP._.uniqueId(this.container + '_sub_widget_' + _widgetoptions.type);
_selector.attr("id", _id);
}
_widgetoptions.container = _id;
if (typeof IriSP.widgetsRequirements[_type] !== "undefined" && typeof IriSP.widgetsRequirements[_type].requires !== "undefined" ) {
for (var _j = 0; _j < IriSP.widgetsRequirements[_type].requires.length; _j++) {
$L.script(IriSP.getLib(IriSP.widgetsRequirements[_type].requires[_j]));
}
}
$L.wait(function() {
_this.player.loadWidget(_widgetoptions, function(_widget) {
_this[_propname] = _widget;
});
});
}
/**
* This method responsible of drawing a widget on screen.
*/
IriSP.Widgets.Widget.prototype.draw = function() {
/* implemented by "sub-classes" */
};